Feature: make power meter polling intervals configurable

this change makes the respective setting accessible from the web UI.
This commit is contained in:
Bernhard Kirchen 2024-05-23 20:26:39 +02:00
parent b891a4c1a3
commit a2a9debd02
10 changed files with 51 additions and 5 deletions

View File

@ -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<float, POWERMETER_HTTP_JSON_MAX_VALUES>;

View File

@ -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.

View File

@ -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:

View File

@ -22,6 +22,7 @@ public:
bool init() final;
void loop() final;
float getPowerTotal() const final;
bool isDataValid() const final;
void doMqttPublish() const final;
private:

View File

@ -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]);

View File

@ -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) {

View File

@ -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<std::mutex> l(_mutex);

View File

@ -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",

View File

@ -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",

View File

@ -51,6 +51,14 @@
:text="$t('powermeteradmin.SDM')"
textVariant="text-bg-primary"
add-space>
<InputElement :label="$t('powermeteradmin.pollingInterval')"
v-model="powerMeterConfigList.serial_sdm.polling_interval"
type="number"
min=1
max=15
:postfix="$t('powermeteradmin.seconds')" />
<div class="row mb-3">
<label for="sdmaddress" class="col-sm-2 col-form-label">{{ $t('powermeteradmin.sdmaddress') }}:</label>
<div class="col-sm-10">
@ -70,6 +78,14 @@
v-model="powerMeterConfigList.http_json.individual_requests"
type="checkbox"
wide />
<InputElement :label="$t('powermeteradmin.pollingInterval')"
v-model="powerMeterConfigList.http_json.polling_interval"
type="number"
min=1
max=15
:postfix="$t('powermeteradmin.seconds')"
wide />
</CardElement>
<div class="alert alert-secondary mt-5" role="alert">
@ -156,6 +172,13 @@
textVariant="text-bg-primary"
add-space>
<InputElement :label="$t('powermeteradmin.pollingInterval')"
v-model="powerMeterConfigList.http_sml.polling_interval"
type="number"
min=1
max=15
:postfix="$t('powermeteradmin.seconds')" />
<HttpRequestSettings :cfg="powerMeterConfigList.http_sml.http_request" />
</CardElement>