From 12c1f2d512d1d9596a28a78c19f3c737a793ee71 Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Sun, 22 Oct 2023 19:30:36 +0200 Subject: [PATCH 1/2] VE.Direct: return non-nullptr as a fallback the changed return statement was supposed to return a shared_ptr to a new and valid MPPT data struct as a fallback. however, it did return a new shared_ptr that was initialized to nullptr. --- src/VictronMppt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VictronMppt.cpp b/src/VictronMppt.cpp index b857e0ec0..046e18857 100644 --- a/src/VictronMppt.cpp +++ b/src/VictronMppt.cpp @@ -78,7 +78,7 @@ VeDirectMpptController::spData_t VictronMpptClass::getData(size_t idx) const if (_controllers.empty() || idx >= _controllers.size()) { MessageOutput.printf("ERROR: MPPT controller index %d is out of bounds (%d controllers)\r\n", idx, _controllers.size()); - return VeDirectMpptController::spData_t{}; + return std::make_shared(); } return _controllers[idx]->getData(); From 844d021ed9354fa21585ed0738cde6e64cf9e1bf Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Sun, 22 Oct 2023 20:00:30 +0200 Subject: [PATCH 2/2] VE.Direct: make liveview total use total MPPT values this change makes the call to VictronMppt.getData() obsolete, which in turn will therefore not cause an error message on the console if VE.Direct (MPPT) is not enabled. this change also takes care that once multiple VE.Direct MPPT charge controllers are supported, the sums of the respective total values are used in the web app totals. --- include/VictronMppt.h | 9 +++++++++ src/VictronMppt.cpp | 33 +++++++++++++++++++++++++++++++++ src/WebApi_ws_live.cpp | 7 +++---- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/include/VictronMppt.h b/include/VictronMppt.h index 6718ef330..d64fbb4cf 100644 --- a/include/VictronMppt.h +++ b/include/VictronMppt.h @@ -25,6 +25,15 @@ class VictronMpptClass { // total output of all MPPT charge controllers in Watts int32_t getPowerOutputWatts() const; + // total panel input power of all MPPT charge controllers in Watts + int32_t getPanelPowerWatts() const; + + // sum of total yield of all MPPT charge controllers in kWh + double getYieldTotal() const; + + // sum of today's yield of all MPPT charge controllers in kWh + double getYieldDay() const; + private: VictronMpptClass(VictronMpptClass const& other) = delete; VictronMpptClass(VictronMpptClass&& other) = delete; diff --git a/src/VictronMppt.cpp b/src/VictronMppt.cpp index 046e18857..609f8bf05 100644 --- a/src/VictronMppt.cpp +++ b/src/VictronMppt.cpp @@ -94,3 +94,36 @@ int32_t VictronMpptClass::getPowerOutputWatts() const return sum; } + +int32_t VictronMpptClass::getPanelPowerWatts() const +{ + int32_t sum = 0; + + for (const auto& upController : _controllers) { + sum += upController->getData()->PPV; + } + + return sum; +} + +double VictronMpptClass::getYieldTotal() const +{ + double sum = 0; + + for (const auto& upController : _controllers) { + sum += upController->getData()->H19; + } + + return sum; +} + +double VictronMpptClass::getYieldDay() const +{ + double sum = 0; + + for (const auto& upController : _controllers) { + sum += upController->getData()->H20; + } + + return sum; +} diff --git a/src/WebApi_ws_live.cpp b/src/WebApi_ws_live.cpp index fdca8baae..f74d5a549 100644 --- a/src/WebApi_ws_live.cpp +++ b/src/WebApi_ws_live.cpp @@ -192,10 +192,9 @@ void WebApiWsLiveClass::generateJsonResponse(JsonVariant& root) vedirectObj[F("enabled")] = Configuration.get().Vedirect_Enabled; JsonObject totalVeObj = vedirectObj.createNestedObject("total"); - auto spMpptData = VictronMppt.getData(); - addTotalField(totalVeObj, "Power", spMpptData->PPV, "W", 1); - addTotalField(totalVeObj, "YieldDay", spMpptData->H20 * 1000, "Wh", 0); - addTotalField(totalVeObj, "YieldTotal", spMpptData->H19, "kWh", 2); + addTotalField(totalVeObj, "Power", VictronMppt.getPanelPowerWatts(), "W", 1); + addTotalField(totalVeObj, "YieldDay", VictronMppt.getYieldDay() * 1000, "Wh", 0); + addTotalField(totalVeObj, "YieldTotal", VictronMppt.getYieldTotal(), "kWh", 2); JsonObject huaweiObj = root.createNestedObject("huawei"); huaweiObj[F("enabled")] = Configuration.get().Huawei_Enabled;