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
#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;

View File

@ -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();

View File

@ -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;
};

View File

@ -1,5 +1,4 @@
#include "MqttPublishing.h"
#include "Configuration.h"
#include "MqttSettings.h"
#include <Every.h>
@ -34,6 +33,10 @@ void MqttPublishingClass::loop()
MqttSettings.publish(subtopic + "/name", inv->name());
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);
@ -51,6 +54,7 @@ void MqttPublishingClass::loop()
publishField(subtopic, inv, c, FLD_EFF);
publishField(subtopic, inv, c, FLD_IRR);
}
}
yield();
}