From 3153ee4993309beede47365bc16ea617df855ea2 Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Sat, 24 Sep 2022 10:02:33 +0200 Subject: [PATCH] Implemented getTimeout method in AlarmDataCommand --- lib/Hoymiles/src/Hoymiles.cpp | 3 ++- lib/Hoymiles/src/commands/AlarmDataCommand.cpp | 6 ++++++ lib/Hoymiles/src/commands/AlarmDataCommand.h | 1 + lib/Hoymiles/src/inverters/HM_Abstract.cpp | 11 +++++++---- lib/Hoymiles/src/inverters/HM_Abstract.h | 2 +- lib/Hoymiles/src/inverters/InverterAbstract.h | 2 +- lib/Hoymiles/src/parser/AlarmLogParser.cpp | 10 ++++++++++ lib/Hoymiles/src/parser/AlarmLogParser.h | 5 +++++ 8 files changed, 33 insertions(+), 7 deletions(-) diff --git a/lib/Hoymiles/src/Hoymiles.cpp b/lib/Hoymiles/src/Hoymiles.cpp index 6f03975..a46e7d7 100644 --- a/lib/Hoymiles/src/Hoymiles.cpp +++ b/lib/Hoymiles/src/Hoymiles.cpp @@ -29,7 +29,8 @@ void HoymilesClass::loop() iv->sendStatsRequest(_radio.get()); // Fetch event log - iv->sendAlarmLogRequest(_radio.get()); + bool force = iv->EventLog()->getLastAlarmRequestSuccess() == CMD_NOK; + iv->sendAlarmLogRequest(_radio.get(), force); // Fetch limit if ((iv->SystemConfigPara()->getLastLimitRequestSuccess() == CMD_NOK) || (millis() - iv->SystemConfigPara()->getLastUpdate() > HOY_SYSTEM_CONFIG_PARA_POLL_INTERVAL)) { diff --git a/lib/Hoymiles/src/commands/AlarmDataCommand.cpp b/lib/Hoymiles/src/commands/AlarmDataCommand.cpp index 719f4e0..bdb83a7 100644 --- a/lib/Hoymiles/src/commands/AlarmDataCommand.cpp +++ b/lib/Hoymiles/src/commands/AlarmDataCommand.cpp @@ -23,6 +23,12 @@ bool AlarmDataCommand::handleResponse(InverterAbstract* inverter, fragment_t fra inverter->EventLog()->appendFragment(offs, fragment[i].fragment, fragment[i].len); offs += (fragment[i].len); } + inverter->EventLog()->setLastAlarmRequestSuccess(CMD_OK); inverter->EventLog()->setLastUpdate(millis()); return true; +} + +void AlarmDataCommand::gotTimeout(InverterAbstract* inverter) +{ + inverter->EventLog()->setLastAlarmRequestSuccess(CMD_NOK); } \ No newline at end of file diff --git a/lib/Hoymiles/src/commands/AlarmDataCommand.h b/lib/Hoymiles/src/commands/AlarmDataCommand.h index 5af30ef..8821eb9 100644 --- a/lib/Hoymiles/src/commands/AlarmDataCommand.h +++ b/lib/Hoymiles/src/commands/AlarmDataCommand.h @@ -7,4 +7,5 @@ public: explicit AlarmDataCommand(uint64_t target_address = 0, uint64_t router_address = 0, time_t time = 0); virtual bool handleResponse(InverterAbstract* inverter, fragment_t fragment[], uint8_t max_fragment_id); + virtual void gotTimeout(InverterAbstract* inverter); }; \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HM_Abstract.cpp b/lib/Hoymiles/src/inverters/HM_Abstract.cpp index f02744a..9970d65 100644 --- a/lib/Hoymiles/src/inverters/HM_Abstract.cpp +++ b/lib/Hoymiles/src/inverters/HM_Abstract.cpp @@ -27,16 +27,18 @@ bool HM_Abstract::sendStatsRequest(HoymilesRadio* radio) return true; } -bool HM_Abstract::sendAlarmLogRequest(HoymilesRadio* radio) +bool HM_Abstract::sendAlarmLogRequest(HoymilesRadio* radio, bool force) { struct tm timeinfo; if (!getLocalTime(&timeinfo, 0)) { return false; } - if (Statistics()->hasChannelFieldValue(CH0, FLD_EVT_LOG)) { - if ((uint8_t)Statistics()->getChannelFieldValue(CH0, FLD_EVT_LOG) == _lastAlarmLogCnt) { - return false; + if (!force) { + if (Statistics()->hasChannelFieldValue(CH0, FLD_EVT_LOG)) { + if ((uint8_t)Statistics()->getChannelFieldValue(CH0, FLD_EVT_LOG) == _lastAlarmLogCnt) { + return false; + } } } @@ -48,6 +50,7 @@ bool HM_Abstract::sendAlarmLogRequest(HoymilesRadio* radio) AlarmDataCommand* cmd = radio->enqueCommand(); cmd->setTime(now); cmd->setTargetAddress(serial()); + EventLog()->setLastAlarmRequestSuccess(CMD_PENDING); return true; } diff --git a/lib/Hoymiles/src/inverters/HM_Abstract.h b/lib/Hoymiles/src/inverters/HM_Abstract.h index efbe50b..518af83 100644 --- a/lib/Hoymiles/src/inverters/HM_Abstract.h +++ b/lib/Hoymiles/src/inverters/HM_Abstract.h @@ -6,7 +6,7 @@ class HM_Abstract : public InverterAbstract { public: explicit HM_Abstract(uint64_t serial); bool sendStatsRequest(HoymilesRadio* radio); - bool sendAlarmLogRequest(HoymilesRadio* radio); + bool sendAlarmLogRequest(HoymilesRadio* radio, bool force = false); bool sendDevInfoRequest(HoymilesRadio* radio); bool sendSystemConfigParaRequest(HoymilesRadio* radio); bool sendActivePowerControlRequest(HoymilesRadio* radio, float limit, PowerLimitControlType type); diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.h b/lib/Hoymiles/src/inverters/InverterAbstract.h index 5f145e8..7fedcd7 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.h +++ b/lib/Hoymiles/src/inverters/InverterAbstract.h @@ -42,7 +42,7 @@ public: uint8_t verifyAllFragments(CommandAbstract* cmd); virtual bool sendStatsRequest(HoymilesRadio* radio) = 0; - virtual bool sendAlarmLogRequest(HoymilesRadio* radio) = 0; + virtual bool sendAlarmLogRequest(HoymilesRadio* radio, bool force = false) = 0; virtual bool sendDevInfoRequest(HoymilesRadio* radio) = 0; virtual bool sendSystemConfigParaRequest(HoymilesRadio* radio) = 0; virtual bool sendActivePowerControlRequest(HoymilesRadio* radio, float limit, PowerLimitControlType type) = 0; diff --git a/lib/Hoymiles/src/parser/AlarmLogParser.cpp b/lib/Hoymiles/src/parser/AlarmLogParser.cpp index f8b56a3..93f1ef7 100644 --- a/lib/Hoymiles/src/parser/AlarmLogParser.cpp +++ b/lib/Hoymiles/src/parser/AlarmLogParser.cpp @@ -22,6 +22,16 @@ uint8_t AlarmLogParser::getEntryCount() return (_alarmLogLength - 2) / ALARM_LOG_ENTRY_SIZE; } +void AlarmLogParser::setLastAlarmRequestSuccess(LastCommandSuccess status) +{ + _lastAlarmRequestSuccess = status; +} + +LastCommandSuccess AlarmLogParser::getLastAlarmRequestSuccess() +{ + return _lastAlarmRequestSuccess; +} + void AlarmLogParser::getLogEntry(uint8_t entryId, AlarmLogEntry_t* entry) { uint8_t entryStartOffset = 2 + entryId * ALARM_LOG_ENTRY_SIZE; diff --git a/lib/Hoymiles/src/parser/AlarmLogParser.h b/lib/Hoymiles/src/parser/AlarmLogParser.h index a33944e..5b62c61 100644 --- a/lib/Hoymiles/src/parser/AlarmLogParser.h +++ b/lib/Hoymiles/src/parser/AlarmLogParser.h @@ -22,9 +22,14 @@ public: uint8_t getEntryCount(); void getLogEntry(uint8_t entryId, AlarmLogEntry_t* entry); + void setLastAlarmRequestSuccess(LastCommandSuccess status); + LastCommandSuccess getLastAlarmRequestSuccess(); + private: static int getTimezoneOffset(); uint8_t _payloadAlarmLog[ALARM_LOG_PAYLOAD_SIZE]; uint8_t _alarmLogLength; + + LastCommandSuccess _lastAlarmRequestSuccess = CMD_NOK; // Set to NOK to fetch at startup }; \ No newline at end of file