diff --git a/grafana/dashboards/charges.json b/grafana/dashboards/charges.json index a58fef9a..127861c7 100644 --- a/grafana/dashboards/charges.json +++ b/grafana/dashboards/charges.json @@ -15,7 +15,7 @@ "editable": true, "gnetId": null, "graphTooltip": 0, - "iteration": 1569697873593, + "iteration": 1571491749386, "links": [], "panels": [ { @@ -72,7 +72,7 @@ "dateFormat": "YYYY-MM-DD HH:mm:ss", "link": true, "linkTooltip": "", - "linkUrl": "d/BHhxFeZRz/laden?orgId=1&from=${__cell_0}&to=${__cell_1}&var-charging_process_id=${__cell_18}&var-car_id=$car_id", + "linkUrl": "d/BHhxFeZRz/laden?orgId=1&from=${__cell_0}&to=${__cell_1}&var-charging_process_id=${__cell_19}&var-car_id=$car_id", "pattern": "start_date", "type": "date" }, @@ -93,7 +93,7 @@ "unit": "short" }, { - "alias": "charged", + "alias": "Energy added", "colorMode": null, "colors": [ "rgba(245, 54, 54, 0.9)", @@ -249,7 +249,7 @@ "link": true, "linkTargetBlank": true, "linkTooltip": "", - "linkUrl": "[[base_url:raw]]/geo-fences/${__cell_18:raw}", + "linkUrl": "[[base_url:raw]]/geo-fences/${__cell_20:raw}", "mappingType": 1, "pattern": "address", "thresholds": [], @@ -451,6 +451,58 @@ "type": "hidden", "unit": "short" }, + { + "alias": "Energey used", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": true, + "linkTooltip": "Confidence: ${__cell_9}%", + "linkUrl": "#", + "mappingType": 1, + "pattern": "charge_energy_used", + "thresholds": [], + "type": "number", + "unit": "kwatth" + }, + { + "alias": "Confidence", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 0, + "link": false, + "mappingType": 1, + "pattern": "charge_energy_used_confidence", + "thresholds": [], + "type": "hidden", + "unit": "none" + }, + { + "alias": "Efficiency", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 0, + "mappingType": 1, + "pattern": "charging_efficiency", + "thresholds": [], + "type": "number", + "unit": "percentunit" + }, { "alias": "", "colorMode": null, @@ -472,7 +524,7 @@ "group": [], "metricColumn": "none", "rawQuery": true, - "rawSql": "WITH data AS (\n SELECT\n (extract(epoch FROM start_date) * 1000) - 1000 AS start_date_ts,\n (extract(epoch FROM end_date) * 1000) + 1000 AS end_date_ts,\n start_date,\n end_date,\n CONCAT_WS(', ', COALESCE(addresses.name, CONCAT_WS(' ', addresses.road, addresses.house_number)), addresses.city) AS address,\n g.name as geofence_name,\n g.id as geofence_id,\n p.latitude,\n p.longitude,\n charge_energy_added,\n duration_min,\n start_battery_level,\n end_battery_level,\n start_[[preferred_range]]_range_km,\n end_[[preferred_range]]_range_km,\n outside_temp_avg,\n c.id,\n lag(end_[[preferred_range]]_range_km) OVER (ORDER BY start_date) - start_[[preferred_range]]_range_km AS range_loss,\n p.odometer - lag(p.odometer) OVER (ORDER BY start_date) AS distance,\n cars.efficiency\n FROM\n charging_processes c\n LEFT JOIN positions p ON p.id = c.position_id\n LEFT JOIN cars ON cars.id = c.car_id\n LEFT JOIN addresses ON addresses.id = c.address_id\n LEFT JOIN geofences g ON g.id = geofence_id\nWHERE \n c.car_id = $car_id AND\n $__timeFilter(start_date)\nORDER BY\n start_date\n)\nSELECT\n start_date_ts,\n end_date_ts,\n start_date,\n end_date,\n COALESCE(geofence_name, address) as address,\n charge_energy_added,\n charge_energy_added * 60 / NULLIF (duration_min, 0) AS charge_energy_added_per_hour,\n convert_km((end_[[preferred_range]]_range_km - start_[[preferred_range]]_range_km) * 60 / NULLIF (duration_min, 0), '$length_unit') AS range_added_per_hour_$length_unit,\n duration_min,\n start_battery_level,\n end_battery_level,\n convert_km(start_[[preferred_range]]_range_km, '$length_unit') AS start_range_$length_unit,\n convert_km(end_[[preferred_range]]_range_km, '$length_unit') AS end_range_$length_unit,\n convert_km(distance, '$length_unit') AS distance_$length_unit,\n range_loss * efficiency AS consumption_kWh,\n range_loss * efficiency / NULLIF (distance, 0) * 100 * \n CASE WHEN '$length_unit' = 'km' THEN 1\n WHEN '$length_unit' = 'mi' THEN 1.60934\n END AS consumption_kWh_100$length_unit,\n convert_celsius(outside_temp_avg, '$temp_unit') AS outside_temp_avg_$temp_unit,\n id,\n CASE WHEN geofence_id IS NULL THEN CONCAT('new?lat=', latitude, '&lng=', longitude)\n WHEN geofence_id IS NOT NULL THEN CONCAT(geofence_id, '/edit')\n END as path\nFROM\n data\nWHERE\n (distance >= 0 OR distance IS NULL) AND (charge_energy_added IS NULL OR charge_energy_added > 0.1);\n ", + "rawSql": "WITH data AS (\n SELECT\n (extract(epoch FROM start_date) * 1000) - 1000 AS start_date_ts,\n (extract(epoch FROM end_date) * 1000) + 1000 AS end_date_ts,\n start_date,\n end_date,\n CONCAT_WS(', ', COALESCE(addresses.name, CONCAT_WS(' ', addresses.road, addresses.house_number)), addresses.city) AS address,\n g.name as geofence_name,\n g.id as geofence_id,\n p.latitude,\n p.longitude,\n charge_energy_added,\n charge_energy_used,\n charge_energy_used_confidence,\n duration_min,\n start_battery_level,\n end_battery_level,\n start_[[preferred_range]]_range_km,\n end_[[preferred_range]]_range_km,\n outside_temp_avg,\n c.id,\n lag(end_[[preferred_range]]_range_km) OVER (ORDER BY start_date) - start_[[preferred_range]]_range_km AS range_loss,\n p.odometer - lag(p.odometer) OVER (ORDER BY start_date) AS distance,\n cars.efficiency\n FROM\n charging_processes c\n LEFT JOIN positions p ON p.id = c.position_id\n LEFT JOIN cars ON cars.id = c.car_id\n LEFT JOIN addresses ON addresses.id = c.address_id\n LEFT JOIN geofences g ON g.id = geofence_id\nWHERE \n c.car_id = $car_id AND\n $__timeFilter(start_date)\nORDER BY\n start_date\n)\nSELECT\n start_date_ts,\n end_date_ts,\n start_date,\n end_date,\n COALESCE(geofence_name, address) as address, \n duration_min,\n charge_energy_added,\n charge_energy_used,\n charge_energy_added / charge_energy_used as charging_efficiency,\n round(charge_energy_used_confidence::numeric, 2) * 100 as charge_energy_used_confidence,\n charge_energy_added * 60 / NULLIF (duration_min, 0) AS charge_energy_added_per_hour,\n convert_km((end_[[preferred_range]]_range_km - start_[[preferred_range]]_range_km) * 60 / NULLIF (duration_min, 0), '$length_unit') AS range_added_per_hour_$length_unit,\n start_battery_level,\n end_battery_level,\n convert_km(start_[[preferred_range]]_range_km, '$length_unit') AS start_range_$length_unit,\n convert_km(end_[[preferred_range]]_range_km, '$length_unit') AS end_range_$length_unit,\n convert_km(distance, '$length_unit') AS distance_$length_unit,\n range_loss * efficiency AS consumption_kWh,\n range_loss * efficiency / NULLIF (distance, 0) * 100 * \n CASE WHEN '$length_unit' = 'km' THEN 1\n WHEN '$length_unit' = 'mi' THEN 1.60934\n END AS consumption_kWh_100$length_unit,\n id,\n CASE WHEN geofence_id IS NULL THEN CONCAT('new?lat=', latitude, '&lng=', longitude)\n WHEN geofence_id IS NOT NULL THEN CONCAT(geofence_id, '/edit')\n END as path\nFROM\n data\nWHERE\n (distance >= 0 OR distance IS NULL) AND (charge_energy_added IS NULL OR charge_energy_added > 0.1);\n ", "refId": "A", "select": [ [ diff --git a/lib/teslamate/custom_expressions.ex b/lib/teslamate/custom_expressions.ex index 80ee3f43..3b32ead1 100644 --- a/lib/teslamate/custom_expressions.ex +++ b/lib/teslamate/custom_expressions.ex @@ -1,6 +1,17 @@ defmodule TeslaMate.CustomExpressions do import Ecto.Query, warn: false + defmacro c_if(condition, do: do_clause, else: else_clause) do + quote do + fragment( + "CASE WHEN ? THEN ? ELSE ? END", + unquote(condition), + unquote(do_clause), + unquote(else_clause) + ) + end + end + defmacro duration_min(a, b) do quote do fragment( diff --git a/lib/teslamate/locations/geo_fence.ex b/lib/teslamate/locations/geo_fence.ex index ee745a1f..b0cdf756 100644 --- a/lib/teslamate/locations/geo_fence.ex +++ b/lib/teslamate/locations/geo_fence.ex @@ -3,7 +3,7 @@ defmodule TeslaMate.Locations.GeoFence do import Ecto.Changeset import Ecto.Query - import TeslaMate.CustomExpressions + import TeslaMate.CustomExpressions, only: [within_geofence?: 3] alias TeslaMate.Log.{ChargingProcess, Drive} diff --git a/lib/teslamate/log.ex b/lib/teslamate/log.ex index 9f9172ef..b1f6f494 100644 --- a/lib/teslamate/log.ex +++ b/lib/teslamate/log.ex @@ -5,8 +5,8 @@ defmodule TeslaMate.Log do require Logger - import Ecto.Query, warn: false import TeslaMate.CustomExpressions + import Ecto.Query, warn: false alias TeslaMate.{Repo, Locations, Mapping, Settings} @@ -299,7 +299,9 @@ defmodule TeslaMate.Log do end_ideal_range_km: nil, end_rated_range_km: nil, end_battery_level: nil, - duration_min: nil + duration_min: nil, + charge_energy_used: nil, + charge_energy_used_confidence: nil }) |> Repo.update() end @@ -312,11 +314,23 @@ defmodule TeslaMate.Log do settings = Settings.get_settings!() + charging_interval = Keyword.get(opts, :charging_interval) + charge_energy_used_confidence = calculate_confidence(process_id, charging_interval) + stats = Charge |> where(charging_process_id: ^process_id) |> select([c], %{ charge_energy_added: max(c.charge_energy_added) - min(c.charge_energy_added), + charge_energy_used: + sum( + c_if is_nil(c.charger_phases) do + c.charger_power + else + c.charger_actual_current * c.charger_voltage * + c_if(c.charger_phases == 2, do: 3, else: c.charger_phases) / 1000.0 + end + ) * ^charging_interval / 3600, start_ideal_range_km: min(c.ideal_battery_range_km), end_ideal_range_km: max(c.ideal_battery_range_km), start_rated_range_km: min(c.rated_battery_range_km), @@ -328,6 +342,8 @@ defmodule TeslaMate.Log do }) |> Repo.one() |> Map.put(:end_date, Keyword.get_lazy(opts, :date, &DateTime.utc_now/0)) + |> Map.put(:charge_energy_used_confidence, charge_energy_used_confidence) + |> Map.put(:interval_sec, charging_interval) with {:ok, cproc} <- charging_process |> ChargingProcess.changeset(stats) |> Repo.update(), {:ok, _car} <- recalculate_efficiency(charging_process.car, settings) do @@ -335,6 +351,35 @@ defmodule TeslaMate.Log do end end + defp calculate_confidence(_process_id, nil), do: nil + + defp calculate_confidence(process_id, charging_interval) do + {:ok, %{rows: [[confidence]]}} = + Repo.query( + """ + WITH deltas AS ( + SELECT + date - lag(date, 1) OVER (ORDER BY date) as delta + FROM + charges + WHERE + charging_process_id = $1 + ORDER BY + date + ) + SELECT + (NULLIF(count(*), 0) / NULLIF((select count(*) from deltas)::numeric, 0))::float as confidence + FROM + deltas + WHERE + delta >= $2 * INTERVAL '1 second' and delta <= ($2 + 1) * INTERVAL '1 second'; + """, + [process_id, charging_interval] + ) + + confidence + end + defp recalculate_efficiency(car, settings, opts \\ [{5, 8}, {4, 5}, {3, 3}, {2, 2}]) defp recalculate_efficiency(car, _settings, []), do: {:ok, car} diff --git a/lib/teslamate/log/charging_process.ex b/lib/teslamate/log/charging_process.ex index fab6961d..84c8e5a7 100644 --- a/lib/teslamate/log/charging_process.ex +++ b/lib/teslamate/log/charging_process.ex @@ -6,9 +6,13 @@ defmodule TeslaMate.Log.ChargingProcess do alias TeslaMate.Log.{Charge, Car, Position} schema "charging_processes" do + field :interval_sec, :integer + field :start_date, :utc_datetime field :end_date, :utc_datetime field :charge_energy_added, :float + field :charge_energy_used, :float + field :charge_energy_used_confidence, :float field :start_ideal_range_km, :float field :end_ideal_range_km, :float field :start_rated_range_km, :float @@ -31,9 +35,12 @@ defmodule TeslaMate.Log.ChargingProcess do charging_state |> cast(attrs, [ :geofence_id, + :interval_sec, :start_date, :end_date, :charge_energy_added, + :charge_energy_used, + :charge_energy_used_confidence, :start_ideal_range_km, :end_ideal_range_km, :start_rated_range_km, @@ -44,6 +51,8 @@ defmodule TeslaMate.Log.ChargingProcess do :outside_temp_avg ]) |> validate_required([:car_id, :start_date]) + |> validate_number(:interval_sec, greater_than: 0) + |> validate_number(:charge_energy_used_confidence, greater_than: 0, less_than_or_equal_to: 1.0) |> foreign_key_constraint(:car_id) |> foreign_key_constraint(:position_id) |> foreign_key_constraint(:address_id) diff --git a/lib/teslamate/vehicles/vehicle.ex b/lib/teslamate/vehicles/vehicle.ex index 0c4b7087..8b9c8b7a 100644 --- a/lib/teslamate/vehicles/vehicle.ex +++ b/lib/teslamate/vehicles/vehicle.ex @@ -21,7 +21,10 @@ defmodule TeslaMate.Vehicles.Vehicle do alias __MODULE__, as: Data @topic inspect(__MODULE__) + @asleep_interval 60 + @charging_interval 5 + @driving_interval 2.5 def child_spec(arg) do %{ @@ -296,7 +299,7 @@ defmodule TeslaMate.Vehicles.Vehicle do call(data.deps.log, :start_state, [data.car.id, :asleep]) {:next_state, {:asleep, @asleep_interval}, %Data{data | last_state_change: last_state_change}, - [notify_subscribers(), schedule_fetch(30)]} + [notify_subscribers(), schedule_fetch()]} end def handle_event(:internal, {:update, :offline}, :start, data) do @@ -350,7 +353,7 @@ defmodule TeslaMate.Vehicles.Vehicle do {:next_state, {:driving, :available, drive_id}, %Data{data | last_state_change: DateTime.utc_now(), last_used: DateTime.utc_now()}, - [notify_subscribers(), schedule_fetch(2.5)]} + [notify_subscribers(), schedule_fetch(@driving_interval)]} %{charge_state: %Charge{charging_state: charging_state, battery_level: lvl}} when charging_state in ["Starting", "Charging"] -> @@ -362,7 +365,7 @@ defmodule TeslaMate.Vehicles.Vehicle do {:next_state, {:charging, charging_state, charge_id}, %Data{data | last_state_change: DateTime.utc_now(), last_used: DateTime.utc_now()}, - [notify_subscribers(), schedule_fetch(2.5)]} + [notify_subscribers(), schedule_fetch(@charging_interval)]} _ -> try_to_suspend(vehicle, :online, data) @@ -387,13 +390,8 @@ defmodule TeslaMate.Vehicles.Vehicle do :ok = insert_charge(pid, vehicle, data) - interval = - vehicle.charge_state - |> Map.get(:charger_power) - |> determince_interval() - {:next_state, {:charging, "Charging", pid}, %Data{data | last_used: DateTime.utc_now()}, - [notify_subscribers(), schedule_fetch(interval)]} + [notify_subscribers(), schedule_fetch(@charging_interval)]} {"Complete", "Complete"} -> try_to_suspend(vehicle, s, data) @@ -402,7 +400,10 @@ defmodule TeslaMate.Vehicles.Vehicle do :ok = insert_charge(pid, vehicle, data) {:ok, %Log.ChargingProcess{duration_min: duration, charge_energy_added: added}} = - call(data.deps.log, :complete_charging_process, [pid]) + call(data.deps.log, :complete_charging_process, [ + pid, + [charging_interval: @charging_interval] + ]) Logger.info("Charging / Complete / #{Float.round(added, 2)} kWh – #{duration} min", car_id: data.car.id @@ -410,11 +411,14 @@ defmodule TeslaMate.Vehicles.Vehicle do {:next_state, {:charging, "Complete", pid}, %Data{data | last_state_change: DateTime.utc_now(), last_used: DateTime.utc_now()}, - [notify_subscribers(), schedule_fetch()]} + [notify_subscribers(), schedule_fetch(@charging_interval * 3)]} {state, _} -> {:ok, %Log.ChargingProcess{duration_min: duration, charge_energy_added: added}} = - call(data.deps.log, :complete_charging_process, [pid]) + call(data.deps.log, :complete_charging_process, [ + pid, + [charging_interval: @charging_interval] + ]) Logger.info("Charging / #{state} / #{added} kWh – #{duration} min", car_id: data.car.id) @@ -529,7 +533,7 @@ defmodule TeslaMate.Vehicles.Vehicle do :ok = insert_position(vehicle, data, drive_id: did) {:next_state, {:driving, :available, did}, %Data{data | last_used: DateTime.utc_now()}, - [notify_subscribers(), schedule_fetch(2.5)]} + [notify_subscribers(), schedule_fetch(@driving_interval)]} shift_state when is_nil(shift_state) or shift_state == "P" -> {:ok, %Log.Drive{distance: km, duration_min: min}} = @@ -881,9 +885,6 @@ defmodule TeslaMate.Vehicles.Vehicle do Map.put(vehicle, :charge_state, charge_state) end - defp determince_interval(n) when not is_nil(n) and n > 0, do: round(725 / n) |> min(30) - defp determince_interval(_), do: 15 - defp fuse_name(:vehicle_not_found, car_id), do: :"#{__MODULE__}_#{car_id}_not_found" defp fuse_name(:api_error, car_id), do: :"#{__MODULE__}_#{car_id}_api_error" diff --git a/lib/teslamate/vehicles/vehicle/summary.ex b/lib/teslamate/vehicles/vehicle/summary.ex index b651b15a..6a2e98af 100644 --- a/lib/teslamate/vehicles/vehicle/summary.ex +++ b/lib/teslamate/vehicles/vehicle/summary.ex @@ -76,7 +76,7 @@ defmodule TeslaMate.Vehicles.Vehicle.Summary do charge_port_door_open: charge(vehicle, :charge_port_door_open), charger_actual_current: charge(vehicle, :charger_actual_current), charger_phases: charge(vehicle, :charger_phases), - charger_power: charge(vehicle, :charger_power), + charger_power: charger_power(vehicle), charger_voltage: charge(vehicle, :charger_voltage), est_battery_range_km: charge(vehicle, :est_battery_range) |> miles_to_km(2), ideal_battery_range_km: charge(vehicle, :ideal_battery_range) |> miles_to_km(2), @@ -101,6 +101,17 @@ defmodule TeslaMate.Vehicles.Vehicle.Summary do defp charge(vehicle, key), do: get_in_struct(vehicle, [:charge_state, key]) + defp charger_power(%Vehicle{charge_state: %Charge{charger_phases: nil} = c}) do + c.charger_power + end + + defp charger_power(%Vehicle{charge_state: %Charge{} = c}) do + c.charger_actual_current * c.charger_voltage * + if(c.charger_phases == 2, do: 3, else: c.charger_phases) / 1000.0 + end + + defp charger_power(_vehicle), do: nil + defp speed(%Vehicle{drive_state: %Drive{speed: s}}) when not is_nil(s), do: mph_to_kmh(s) defp speed(_vehicle), do: nil diff --git a/priv/repo/migrations/20191017003836_add_est_total_charge_energy.exs b/priv/repo/migrations/20191017003836_add_est_total_charge_energy.exs new file mode 100644 index 00000000..5066347a --- /dev/null +++ b/priv/repo/migrations/20191017003836_add_est_total_charge_energy.exs @@ -0,0 +1,11 @@ +defmodule TeslaMate.Repo.Migrations.AddEstTotalChargeEnergy do + use Ecto.Migration + + def change do + alter table(:charging_processes) do + add(:charge_energy_used, :float) + add(:charge_energy_used_confidence, :float) + add(:interval_sec, :integer) + end + end +end diff --git a/test/teslamate/log/log_charging_test.exs b/test/teslamate/log/log_charging_test.exs index f2c078c9..06b6c381 100644 --- a/test/teslamate/log/log_charging_test.exs +++ b/test/teslamate/log/log_charging_test.exs @@ -479,7 +479,7 @@ defmodule TeslaMate.LogChargingTest do assert %Car{efficiency: 0.1522} = Log.get_car!(car_id) end - test "makes a rough estimate starting a two values" do + test "makes a rough estimate starting at two values" do ## 2x assert %Car{id: car_id, efficiency: nil} = car_fixture(eid: 666, vid: 667, vin: "668") diff --git a/test/teslamate/log/log_state_test.exs b/test/teslamate/log/log_state_test.exs index 491e2f59..f205834e 100644 --- a/test/teslamate/log/log_state_test.exs +++ b/test/teslamate/log/log_state_test.exs @@ -61,27 +61,22 @@ defmodule TeslaMate.LogStateTest do assert {:ok, %State{state: :online, start_date: s0, end_date: nil}} = Log.start_state(car_id, :online) - Process.sleep(10) - assert {:ok, %State{state: :online, start_date: s1, end_date: nil}} = Log.start_state(another_car_id, :online) - Process.sleep(10) + Process.sleep(1010) assert {:ok, %State{state: :asleep, start_date: e1, end_date: nil}} = Log.start_state(another_car_id, :asleep) - Process.sleep(10) - assert {:ok, %State{state: :offline, start_date: e0, end_date: nil}} = Log.start_state(car_id, :offline) - assert [ - %State{state: :online, start_date: ^s0, end_date: ^e0}, - %State{state: :online, start_date: ^e1, end_date: ^e1}, - %State{state: :asleep, start_date: ^s1, end_date: nil}, - %State{state: :offline, start_date: ^s0, end_date: nil} - ] = State |> order_by(asc: :id) |> Repo.all() + assert [state_0, state_1, state_2, state_3] = State |> order_by(asc: :id) |> Repo.all() + assert %State{state: :online, start_date: ^s0, end_date: ^e0} = state_0 + assert %State{state: :online, start_date: ^s1, end_date: ^e1} = state_1 + assert %State{state: :asleep, start_date: ^e1, end_date: nil} = state_2 + assert %State{state: :offline, start_date: ^e0, end_date: nil} = state_3 end test "with invalid data returns error changeset" do diff --git a/test/teslamate/vehicles/vehicle/charging_test.exs b/test/teslamate/vehicles/vehicle/charging_test.exs index fe7c9806..23785757 100644 --- a/test/teslamate/vehicles/vehicle/charging_test.exs +++ b/test/teslamate/vehicles/vehicle/charging_test.exs @@ -70,9 +70,9 @@ defmodule TeslaMate.Vehicles.Vehicle.ChargingTest do assert DateTime.diff(s1, s2, :nanosecond) < 0 # Completed - assert_receive {:complete_charging_process, ^charging_id, []} + assert_receive {:complete_charging_process, ^charging_id, [charging_interval: 5]} # Unplugged - assert_receive {:complete_charging_process, ^charging_id, []} + assert_receive {:complete_charging_process, ^charging_id, [charging_interval: 5]} assert_receive {:start_state, ^car_id, :online} assert_receive {:insert_position, ^car_id, %{}} @@ -125,9 +125,9 @@ defmodule TeslaMate.Vehicles.Vehicle.ChargingTest do assert_receive {:insert_charge, ^charging_id, %{date: _, charge_energy_added: 0.3}} assert_receive {:pubsub, {:broadcast, _, _, %Summary{state: :charging_complete}}} - assert_receive {:complete_charging_process, ^charging_id, []} + assert_receive {:complete_charging_process, ^charging_id, [charging_interval: 5]} - assert_receive {:complete_charging_process, ^charging_id, []} + assert_receive {:complete_charging_process, ^charging_id, [charging_interval: 5]} assert_receive {:start_state, ^car_id, :online} assert_receive {:insert_position, ^car_id, %{}} diff --git a/test/teslamate/vehicles/vehicle/suspend_logging_test.exs b/test/teslamate/vehicles/vehicle/suspend_logging_test.exs index 1c37d05c..54e2f355 100644 --- a/test/teslamate/vehicles/vehicle/suspend_logging_test.exs +++ b/test/teslamate/vehicles/vehicle/suspend_logging_test.exs @@ -260,7 +260,7 @@ defmodule TeslaMate.Vehicles.Vehicle.SuspendLoggingTest do assert_receive {:insert_charge, ^charging_id, %{date: _, charge_energy_added: 1.5}} assert_receive {:pubsub, {:broadcast, _, _, %Summary{state: :charging_complete, since: s2}}} - assert_receive {:complete_charging_process, ^charging_id, []} + assert_receive {:complete_charging_process, ^charging_id, [charging_interval: 5]} assert DateTime.diff(s1, s2, :nanosecond) < 0 assert :ok = Vehicle.suspend_logging(name) diff --git a/test/teslamate/vehicles/vehicle/suspend_test.exs b/test/teslamate/vehicles/vehicle/suspend_test.exs index c174c133..28ac4930 100644 --- a/test/teslamate/vehicles/vehicle/suspend_test.exs +++ b/test/teslamate/vehicles/vehicle/suspend_test.exs @@ -173,7 +173,7 @@ defmodule TeslaMate.Vehicles.Vehicle.SuspendTest do assert_receive {:insert_charge, charge_id, %{date: _, charge_energy_added: 0.1}} assert_receive {:pubsub, {:broadcast, _, _, %Summary{state: :charging_complete}}} assert_receive {:insert_charge, ^charge_id, %{date: _, charge_energy_added: 0.2}} - assert_receive {:complete_charging_process, ^charge_id, []} + assert_receive {:complete_charging_process, ^charge_id, [charging_interval: 5]} assert_receive {:pubsub, {:broadcast, _, _, %Summary{state: :suspended}}} @@ -220,7 +220,7 @@ defmodule TeslaMate.Vehicles.Vehicle.SuspendTest do assert_receive {:insert_charge, ^charging_event, %{date: _, charge_energy_added: 0.15}} assert_receive {:pubsub, {:broadcast, _, _, %Summary{state: :charging_complete}}} - assert_receive {:complete_charging_process, ^charging_event, []} + assert_receive {:complete_charging_process, ^charging_event, [charging_interval: 5]} assert_receive {:pubsub, {:broadcast, _, _, %Summary{state: :suspended}}} diff --git a/test/teslamate/vehicles/vehicle_test.exs b/test/teslamate/vehicles/vehicle_test.exs index 3dbd6f6c..1ac6cf3b 100644 --- a/test/teslamate/vehicles/vehicle_test.exs +++ b/test/teslamate/vehicles/vehicle_test.exs @@ -89,7 +89,7 @@ defmodule TeslaMate.Vehicles.VehicleTest do assert_receive {:pubsub, {:broadcast, _, _, %Summary{state: :charging}}} # Charging (complete) - assert_receive {:complete_charging_process, ^charging_id, []} + assert_receive {:complete_charging_process, ^charging_id, [charging_interval: 5]} assert_receive {:insert_charge, ^charging_id, %{charge_energy_added: 5.0}} assert_receive {:pubsub, {:broadcast, _, _, %Summary{state: :charging_complete}}} @@ -103,7 +103,7 @@ defmodule TeslaMate.Vehicles.VehicleTest do assert_receive {:pubsub, {:broadcast, _, _, %Summary{state: :charging_complete}}} # Unplugging - assert_receive {:complete_charging_process, ^charging_id, []} + assert_receive {:complete_charging_process, ^charging_id, [charging_interval: 5]} # Online assert_receive {:start_state, ^car_id, :online}