Skip to content

Commit

Permalink
Feature: make power meter polling intervals configurable
Browse files Browse the repository at this point in the history
this change makes the respective setting accessible from the web UI.
  • Loading branch information
schlimmchen committed Jun 27, 2024
1 parent b891a4c commit a2a9deb
Show file tree
Hide file tree
Showing 10 changed files with 51 additions and 5 deletions.
1 change: 1 addition & 0 deletions include/PowerMeterHttpJson.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class PowerMeterHttpJson : public PowerMeterProvider {
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>;
Expand Down
1 change: 1 addition & 0 deletions include/PowerMeterHttpSml.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ class PowerMeterHttpSml : public PowerMeterSml {

bool init() final;
void loop() final;
bool isDataValid() const final;

// returns an empty string on success,
// returns an error message otherwise.
Expand Down
2 changes: 1 addition & 1 deletion include/PowerMeterProvider.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ class PowerMeterProvider {

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:
Expand Down
1 change: 1 addition & 0 deletions include/PowerMeterSerialSdm.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class PowerMeterSerialSdm : public PowerMeterProvider {
bool init() final;
void loop() final;
float getPowerTotal() const final;
bool isDataValid() const final;
void doMqttPublish() const final;

private:
Expand Down
6 changes: 6 additions & 0 deletions src/PowerMeterHttpJson.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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]);
Expand Down
6 changes: 6 additions & 0 deletions src/PowerMeterHttpSml.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
6 changes: 6 additions & 0 deletions src/PowerMeterSerialSdm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
5 changes: 3 additions & 2 deletions webapp/src/locales/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -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)",
Expand Down Expand Up @@ -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",
Expand Down
5 changes: 3 additions & 2 deletions webapp/src/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -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)",
Expand Down Expand Up @@ -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",
Expand Down
23 changes: 23 additions & 0 deletions webapp/src/views/PowerMeterAdminView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -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">
Expand All @@ -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">
Expand Down Expand Up @@ -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>

Expand Down

0 comments on commit a2a9deb

Please sign in to comment.