From 1e968a17133604da4b23439479cffc40117495ce Mon Sep 17 00:00:00 2001 From: helgeerbe Date: Sat, 25 Feb 2023 16:28:21 +0100 Subject: [PATCH] Add target for power consumption --- src/PowerLimiter.cpp | 55 ++++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/src/PowerLimiter.cpp b/src/PowerLimiter.cpp index 387b8988..940a1478 100644 --- a/src/PowerLimiter.cpp +++ b/src/PowerLimiter.cpp @@ -148,41 +148,50 @@ void PowerLimiterClass::loop() } int32_t newPowerLimit = 0; + bool withinTargetRange = false; if (millis() - _lastPowerMeterUpdate < (30 * 1000)) { newPowerLimit = static_cast(_powerMeter1Power + _powerMeter2Power + _powerMeter3Power); + // check if grid power consumption is within the upper an lower threshold of the target consumption + if (!_consumeSolarPowerOnly && + newPowerLimit > (config.PowerLimiter_TargetPowerConsumption - config.PowerLimiter_TargetPowerConsumptionHysteresis) && + newPowerLimit < (config.PowerLimiter_TargetPowerConsumption + config.PowerLimiter_TargetPowerConsumptionHysteresis)) + withinTargetRange = true; + else { + if (config.PowerLimiter_IsInverterBehindPowerMeter) { + // If the inverter the behind the power meter (part of measurement), + // the produced power of this inverter has also to be taken into account. + // We don't use FLD_PAC from the statistics, because that + // data might be too old and unrelieable. + newPowerLimit += _lastRequestedPowerLimit; + } - if (config.PowerLimiter_IsInverterBehindPowerMeter) { - // If the inverter the behind the power meter (part of measurement), - // the produced power of this inverter has also to be taken into account. - // We don't use FLD_PAC from the statistics, because that - // data might be too old and unrelieable. - newPowerLimit += _lastRequestedPowerLimit; + newPowerLimit -= config.PowerLimiter_TargetPowerConsumption; + + uint16_t upperPowerLimit = config.PowerLimiter_UpperPowerLimit; + if (_consumeSolarPowerOnly && upperPowerLimit > victronChargePower) { + // Battery voltage too low, use Victron solar power only + upperPowerLimit = victronChargePower; + } + + newPowerLimit = constrain(newPowerLimit, (uint16_t)config.PowerLimiter_LowerPowerLimit, upperPowerLimit); + + MessageOutput.printf("[PowerLimiterClass::loop] powerMeter: %d W lastRequestedPowerLimit: %d\r\n", + static_cast(_powerMeter1Power + _powerMeter2Power + _powerMeter3Power), _lastRequestedPowerLimit); } - - newPowerLimit -= 10; - - uint16_t upperPowerLimit = config.PowerLimiter_UpperPowerLimit; - if (_consumeSolarPowerOnly && upperPowerLimit > victronChargePower) { - // Battery voltage too low, use Victron solar power only - upperPowerLimit = victronChargePower; - } - - newPowerLimit = constrain(newPowerLimit, (uint16_t)config.PowerLimiter_LowerPowerLimit, upperPowerLimit); - - MessageOutput.printf("[PowerLimiterClass::loop] powerMeter: %d W lastRequestedPowerLimit: %d\r\n", - static_cast(_powerMeter1Power + _powerMeter2Power + _powerMeter3Power), _lastRequestedPowerLimit); } else { // If the power meter values are older than 30 seconds, // set the limit to config.PowerLimiter_LowerPowerLimit for safety reasons. newPowerLimit = config.PowerLimiter_LowerPowerLimit; } - MessageOutput.printf("[PowerLimiterClass::loop] Limit Non-Persistent: %d W\r\n", newPowerLimit); - inverter->sendActivePowerControlRequest(Hoymiles.getRadio(), newPowerLimit, PowerLimitControlType::AbsolutNonPersistent); - _lastRequestedPowerLimit = newPowerLimit; + if(!withinTargetRange) { + MessageOutput.printf("[PowerLimiterClass::loop] Limit Non-Persistent: %d W\r\n", newPowerLimit); + inverter->sendActivePowerControlRequest(Hoymiles.getRadio(), newPowerLimit, PowerLimitControlType::AbsolutNonPersistent); + _lastRequestedPowerLimit = newPowerLimit; - _lastCommandSent = millis(); + _lastCommandSent = millis(); + } } bool PowerLimiterClass::canUseDirectSolarPower()