Implemented getTimeout method in AlarmDataCommand

This commit is contained in:
Thomas Basler 2022-09-24 10:02:33 +02:00
parent 0af809e4ea
commit 3153ee4993
8 changed files with 33 additions and 7 deletions

View File

@ -29,7 +29,8 @@ void HoymilesClass::loop()
iv->sendStatsRequest(_radio.get()); iv->sendStatsRequest(_radio.get());
// Fetch event log // Fetch event log
iv->sendAlarmLogRequest(_radio.get()); bool force = iv->EventLog()->getLastAlarmRequestSuccess() == CMD_NOK;
iv->sendAlarmLogRequest(_radio.get(), force);
// Fetch limit // Fetch limit
if ((iv->SystemConfigPara()->getLastLimitRequestSuccess() == CMD_NOK) || (millis() - iv->SystemConfigPara()->getLastUpdate() > HOY_SYSTEM_CONFIG_PARA_POLL_INTERVAL)) { if ((iv->SystemConfigPara()->getLastLimitRequestSuccess() == CMD_NOK) || (millis() - iv->SystemConfigPara()->getLastUpdate() > HOY_SYSTEM_CONFIG_PARA_POLL_INTERVAL)) {

View File

@ -23,6 +23,12 @@ bool AlarmDataCommand::handleResponse(InverterAbstract* inverter, fragment_t fra
inverter->EventLog()->appendFragment(offs, fragment[i].fragment, fragment[i].len); inverter->EventLog()->appendFragment(offs, fragment[i].fragment, fragment[i].len);
offs += (fragment[i].len); offs += (fragment[i].len);
} }
inverter->EventLog()->setLastAlarmRequestSuccess(CMD_OK);
inverter->EventLog()->setLastUpdate(millis()); inverter->EventLog()->setLastUpdate(millis());
return true; return true;
} }
void AlarmDataCommand::gotTimeout(InverterAbstract* inverter)
{
inverter->EventLog()->setLastAlarmRequestSuccess(CMD_NOK);
}

View File

@ -7,4 +7,5 @@ public:
explicit AlarmDataCommand(uint64_t target_address = 0, uint64_t router_address = 0, time_t time = 0); 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 bool handleResponse(InverterAbstract* inverter, fragment_t fragment[], uint8_t max_fragment_id);
virtual void gotTimeout(InverterAbstract* inverter);
}; };

View File

@ -27,16 +27,18 @@ bool HM_Abstract::sendStatsRequest(HoymilesRadio* radio)
return true; return true;
} }
bool HM_Abstract::sendAlarmLogRequest(HoymilesRadio* radio) bool HM_Abstract::sendAlarmLogRequest(HoymilesRadio* radio, bool force)
{ {
struct tm timeinfo; struct tm timeinfo;
if (!getLocalTime(&timeinfo, 0)) { if (!getLocalTime(&timeinfo, 0)) {
return false; return false;
} }
if (Statistics()->hasChannelFieldValue(CH0, FLD_EVT_LOG)) { if (!force) {
if ((uint8_t)Statistics()->getChannelFieldValue(CH0, FLD_EVT_LOG) == _lastAlarmLogCnt) { if (Statistics()->hasChannelFieldValue(CH0, FLD_EVT_LOG)) {
return false; 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<AlarmDataCommand>(); AlarmDataCommand* cmd = radio->enqueCommand<AlarmDataCommand>();
cmd->setTime(now); cmd->setTime(now);
cmd->setTargetAddress(serial()); cmd->setTargetAddress(serial());
EventLog()->setLastAlarmRequestSuccess(CMD_PENDING);
return true; return true;
} }

View File

@ -6,7 +6,7 @@ class HM_Abstract : public InverterAbstract {
public: public:
explicit HM_Abstract(uint64_t serial); explicit HM_Abstract(uint64_t serial);
bool sendStatsRequest(HoymilesRadio* radio); bool sendStatsRequest(HoymilesRadio* radio);
bool sendAlarmLogRequest(HoymilesRadio* radio); bool sendAlarmLogRequest(HoymilesRadio* radio, bool force = false);
bool sendDevInfoRequest(HoymilesRadio* radio); bool sendDevInfoRequest(HoymilesRadio* radio);
bool sendSystemConfigParaRequest(HoymilesRadio* radio); bool sendSystemConfigParaRequest(HoymilesRadio* radio);
bool sendActivePowerControlRequest(HoymilesRadio* radio, float limit, PowerLimitControlType type); bool sendActivePowerControlRequest(HoymilesRadio* radio, float limit, PowerLimitControlType type);

View File

@ -42,7 +42,7 @@ public:
uint8_t verifyAllFragments(CommandAbstract* cmd); uint8_t verifyAllFragments(CommandAbstract* cmd);
virtual bool sendStatsRequest(HoymilesRadio* radio) = 0; 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 sendDevInfoRequest(HoymilesRadio* radio) = 0;
virtual bool sendSystemConfigParaRequest(HoymilesRadio* radio) = 0; virtual bool sendSystemConfigParaRequest(HoymilesRadio* radio) = 0;
virtual bool sendActivePowerControlRequest(HoymilesRadio* radio, float limit, PowerLimitControlType type) = 0; virtual bool sendActivePowerControlRequest(HoymilesRadio* radio, float limit, PowerLimitControlType type) = 0;

View File

@ -22,6 +22,16 @@ uint8_t AlarmLogParser::getEntryCount()
return (_alarmLogLength - 2) / ALARM_LOG_ENTRY_SIZE; 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) void AlarmLogParser::getLogEntry(uint8_t entryId, AlarmLogEntry_t* entry)
{ {
uint8_t entryStartOffset = 2 + entryId * ALARM_LOG_ENTRY_SIZE; uint8_t entryStartOffset = 2 + entryId * ALARM_LOG_ENTRY_SIZE;

View File

@ -22,9 +22,14 @@ public:
uint8_t getEntryCount(); uint8_t getEntryCount();
void getLogEntry(uint8_t entryId, AlarmLogEntry_t* entry); void getLogEntry(uint8_t entryId, AlarmLogEntry_t* entry);
void setLastAlarmRequestSuccess(LastCommandSuccess status);
LastCommandSuccess getLastAlarmRequestSuccess();
private: private:
static int getTimezoneOffset(); static int getTimezoneOffset();
uint8_t _payloadAlarmLog[ALARM_LOG_PAYLOAD_SIZE]; uint8_t _payloadAlarmLog[ALARM_LOG_PAYLOAD_SIZE];
uint8_t _alarmLogLength; uint8_t _alarmLogLength;
LastCommandSuccess _lastAlarmRequestSuccess = CMD_NOK; // Set to NOK to fetch at startup
}; };