diff --git a/assets/js/components/Config/GeneralConfig.vue b/assets/js/components/Config/GeneralConfig.vue index d1e2997f3..4da3ce528 100644 --- a/assets/js/components/Config/GeneralConfig.vue +++ b/assets/js/components/Config/GeneralConfig.vue @@ -87,7 +87,7 @@ export default { }, computed: { telemetryEnabled() { - return settings.telemetry === true; + return store.state?.telemetry === true; }, hiddenFeatures() { return settings.hiddenFeatures === true; diff --git a/assets/js/components/GlobalSettings/GlobalSettingsModal.vue b/assets/js/components/GlobalSettings/GlobalSettingsModal.vue index d7545af1f..03a2c5273 100644 --- a/assets/js/components/GlobalSettings/GlobalSettingsModal.vue +++ b/assets/js/components/GlobalSettings/GlobalSettingsModal.vue @@ -4,7 +4,7 @@ :title="$t('settings.title')" data-testid="global-settings-modal" > - + @@ -19,6 +19,7 @@ export default defineComponent({ components: { GenericModal, UserInterfaceSettings }, props: { sponsor: { type: Object as PropType, default: () => ({}) }, + telemetry: Boolean, }, }); diff --git a/assets/js/components/GlobalSettings/UserInterfaceSettings.vue b/assets/js/components/GlobalSettings/UserInterfaceSettings.vue index a87dd7d33..8bbdd389e 100644 --- a/assets/js/components/GlobalSettings/UserInterfaceSettings.vue +++ b/assets/js/components/GlobalSettings/UserInterfaceSettings.vue @@ -58,7 +58,11 @@ /> - +
@@ -116,6 +120,7 @@ export default defineComponent({ components: { TelemetrySettings, FormRow, SelectGroup }, props: { sponsor: Object as PropType, + telemetry: Boolean, }, data() { return { diff --git a/assets/js/components/Savings/Savings.vue b/assets/js/components/Savings/Savings.vue index 0cecbde66..1a87b4d02 100644 --- a/assets/js/components/Savings/Savings.vue +++ b/assets/js/components/Savings/Savings.vue @@ -190,7 +190,10 @@
- +
@@ -226,6 +229,7 @@ export default defineComponent({ co2Configured: Boolean, sponsor: Object as PropType, currency: String as PropType, + telemetry: Boolean, }, data() { return { diff --git a/assets/js/components/Site/Site.vue b/assets/js/components/Site/Site.vue index 7b90e3f7e..fcdbb79f5 100644 --- a/assets/js/components/Site/Site.vue +++ b/assets/js/components/Site/Site.vue @@ -153,6 +153,7 @@ export default defineComponent({ smartFeedInPriorityAvailable: Boolean, fatal: Object, forecast: Object as PropType, + telemetry: Boolean, }, computed: { batteryConfigured() { @@ -216,6 +217,7 @@ export default defineComponent({ co2Configured: this.tariffCo2 !== undefined, priceConfigured: this.tariffGrid !== undefined, currency: this.currency, + telemetry: this.telemetry, }, }; }, diff --git a/assets/js/components/TelemetrySettings.vue b/assets/js/components/TelemetrySettings.vue index 1888cc37a..ad21a9af3 100644 --- a/assets/js/components/TelemetrySettings.vue +++ b/assets/js/components/TelemetrySettings.vue @@ -3,7 +3,7 @@
; if (e.response) { this.error = parseMarkdown("**Error:** " + e.response.data.error); - settings.telemetry = false; } } }, - async update() { - if (settings.telemetry !== null) { - return; - } - try { - const response = await api.get("settings/telemetry", { - validateStatus: () => true, - }); - if (response.status === 200) { - settings.telemetry = response.data.result; - } - } catch (err) { - console.error(err); - } - }, }, }); diff --git a/assets/js/settings.ts b/assets/js/settings.ts index 6c4acea6b..22b30eb82 100644 --- a/assets/js/settings.ts +++ b/assets/js/settings.ts @@ -58,7 +58,6 @@ function saveArray(key: string) { } export interface Settings { - telemetry: boolean | null; // status is unknown on start locale: keyof typeof LOCALES | null; theme: THEME | null; unit: string; @@ -78,7 +77,6 @@ export interface Settings { } const settings: Settings = reactive({ - telemetry: null, locale: read(SETTINGS_LOCALE), theme: read(SETTINGS_THEME), unit: read(SETTINGS_UNIT), diff --git a/cmd/root.go b/cmd/root.go index 625dffea6..ab9379b55 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -189,7 +189,7 @@ func runRoot(cmd *cobra.Command, args []string) { // setup telemetry if err == nil { - telemetry.Create(conf.Plant) + telemetry.Create(conf.Plant, valueChan) if conf.Telemetry { err = telemetry.Enable(true) } diff --git a/server/http.go b/server/http.go index 7816d5e0d..327246f1a 100644 --- a/server/http.go +++ b/server/http.go @@ -154,7 +154,6 @@ func (s *HTTPd) RegisterSiteHandlers(site site.API, valueChan chan<- util.Param) "sessions": {"GET", "/sessions", sessionHandler}, "updatesession": {"PUT", "/session/{id:[0-9]+}", updateSessionHandler}, "deletesession": {"DELETE", "/session/{id:[0-9]+}", deleteSessionHandler}, - "telemetry": {"GET", "/settings/telemetry", getHandler(telemetry.Enabled)}, "telemetry2": {"POST", "/settings/telemetry/{value:[01truefalse]+}", boolHandler(telemetry.Enable, telemetry.Enabled)}, } diff --git a/util/telemetry/charge.go b/util/telemetry/charge.go index 86cd4b27a..4bab9194e 100644 --- a/util/telemetry/charge.go +++ b/util/telemetry/charge.go @@ -22,6 +22,7 @@ const ( var ( instanceID string + publisher chan<- util.Param mu sync.Mutex updated time.Time @@ -33,6 +34,13 @@ func Enabled() bool { return enabled && sponsor.IsAuthorizedForApi() && instanceID != "" } +// publish publishes the current telemetry enabled state +func publish() { + if publisher != nil { + publisher <- util.Param{Key: keys.Telemetry, Val: Enabled()} + } +} + func Enable(enable bool) error { if enable { if !sponsor.IsAuthorized() { @@ -44,16 +52,20 @@ func Enable(enable bool) error { } settings.SetBool(keys.Telemetry, enable) + publish() return nil } -func Create(machineID string) { +func Create(machineID string, valueChan chan<- util.Param) { instanceID = machineID + publisher = valueChan if machineID == "" { instanceID = machine.ProtectedID("evcc-api") } + + publish() } // UpdateChargeProgress uploads power and energy data every 30 seconds