From 2b2afee77088bc5a66a72d681e2edfbb550664fe Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Tue, 15 Nov 2022 22:30:29 +0100 Subject: [PATCH] Fix issue that in multi inverter environments some inverters where not fetched When the radio was busy, the current inverter was just skipped and switched to the next one --- lib/Hoymiles/src/Hoymiles.cpp | 70 ++++++++++++++++++----------------- 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/lib/Hoymiles/src/Hoymiles.cpp b/lib/Hoymiles/src/Hoymiles.cpp index 078f2785..355a4db2 100644 --- a/lib/Hoymiles/src/Hoymiles.cpp +++ b/lib/Hoymiles/src/Hoymiles.cpp @@ -28,45 +28,47 @@ void HoymilesClass::loop() if (millis() - _lastPoll > (_pollInterval * 1000)) { static uint8_t inverterPos = 0; - std::shared_ptr iv = getInverterByPos(inverterPos); - if (iv != nullptr && _radio->isIdle()) { - Serial.print(F("Fetch inverter: ")); - Serial.println(iv->serial(), HEX); + if (_radio->isIdle()) { + std::shared_ptr iv = getInverterByPos(inverterPos); + if (iv != nullptr) { + Serial.print(F("Fetch inverter: ")); + Serial.println(iv->serial(), HEX); - iv->sendStatsRequest(_radio.get()); + iv->sendStatsRequest(_radio.get()); - // Fetch event log - bool force = iv->EventLog()->getLastAlarmRequestSuccess() == CMD_NOK; - iv->sendAlarmLogRequest(_radio.get(), force); + // Fetch event log + bool force = iv->EventLog()->getLastAlarmRequestSuccess() == CMD_NOK; + iv->sendAlarmLogRequest(_radio.get(), force); - // Fetch limit - 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()); + // Fetch limit + 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()); + } + + // Set limit if required + if (iv->SystemConfigPara()->getLastLimitCommandSuccess() == CMD_NOK) { + Serial.println(F("Resend ActivePowerControl")); + iv->resendActivePowerControlRequest(_radio.get()); + } + + // Set power status if required + if (iv->PowerCommand()->getLastPowerCommandSuccess() == CMD_NOK) { + Serial.println(F("Resend PowerCommand")); + iv->resendPowerControlRequest(_radio.get()); + } + + // Fetch dev info (but first fetch stats) + if (iv->Statistics()->getLastUpdate() > 0 && (iv->DevInfo()->getLastUpdateAll() == 0 || iv->DevInfo()->getLastUpdateSimple() == 0)) { + Serial.println(F("Request device info")); + iv->sendDevInfoRequest(_radio.get()); + } } - - // Set limit if required - if (iv->SystemConfigPara()->getLastLimitCommandSuccess() == CMD_NOK) { - Serial.println(F("Resend ActivePowerControl")); - iv->resendActivePowerControlRequest(_radio.get()); + if (++inverterPos >= getNumInverters()) { + inverterPos = 0; } - - // Set power status if required - if (iv->PowerCommand()->getLastPowerCommandSuccess() == CMD_NOK) { - Serial.println(F("Resend PowerCommand")); - iv->resendPowerControlRequest(_radio.get()); - } - - // Fetch dev info (but first fetch stats) - if (iv->Statistics()->getLastUpdate() > 0 && (iv->DevInfo()->getLastUpdateAll() == 0 || iv->DevInfo()->getLastUpdateSimple() == 0)) { - Serial.println(F("Request device info")); - iv->sendDevInfoRequest(_radio.get()); - } - } - if (++inverterPos >= getNumInverters()) { - inverterPos = 0; } _lastPoll = millis();