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

* Add ability to enable and disable cars

* Add default value for enabled in car_settings.

* Fix unit tests.

* Fix formatting.

* Update text to be more descriptive

* Update lables.
This commit is contained in:
mark3-dev
2024-07-05 03:01:16 -04:00
committed by GitHub
parent 9ba6fc8f0d
commit c90cde871d
25 changed files with 737 additions and 582 deletions
+2 -1
View File
@@ -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}
+11 -1
View File
@@ -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
@@ -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
@@ -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
+3 -1
View File
@@ -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
@@ -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
+1
View File
@@ -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,
@@ -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("Data Collection") %></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>