From e3ded3402088f510bdd2ed762aac0511029a6cc9 Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Wed, 15 Jun 2022 21:50:49 +0200 Subject: [PATCH] Publish inverter stats only if values are updated --- include/MqttPublishing.h | 3 ++ .../src/inverters/InverterAbstract.cpp | 6 +++ lib/Hoymiles/src/inverters/InverterAbstract.h | 3 ++ src/MqttPublishing.cpp | 38 ++++++++++--------- 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/include/MqttPublishing.h b/include/MqttPublishing.h index 3c15c36e..b43a5a6e 100644 --- a/include/MqttPublishing.h +++ b/include/MqttPublishing.h @@ -1,5 +1,6 @@ #pragma once +#include "Configuration.h" #include #include #include @@ -11,6 +12,8 @@ public: private: void publishField(String subtopic, std::shared_ptr inv, uint8_t channel, uint8_t fieldId); + + uint32_t _lastPublishStats[INV_MAX_COUNT]; }; extern MqttPublishingClass MqttPublishing; \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.cpp b/lib/Hoymiles/src/inverters/InverterAbstract.cpp index 27107ed6..44d0a1bc 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.cpp +++ b/lib/Hoymiles/src/inverters/InverterAbstract.cpp @@ -111,10 +111,16 @@ uint8_t InverterAbstract::verifyAllFragments() memcpy(&_payloadStats[offs], _rxFragmentBuffer[i].fragment, _rxFragmentBuffer[i].len); offs += (_rxFragmentBuffer[i].len); } + _lastStatsUpdate = millis(); return 0; } +uint32_t InverterAbstract::getLastStatsUpdate() +{ + return _lastStatsUpdate; +} + uint8_t InverterAbstract::getChannelCount() { const byteAssign_t* b = getByteAssignment(); diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.h b/lib/Hoymiles/src/inverters/InverterAbstract.h index 1a9b2613..ad774584 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.h +++ b/lib/Hoymiles/src/inverters/InverterAbstract.h @@ -111,6 +111,8 @@ public: const char* getUnit(uint8_t channel, uint8_t fieldId); const char* getName(uint8_t channel, uint8_t fieldId); + uint32_t getLastStatsUpdate(); + private: serial_u _serial; char _name[MAX_NAME_LENGTH]; @@ -120,4 +122,5 @@ private: uint8_t _rxFragmentRetransmitCnt = 0; uint8_t _payloadStats[MAX_RF_FRAGMENT_COUNT * MAX_RF_PAYLOAD_SIZE]; + uint32_t _lastStatsUpdate = 0; }; \ No newline at end of file diff --git a/src/MqttPublishing.cpp b/src/MqttPublishing.cpp index 471087a8..c225c8cb 100644 --- a/src/MqttPublishing.cpp +++ b/src/MqttPublishing.cpp @@ -1,5 +1,4 @@ #include "MqttPublishing.h" -#include "Configuration.h" #include "MqttSettings.h" #include @@ -34,22 +33,27 @@ void MqttPublishingClass::loop() MqttSettings.publish(subtopic + "/name", inv->name()); - // Loop all channels - for (uint8_t c = 0; c <= inv->getChannelCount(); c++) { - publishField(subtopic, inv, c, FLD_UDC); - publishField(subtopic, inv, c, FLD_IDC); - publishField(subtopic, inv, c, FLD_PDC); - publishField(subtopic, inv, c, FLD_YD); - publishField(subtopic, inv, c, FLD_YW); - publishField(subtopic, inv, c, FLD_YT); - publishField(subtopic, inv, c, FLD_UAC); - publishField(subtopic, inv, c, FLD_IAC); - publishField(subtopic, inv, c, FLD_PAC); - publishField(subtopic, inv, c, FLD_F); - publishField(subtopic, inv, c, FLD_T); - publishField(subtopic, inv, c, FLD_PCT); - publishField(subtopic, inv, c, FLD_EFF); - publishField(subtopic, inv, c, FLD_IRR); + uint32_t lastUpdate = inv->getLastStatsUpdate(); + if (lastUpdate > 0 && lastUpdate != _lastPublishStats[i]) { + _lastPublishStats[i] = lastUpdate; + + // Loop all channels + for (uint8_t c = 0; c <= inv->getChannelCount(); c++) { + publishField(subtopic, inv, c, FLD_UDC); + publishField(subtopic, inv, c, FLD_IDC); + publishField(subtopic, inv, c, FLD_PDC); + publishField(subtopic, inv, c, FLD_YD); + publishField(subtopic, inv, c, FLD_YW); + publishField(subtopic, inv, c, FLD_YT); + publishField(subtopic, inv, c, FLD_UAC); + publishField(subtopic, inv, c, FLD_IAC); + publishField(subtopic, inv, c, FLD_PAC); + publishField(subtopic, inv, c, FLD_F); + publishField(subtopic, inv, c, FLD_T); + publishField(subtopic, inv, c, FLD_PCT); + publishField(subtopic, inv, c, FLD_EFF); + publishField(subtopic, inv, c, FLD_IRR); + } } yield();