From 73e2aaf8fe7d22e7fe083660f810c79fa3860b89 Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Mon, 12 Sep 2022 21:04:53 +0200 Subject: [PATCH] Implemented setting/getting of limit/type for ActivePowerControl --- .../commands/ActivePowerControlCommand.cpp | 38 +++++++++++++++++++ .../src/commands/ActivePowerControlCommand.h | 11 ++++++ 2 files changed, 49 insertions(+) diff --git a/lib/Hoymiles/src/commands/ActivePowerControlCommand.cpp b/lib/Hoymiles/src/commands/ActivePowerControlCommand.cpp index 94738fb..26fff1f 100644 --- a/lib/Hoymiles/src/commands/ActivePowerControlCommand.cpp +++ b/lib/Hoymiles/src/commands/ActivePowerControlCommand.cpp @@ -1,8 +1,46 @@ #include "ActivePowerControlCommand.h" +#define CRC_SIZE 6 + ActivePowerControlCommand::ActivePowerControlCommand(uint64_t target_address, uint64_t router_address) : DevControlCommand(target_address, router_address) { + _payload[10] = 0x0b; + _payload[11] = 0x00; + _payload[12] = 0x00; + _payload[13] = 0x00; + _payload[14] = 0x00; + _payload[15] = 0x00; + + udpateCRC(CRC_SIZE); // 2 byte crc + + _payload_size = 18; +} + +void ActivePowerControlCommand::setActivePowerLimit(float limit, PowerLimitControlType type) +{ + uint16_t l = limit * 10; + + // limit + _payload[12] = (l >> 8) & 0xff; + _payload[13] = (l) & 0xff; + + // type + _payload[14] = (type >> 8) & 0xff; + _payload[15] = (type) & 0xff; + + udpateCRC(CRC_SIZE); +} + +float ActivePowerControlCommand::getLimit() +{ + uint16_t l = (((uint16_t)_payload[12] << 8) | _payload[13]); + return l / 10; +} + +PowerLimitControlType ActivePowerControlCommand::getType() +{ + return (PowerLimitControlType)(((uint16_t)_payload[14] << 8) | _payload[15]); } bool ActivePowerControlCommand::handleResponse(InverterAbstract* inverter, fragment_t fragment[], uint8_t max_fragment_id) diff --git a/lib/Hoymiles/src/commands/ActivePowerControlCommand.h b/lib/Hoymiles/src/commands/ActivePowerControlCommand.h index 4db6a0f..c086708 100644 --- a/lib/Hoymiles/src/commands/ActivePowerControlCommand.h +++ b/lib/Hoymiles/src/commands/ActivePowerControlCommand.h @@ -2,9 +2,20 @@ #include "DevControlCommand.h" +typedef enum { // ToDo: to be verified by field tests + AbsolutNonPersistent = 0x0000, // 0 + RelativNonPersistent = 0x0001, // 1 + AbsolutPersistent = 0x0100, // 256 + RelativPersistent = 0x0101 // 257 +} PowerLimitControlType; + class ActivePowerControlCommand : public DevControlCommand { public: ActivePowerControlCommand(uint64_t target_address = 0, uint64_t router_address = 0); + void setActivePowerLimit(float limit, PowerLimitControlType type = RelativNonPersistent); + float getLimit(); + PowerLimitControlType getType(); + virtual bool handleResponse(InverterAbstract* inverter, fragment_t fragment[], uint8_t max_fragment_id); }; \ No newline at end of file