// SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (C) 2022-2024 Thomas Basler and others */ #include "HM_Abstract.h" #include "HoymilesRadio.h" #include "commands/ActivePowerControlCommand.h" #include "commands/AlarmDataCommand.h" #include "commands/DevInfoAllCommand.h" #include "commands/DevInfoSimpleCommand.h" #include "commands/GridOnProFilePara.h" #include "commands/PowerControlCommand.h" #include "commands/RealTimeRunDataCommand.h" #include "commands/SystemConfigParaCommand.h" HM_Abstract::HM_Abstract(HoymilesRadio* radio, const uint64_t serial) : InverterAbstract(radio, serial) {}; bool HM_Abstract::sendStatsRequest() { if (!getEnablePolling()) { return false; } struct tm timeinfo; if (!getLocalTime(&timeinfo, 5)) { return false; } time_t now; time(&now); auto cmd = _radio->prepareCommand(this); cmd->setTime(now); _radio->enqueCommand(cmd); return true; } bool HM_Abstract::sendAlarmLogRequest(const bool force) { if (!getEnablePolling()) { return false; } struct tm timeinfo; if (!getLocalTime(&timeinfo, 5)) { return false; } if (!force) { if (Statistics()->hasChannelFieldValue(TYPE_INV, CH0, FLD_EVT_LOG)) { if ((uint8_t)Statistics()->getChannelFieldValue(TYPE_INV, CH0, FLD_EVT_LOG) == _lastAlarmLogCnt) { return false; } } } _lastAlarmLogCnt = (uint8_t)Statistics()->getChannelFieldValue(TYPE_INV, CH0, FLD_EVT_LOG); time_t now; time(&now); auto cmd = _radio->prepareCommand(this); cmd->setTime(now); EventLog()->setLastAlarmRequestSuccess(CMD_PENDING); _radio->enqueCommand(cmd); return true; } bool HM_Abstract::sendDevInfoRequest() { if (!getEnablePolling()) { return false; } struct tm timeinfo; if (!getLocalTime(&timeinfo, 5)) { return false; } time_t now; time(&now); auto cmdAll = _radio->prepareCommand(this); cmdAll->setTime(now); _radio->enqueCommand(cmdAll); auto cmdSimple = _radio->prepareCommand(this); cmdSimple->setTime(now); _radio->enqueCommand(cmdSimple); return true; } bool HM_Abstract::sendSystemConfigParaRequest() { if (!getEnablePolling()) { return false; } struct tm timeinfo; if (!getLocalTime(&timeinfo, 5)) { return false; } time_t now; time(&now); auto cmd = _radio->prepareCommand(this); cmd->setTime(now); SystemConfigPara()->setLastLimitRequestSuccess(CMD_PENDING); _radio->enqueCommand(cmd); return true; } bool HM_Abstract::sendActivePowerControlRequest(float limit, const PowerLimitControlType type) { if (!getEnableCommands()) { return false; } if (type == PowerLimitControlType::RelativNonPersistent || type == PowerLimitControlType::RelativPersistent) { limit = min(100, limit); } _activePowerControlLimit = limit; _activePowerControlType = type; auto cmd = _radio->prepareCommand(this); cmd->setActivePowerLimit(limit, type); SystemConfigPara()->setLastLimitCommandSuccess(CMD_PENDING); _radio->enqueCommand(cmd); return true; } bool HM_Abstract::resendActivePowerControlRequest() { return sendActivePowerControlRequest(_activePowerControlLimit, _activePowerControlType); } bool HM_Abstract::sendPowerControlRequest(const bool turnOn) { if (!getEnableCommands()) { return false; } if (turnOn) { _powerState = 1; } else { _powerState = 0; } auto cmd = _radio->prepareCommand(this); cmd->setPowerOn(turnOn); PowerCommand()->setLastPowerCommandSuccess(CMD_PENDING); _radio->enqueCommand(cmd); return true; } bool HM_Abstract::sendRestartControlRequest() { if (!getEnableCommands()) { return false; } _powerState = 2; auto cmd = _radio->prepareCommand(this); cmd->setRestart(); PowerCommand()->setLastPowerCommandSuccess(CMD_PENDING); _radio->enqueCommand(cmd); return true; } bool HM_Abstract::resendPowerControlRequest() { switch (_powerState) { case 0: return sendPowerControlRequest(false); break; case 1: return sendPowerControlRequest(true); break; case 2: return sendRestartControlRequest(); break; default: return false; break; } } bool HM_Abstract::sendGridOnProFileParaRequest() { if (!getEnablePolling()) { return false; } struct tm timeinfo; if (!getLocalTime(&timeinfo, 5)) { return false; } time_t now; time(&now); auto cmd = _radio->prepareCommand(this); cmd->setTime(now); _radio->enqueCommand(cmd); return true; }