Publish inverter stats only if values are updated

This commit is contained in:
Thomas Basler 2022-06-15 21:50:49 +02:00
parent 0cc80126fa
commit e3ded34020
4 changed files with 33 additions and 17 deletions

View File

@ -1,5 +1,6 @@
#pragma once #pragma once
#include "Configuration.h"
#include <Arduino.h> #include <Arduino.h>
#include <Hoymiles.h> #include <Hoymiles.h>
#include <memory> #include <memory>
@ -11,6 +12,8 @@ public:
private: private:
void publishField(String subtopic, std::shared_ptr<InverterAbstract> inv, uint8_t channel, uint8_t fieldId); void publishField(String subtopic, std::shared_ptr<InverterAbstract> inv, uint8_t channel, uint8_t fieldId);
uint32_t _lastPublishStats[INV_MAX_COUNT];
}; };
extern MqttPublishingClass MqttPublishing; extern MqttPublishingClass MqttPublishing;

View File

@ -111,10 +111,16 @@ uint8_t InverterAbstract::verifyAllFragments()
memcpy(&_payloadStats[offs], _rxFragmentBuffer[i].fragment, _rxFragmentBuffer[i].len); memcpy(&_payloadStats[offs], _rxFragmentBuffer[i].fragment, _rxFragmentBuffer[i].len);
offs += (_rxFragmentBuffer[i].len); offs += (_rxFragmentBuffer[i].len);
} }
_lastStatsUpdate = millis();
return 0; return 0;
} }
uint32_t InverterAbstract::getLastStatsUpdate()
{
return _lastStatsUpdate;
}
uint8_t InverterAbstract::getChannelCount() uint8_t InverterAbstract::getChannelCount()
{ {
const byteAssign_t* b = getByteAssignment(); const byteAssign_t* b = getByteAssignment();

View File

@ -111,6 +111,8 @@ public:
const char* getUnit(uint8_t channel, uint8_t fieldId); const char* getUnit(uint8_t channel, uint8_t fieldId);
const char* getName(uint8_t channel, uint8_t fieldId); const char* getName(uint8_t channel, uint8_t fieldId);
uint32_t getLastStatsUpdate();
private: private:
serial_u _serial; serial_u _serial;
char _name[MAX_NAME_LENGTH]; char _name[MAX_NAME_LENGTH];
@ -120,4 +122,5 @@ private:
uint8_t _rxFragmentRetransmitCnt = 0; uint8_t _rxFragmentRetransmitCnt = 0;
uint8_t _payloadStats[MAX_RF_FRAGMENT_COUNT * MAX_RF_PAYLOAD_SIZE]; uint8_t _payloadStats[MAX_RF_FRAGMENT_COUNT * MAX_RF_PAYLOAD_SIZE];
uint32_t _lastStatsUpdate = 0;
}; };

View File

@ -1,5 +1,4 @@
#include "MqttPublishing.h" #include "MqttPublishing.h"
#include "Configuration.h"
#include "MqttSettings.h" #include "MqttSettings.h"
#include <Every.h> #include <Every.h>
@ -34,6 +33,10 @@ void MqttPublishingClass::loop()
MqttSettings.publish(subtopic + "/name", inv->name()); MqttSettings.publish(subtopic + "/name", inv->name());
uint32_t lastUpdate = inv->getLastStatsUpdate();
if (lastUpdate > 0 && lastUpdate != _lastPublishStats[i]) {
_lastPublishStats[i] = lastUpdate;
// Loop all channels // Loop all channels
for (uint8_t c = 0; c <= inv->getChannelCount(); c++) { for (uint8_t c = 0; c <= inv->getChannelCount(); c++) {
publishField(subtopic, inv, c, FLD_UDC); publishField(subtopic, inv, c, FLD_UDC);
@ -51,6 +54,7 @@ void MqttPublishingClass::loop()
publishField(subtopic, inv, c, FLD_EFF); publishField(subtopic, inv, c, FLD_EFF);
publishField(subtopic, inv, c, FLD_IRR); publishField(subtopic, inv, c, FLD_IRR);
} }
}
yield(); yield();
} }