Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add ability to enable and disable data collection for cars #3993

Merged
merged 6 commits into from
Jul 5, 2024
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion lib/teslamate/import.ex
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,8 @@ defmodule TeslaMate.Import do
settings = %CarSettings{
suspend_min: 0,
suspend_after_idle_min: 99999,
use_streaming_api: false
use_streaming_api: false,
enabled: true
}

%Car{car | settings: settings}
Expand Down
12 changes: 11 additions & 1 deletion lib/teslamate/settings.ex
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ defmodule TeslaMate.Settings do
alias TeslaMate.Repo

alias __MODULE__.{GlobalSettings, CarSettings}
alias TeslaMate.{Log, Locations}
alias TeslaMate.{Log, Locations, Vehicles}
alias TeslaMate.Log.Car
import Core.Dependency, only: [call: 2]

def get_global_settings! do
case Repo.all(GlobalSettings) do
Expand Down Expand Up @@ -46,6 +47,7 @@ defmodule TeslaMate.Settings do
def update_car_settings(%CarSettings{car: %Car{}} = pre, attrs) do
Repo.transaction(fn ->
with {:ok, post} <- pre |> CarSettings.changeset(attrs) |> Repo.update(),
:ok <- on_enabled_change(pre, post),
:ok <- broadcast(pre.car, post) do
post
else
Expand Down Expand Up @@ -84,6 +86,14 @@ defmodule TeslaMate.Settings do
Locations.refresh_addresses(lang)
end

def on_enabled_change(%CarSettings{enabled: preEnabled}, %CarSettings{enabled: postEnabled}) do
if preEnabled != postEnabled do
call(Vehicles, :restart)
end

:ok
end

defp broadcast(car, settings) do
Phoenix.PubSub.broadcast(TeslaMate.PubSub, topic(car), settings)
rescue
Expand Down
4 changes: 3 additions & 1 deletion lib/teslamate/settings/car_settings.ex
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ defmodule TeslaMate.Settings.CarSettings do
field :req_not_unlocked, :boolean, default: false
field :free_supercharging, :boolean, default: false
field :use_streaming_api, :boolean, default: true
field :enabled, :boolean, default: true

has_one :car, Car, foreign_key: :settings_id
end
Expand All @@ -19,7 +20,8 @@ defmodule TeslaMate.Settings.CarSettings do
:suspend_after_idle_min,
:req_not_unlocked,
:free_supercharging,
:use_streaming_api
:use_streaming_api,
:enabled
]

@doc false
Expand Down
1 change: 1 addition & 0 deletions lib/teslamate/vehicles.ex
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ defmodule TeslaMate.Vehicles do
|> Keyword.get_lazy(:vehicles, &list_vehicles!/0)
|> Enum.map(&{Keyword.get(opts, :vehicle, Vehicle), car: create_or_update!(&1)})
|> Enum.uniq_by(fn {_mod, car: %Car{id: id}} -> id end)
|> Enum.filter(fn {_mod, car: %Car{settings: settings}} -> settings.enabled end)

