From a1da3f98420bd7e4fc5bae818a9226cc25c0a606 Mon Sep 17 00:00:00 2001 From: qubeck Date: Sun, 2 Apr 2023 22:13:43 +0200 Subject: [PATCH] producing DC channel aware artificial increase of applied power limit to mitigate fixed distribution of applied power limit across all channels --- src/PowerLimiter.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/PowerLimiter.cpp b/src/PowerLimiter.cpp index b9b5b171d..93decf9fe 100644 --- a/src/PowerLimiter.cpp +++ b/src/PowerLimiter.cpp @@ -223,7 +223,18 @@ void PowerLimiterClass::setNewPowerLimit(std::shared_ptr inver _lastCommandSent = millis(); } MessageOutput.printf("[PowerLimiterClass::loop] Limit Non-Persistent: %d W\r\n", newPowerLimit); - inverter->sendActivePowerControlRequest(Hoymiles.getRadio(), newPowerLimit, PowerLimitControlType::AbsolutNonPersistent); + + std::list dcChnls = inverter->Statistics()->getChannelsByType(TYPE_DC); + int dcProdChnls = 0, dcTotalChnls = dcChnls.size(); + for (auto& c : dcChnls){ + if (inverter->Statistics()->getChannelFieldValue(TYPE_DC, c, FLD_PDC) > 0) + dcProdChnls++; + } + int32_t effPowerLimit = round(newPowerLimit * (float)dcTotalChnls / dcProdChnls); + if (effPowerLimit > config.PowerLimiter_UpperPowerLimit) + effPowerLimit = config.PowerLimiter_UpperPowerLimit; + + inverter->sendActivePowerControlRequest(Hoymiles.getRadio(), effPowerLimit, PowerLimitControlType::AbsolutNonPersistent); _lastRequestedPowerLimit = newPowerLimit; } }