From 754913368aca8572de8107ae3eaaba15cf754c79 Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Wed, 28 Sep 2022 18:40:12 +0200 Subject: [PATCH] Implemented way to periodically fetch the current limit from the inverter The fetch is only executed at least 4 minutes after the last set command. Otherwise it would generate a entry in the event log (ID 2) --- lib/Hoymiles/src/Hoymiles.cpp | 4 ++- lib/Hoymiles/src/Hoymiles.h | 3 +- .../commands/ActivePowerControlCommand.cpp | 6 ++++ .../src/commands/SystemConfigParaCommand.cpp | 2 +- lib/Hoymiles/src/inverters/HM_Abstract.cpp | 3 -- .../src/parser/SystemConfigParaParser.cpp | 28 +++++++++++++++++++ .../src/parser/SystemConfigParaParser.h | 8 ++++++ 7 files changed, 48 insertions(+), 6 deletions(-) diff --git a/lib/Hoymiles/src/Hoymiles.cpp b/lib/Hoymiles/src/Hoymiles.cpp index a46e7d7..ed2651f 100644 --- a/lib/Hoymiles/src/Hoymiles.cpp +++ b/lib/Hoymiles/src/Hoymiles.cpp @@ -33,7 +33,9 @@ void HoymilesClass::loop() iv->sendAlarmLogRequest(_radio.get(), force); // 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()->getLastUpdateRequest() > HOY_SYSTEM_CONFIG_PARA_POLL_INTERVAL) + && (millis() - iv->SystemConfigPara()->getLastUpdateCommand() > HOY_SYSTEM_CONFIG_PARA_POLL_MIN_DURATION))) { Serial.println("Request SystemConfigPara"); iv->sendSystemConfigParaRequest(_radio.get()); } diff --git a/lib/Hoymiles/src/Hoymiles.h b/lib/Hoymiles/src/Hoymiles.h index 10b0c9c..072f196 100644 --- a/lib/Hoymiles/src/Hoymiles.h +++ b/lib/Hoymiles/src/Hoymiles.h @@ -7,7 +7,8 @@ #include #include -#define HOY_SYSTEM_CONFIG_PARA_POLL_INTERVAL (10 * 60 * 1000) // 10 minutes +#define HOY_SYSTEM_CONFIG_PARA_POLL_INTERVAL (2 * 60 * 1000) // 2 minutes +#define HOY_SYSTEM_CONFIG_PARA_POLL_MIN_DURATION (4 * 60 * 1000) // at least 4 minutes between sending limit command and read request. Otherwise eventlog entry class HoymilesClass { public: diff --git a/lib/Hoymiles/src/commands/ActivePowerControlCommand.cpp b/lib/Hoymiles/src/commands/ActivePowerControlCommand.cpp index 83ddc82..7512893 100644 --- a/lib/Hoymiles/src/commands/ActivePowerControlCommand.cpp +++ b/lib/Hoymiles/src/commands/ActivePowerControlCommand.cpp @@ -41,6 +41,12 @@ bool ActivePowerControlCommand::handleResponse(InverterAbstract* inverter, fragm return false; } + if ((getType() == PowerLimitControlType::RelativNonPersistent) || (getType() == PowerLimitControlType::RelativPersistent)) { + inverter->SystemConfigPara()->setLimitPercent(getLimit()); + } else { + // TODO: Not implemented yet because we only can publish the percentage value + } + inverter->SystemConfigPara()->setLastUpdateCommand(millis()); inverter->SystemConfigPara()->setLastLimitCommandSuccess(CMD_OK); return true; } diff --git a/lib/Hoymiles/src/commands/SystemConfigParaCommand.cpp b/lib/Hoymiles/src/commands/SystemConfigParaCommand.cpp index 65267f4..b7b59d3 100644 --- a/lib/Hoymiles/src/commands/SystemConfigParaCommand.cpp +++ b/lib/Hoymiles/src/commands/SystemConfigParaCommand.cpp @@ -23,7 +23,7 @@ bool SystemConfigParaCommand::handleResponse(InverterAbstract* inverter, fragmen inverter->SystemConfigPara()->appendFragment(offs, fragment[i].fragment, fragment[i].len); offs += (fragment[i].len); } - inverter->SystemConfigPara()->setLastUpdate(millis()); + inverter->SystemConfigPara()->setLastUpdateRequest(millis()); inverter->SystemConfigPara()->setLastLimitRequestSuccess(CMD_OK); return true; } diff --git a/lib/Hoymiles/src/inverters/HM_Abstract.cpp b/lib/Hoymiles/src/inverters/HM_Abstract.cpp index 9970d65..31a6895 100644 --- a/lib/Hoymiles/src/inverters/HM_Abstract.cpp +++ b/lib/Hoymiles/src/inverters/HM_Abstract.cpp @@ -104,9 +104,6 @@ bool HM_Abstract::sendActivePowerControlRequest(HoymilesRadio* radio, float limi cmd->setTargetAddress(serial()); SystemConfigPara()->setLastLimitCommandSuccess(CMD_PENDING); - // request updated limits - sendSystemConfigParaRequest(radio); - return true; } diff --git a/lib/Hoymiles/src/parser/SystemConfigParaParser.cpp b/lib/Hoymiles/src/parser/SystemConfigParaParser.cpp index e989a01..8ac43ea 100644 --- a/lib/Hoymiles/src/parser/SystemConfigParaParser.cpp +++ b/lib/Hoymiles/src/parser/SystemConfigParaParser.cpp @@ -22,6 +22,12 @@ float SystemConfigParaParser::getLimitPercent() return ((((uint16_t)_payload[2]) << 8) | _payload[3]) / 10; } +void SystemConfigParaParser::setLimitPercent(float value) +{ + _payload[2] = ((uint16_t)(value * 10)) >> 8; + _payload[3] = ((uint16_t)(value * 10)); +} + void SystemConfigParaParser::setLastLimitCommandSuccess(LastCommandSuccess status) { _lastLimitCommandSuccess = status; @@ -32,6 +38,17 @@ LastCommandSuccess SystemConfigParaParser::getLastLimitCommandSuccess() return _lastLimitCommandSuccess; } +uint32_t SystemConfigParaParser::getLastUpdateCommand() +{ + return _lastUpdateCommand; +} + +void SystemConfigParaParser::setLastUpdateCommand(uint32_t lastUpdate) +{ + _lastUpdateCommand = lastUpdate; + setLastUpdate(lastUpdate); +} + void SystemConfigParaParser::setLastLimitRequestSuccess(LastCommandSuccess status) { _lastLimitRequestSuccess = status; @@ -40,4 +57,15 @@ void SystemConfigParaParser::setLastLimitRequestSuccess(LastCommandSuccess statu LastCommandSuccess SystemConfigParaParser::getLastLimitRequestSuccess() { return _lastLimitRequestSuccess; +} + +uint32_t SystemConfigParaParser::getLastUpdateRequest() +{ + return _lastUpdateRequest; +} + +void SystemConfigParaParser::setLastUpdateRequest(uint32_t lastUpdate) +{ + _lastUpdateRequest = lastUpdate; + setLastUpdate(lastUpdate); } \ No newline at end of file diff --git a/lib/Hoymiles/src/parser/SystemConfigParaParser.h b/lib/Hoymiles/src/parser/SystemConfigParaParser.h index 992bb15..32d1e4b 100644 --- a/lib/Hoymiles/src/parser/SystemConfigParaParser.h +++ b/lib/Hoymiles/src/parser/SystemConfigParaParser.h @@ -10,12 +10,17 @@ public: void appendFragment(uint8_t offset, uint8_t* payload, uint8_t len); float getLimitPercent(); + void setLimitPercent(float value); void setLastLimitCommandSuccess(LastCommandSuccess status); LastCommandSuccess getLastLimitCommandSuccess(); + uint32_t getLastUpdateCommand(); + void setLastUpdateCommand(uint32_t lastUpdate); void setLastLimitRequestSuccess(LastCommandSuccess status); LastCommandSuccess getLastLimitRequestSuccess(); + uint32_t getLastUpdateRequest(); + void setLastUpdateRequest(uint32_t lastUpdate); private: uint8_t _payload[SYSTEM_CONFIG_PARA_SIZE]; @@ -23,4 +28,7 @@ private: LastCommandSuccess _lastLimitCommandSuccess = CMD_OK; // Set to OK because we have to assume nothing is done at startup LastCommandSuccess _lastLimitRequestSuccess = CMD_NOK; // Set to NOK to fetch at startup + + uint32_t _lastUpdateCommand = 0; + uint32_t _lastUpdateRequest = 0; }; \ No newline at end of file