Supervisor.init(children,
strategy: :one_for_one,
Expand Down
19 changes: 19 additions & 0 deletions lib/teslamate_web/live/settings_live/index.html.heex
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,25 @@
phx-change="change"
as={:"car_settings_#{@car}"}
>
<div class="columns is-mobile is-centered">
<div class="column">
<h2 class="title is-4"><%= gettext("Enabled") %></h2>
<div class="field is-horizontal center-vertically">
<div class="field-label is-normal is-paddingless">
<%= label(f, :enabled, gettext("Enabled"), class: "label") %>
</div>
<div class="field-body">
<div class="field">
<div class="control">
<%= checkbox(f, :enabled, class: "switch is-rounded is-success") %>
<%= label(f, :enabled, nil) %>
</div>
</div>
</div>
</div>
</div>
</div>

<div class="columns is-mobile is-centered">
<div class="column">
<h2 class="title is-4"><%= gettext("Sleep Mode") %></h2>
Expand Down
66 changes: 34 additions & 32 deletions priv/gettext/default.pot
Original file line number Diff line number Diff line change
Expand Up @@ -112,17 +112,17 @@ msgstr ""
msgid "unavailable"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:216
#: lib/teslamate_web/live/settings_live/index.html.heex:235
#, elixir-autogen, elixir-format
msgid "Length"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:231
#: lib/teslamate_web/live/settings_live/index.html.heex:250
#, elixir-autogen, elixir-format
msgid "Temperature"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:213
#: lib/teslamate_web/live/settings_live/index.html.heex:232
#, elixir-autogen, elixir-format
msgid "Units"
msgstr ""
Expand All @@ -147,7 +147,7 @@ msgstr ""
msgid "Geo-Fences"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:55
#: lib/teslamate_web/live/settings_live/index.html.heex:74
#, elixir-autogen, elixir-format
msgid "Idle Time Before Trying to Sleep"
msgstr ""
Expand Down Expand Up @@ -183,13 +183,13 @@ msgstr ""
msgid "Saving..."
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:34
#: lib/teslamate_web/live/settings_live/index.html.heex:53
#, elixir-autogen, elixir-format
msgid "Time to Try Sleeping"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:45
#: lib/teslamate_web/live/settings_live/index.html.heex:68
#: lib/teslamate_web/live/settings_live/index.html.heex:64
#: lib/teslamate_web/live/settings_live/index.html.heex:87
#, elixir-autogen, elixir-format
msgid "min"
msgstr ""
Expand Down Expand Up @@ -246,12 +246,12 @@ msgstr ""
msgid "for"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:80
#: lib/teslamate_web/live/settings_live/index.html.heex:99
#, elixir-autogen, elixir-format
msgid "Requirements"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:88
#: lib/teslamate_web/live/settings_live/index.html.heex:107
#, elixir-autogen, elixir-format
msgid "Vehicle must be locked"
msgstr ""
Expand All @@ -266,22 +266,22 @@ msgstr ""
msgid "Charger Power"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:152
#: lib/teslamate_web/live/settings_live/index.html.heex:171
#, elixir-autogen, elixir-format
msgid "Preferred Range"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:148
#: lib/teslamate_web/live/settings_live/index.html.heex:167
#, elixir-autogen, elixir-format
msgid "Range"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:160
#: lib/teslamate_web/live/settings_live/index.html.heex:179
#, elixir-autogen, elixir-format
msgid "ideal"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:161
#: lib/teslamate_web/live/settings_live/index.html.heex:180
#, elixir-autogen, elixir-format
msgid "rated"
msgstr ""
Expand All @@ -291,7 +291,7 @@ msgstr ""
msgid "Range (ideal)"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:151
#: lib/teslamate_web/live/settings_live/index.html.heex:170
#, elixir-autogen, elixir-format
msgid "The car's estimate of remaining range is based on a fixed energy consumption in Wh/km. The Wh/km factor is determined by Tesla and is not country specific whereas the rated range is based on regulatory tests in the different markets for that vehicle."
msgstr ""
Expand Down Expand Up @@ -322,7 +322,7 @@ msgid "Outside Temperature"
msgstr ""

#: lib/teslamate_web/live/car_live/summary.html.heex:399
#: lib/teslamate_web/live/settings_live/index.html.heex:311
#: lib/teslamate_web/live/settings_live/index.html.heex:330
#, elixir-autogen, elixir-format
msgid "Version"
msgstr ""
Expand All @@ -342,29 +342,31 @@ msgstr ""
msgid "Remaining Time"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:286
#: lib/teslamate_web/live/settings_live/index.html.heex:305
#: lib/teslamate_web/templates/layout/root.html.heex:81
#, elixir-autogen, elixir-format
msgid "Dashboards"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:264
#: lib/teslamate_web/live/settings_live/index.html.heex:283
#, elixir-autogen, elixir-format
msgid "URLs"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:178
#: lib/teslamate_web/live/settings_live/index.html.heex:267
#: lib/teslamate_web/live/settings_live/index.html.heex:197
#: lib/teslamate_web/live/settings_live/index.html.heex:286
#, elixir-autogen, elixir-format
msgid "Web App"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:125
#: lib/teslamate_web/live/settings_live/index.html.heex:29
#: lib/teslamate_web/live/settings_live/index.html.heex:32
#: lib/teslamate_web/live/settings_live/index.html.heex:144
#, elixir-autogen, elixir-format
msgid "Enabled"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:29
#: lib/teslamate_web/live/settings_live/index.html.heex:48
#, elixir-autogen, elixir-format
msgid "Sleep Mode"
msgstr ""
Expand Down Expand Up @@ -421,12 +423,12 @@ msgstr ""
msgid "Fetching vehicle data ..."
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:193
#: lib/teslamate_web/live/settings_live/index.html.heex:212
#, elixir-autogen, elixir-format
msgid "Addresses"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:174
#: lib/teslamate_web/live/settings_live/index.html.heex:193
#, elixir-autogen, elixir-format
msgid "Language"
msgstr ""
Expand Down Expand Up @@ -465,17 +467,17 @@ msgstr ""
msgid "Sign in"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:103
#: lib/teslamate_web/live/settings_live/index.html.heex:122
#, elixir-autogen, elixir-format
msgid "Charge cost"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:106
#: lib/teslamate_web/live/settings_live/index.html.heex:125
#, elixir-autogen, elixir-format
msgid "Free Supercharging"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:142
#: lib/teslamate_web/live/settings_live/index.html.heex:161
#, elixir-autogen, elixir-format
msgid "General Settings"
msgstr ""
Expand Down Expand Up @@ -528,22 +530,22 @@ msgstr ""
msgid "Mileage"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:122
#: lib/teslamate_web/live/settings_live/index.html.heex:141
#, elixir-autogen, elixir-format
msgid "Streaming API"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:332
#: lib/teslamate_web/live/settings_live/index.html.heex:351
#, elixir-autogen, elixir-format
msgid "Documentation"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:322
#: lib/teslamate_web/live/settings_live/index.html.heex:341
#, elixir-autogen, elixir-format
msgid "GitHub"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:317
#: lib/teslamate_web/live/settings_live/index.html.heex:336
#: lib/teslamate_web/templates/layout/root.html.heex:168
#, elixir-autogen, elixir-format
msgid "Update available"
Expand All @@ -570,7 +572,7 @@ msgstr ""
msgid "Software Update available (%{version})"
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:350
#: lib/teslamate_web/live/settings_live/index.html.heex:369
#, elixir-autogen, elixir-format
msgid "Sign out"
msgstr ""
Expand Down Expand Up @@ -630,7 +632,7 @@ msgstr ""
msgid "To ensure that your <strong>Tesla API tokens are stored securely</strong>, an encryption key must be provided to TeslaMate via the <code>ENCRYPTION_KEY</code> environment variable. Otherwise, a <strong>login will be required after every restart</strong>."
msgstr ""

#: lib/teslamate_web/live/settings_live/index.html.heex:246
#: lib/teslamate_web/live/settings_live/index.html.heex:265
#, elixir-autogen, elixir-format
msgid "Tire Pressure"
msgstr ""
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
defmodule TeslaMate.Repo.Migrations.AddEnabledToCarSettings do
use Ecto.Migration

def change do
alter table(:car_settings) do
add :enabled, :boolean, null: false, default: true
end
end
end
11 changes: 8 additions & 3 deletions test/teslamate/settings_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -124,14 +124,16 @@ defmodule TeslaMate.SettingsTest do
suspend_after_idle_min: 60,
req_not_unlocked: true,
free_supercharging: true,
use_streaming_api: false
use_streaming_api: false,
enabled: true
}
@invalid_attrs %{
suspend_min: nil,
suspend_after_idle_min: nil,
req_not_unlocked: nil,
free_supercharging: nil,
use_streaming_api: nil
use_streaming_api: nil,
enabled: nil
}

test "get_car_settings/0 returns the settings" do
Expand All @@ -144,6 +146,7 @@ defmodule TeslaMate.SettingsTest do
assert settings.req_not_unlocked == false
assert settings.free_supercharging == false
assert settings.use_streaming_api == true
assert settings.enabled == true
end

test "update_car_settings/2 with valid data updates the settings" do
Expand All @@ -159,6 +162,7 @@ defmodule TeslaMate.SettingsTest do
assert settings.req_not_unlocked == true
assert settings.free_supercharging == true
assert settings.use_streaming_api == false
assert settings.enabled == true
end

test "update_car_settings/2 publishes the settings" do
Expand All @@ -185,7 +189,8 @@ defmodule TeslaMate.SettingsTest do
suspend_after_idle_min: ["can't be blank"],
suspend_min: ["can't be blank"],
free_supercharging: ["can't be blank"],
use_streaming_api: ["can't be blank"]
use_streaming_api: ["can't be blank"],
enabled: ["can't be blank"]
}

assert [^settings] = Settings.get_car_settings()
Expand Down
Loading