diff --git a/include/MqttHandleInverter.h b/include/MqttHandleInverter.h index e1b292e..6f089cd 100644 --- a/include/MqttHandleInverter.h +++ b/include/MqttHandleInverter.h @@ -20,8 +20,6 @@ private: uint32_t _lastPublishStats[INV_MAX_COUNT]; uint32_t _lastPublish; - TimeoutHelper _statsTimeout; - FieldId_t _publishFields[14] = { FLD_UDC, FLD_IDC, diff --git a/lib/Hoymiles/src/parser/StatisticsParser.cpp b/lib/Hoymiles/src/parser/StatisticsParser.cpp index d415fc3..71c1ebb 100644 --- a/lib/Hoymiles/src/parser/StatisticsParser.cpp +++ b/lib/Hoymiles/src/parser/StatisticsParser.cpp @@ -313,6 +313,22 @@ void StatisticsParser::zeroDailyData() zeroFields(dailyProductionFields); } +void StatisticsParser::setLastUpdate(uint32_t lastUpdate) +{ + Parser::setLastUpdate(lastUpdate); + setLastUpdateFromInternal(lastUpdate); +} + +uint32_t StatisticsParser::getLastUpdateFromInternal() +{ + return _lastUpdateFromInternal; +} + +void StatisticsParser::setLastUpdateFromInternal(uint32_t lastUpdate) +{ + _lastUpdateFromInternal = lastUpdate; +} + void StatisticsParser::zeroFields(const FieldId_t* fields) { // Loop all channels @@ -325,6 +341,7 @@ void StatisticsParser::zeroFields(const FieldId_t* fields) } } } + setLastUpdateFromInternal(millis()); } static float calcYieldTotalCh0(StatisticsParser* iv, uint8_t arg0) diff --git a/lib/Hoymiles/src/parser/StatisticsParser.h b/lib/Hoymiles/src/parser/StatisticsParser.h index 4423f1f..da29100 100644 --- a/lib/Hoymiles/src/parser/StatisticsParser.h +++ b/lib/Hoymiles/src/parser/StatisticsParser.h @@ -141,6 +141,13 @@ public: void zeroRuntimeData(); void zeroDailyData(); + // Update time when new data from the inverter is received + void setLastUpdate(uint32_t lastUpdate); + + // Update time when internal data structure changes (from inverter and by internal manipulation) + uint32_t getLastUpdateFromInternal(); + void setLastUpdateFromInternal(uint32_t lastUpdate); + private: void zeroFields(const FieldId_t* fields); @@ -154,4 +161,5 @@ private: std::list _fieldSettings; uint32_t _rxFailureCount = 0; + uint32_t _lastUpdateFromInternal = 0; }; \ No newline at end of file diff --git a/src/MqttHandleInverter.cpp b/src/MqttHandleInverter.cpp index 90cadf5..9048e06 100644 --- a/src/MqttHandleInverter.cpp +++ b/src/MqttHandleInverter.cpp @@ -93,13 +93,9 @@ void MqttHandleInverterClass::loop() MqttSettings.publish(subtopic + "/status/last_update", String(0)); } - uint32_t lastUpdate = inv->Statistics()->getLastUpdate(); - if (lastUpdate > 0 && (lastUpdate != _lastPublishStats[i] || ((inv->getZeroValuesIfUnreachable() || inv->getZeroYieldDayOnMidnight()) && _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); + uint32_t lastUpdateInternal = inv->Statistics()->getLastUpdateFromInternal(); + if (inv->Statistics()->getLastUpdate() > 0 && (lastUpdateInternal != _lastPublishStats[i])) { + _lastPublishStats[i] = lastUpdateInternal; // Loop all channels for (auto& t : inv->Statistics()->getChannelTypes()) {