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)
This commit is contained in:
Thomas Basler 2022-09-28 18:40:12 +02:00
parent 3153ee4993
commit 754913368a
7 changed files with 48 additions and 6 deletions

View File

@ -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());
}

View File

@ -7,7 +7,8 @@
#include <memory>
#include <vector>
#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:

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
@ -41,3 +58,14 @@ LastCommandSuccess SystemConfigParaParser::getLastLimitRequestSuccess()
{
return _lastLimitRequestSuccess;
}
uint32_t SystemConfigParaParser::getLastUpdateRequest()
{
return _lastUpdateRequest;
}
void SystemConfigParaParser::setLastUpdateRequest(uint32_t lastUpdate)
{
_lastUpdateRequest = lastUpdate;
setLastUpdate(lastUpdate);
}

View File

@ -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;
};