From b299b9dc6c8698e8ec1f5262cc6021e1fe36d422 Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Fri, 29 Mar 2024 20:33:56 +0100 Subject: [PATCH] VE.Direct: simplify access to data hand out const& to the data structs. this is possible now that this struct is "stable", i.e., not reset regularly. --- include/MqttHandleVedirect.h | 2 +- include/MqttHandleVedirectHass.h | 6 +- include/VictronMppt.h | 2 +- include/WebApi_ws_vedirect_live.h | 2 +- .../VeDirectFrameHandler.h | 3 +- .../VeDirectMpptController.cpp | 3 - .../VeDirectMpptController.h | 3 - .../VeDirectShuntController.cpp | 8 - .../VeDirectShuntController.h | 2 - src/MqttHandlVedirectHass.cpp | 71 ++++----- src/MqttHandleVedirect.cpp | 149 +++++++++--------- src/VictronMppt.cpp | 16 +- src/VictronSmartShunt.cpp | 2 +- src/WebApi_ws_vedirect_live.cpp | 56 +++---- 14 files changed, 153 insertions(+), 172 deletions(-) diff --git a/include/MqttHandleVedirect.h b/include/MqttHandleVedirect.h index 897dc00a..016ee804 100644 --- a/include/MqttHandleVedirect.h +++ b/include/MqttHandleVedirect.h @@ -33,7 +33,7 @@ private: bool _PublishFull; - void publish_mppt_data(const VeDirectMpptController::spData_t &spMpptData, + void publish_mppt_data(const VeDirectMpptController::data_t &mpptData, const VeDirectMpptController::data_t &frame) const; }; diff --git a/include/MqttHandleVedirectHass.h b/include/MqttHandleVedirectHass.h index 86d364cd..6d7a17ac 100644 --- a/include/MqttHandleVedirectHass.h +++ b/include/MqttHandleVedirectHass.h @@ -16,13 +16,13 @@ private: void publish(const String& subtopic, const String& payload); void publishBinarySensor(const char *caption, const char *icon, const char *subTopic, const char *payload_on, const char *payload_off, - const VeDirectMpptController::spData_t &spMpptData); + const VeDirectMpptController::data_t &mpptData); void publishSensor(const char *caption, const char *icon, const char *subTopic, const char *deviceClass, const char *stateClass, const char *unitOfMeasurement, - const VeDirectMpptController::spData_t &spMpptData); + const VeDirectMpptController::data_t &mpptData); void createDeviceInfo(JsonObject &object, - const VeDirectMpptController::spData_t &spMpptData); + const VeDirectMpptController::data_t &mpptData); Task _loopTask; diff --git a/include/VictronMppt.h b/include/VictronMppt.h index 39e85aad..98aa36dc 100644 --- a/include/VictronMppt.h +++ b/include/VictronMppt.h @@ -25,7 +25,7 @@ public: uint32_t getDataAgeMillis(size_t idx) const; size_t controllerAmount() const { return _controllers.size(); } - std::optional getData(size_t idx = 0) const; + std::optional getData(size_t idx = 0) const; // total output of all MPPT charge controllers in Watts int32_t getPowerOutputWatts() const; diff --git a/include/WebApi_ws_vedirect_live.h b/include/WebApi_ws_vedirect_live.h index d46de4cc..1d471cf3 100644 --- a/include/WebApi_ws_vedirect_live.h +++ b/include/WebApi_ws_vedirect_live.h @@ -15,7 +15,7 @@ public: private: void generateJsonResponse(JsonVariant& root, bool fullUpdate); - static void populateJson(const JsonObject &root, const VeDirectMpptController::spData_t &spMpptData); + static void populateJson(const JsonObject &root, const VeDirectMpptController::data_t &mpptData); void onLivedataStatus(AsyncWebServerRequest* request); void onWebsocketEvent(AsyncWebSocket* server, AsyncWebSocketClient* client, AwsEventType type, void* arg, uint8_t* data, size_t len); bool hasUpdate(size_t idx); diff --git a/lib/VeDirectFrameHandler/VeDirectFrameHandler.h b/lib/VeDirectFrameHandler/VeDirectFrameHandler.h index aa8857a4..dedf5972 100644 --- a/lib/VeDirectFrameHandler/VeDirectFrameHandler.h +++ b/lib/VeDirectFrameHandler/VeDirectFrameHandler.h @@ -24,6 +24,7 @@ public: void loop(); // main loop to read ve.direct data uint32_t getLastUpdate() const; // timestamp of last successful frame read bool isDataValid() const; // return true if data valid and not outdated + T const& getData() const { return _tmpFrame; } protected: VeDirectFrameHandler(); @@ -41,7 +42,7 @@ private: void rxData(uint8_t inbyte); // byte of serial data void processTextData(std::string const& name, std::string const& value); virtual bool processTextDataDerived(std::string const& name, std::string const& value) = 0; - virtual void frameValidEvent() = 0; + virtual void frameValidEvent() { } int hexRxEvent(uint8_t); std::unique_ptr _vedirectSerial; diff --git a/lib/VeDirectFrameHandler/VeDirectMpptController.cpp b/lib/VeDirectFrameHandler/VeDirectMpptController.cpp index 06616202..24063cf5 100644 --- a/lib/VeDirectFrameHandler/VeDirectMpptController.cpp +++ b/lib/VeDirectFrameHandler/VeDirectMpptController.cpp @@ -4,7 +4,6 @@ void VeDirectMpptController::init(int8_t rx, int8_t tx, Print* msgOut, bool verboseLogging, uint16_t hwSerialPort) { VeDirectFrameHandler::init("MPPT", rx, tx, msgOut, verboseLogging, hwSerialPort); - _spData = std::make_shared(); } bool VeDirectMpptController::processTextDataDerived(std::string const& name, std::string const& value) @@ -80,6 +79,4 @@ void VeDirectMpptController::frameValidEvent() { _efficiency.addNumber(static_cast(_tmpFrame.P * 100) / _tmpFrame.PPV); _tmpFrame.E = _efficiency.getAverage(); } - - _spData = std::make_shared(_tmpFrame); } diff --git a/lib/VeDirectFrameHandler/VeDirectMpptController.h b/lib/VeDirectFrameHandler/VeDirectMpptController.h index 277a7376..c5af4521 100644 --- a/lib/VeDirectFrameHandler/VeDirectMpptController.h +++ b/lib/VeDirectFrameHandler/VeDirectMpptController.h @@ -43,12 +43,9 @@ public: void init(int8_t rx, int8_t tx, Print* msgOut, bool verboseLogging, uint16_t hwSerialPort); using data_t = veMpptStruct; - using spData_t = std::shared_ptr; - spData_t getData() const { return _spData; } private: bool processTextDataDerived(std::string const& name, std::string const& value) final; void frameValidEvent() final; - spData_t _spData = nullptr; MovingAverage _efficiency; }; diff --git a/lib/VeDirectFrameHandler/VeDirectShuntController.cpp b/lib/VeDirectFrameHandler/VeDirectShuntController.cpp index be9c8e11..522b152b 100644 --- a/lib/VeDirectFrameHandler/VeDirectShuntController.cpp +++ b/lib/VeDirectFrameHandler/VeDirectShuntController.cpp @@ -110,11 +110,3 @@ bool VeDirectShuntController::processTextDataDerived(std::string const& name, st return false; } - -/* - * frameValidEvent - * This function is called at the end of the received frame. - */ -void VeDirectShuntController::frameValidEvent() { - veFrame = _tmpFrame; -} diff --git a/lib/VeDirectFrameHandler/VeDirectShuntController.h b/lib/VeDirectFrameHandler/VeDirectShuntController.h index 641ec10e..03bc96b8 100644 --- a/lib/VeDirectFrameHandler/VeDirectShuntController.h +++ b/lib/VeDirectFrameHandler/VeDirectShuntController.h @@ -11,11 +11,9 @@ public: void init(int8_t rx, int8_t tx, Print* msgOut, bool verboseLogging); using data_t = veShuntStruct; - data_t veFrame{}; private: bool processTextDataDerived(std::string const& name, std::string const& value) final; - void frameValidEvent() final; }; extern VeDirectShuntController VeDirectShunt; diff --git a/src/MqttHandlVedirectHass.cpp b/src/MqttHandlVedirectHass.cpp index b839af3c..4619c1e4 100644 --- a/src/MqttHandlVedirectHass.cpp +++ b/src/MqttHandlVedirectHass.cpp @@ -58,42 +58,33 @@ void MqttHandleVedirectHassClass::publishConfig() // device info for (int idx = 0; idx < VictronMppt.controllerAmount(); ++idx) { - // ensure data is received from victron - if (!VictronMppt.isDataValid(idx)) { - continue; - } + auto optMpptData = VictronMppt.getData(idx); + if (!optMpptData.has_value()) { continue; } - std::optional spOptMpptData = VictronMppt.getData(idx); - if (!spOptMpptData.has_value()) { - continue; - } - - VeDirectMpptController::spData_t &spMpptData = spOptMpptData.value(); - - publishBinarySensor("MPPT load output state", "mdi:export", "LOAD", "ON", "OFF", spMpptData); - publishSensor("MPPT serial number", "mdi:counter", "SER", nullptr, nullptr, nullptr, spMpptData); - publishSensor("MPPT firmware number", "mdi:counter", "FW", nullptr, nullptr, nullptr, spMpptData); - publishSensor("MPPT state of operation", "mdi:wrench", "CS", nullptr, nullptr, nullptr, spMpptData); - publishSensor("MPPT error code", "mdi:bell", "ERR", nullptr, nullptr, nullptr, spMpptData); - publishSensor("MPPT off reason", "mdi:wrench", "OR", nullptr, nullptr, nullptr, spMpptData); - publishSensor("MPPT tracker operation mode", "mdi:wrench", "MPPT", nullptr, nullptr, nullptr, spMpptData); - publishSensor("MPPT Day sequence number (0...364)", "mdi:calendar-month-outline", "HSDS", NULL, "total", "d", spMpptData); + publishBinarySensor("MPPT load output state", "mdi:export", "LOAD", "ON", "OFF", *optMpptData); + publishSensor("MPPT serial number", "mdi:counter", "SER", nullptr, nullptr, nullptr, *optMpptData); + publishSensor("MPPT firmware number", "mdi:counter", "FW", nullptr, nullptr, nullptr, *optMpptData); + publishSensor("MPPT state of operation", "mdi:wrench", "CS", nullptr, nullptr, nullptr, *optMpptData); + publishSensor("MPPT error code", "mdi:bell", "ERR", nullptr, nullptr, nullptr, *optMpptData); + publishSensor("MPPT off reason", "mdi:wrench", "OR", nullptr, nullptr, nullptr, *optMpptData); + publishSensor("MPPT tracker operation mode", "mdi:wrench", "MPPT", nullptr, nullptr, nullptr, *optMpptData); + publishSensor("MPPT Day sequence number (0...364)", "mdi:calendar-month-outline", "HSDS", NULL, "total", "d", *optMpptData); // battery info - publishSensor("Battery voltage", NULL, "V", "voltage", "measurement", "V", spMpptData); - publishSensor("Battery current", NULL, "I", "current", "measurement", "A", spMpptData); - publishSensor("Battery power (calculated)", NULL, "P", "power", "measurement", "W", spMpptData); - publishSensor("Battery efficiency (calculated)", NULL, "E", NULL, "measurement", "%", spMpptData); + publishSensor("Battery voltage", NULL, "V", "voltage", "measurement", "V", *optMpptData); + publishSensor("Battery current", NULL, "I", "current", "measurement", "A", *optMpptData); + publishSensor("Battery power (calculated)", NULL, "P", "power", "measurement", "W", *optMpptData); + publishSensor("Battery efficiency (calculated)", NULL, "E", NULL, "measurement", "%", *optMpptData); // panel info - publishSensor("Panel voltage", NULL, "VPV", "voltage", "measurement", "V", spMpptData); - publishSensor("Panel current (calculated)", NULL, "IPV", "current", "measurement", "A", spMpptData); - publishSensor("Panel power", NULL, "PPV", "power", "measurement", "W", spMpptData); - publishSensor("Panel yield total", NULL, "H19", "energy", "total_increasing", "kWh", spMpptData); - publishSensor("Panel yield today", NULL, "H20", "energy", "total", "kWh", spMpptData); - publishSensor("Panel maximum power today", NULL, "H21", "power", "measurement", "W", spMpptData); - publishSensor("Panel yield yesterday", NULL, "H22", "energy", "total", "kWh", spMpptData); - publishSensor("Panel maximum power yesterday", NULL, "H23", "power", "measurement", "W", spMpptData); + publishSensor("Panel voltage", NULL, "VPV", "voltage", "measurement", "V", *optMpptData); + publishSensor("Panel current (calculated)", NULL, "IPV", "current", "measurement", "A", *optMpptData); + publishSensor("Panel power", NULL, "PPV", "power", "measurement", "W", *optMpptData); + publishSensor("Panel yield total", NULL, "H19", "energy", "total_increasing", "kWh", *optMpptData); + publishSensor("Panel yield today", NULL, "H20", "energy", "total", "kWh", *optMpptData); + publishSensor("Panel maximum power today", NULL, "H21", "power", "measurement", "W", *optMpptData); + publishSensor("Panel yield yesterday", NULL, "H22", "energy", "total", "kWh", *optMpptData); + publishSensor("Panel maximum power yesterday", NULL, "H23", "power", "measurement", "W", *optMpptData); } yield(); @@ -102,9 +93,9 @@ void MqttHandleVedirectHassClass::publishConfig() void MqttHandleVedirectHassClass::publishSensor(const char *caption, const char *icon, const char *subTopic, const char *deviceClass, const char *stateClass, const char *unitOfMeasurement, - const VeDirectMpptController::spData_t &spMpptData) + const VeDirectMpptController::data_t &mpptData) { - String serial = spMpptData->SER; + String serial = mpptData.SER; String sensorId = caption; sensorId.replace(" ", "_"); @@ -139,7 +130,7 @@ void MqttHandleVedirectHassClass::publishSensor(const char *caption, const char } JsonObject deviceObj = root.createNestedObject("dev"); - createDeviceInfo(deviceObj, spMpptData); + createDeviceInfo(deviceObj, mpptData); if (Configuration.get().Mqtt.Hass.Expire) { root["exp_aft"] = Configuration.get().Mqtt.PublishInterval * 3; @@ -160,9 +151,9 @@ void MqttHandleVedirectHassClass::publishSensor(const char *caption, const char } void MqttHandleVedirectHassClass::publishBinarySensor(const char *caption, const char *icon, const char *subTopic, const char *payload_on, const char *payload_off, - const VeDirectMpptController::spData_t &spMpptData) + const VeDirectMpptController::data_t &mpptData) { - String serial = spMpptData->SER; + String serial = mpptData.SER; String sensorId = caption; sensorId.replace(" ", "_"); @@ -195,7 +186,7 @@ void MqttHandleVedirectHassClass::publishBinarySensor(const char *caption, const } JsonObject deviceObj = root.createNestedObject("dev"); - createDeviceInfo(deviceObj, spMpptData); + createDeviceInfo(deviceObj, mpptData); if (Utils::checkJsonOverflow(root, __FUNCTION__, __LINE__)) { return; } @@ -205,14 +196,14 @@ void MqttHandleVedirectHassClass::publishBinarySensor(const char *caption, const } void MqttHandleVedirectHassClass::createDeviceInfo(JsonObject &object, - const VeDirectMpptController::spData_t &spMpptData) + const VeDirectMpptController::data_t &mpptData) { - String serial = spMpptData->SER; + String serial = mpptData.SER; object["name"] = "Victron(" + serial + ")"; object["ids"] = serial; object["cu"] = String("http://") + NetworkSettings.localIP().toString(); object["mf"] = "OpenDTU"; - object["mdl"] = spMpptData->getPidAsString(); + object["mdl"] = mpptData.getPidAsString(); object["sw"] = AUTO_GIT_HASH; } diff --git a/src/MqttHandleVedirect.cpp b/src/MqttHandleVedirect.cpp index 92c3d788..6244725a 100644 --- a/src/MqttHandleVedirect.cpp +++ b/src/MqttHandleVedirect.cpp @@ -59,21 +59,13 @@ void MqttHandleVedirectClass::loop() #endif for (int idx = 0; idx < VictronMppt.controllerAmount(); ++idx) { - if (!VictronMppt.isDataValid(idx)) { - continue; - } + std::optional optMpptData = VictronMppt.getData(idx); + if (!optMpptData.has_value()) { continue; } - std::optional spOptMpptData = VictronMppt.getData(idx); - if (!spOptMpptData.has_value()) { - continue; - } - - VeDirectMpptController::spData_t &spMpptData = spOptMpptData.value(); - - VeDirectMpptController::data_t _kvFrame = _kvFrames[spMpptData->SER]; - publish_mppt_data(spMpptData, _kvFrame); + auto const& kvFrame = _kvFrames[optMpptData->SER]; + publish_mppt_data(*optMpptData, kvFrame); if (!_PublishFull) { - _kvFrames[spMpptData->SER] = *spMpptData; + _kvFrames[optMpptData->SER] = *optMpptData; } } @@ -104,79 +96,94 @@ void MqttHandleVedirectClass::loop() } } -void MqttHandleVedirectClass::publish_mppt_data(const VeDirectMpptController::spData_t &spMpptData, - const VeDirectMpptController::data_t &frame) const { +void MqttHandleVedirectClass::publish_mppt_data(const VeDirectMpptController::data_t ¤tData, + const VeDirectMpptController::data_t &previousData) const { String value; String topic = "victron/"; - topic.concat(spMpptData->SER); + topic.concat(currentData.SER); topic.concat("/"); - if (_PublishFull || spMpptData->PID != frame.PID) - MqttSettings.publish(topic + "PID", spMpptData->getPidAsString().data()); - if (_PublishFull || strcmp(spMpptData->SER, frame.SER) != 0) - MqttSettings.publish(topic + "SER", spMpptData->SER ); - if (_PublishFull || strcmp(spMpptData->FW, frame.FW) != 0) - MqttSettings.publish(topic + "FW", spMpptData->FW); - if (_PublishFull || spMpptData->LOAD != frame.LOAD) - MqttSettings.publish(topic + "LOAD", spMpptData->LOAD ? "ON" : "OFF"); - if (_PublishFull || spMpptData->CS != frame.CS) - MqttSettings.publish(topic + "CS", spMpptData->getCsAsString().data()); - if (_PublishFull || spMpptData->ERR != frame.ERR) - MqttSettings.publish(topic + "ERR", spMpptData->getErrAsString().data()); - if (_PublishFull || spMpptData->OR != frame.OR) - MqttSettings.publish(topic + "OR", spMpptData->getOrAsString().data()); - if (_PublishFull || spMpptData->MPPT != frame.MPPT) - MqttSettings.publish(topic + "MPPT", spMpptData->getMpptAsString().data()); - if (_PublishFull || spMpptData->HSDS != frame.HSDS) { - value = spMpptData->HSDS; - MqttSettings.publish(topic + "HSDS", value); + if (_PublishFull || currentData.PID != previousData.PID) { + MqttSettings.publish(topic + "PID", currentData.getPidAsString().data()); } - if (_PublishFull || spMpptData->V != frame.V) { - value = spMpptData->V; - MqttSettings.publish(topic + "V", value); + + if (_PublishFull || strcmp(currentData.SER, previousData.SER) != 0) { + MqttSettings.publish(topic + "SER", currentData.SER); } - if (_PublishFull || spMpptData->I != frame.I) { - value = spMpptData->I; - MqttSettings.publish(topic + "I", value); + + if (_PublishFull || strcmp(currentData.FW, previousData.FW) != 0) { + MqttSettings.publish(topic + "FW", currentData.FW); } - if (_PublishFull || spMpptData->P != frame.P) { - value = spMpptData->P; - MqttSettings.publish(topic + "P", value); + + if (_PublishFull || currentData.LOAD != previousData.LOAD) { + MqttSettings.publish(topic + "LOAD", currentData.LOAD ? "ON" : "OFF"); } - if (_PublishFull || spMpptData->VPV != frame.VPV) { - value = spMpptData->VPV; - MqttSettings.publish(topic + "VPV", value); + + if (_PublishFull || currentData.CS != previousData.CS) { + MqttSettings.publish(topic + "CS", currentData.getCsAsString().data()); } - if (_PublishFull || spMpptData->IPV != frame.IPV) { - value = spMpptData->IPV; - MqttSettings.publish(topic + "IPV", value); + + if (_PublishFull || currentData.ERR != previousData.ERR) { + MqttSettings.publish(topic + "ERR", currentData.getErrAsString().data()); } - if (_PublishFull || spMpptData->PPV != frame.PPV) { - value = spMpptData->PPV; - MqttSettings.publish(topic + "PPV", value); + + if (_PublishFull || currentData.OR != previousData.OR) { + MqttSettings.publish(topic + "OR", currentData.getOrAsString().data()); } - if (_PublishFull || spMpptData->E != frame.E) { - value = spMpptData->E; - MqttSettings.publish(topic + "E", value); + + if (_PublishFull || currentData.MPPT != previousData.MPPT) { + MqttSettings.publish(topic + "MPPT", currentData.getMpptAsString().data()); } - if (_PublishFull || spMpptData->H19 != frame.H19) { - value = spMpptData->H19; - MqttSettings.publish(topic + "H19", value); + + if (_PublishFull || currentData.HSDS != previousData.HSDS) { + MqttSettings.publish(topic + "HSDS", String(currentData.HSDS)); } - if (_PublishFull || spMpptData->H20 != frame.H20) { - value = spMpptData->H20; - MqttSettings.publish(topic + "H20", value); + + if (_PublishFull || currentData.V != previousData.V) { + MqttSettings.publish(topic + "V", String(currentData.V)); } - if (_PublishFull || spMpptData->H21 != frame.H21) { - value = spMpptData->H21; - MqttSettings.publish(topic + "H21", value); + + if (_PublishFull || currentData.I != previousData.I) { + MqttSettings.publish(topic + "I", String(currentData.I)); } - if (_PublishFull || spMpptData->H22 != frame.H22) { - value = spMpptData->H22; - MqttSettings.publish(topic + "H22", value); + + if (_PublishFull || currentData.P != previousData.P) { + MqttSettings.publish(topic + "P", String(currentData.P)); } - if (_PublishFull || spMpptData->H23 != frame.H23) { - value = spMpptData->H23; - MqttSettings.publish(topic + "H23", value); + + if (_PublishFull || currentData.VPV != previousData.VPV) { + MqttSettings.publish(topic + "VPV", String(currentData.VPV)); + } + + if (_PublishFull || currentData.IPV != previousData.IPV) { + MqttSettings.publish(topic + "IPV", String(currentData.IPV)); + } + + if (_PublishFull || currentData.PPV != previousData.PPV) { + MqttSettings.publish(topic + "PPV", String(currentData.PPV)); + } + + if (_PublishFull || currentData.E != previousData.E) { + MqttSettings.publish(topic + "E", String(currentData.E)); + } + + if (_PublishFull || currentData.H19 != previousData.H19) { + MqttSettings.publish(topic + "H19", String(currentData.H19)); + } + + if (_PublishFull || currentData.H20 != previousData.H20) { + MqttSettings.publish(topic + "H20", String(currentData.H20)); + } + + if (_PublishFull || currentData.H21 != previousData.H21) { + MqttSettings.publish(topic + "H21", String(currentData.H21)); + } + + if (_PublishFull || currentData.H22 != previousData.H22) { + MqttSettings.publish(topic + "H22", String(currentData.H22)); + } + + if (_PublishFull || currentData.H23 != previousData.H23) { + MqttSettings.publish(topic + "H23", String(currentData.H23)); } } diff --git a/src/VictronMppt.cpp b/src/VictronMppt.cpp index e39cf3aa..c555e9e8 100644 --- a/src/VictronMppt.cpp +++ b/src/VictronMppt.cpp @@ -119,7 +119,7 @@ uint32_t VictronMpptClass::getDataAgeMillis(size_t idx) const return millis() - _controllers[idx]->getLastUpdate(); } -std::optional VictronMpptClass::getData(size_t idx) const +std::optional VictronMpptClass::getData(size_t idx) const { std::lock_guard lock(_mutex); @@ -129,7 +129,9 @@ std::optional VictronMpptClass::getData(size_t return std::nullopt; } - return std::optional{_controllers[idx]->getData()}; + if (!_controllers[idx]->isDataValid()) { return std::nullopt; } + + return _controllers[idx]->getData(); } int32_t VictronMpptClass::getPowerOutputWatts() const @@ -138,7 +140,7 @@ int32_t VictronMpptClass::getPowerOutputWatts() const for (const auto& upController : _controllers) { if (!upController->isDataValid()) { continue; } - sum += upController->getData()->P; + sum += upController->getData().P; } return sum; @@ -150,7 +152,7 @@ int32_t VictronMpptClass::getPanelPowerWatts() const for (const auto& upController : _controllers) { if (!upController->isDataValid()) { continue; } - sum += upController->getData()->PPV; + sum += upController->getData().PPV; } return sum; @@ -162,7 +164,7 @@ double VictronMpptClass::getYieldTotal() const for (const auto& upController : _controllers) { if (!upController->isDataValid()) { continue; } - sum += upController->getData()->H19; + sum += upController->getData().H19; } return sum; @@ -174,7 +176,7 @@ double VictronMpptClass::getYieldDay() const for (const auto& upController : _controllers) { if (!upController->isDataValid()) { continue; } - sum += upController->getData()->H20; + sum += upController->getData().H20; } return sum; @@ -186,7 +188,7 @@ double VictronMpptClass::getOutputVoltage() const for (const auto& upController : _controllers) { if (!upController->isDataValid()) { continue; } - double volts = upController->getData()->V; + double volts = upController->getData().V; if (min == -1) { min = volts; } min = std::min(min, volts); } diff --git a/src/VictronSmartShunt.cpp b/src/VictronSmartShunt.cpp index 7b6da145..e3da07fa 100644 --- a/src/VictronSmartShunt.cpp +++ b/src/VictronSmartShunt.cpp @@ -31,6 +31,6 @@ void VictronSmartShunt::loop() if (VeDirectShunt.getLastUpdate() <= _lastUpdate) { return; } - _stats->updateFrom(VeDirectShunt.veFrame); + _stats->updateFrom(VeDirectShunt.getData()); _lastUpdate = VeDirectShunt.getLastUpdate(); } diff --git a/src/WebApi_ws_vedirect_live.cpp b/src/WebApi_ws_vedirect_live.cpp index 9ec9d79f..d843475c 100644 --- a/src/WebApi_ws_vedirect_live.cpp +++ b/src/WebApi_ws_vedirect_live.cpp @@ -123,21 +123,17 @@ void WebApiWsVedirectLiveClass::generateJsonResponse(JsonVariant& root, bool ful root["vedirect"]["full_update"] = fullUpdate; for (size_t idx = 0; idx < VictronMppt.controllerAmount(); ++idx) { - std::optional spOptMpptData = VictronMppt.getData(idx); - if (!spOptMpptData.has_value()) { - continue; - } + auto optMpptData = VictronMppt.getData(idx); + if (!optMpptData.has_value()) { continue; } if (!fullUpdate && !hasUpdate(idx)) { continue; } - VeDirectMpptController::spData_t &spMpptData = spOptMpptData.value(); - - String serial(spMpptData->SER); + String serial(optMpptData->SER); if (serial.isEmpty()) { continue; } // serial required as index const JsonObject &nested = array.createNestedObject(serial); nested["data_age_ms"] = VictronMppt.getDataAgeMillis(idx); - populateJson(nested, spMpptData); + populateJson(nested, *optMpptData); } _lastPublish = millis(); @@ -149,56 +145,56 @@ void WebApiWsVedirectLiveClass::generateJsonResponse(JsonVariant& root, bool ful root["dpl"]["PLLIMIT"] = PowerLimiter.getLastRequestedPowerLimit(); } -void WebApiWsVedirectLiveClass::populateJson(const JsonObject &root, const VeDirectMpptController::spData_t &spMpptData) { +void WebApiWsVedirectLiveClass::populateJson(const JsonObject &root, const VeDirectMpptController::data_t &mpptData) { // device info - root["device"]["PID"] = spMpptData->getPidAsString(); - root["device"]["SER"] = spMpptData->SER; - root["device"]["FW"] = spMpptData->FW; - root["device"]["LOAD"] = spMpptData->LOAD ? "ON" : "OFF"; - root["device"]["CS"] = spMpptData->getCsAsString(); - root["device"]["ERR"] = spMpptData->getErrAsString(); - root["device"]["OR"] = spMpptData->getOrAsString(); - root["device"]["MPPT"] = spMpptData->getMpptAsString(); - root["device"]["HSDS"]["v"] = spMpptData->HSDS; + root["device"]["PID"] = mpptData.getPidAsString(); + root["device"]["SER"] = String(mpptData.SER); + root["device"]["FW"] = String(mpptData.FW); + root["device"]["LOAD"] = mpptData.LOAD ? "ON" : "OFF"; + root["device"]["CS"] = mpptData.getCsAsString(); + root["device"]["ERR"] = mpptData.getErrAsString(); + root["device"]["OR"] = mpptData.getOrAsString(); + root["device"]["MPPT"] = mpptData.getMpptAsString(); + root["device"]["HSDS"]["v"] = mpptData.HSDS; root["device"]["HSDS"]["u"] = "d"; // battery info - root["output"]["P"]["v"] = spMpptData->P; + root["output"]["P"]["v"] = mpptData.P; root["output"]["P"]["u"] = "W"; root["output"]["P"]["d"] = 0; - root["output"]["V"]["v"] = spMpptData->V; + root["output"]["V"]["v"] = mpptData.V; root["output"]["V"]["u"] = "V"; root["output"]["V"]["d"] = 2; - root["output"]["I"]["v"] = spMpptData->I; + root["output"]["I"]["v"] = mpptData.I; root["output"]["I"]["u"] = "A"; root["output"]["I"]["d"] = 2; - root["output"]["E"]["v"] = spMpptData->E; + root["output"]["E"]["v"] = mpptData.E; root["output"]["E"]["u"] = "%"; root["output"]["E"]["d"] = 1; // panel info - root["input"]["PPV"]["v"] = spMpptData->PPV; + root["input"]["PPV"]["v"] = mpptData.PPV; root["input"]["PPV"]["u"] = "W"; root["input"]["PPV"]["d"] = 0; - root["input"]["VPV"]["v"] = spMpptData->VPV; + root["input"]["VPV"]["v"] = mpptData.VPV; root["input"]["VPV"]["u"] = "V"; root["input"]["VPV"]["d"] = 2; - root["input"]["IPV"]["v"] = spMpptData->IPV; + root["input"]["IPV"]["v"] = mpptData.IPV; root["input"]["IPV"]["u"] = "A"; root["input"]["IPV"]["d"] = 2; - root["input"]["YieldToday"]["v"] = spMpptData->H20; + root["input"]["YieldToday"]["v"] = mpptData.H20; root["input"]["YieldToday"]["u"] = "kWh"; root["input"]["YieldToday"]["d"] = 3; - root["input"]["YieldYesterday"]["v"] = spMpptData->H22; + root["input"]["YieldYesterday"]["v"] = mpptData.H22; root["input"]["YieldYesterday"]["u"] = "kWh"; root["input"]["YieldYesterday"]["d"] = 3; - root["input"]["YieldTotal"]["v"] = spMpptData->H19; + root["input"]["YieldTotal"]["v"] = mpptData.H19; root["input"]["YieldTotal"]["u"] = "kWh"; root["input"]["YieldTotal"]["d"] = 3; - root["input"]["MaximumPowerToday"]["v"] = spMpptData->H21; + root["input"]["MaximumPowerToday"]["v"] = mpptData.H21; root["input"]["MaximumPowerToday"]["u"] = "W"; root["input"]["MaximumPowerToday"]["d"] = 0; - root["input"]["MaximumPowerYesterday"]["v"] = spMpptData->H23; + root["input"]["MaximumPowerYesterday"]["v"] = mpptData.H23; root["input"]["MaximumPowerYesterday"]["u"] = "W"; root["input"]["MaximumPowerYesterday"]["d"] = 0; }