Fix #1335: Only the first inverter was set to zero at midnight via mqtt

This commit is contained in:
Thomas Basler 2023-09-13 18:46:23 +02:00
parent a0f9d22395
commit a974e217df
4 changed files with 28 additions and 9 deletions

View File

@ -20,8 +20,6 @@ private:
uint32_t _lastPublishStats[INV_MAX_COUNT]; uint32_t _lastPublishStats[INV_MAX_COUNT];
uint32_t _lastPublish; uint32_t _lastPublish;
TimeoutHelper _statsTimeout;
FieldId_t _publishFields[14] = { FieldId_t _publishFields[14] = {
FLD_UDC, FLD_UDC,
FLD_IDC, FLD_IDC,

View File

@ -313,6 +313,22 @@ void StatisticsParser::zeroDailyData()
zeroFields(dailyProductionFields); 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) void StatisticsParser::zeroFields(const FieldId_t* fields)
{ {
// Loop all channels // Loop all channels
@ -325,6 +341,7 @@ void StatisticsParser::zeroFields(const FieldId_t* fields)
} }
} }
} }
setLastUpdateFromInternal(millis());
} }
static float calcYieldTotalCh0(StatisticsParser* iv, uint8_t arg0) static float calcYieldTotalCh0(StatisticsParser* iv, uint8_t arg0)

View File

@ -141,6 +141,13 @@ public:
void zeroRuntimeData(); void zeroRuntimeData();
void zeroDailyData(); 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: private:
void zeroFields(const FieldId_t* fields); void zeroFields(const FieldId_t* fields);
@ -154,4 +161,5 @@ private:
std::list<fieldSettings_t> _fieldSettings; std::list<fieldSettings_t> _fieldSettings;
uint32_t _rxFailureCount = 0; uint32_t _rxFailureCount = 0;
uint32_t _lastUpdateFromInternal = 0;
}; };

View File

@ -93,13 +93,9 @@ void MqttHandleInverterClass::loop()
MqttSettings.publish(subtopic + "/status/last_update", String(0)); MqttSettings.publish(subtopic + "/status/last_update", String(0));
} }
uint32_t lastUpdate = inv->Statistics()->getLastUpdate(); uint32_t lastUpdateInternal = inv->Statistics()->getLastUpdateFromInternal();
if (lastUpdate > 0 && (lastUpdate != _lastPublishStats[i] || ((inv->getZeroValuesIfUnreachable() || inv->getZeroYieldDayOnMidnight()) && _statsTimeout.occured()))) { if (inv->Statistics()->getLastUpdate() > 0 && (lastUpdateInternal != _lastPublishStats[i])) {
_lastPublishStats[i] = lastUpdate; _lastPublishStats[i] = lastUpdateInternal;
// 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);
// Loop all channels // Loop all channels
for (auto& t : inv->Statistics()->getChannelTypes()) { for (auto& t : inv->Statistics()->getChannelTypes()) {