Fix #96 and #95 : Reworked handling of inverter editing

This commit is contained in:
Thomas Basler 2022-08-24 02:53:34 +02:00
parent 231c1903ff
commit 26268479fb
4 changed files with 27 additions and 11 deletions

View File

@ -110,10 +110,13 @@ std::shared_ptr<InverterAbstract> HoymilesClass::getInverterByFragment(fragment_
return nullptr; return nullptr;
} }
void HoymilesClass::removeInverterByPos(uint8_t pos) void HoymilesClass::removeInverterBySerial(uint64_t serial)
{ {
if (pos < _inverters.size()) { for (uint8_t i = 0; i < _inverters.size(); i++) {
_inverters.erase(_inverters.begin() + pos); if (_inverters[i]->serial() == serial) {
_inverters.erase(_inverters.begin() + i);
return;
}
} }
} }

View File

@ -16,7 +16,7 @@ public:
std::shared_ptr<InverterAbstract> getInverterByPos(uint8_t pos); std::shared_ptr<InverterAbstract> getInverterByPos(uint8_t pos);
std::shared_ptr<InverterAbstract> getInverterBySerial(uint64_t serial); std::shared_ptr<InverterAbstract> getInverterBySerial(uint64_t serial);
std::shared_ptr<InverterAbstract> getInverterByFragment(fragment_t* fragment); std::shared_ptr<InverterAbstract> getInverterByFragment(fragment_t* fragment);
void removeInverterByPos(uint8_t pos); void removeInverterBySerial(uint64_t serial);
size_t getNumInverters(); size_t getNumInverters();
HoymilesRadio* getRadio(); HoymilesRadio* getRadio();

View File

@ -123,6 +123,11 @@ void HoymilesRadio::loop()
_commandQueue.pop(); _commandQueue.pop();
_busyFlag = false; _busyFlag = false;
} }
} else {
// If inverter was not found, assume the command is invalid
Serial.println(F("Invalid inverter found"));
_commandQueue.pop();
_busyFlag = false;
} }
} else if (!_busyFlag) { } else if (!_busyFlag) {
// Currently in idle mode --> send packet if one is in the queue // Currently in idle mode --> send packet if one is in the queue

View File

@ -225,8 +225,11 @@ void WebApiInverterClass::onInverterEdit(AsyncWebServerRequest* request)
INVERTER_CONFIG_T& inverter = Configuration.get().Inverter[root[F("id")].as<uint8_t>()]; INVERTER_CONFIG_T& inverter = Configuration.get().Inverter[root[F("id")].as<uint8_t>()];
char* t; char* t;
uint64_t new_serial = strtoll(root[F("serial")].as<String>().c_str(), &t, 16);
uint64_t old_serial = inverter.Serial;
// Interpret the string as a hex value and convert it to uint64_t // Interpret the string as a hex value and convert it to uint64_t
inverter.Serial = strtoll(root[F("serial")].as<String>().c_str(), &t, 16); inverter.Serial = new_serial;
strncpy(inverter.Name, root[F("name")].as<String>().c_str(), INV_MAX_NAME_STRLEN); strncpy(inverter.Name, root[F("name")].as<String>().c_str(), INV_MAX_NAME_STRLEN);
arrayCount = 0; arrayCount = 0;
@ -243,13 +246,17 @@ void WebApiInverterClass::onInverterEdit(AsyncWebServerRequest* request)
response->setLength(); response->setLength();
request->send(response); request->send(response);
std::shared_ptr<InverterAbstract> inv = Hoymiles.getInverterByPos(root[F("id")].as<uint64_t>()); std::shared_ptr<InverterAbstract> inv = Hoymiles.getInverterBySerial(old_serial);
if (inv != nullptr && inv->serial() != inverter.Serial) { if (inv != nullptr && new_serial != old_serial) {
// Serial was changed // Valid inverter exists but serial changed --> remove it and insert new one
Hoymiles.removeInverterByPos(root[F("id")].as<uint64_t>()); Hoymiles.removeInverterBySerial(old_serial);
inv = Hoymiles.addInverter(inverter.Name, inverter.Serial); inv = Hoymiles.addInverter(inverter.Name, inverter.Serial);
} else if (inv != nullptr && new_serial == old_serial) {
// Valid inverter exists and serial stays the same --> update name
inv->setName(inverter.Name);
} else if (inv == nullptr) { } else if (inv == nullptr) {
// Valid inverter did not exist --> try to create one
inv = Hoymiles.addInverter(inverter.Name, inverter.Serial); inv = Hoymiles.addInverter(inverter.Name, inverter.Serial);
} }
@ -310,6 +317,9 @@ void WebApiInverterClass::onInverterDelete(AsyncWebServerRequest* request)
uint8_t inverter_id = root[F("id")].as<uint8_t>(); uint8_t inverter_id = root[F("id")].as<uint8_t>();
INVERTER_CONFIG_T& inverter = Configuration.get().Inverter[inverter_id]; INVERTER_CONFIG_T& inverter = Configuration.get().Inverter[inverter_id];
Hoymiles.removeInverterBySerial(inverter.Serial);
inverter.Serial = 0; inverter.Serial = 0;
strncpy(inverter.Name, "", 0); strncpy(inverter.Name, "", 0);
Configuration.write(); Configuration.write();
@ -320,7 +330,5 @@ void WebApiInverterClass::onInverterDelete(AsyncWebServerRequest* request)
response->setLength(); response->setLength();
request->send(response); request->send(response);
Hoymiles.removeInverterByPos(inverter_id);
MqttHassPublishing.forceUpdate(); MqttHassPublishing.forceUpdate();
} }