From a2a9debd025dc7d1598f95b072173e94b0751218 Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Thu, 23 May 2024 20:26:39 +0200 Subject: [PATCH] Feature: make power meter polling intervals configurable this change makes the respective setting accessible from the web UI. --- include/PowerMeterHttpJson.h | 1 + include/PowerMeterHttpSml.h | 1 + include/PowerMeterProvider.h | 2 +- include/PowerMeterSerialSdm.h | 1 + src/PowerMeterHttpJson.cpp | 6 ++++++ src/PowerMeterHttpSml.cpp | 6 ++++++ src/PowerMeterSerialSdm.cpp | 6 ++++++ webapp/src/locales/de.json | 5 +++-- webapp/src/locales/en.json | 5 +++-- webapp/src/views/PowerMeterAdminView.vue | 23 +++++++++++++++++++++++ 10 files changed, 51 insertions(+), 5 deletions(-) diff --git a/include/PowerMeterHttpJson.h b/include/PowerMeterHttpJson.h index afccb05a..110517c9 100644 --- a/include/PowerMeterHttpJson.h +++ b/include/PowerMeterHttpJson.h @@ -20,6 +20,7 @@ public: bool init() final; void loop() final; float getPowerTotal() const final; + bool isDataValid() const final; void doMqttPublish() const final; using power_values_t = std::array; diff --git a/include/PowerMeterHttpSml.h b/include/PowerMeterHttpSml.h index 30444b6a..eb201a1b 100644 --- a/include/PowerMeterHttpSml.h +++ b/include/PowerMeterHttpSml.h @@ -15,6 +15,7 @@ public: bool init() final; void loop() final; + bool isDataValid() const final; // returns an empty string on success, // returns an error message otherwise. diff --git a/include/PowerMeterProvider.h b/include/PowerMeterProvider.h index 4cd1c888..0ca7bcdf 100644 --- a/include/PowerMeterProvider.h +++ b/include/PowerMeterProvider.h @@ -23,9 +23,9 @@ public: virtual void loop() = 0; virtual float getPowerTotal() const = 0; + virtual bool isDataValid() const; uint32_t getLastUpdate() const { return _lastUpdate; } - bool isDataValid() const; void mqttLoop() const; protected: diff --git a/include/PowerMeterSerialSdm.h b/include/PowerMeterSerialSdm.h index e98b286e..56a52e6e 100644 --- a/include/PowerMeterSerialSdm.h +++ b/include/PowerMeterSerialSdm.h @@ -22,6 +22,7 @@ public: bool init() final; void loop() final; float getPowerTotal() const final; + bool isDataValid() const final; void doMqttPublish() const final; private: diff --git a/src/PowerMeterHttpJson.cpp b/src/PowerMeterHttpJson.cpp index 822f2eb2..c199c41c 100644 --- a/src/PowerMeterHttpJson.cpp +++ b/src/PowerMeterHttpJson.cpp @@ -124,6 +124,12 @@ float PowerMeterHttpJson::getPowerTotal() const return sum; } +bool PowerMeterHttpJson::isDataValid() const +{ + uint32_t age = millis() - getLastUpdate(); + return getLastUpdate() > 0 && (age < (3 * _cfg.PollingInterval * 1000)); +} + void PowerMeterHttpJson::doMqttPublish() const { mqttPublish("power1", _powerValues[0]); diff --git a/src/PowerMeterHttpSml.cpp b/src/PowerMeterHttpSml.cpp index 7d64f442..799355c6 100644 --- a/src/PowerMeterHttpSml.cpp +++ b/src/PowerMeterHttpSml.cpp @@ -36,6 +36,12 @@ void PowerMeterHttpSml::loop() gotUpdate(); } +bool PowerMeterHttpSml::isDataValid() const +{ + uint32_t age = millis() - getLastUpdate(); + return getLastUpdate() > 0 && (age < (3 * _cfg.PollingInterval * 1000)); +} + String PowerMeterHttpSml::poll() { if (!_upHttpGetter) { diff --git a/src/PowerMeterSerialSdm.cpp b/src/PowerMeterSerialSdm.cpp index f5552aaa..3c9941f6 100644 --- a/src/PowerMeterSerialSdm.cpp +++ b/src/PowerMeterSerialSdm.cpp @@ -43,6 +43,12 @@ float PowerMeterSerialSdm::getPowerTotal() const return _phase1Power + _phase2Power + _phase3Power; } +bool PowerMeterSerialSdm::isDataValid() const +{ + uint32_t age = millis() - getLastUpdate(); + return getLastUpdate() > 0 && (age < (3 * _cfg.PollingInterval * 1000)); +} + void PowerMeterSerialSdm::doMqttPublish() const { std::lock_guard l(_mutex); diff --git a/webapp/src/locales/de.json b/webapp/src/locales/de.json index 25630a8d..2d668aa0 100644 --- a/webapp/src/locales/de.json +++ b/webapp/src/locales/de.json @@ -554,8 +554,9 @@ "PowerMeterConfiguration": "Stromzähler Konfiguration", "PowerMeterEnable": "Aktiviere Stromzähler", "VerboseLogging": "@:base.VerboseLogging", - "PowerMeterParameter": "Power Meter Parameter", "PowerMeterSource": "Stromzählertyp", + "pollingInterval": "Abfrageintervall", + "seconds": "@:base.Seconds", "typeMQTT": "MQTT", "typeSDM1ph": "SDM mit 1 Phase (SDM120/220/230)", "typeSDM3ph": "SDM mit 3 Phasen (SDM72/630)", @@ -598,7 +599,7 @@ "headerKeyDescription": "Optional. Ein benutzerdefinierter HTTP header kann definiert werden. Nützlich um z.B. ein (zusätzlichen) Authentifizierungstoken zu übermitteln.", "headerValue": "HTTP Header - Wert", "timeout": "Zeitüberschreitung", - "milliSeconds": "ms" + "milliSeconds": "Millisekunden" }, "powerlimiteradmin": { "PowerLimiterSettings": "Dynamic Power Limiter Einstellungen", diff --git a/webapp/src/locales/en.json b/webapp/src/locales/en.json index 8b5f7d0e..66328d82 100644 --- a/webapp/src/locales/en.json +++ b/webapp/src/locales/en.json @@ -556,8 +556,9 @@ "PowerMeterConfiguration": "Power Meter Configuration", "PowerMeterEnable": "Enable Power Meter", "VerboseLogging": "@:base.VerboseLogging", - "PowerMeterParameter": "Power Meter Parameter", "PowerMeterSource": "Power Meter type", + "pollingInterval": "Polling Interval", + "seconds": "@:base.Seconds", "typeMQTT": "MQTT", "typeSDM1ph": "SDM for 1 phase (SDM120/220/230)", "typeSDM3ph": "SDM for 3 phases (SDM72/630)", @@ -600,7 +601,7 @@ "headerKeyDescription": "Optional. A custom HTTP header key-value pair can be defined. Useful, e.g., to send an (additional) authentication token.", "headerValue": "HTTP Header - Value", "timeout": "Timeout", - "milliSeconds": "ms" + "milliSeconds": "Milliseconds" }, "powerlimiteradmin": { "PowerLimiterSettings": "Dynamic Power Limiter Settings", diff --git a/webapp/src/views/PowerMeterAdminView.vue b/webapp/src/views/PowerMeterAdminView.vue index c389af4d..63535285 100644 --- a/webapp/src/views/PowerMeterAdminView.vue +++ b/webapp/src/views/PowerMeterAdminView.vue @@ -51,6 +51,14 @@ :text="$t('powermeteradmin.SDM')" textVariant="text-bg-primary" add-space> + + +
@@ -70,6 +78,14 @@ v-model="powerMeterConfigList.http_json.individual_requests" type="checkbox" wide /> + +