From 7d90937d0f30625c5ce283388d489ffa5062e49a Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Mon, 4 Sep 2023 18:20:51 +0200 Subject: [PATCH] Publish mqtt string stats values periodically if they are set to zero if unreachable --- include/MqttHandleInverter.h | 3 +++ src/MqttHandleInverter.cpp | 8 +++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/MqttHandleInverter.h b/include/MqttHandleInverter.h index ee42750..e1b292e 100644 --- a/include/MqttHandleInverter.h +++ b/include/MqttHandleInverter.h @@ -3,6 +3,7 @@ #include "Configuration.h" #include +#include #include class MqttHandleInverterClass { @@ -19,6 +20,8 @@ private: uint32_t _lastPublishStats[INV_MAX_COUNT]; uint32_t _lastPublish; + TimeoutHelper _statsTimeout; + FieldId_t _publishFields[14] = { FLD_UDC, FLD_IDC, diff --git a/src/MqttHandleInverter.cpp b/src/MqttHandleInverter.cpp index c9621e3..9ca3679 100644 --- a/src/MqttHandleInverter.cpp +++ b/src/MqttHandleInverter.cpp @@ -14,6 +14,8 @@ #define TOPIC_SUB_POWER "power" #define TOPIC_SUB_RESTART "restart" +#define PUBLISH_MAX_INTERVAL 60000 + MqttHandleInverterClass MqttHandleInverter; void MqttHandleInverterClass::init() @@ -92,9 +94,13 @@ void MqttHandleInverterClass::loop() } uint32_t lastUpdate = inv->Statistics()->getLastUpdate(); - if (lastUpdate > 0 && lastUpdate != _lastPublishStats[i]) { + if (lastUpdate > 0 && (lastUpdate != _lastPublishStats[i] || (inv->getZeroValuesIfUnreachable() && _statsTimeout.occured()))) { _lastPublishStats[i] = lastUpdate; + // At first a change of the stats have to occour. Then the stats + // are published on every change or every 60 seconds + _statsTimeout.set(PUBLISH_MAX_INTERVAL); + // Loop all channels for (auto& t : inv->Statistics()->getChannelTypes()) { for (auto& c : inv->Statistics()->getChannelsByType(t)) {