Publish inverter stats only if values are updated
This commit is contained in:
parent
0cc80126fa
commit
e3ded34020
@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include "Configuration.h"
|
||||
#include <Arduino.h>
|
||||
#include <Hoymiles.h>
|
||||
#include <memory>
|
||||
@ -11,6 +12,8 @@ public:
|
||||
|
||||
private:
|
||||
void publishField(String subtopic, std::shared_ptr<InverterAbstract> inv, uint8_t channel, uint8_t fieldId);
|
||||
|
||||
uint32_t _lastPublishStats[INV_MAX_COUNT];
|
||||
};
|
||||
|
||||
extern MqttPublishingClass MqttPublishing;
|
||||
@ -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();
|
||||
|
||||
@ -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;
|
||||
};
|
||||
@ -1,5 +1,4 @@
|
||||
#include "MqttPublishing.h"
|
||||
#include "Configuration.h"
|
||||
#include "MqttSettings.h"
|
||||
#include <Every.h>
|
||||
|
||||
@ -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();
|
||||
|
||||
Loading…
Reference in New Issue
Block a user