From f42696d14cd96ed30c3db7e83807d5fb967b645a Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Wed, 22 Jun 2022 21:32:37 +0200 Subject: [PATCH] Fix change of inverter serial Because of the inverter type depends on the serial number it's a must to remove and add the inverter of the serial was changed. setSerial doesn't make sense anymore. Move the serial to the constructor --- lib/Hoymiles/src/Hoymiles.cpp | 7 +++---- lib/Hoymiles/src/inverters/HM_1CH.cpp | 3 +++ lib/Hoymiles/src/inverters/HM_1CH.h | 1 + lib/Hoymiles/src/inverters/HM_2CH.cpp | 3 +++ lib/Hoymiles/src/inverters/HM_2CH.h | 1 + lib/Hoymiles/src/inverters/HM_4CH.cpp | 3 +++ lib/Hoymiles/src/inverters/HM_4CH.h | 1 + lib/Hoymiles/src/inverters/InverterAbstract.cpp | 2 +- lib/Hoymiles/src/inverters/InverterAbstract.h | 2 +- src/WebApi_inverter.cpp | 8 ++++++-- 10 files changed, 23 insertions(+), 8 deletions(-) diff --git a/lib/Hoymiles/src/Hoymiles.cpp b/lib/Hoymiles/src/Hoymiles.cpp index e340d15c..38141c72 100644 --- a/lib/Hoymiles/src/Hoymiles.cpp +++ b/lib/Hoymiles/src/Hoymiles.cpp @@ -50,17 +50,16 @@ std::shared_ptr HoymilesClass::addInverter(const char* name, u { std::shared_ptr i; if (HM_4CH::isValidSerial(serial)) { - i = std::make_shared(); + i = std::make_shared(serial); } else if (HM_2CH::isValidSerial(serial)) { - i = std::make_shared(); + i = std::make_shared(serial); } else if (HM_1CH::isValidSerial(serial)) { - i = std::make_shared(); + i = std::make_shared(serial); } if (i) { - i->setSerial(serial); i->setName(name); _inverters.push_back(std::move(i)); return _inverters.back(); diff --git a/lib/Hoymiles/src/inverters/HM_1CH.cpp b/lib/Hoymiles/src/inverters/HM_1CH.cpp index 80e80393..fca6299c 100644 --- a/lib/Hoymiles/src/inverters/HM_1CH.cpp +++ b/lib/Hoymiles/src/inverters/HM_1CH.cpp @@ -1,5 +1,8 @@ #include "HM_1CH.h" +HM_1CH::HM_1CH(uint64_t serial) + : InverterAbstract(serial) {}; + bool HM_1CH::isValidSerial(uint64_t serial) { return serial >= 0x112100000000 && serial <= 0x112199999999; diff --git a/lib/Hoymiles/src/inverters/HM_1CH.h b/lib/Hoymiles/src/inverters/HM_1CH.h index a4c3a3e2..21383d7f 100644 --- a/lib/Hoymiles/src/inverters/HM_1CH.h +++ b/lib/Hoymiles/src/inverters/HM_1CH.h @@ -4,6 +4,7 @@ class HM_1CH : public InverterAbstract { public: + HM_1CH(uint64_t serial); static bool isValidSerial(uint64_t serial); String typeName(); const byteAssign_t* getByteAssignment(); diff --git a/lib/Hoymiles/src/inverters/HM_2CH.cpp b/lib/Hoymiles/src/inverters/HM_2CH.cpp index f02a0b26..869cb406 100644 --- a/lib/Hoymiles/src/inverters/HM_2CH.cpp +++ b/lib/Hoymiles/src/inverters/HM_2CH.cpp @@ -1,5 +1,8 @@ #include "HM_2CH.h" +HM_2CH::HM_2CH(uint64_t serial) + : InverterAbstract(serial) {}; + bool HM_2CH::isValidSerial(uint64_t serial) { return serial >= 0x114100000000 && serial <= 0x114199999999; diff --git a/lib/Hoymiles/src/inverters/HM_2CH.h b/lib/Hoymiles/src/inverters/HM_2CH.h index f80e831a..f7cd6613 100644 --- a/lib/Hoymiles/src/inverters/HM_2CH.h +++ b/lib/Hoymiles/src/inverters/HM_2CH.h @@ -4,6 +4,7 @@ class HM_2CH : public InverterAbstract { public: + HM_2CH(uint64_t serial); static bool isValidSerial(uint64_t serial); String typeName(); const byteAssign_t* getByteAssignment(); diff --git a/lib/Hoymiles/src/inverters/HM_4CH.cpp b/lib/Hoymiles/src/inverters/HM_4CH.cpp index 1638fde4..abd0d1cd 100644 --- a/lib/Hoymiles/src/inverters/HM_4CH.cpp +++ b/lib/Hoymiles/src/inverters/HM_4CH.cpp @@ -1,5 +1,8 @@ #include "HM_4CH.h" +HM_4CH::HM_4CH(uint64_t serial) + : InverterAbstract(serial) {}; + bool HM_4CH::isValidSerial(uint64_t serial) { return serial >= 0x116100000000 && serial <= 0x116199999999; diff --git a/lib/Hoymiles/src/inverters/HM_4CH.h b/lib/Hoymiles/src/inverters/HM_4CH.h index 7833b60d..b2a48f4e 100644 --- a/lib/Hoymiles/src/inverters/HM_4CH.h +++ b/lib/Hoymiles/src/inverters/HM_4CH.h @@ -4,6 +4,7 @@ class HM_4CH : public InverterAbstract { public: + HM_4CH(uint64_t serial); static bool isValidSerial(uint64_t serial); String typeName(); const byteAssign_t* getByteAssignment(); diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.cpp b/lib/Hoymiles/src/inverters/InverterAbstract.cpp index cdf94be5..70c2149e 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.cpp +++ b/lib/Hoymiles/src/inverters/InverterAbstract.cpp @@ -2,7 +2,7 @@ #include "crc.h" #include -void InverterAbstract::setSerial(uint64_t serial) +InverterAbstract::InverterAbstract(uint64_t serial) { _serial.u64 = serial; } diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.h b/lib/Hoymiles/src/inverters/InverterAbstract.h index e6289b51..8d3e8e7b 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.h +++ b/lib/Hoymiles/src/inverters/InverterAbstract.h @@ -90,7 +90,7 @@ const calcFunc_t calcFunctions[] = { class InverterAbstract { public: - void setSerial(uint64_t serial); + InverterAbstract(uint64_t serial); uint64_t serial(); void setName(const char* name); const char* name(); diff --git a/src/WebApi_inverter.cpp b/src/WebApi_inverter.cpp index 8d2019ee..8690d515 100644 --- a/src/WebApi_inverter.cpp +++ b/src/WebApi_inverter.cpp @@ -212,8 +212,12 @@ void WebApiInverterClass::onInverterEdit(AsyncWebServerRequest* request) request->send(response); std::shared_ptr inv = Hoymiles.getInverterByPos(root[F("id")].as()); - inv->setName(inverter.Name); - inv->setSerial(inverter.Serial); + + if (inv->serial() != inverter.Serial) { + // Serial was changed + Hoymiles.removeInverterByPos(root[F("id")].as()); + inv = Hoymiles.addInverter(inverter.Name, inverter.Serial); + } for (uint8_t c = 0; c < INV_MAX_CHAN_COUNT; c++) { inv->setChannelMaxPower(c, inverter.MaxChannelPower[c]);