diff --git a/lib/Hoymiles/src/commands/ActivePowerControlCommand.cpp b/lib/Hoymiles/src/commands/ActivePowerControlCommand.cpp index 7f8fe3f7..86da1a8a 100644 --- a/lib/Hoymiles/src/commands/ActivePowerControlCommand.cpp +++ b/lib/Hoymiles/src/commands/ActivePowerControlCommand.cpp @@ -25,6 +25,13 @@ ID Target Addr Source Addr Cmd SCmd ? Limit Type CRC16 CRC8 #define CRC_SIZE 6 +const uint32_t _powerLimitControlTypeValue[] = { + 0x0000, + 0x0001, + 0x0100, + 0x0101, +}; + ActivePowerControlCommand::ActivePowerControlCommand(InverterAbstract* inv, const uint64_t router_address) : DevControlCommand(inv, router_address) { @@ -64,8 +71,9 @@ void ActivePowerControlCommand::setActivePowerLimit(const float limit, const Pow _payload[13] = (l) & 0xff; // type - _payload[14] = (type >> 8) & 0xff; - _payload[15] = (type) & 0xff; + uint32_t type_value = _powerLimitControlTypeValue[type]; + _payload[14] = (type_value >> 8) & 0xff; + _payload[15] = (type_value) & 0xff; udpateCRC(CRC_SIZE); } @@ -102,7 +110,13 @@ float ActivePowerControlCommand::getLimit() const PowerLimitControlType ActivePowerControlCommand::getType() const { - return (PowerLimitControlType)((static_cast(_payload[14]) << 8) | _payload[15]); + uint32_t type_val = ((static_cast(_payload[14]) << 8) | _payload[15]); + for (uint8_t i = 0; i < PowerLimitControl_Max; i++) { + if (type_val == _powerLimitControlTypeValue[i]) { + return static_cast(i); + } + } + return PowerLimitControlType::RelativNonPersistent; } void ActivePowerControlCommand::gotTimeout() diff --git a/lib/Hoymiles/src/commands/ActivePowerControlCommand.h b/lib/Hoymiles/src/commands/ActivePowerControlCommand.h index 8425d248..4181fc67 100644 --- a/lib/Hoymiles/src/commands/ActivePowerControlCommand.h +++ b/lib/Hoymiles/src/commands/ActivePowerControlCommand.h @@ -4,10 +4,11 @@ #include "DevControlCommand.h" typedef enum { // ToDo: to be verified by field tests - AbsolutNonPersistent = 0x0000, // 0 - RelativNonPersistent = 0x0001, // 1 - AbsolutPersistent = 0x0100, // 256 - RelativPersistent = 0x0101 // 257 + AbsolutNonPersistent, + RelativNonPersistent, + AbsolutPersistent, + RelativPersistent, + PowerLimitControl_Max } PowerLimitControlType; class ActivePowerControlCommand : public DevControlCommand { diff --git a/src/WebApi_limit.cpp b/src/WebApi_limit.cpp index e3f53ae0..94d15848 100644 --- a/src/WebApi_limit.cpp +++ b/src/WebApi_limit.cpp @@ -91,11 +91,7 @@ void WebApiLimitClass::onLimitPost(AsyncWebServerRequest* request) return; } - if (!((root["limit_type"].as() == PowerLimitControlType::AbsolutNonPersistent) - || (root["limit_type"].as() == PowerLimitControlType::AbsolutPersistent) - || (root["limit_type"].as() == PowerLimitControlType::RelativNonPersistent) - || (root["limit_type"].as() == PowerLimitControlType::RelativPersistent))) { - + if (!(root["limit_type"].as() < PowerLimitControlType::PowerLimitControl_Max)) { retMsg["message"] = "Invalid type specified!"; retMsg["code"] = WebApiError::LimitInvalidType; WebApi.sendJsonResponse(request, response, __FUNCTION__, __LINE__); diff --git a/webapp/src/types/LimitConfig.ts b/webapp/src/types/LimitConfig.ts index b218c114..79228835 100644 --- a/webapp/src/types/LimitConfig.ts +++ b/webapp/src/types/LimitConfig.ts @@ -1,5 +1,13 @@ +export enum LimitType { + AbsolutNonPersistent, + RelativNonPersistent, + AbsolutPersistent, + RelativPersistent, + PowerLimitControl_Max, +} + export interface LimitConfig { serial: string; limit_value: number; - limit_type: number; + limit_type: LimitType; } diff --git a/webapp/src/views/HomeView.vue b/webapp/src/views/HomeView.vue index 1d422739..ea48ccfd 100644 --- a/webapp/src/views/HomeView.vue +++ b/webapp/src/views/HomeView.vue @@ -434,15 +434,15 @@