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:
parent
3153ee4993
commit
754913368a
@ -33,7 +33,9 @@ void HoymilesClass::loop()
|
|||||||
iv->sendAlarmLogRequest(_radio.get(), force);
|
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()->getLastUpdateRequest() > HOY_SYSTEM_CONFIG_PARA_POLL_INTERVAL)
|
||||||
|
&& (millis() - iv->SystemConfigPara()->getLastUpdateCommand() > HOY_SYSTEM_CONFIG_PARA_POLL_MIN_DURATION))) {
|
||||||
Serial.println("Request SystemConfigPara");
|
Serial.println("Request SystemConfigPara");
|
||||||
iv->sendSystemConfigParaRequest(_radio.get());
|
iv->sendSystemConfigParaRequest(_radio.get());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,7 +7,8 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#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 {
|
class HoymilesClass {
|
||||||
public:
|
public:
|
||||||
|
|||||||
@ -41,6 +41,12 @@ bool ActivePowerControlCommand::handleResponse(InverterAbstract* inverter, fragm
|
|||||||
return false;
|
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);
|
inverter->SystemConfigPara()->setLastLimitCommandSuccess(CMD_OK);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,7 +23,7 @@ bool SystemConfigParaCommand::handleResponse(InverterAbstract* inverter, fragmen
|
|||||||
inverter->SystemConfigPara()->appendFragment(offs, fragment[i].fragment, fragment[i].len);
|
inverter->SystemConfigPara()->appendFragment(offs, fragment[i].fragment, fragment[i].len);
|
||||||
offs += (fragment[i].len);
|
offs += (fragment[i].len);
|
||||||
}
|
}
|
||||||
inverter->SystemConfigPara()->setLastUpdate(millis());
|
inverter->SystemConfigPara()->setLastUpdateRequest(millis());
|
||||||
inverter->SystemConfigPara()->setLastLimitRequestSuccess(CMD_OK);
|
inverter->SystemConfigPara()->setLastLimitRequestSuccess(CMD_OK);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -104,9 +104,6 @@ bool HM_Abstract::sendActivePowerControlRequest(HoymilesRadio* radio, float limi
|
|||||||
cmd->setTargetAddress(serial());
|
cmd->setTargetAddress(serial());
|
||||||
SystemConfigPara()->setLastLimitCommandSuccess(CMD_PENDING);
|
SystemConfigPara()->setLastLimitCommandSuccess(CMD_PENDING);
|
||||||
|
|
||||||
// request updated limits
|
|
||||||
sendSystemConfigParaRequest(radio);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -22,6 +22,12 @@ float SystemConfigParaParser::getLimitPercent()
|
|||||||
return ((((uint16_t)_payload[2]) << 8) | _payload[3]) / 10;
|
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)
|
void SystemConfigParaParser::setLastLimitCommandSuccess(LastCommandSuccess status)
|
||||||
{
|
{
|
||||||
_lastLimitCommandSuccess = status;
|
_lastLimitCommandSuccess = status;
|
||||||
@ -32,6 +38,17 @@ LastCommandSuccess SystemConfigParaParser::getLastLimitCommandSuccess()
|
|||||||
return _lastLimitCommandSuccess;
|
return _lastLimitCommandSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t SystemConfigParaParser::getLastUpdateCommand()
|
||||||
|
{
|
||||||
|
return _lastUpdateCommand;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SystemConfigParaParser::setLastUpdateCommand(uint32_t lastUpdate)
|
||||||
|
{
|
||||||
|
_lastUpdateCommand = lastUpdate;
|
||||||
|
setLastUpdate(lastUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
void SystemConfigParaParser::setLastLimitRequestSuccess(LastCommandSuccess status)
|
void SystemConfigParaParser::setLastLimitRequestSuccess(LastCommandSuccess status)
|
||||||
{
|
{
|
||||||
_lastLimitRequestSuccess = status;
|
_lastLimitRequestSuccess = status;
|
||||||
@ -41,3 +58,14 @@ LastCommandSuccess SystemConfigParaParser::getLastLimitRequestSuccess()
|
|||||||
{
|
{
|
||||||
return _lastLimitRequestSuccess;
|
return _lastLimitRequestSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t SystemConfigParaParser::getLastUpdateRequest()
|
||||||
|
{
|
||||||
|
return _lastUpdateRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SystemConfigParaParser::setLastUpdateRequest(uint32_t lastUpdate)
|
||||||
|
{
|
||||||
|
_lastUpdateRequest = lastUpdate;
|
||||||
|
setLastUpdate(lastUpdate);
|
||||||
|
}
|
||||||
@ -10,12 +10,17 @@ public:
|
|||||||
void appendFragment(uint8_t offset, uint8_t* payload, uint8_t len);
|
void appendFragment(uint8_t offset, uint8_t* payload, uint8_t len);
|
||||||
|
|
||||||
float getLimitPercent();
|
float getLimitPercent();
|
||||||
|
void setLimitPercent(float value);
|
||||||
|
|
||||||
void setLastLimitCommandSuccess(LastCommandSuccess status);
|
void setLastLimitCommandSuccess(LastCommandSuccess status);
|
||||||
LastCommandSuccess getLastLimitCommandSuccess();
|
LastCommandSuccess getLastLimitCommandSuccess();
|
||||||
|
uint32_t getLastUpdateCommand();
|
||||||
|
void setLastUpdateCommand(uint32_t lastUpdate);
|
||||||
|
|
||||||
void setLastLimitRequestSuccess(LastCommandSuccess status);
|
void setLastLimitRequestSuccess(LastCommandSuccess status);
|
||||||
LastCommandSuccess getLastLimitRequestSuccess();
|
LastCommandSuccess getLastLimitRequestSuccess();
|
||||||
|
uint32_t getLastUpdateRequest();
|
||||||
|
void setLastUpdateRequest(uint32_t lastUpdate);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint8_t _payload[SYSTEM_CONFIG_PARA_SIZE];
|
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 _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
|
LastCommandSuccess _lastLimitRequestSuccess = CMD_NOK; // Set to NOK to fetch at startup
|
||||||
|
|
||||||
|
uint32_t _lastUpdateCommand = 0;
|
||||||
|
uint32_t _lastUpdateRequest = 0;
|
||||||
};
|
};
|
||||||
Loading…
Reference in New Issue
Block a user