mirror of
https://github.com/teslamate-org/teslamate.git
synced 2026-01-24 21:06:08 +08:00
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:
@@ -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}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user