From 006209e544f0ef9077876961c79e22f40d3afa9f Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Fri, 22 May 2026 08:11:44 +0200 Subject: [PATCH 1/7] change logic and adjust tests --- packages/control/bat_all.py | 5 ++++- packages/control/bat_all_test.py | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/control/bat_all.py b/packages/control/bat_all.py index 990f9419fb..bb0e3a22d0 100644 --- a/packages/control/bat_all.py +++ b/packages/control/bat_all.py @@ -584,7 +584,10 @@ def get_power_limit(self): self.data.set.power_limit = data.data.counter_all_data.data.set.home_consumption * -1 log.debug(f"Speicher-Leistung begrenzen auf {self.data.set.power_limit/1000}kW") elif self.data.config.power_limit_mode == BatPowerLimitMode.MODE_CHARGE_PV_PRODUCTION.value: - self.data.set.power_limit = data.data.pv_all_data.data.get.power * -1 + # PV-Ueberschuss abzueglich Hausverbrauch als Ladeleistung des Speichers nutzen. + # Bei geringem Ueberschuss wird Hausverbrauch durch Speicher ausgeglichen + left_pv_power = data.data.pv_all_data.data.get.power - data.data.counter_all_data.data.set.home_consumption + self.data.set.power_limit = left_pv_power * -1 log.debug(f"Speicher in Höhe des PV-Ertrags laden: {self.data.set.power_limit/1000}kW") elif charge_mode == BatChargeMode.BAT_FORCE_CHARGE: # maximal konfigurierte Ladeleistung des Speichers setzen diff --git a/packages/control/bat_all_test.py b/packages/control/bat_all_test.py index 9fdfc946a2..ccc3b8e75f 100644 --- a/packages/control/bat_all_test.py +++ b/packages/control/bat_all_test.py @@ -222,7 +222,7 @@ class BatControlParams: power_limit_condition=BatPowerLimitCondition.MANUAL.value, bat_manual_mode=ManualMode.MANUAL_LIMIT.value, power_limit_mode=BatPowerLimitMode.MODE_DISCHARGE_HOME_CONSUMPTION.value), - BatControlParams("Manuelle Steuerung, Ladung PV Überschuss", 654, + BatControlParams("Manuelle Steuerung, Ladung PV Überschuss", 1110, power_limit_condition=BatPowerLimitCondition.MANUAL.value, bat_manual_mode=ManualMode.MANUAL_LIMIT.value, power_limit_mode=BatPowerLimitMode.MODE_CHARGE_PV_PRODUCTION.value), @@ -240,7 +240,7 @@ class BatControlParams: power_limit_mode=BatPowerLimitMode.MODE_NO_DISCHARGE.value), BatControlParams("Fahrzeuge laden, Begrenzung Hausverbrauch", -456, power_limit_mode=BatPowerLimitMode.MODE_DISCHARGE_HOME_CONSUMPTION.value), - BatControlParams("Fahrzeuge laden, Ladung PV Überschuss", 654, + BatControlParams("Fahrzeuge laden, Ladung PV Überschuss", 1110, power_limit_mode=BatPowerLimitMode.MODE_CHARGE_PV_PRODUCTION.value), ] @@ -300,7 +300,7 @@ def test_active_bat_control(params: BatControlParams, data_, monkeypatch): price_limit_activated=True, price_limit=0.30, power_limit_mode=BatPowerLimitMode.MODE_NO_DISCHARGE.value), - BatControlParams("Preisgrenze, Überschuss Laden, Grenze unterschritten", 654, + BatControlParams("Preisgrenze, Überschuss Laden, Grenze unterschritten", 1110, power_limit_condition=BatPowerLimitCondition.PRICE_LIMIT.value, price_limit_activated=True, price_limit=0.30, From 5dcd4a55720b58f02f8fafdca69646c019c12c98 Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Fri, 22 May 2026 08:21:41 +0200 Subject: [PATCH 2/7] correct power_limit --- packages/control/bat_all.py | 2 +- packages/control/bat_all_test.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/control/bat_all.py b/packages/control/bat_all.py index bb0e3a22d0..ad7a0bb00c 100644 --- a/packages/control/bat_all.py +++ b/packages/control/bat_all.py @@ -586,7 +586,7 @@ def get_power_limit(self): elif self.data.config.power_limit_mode == BatPowerLimitMode.MODE_CHARGE_PV_PRODUCTION.value: # PV-Ueberschuss abzueglich Hausverbrauch als Ladeleistung des Speichers nutzen. # Bei geringem Ueberschuss wird Hausverbrauch durch Speicher ausgeglichen - left_pv_power = data.data.pv_all_data.data.get.power - data.data.counter_all_data.data.set.home_consumption + left_pv_power = data.data.pv_all_data.data.get.power + data.data.counter_all_data.data.set.home_consumption self.data.set.power_limit = left_pv_power * -1 log.debug(f"Speicher in Höhe des PV-Ertrags laden: {self.data.set.power_limit/1000}kW") elif charge_mode == BatChargeMode.BAT_FORCE_CHARGE: diff --git a/packages/control/bat_all_test.py b/packages/control/bat_all_test.py index ccc3b8e75f..cb62e326d7 100644 --- a/packages/control/bat_all_test.py +++ b/packages/control/bat_all_test.py @@ -222,7 +222,7 @@ class BatControlParams: power_limit_condition=BatPowerLimitCondition.MANUAL.value, bat_manual_mode=ManualMode.MANUAL_LIMIT.value, power_limit_mode=BatPowerLimitMode.MODE_DISCHARGE_HOME_CONSUMPTION.value), - BatControlParams("Manuelle Steuerung, Ladung PV Überschuss", 1110, + BatControlParams("Manuelle Steuerung, Ladung PV Überschuss", 198, power_limit_condition=BatPowerLimitCondition.MANUAL.value, bat_manual_mode=ManualMode.MANUAL_LIMIT.value, power_limit_mode=BatPowerLimitMode.MODE_CHARGE_PV_PRODUCTION.value), @@ -240,7 +240,7 @@ class BatControlParams: power_limit_mode=BatPowerLimitMode.MODE_NO_DISCHARGE.value), BatControlParams("Fahrzeuge laden, Begrenzung Hausverbrauch", -456, power_limit_mode=BatPowerLimitMode.MODE_DISCHARGE_HOME_CONSUMPTION.value), - BatControlParams("Fahrzeuge laden, Ladung PV Überschuss", 1110, + BatControlParams("Fahrzeuge laden, Ladung PV Überschuss", 198, power_limit_mode=BatPowerLimitMode.MODE_CHARGE_PV_PRODUCTION.value), ] @@ -300,7 +300,7 @@ def test_active_bat_control(params: BatControlParams, data_, monkeypatch): price_limit_activated=True, price_limit=0.30, power_limit_mode=BatPowerLimitMode.MODE_NO_DISCHARGE.value), - BatControlParams("Preisgrenze, Überschuss Laden, Grenze unterschritten", 1110, + BatControlParams("Preisgrenze, Überschuss Laden, Grenze unterschritten", 198, power_limit_condition=BatPowerLimitCondition.PRICE_LIMIT.value, price_limit_activated=True, price_limit=0.30, From 81d5bfdc6524c28e1c65114997d9b4d3efbc7d34 Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Fri, 22 May 2026 08:45:42 +0200 Subject: [PATCH 3/7] fix line length --- packages/control/bat_all.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/control/bat_all.py b/packages/control/bat_all.py index ad7a0bb00c..2268f0d875 100644 --- a/packages/control/bat_all.py +++ b/packages/control/bat_all.py @@ -586,7 +586,8 @@ def get_power_limit(self): elif self.data.config.power_limit_mode == BatPowerLimitMode.MODE_CHARGE_PV_PRODUCTION.value: # PV-Ueberschuss abzueglich Hausverbrauch als Ladeleistung des Speichers nutzen. # Bei geringem Ueberschuss wird Hausverbrauch durch Speicher ausgeglichen - left_pv_power = data.data.pv_all_data.data.get.power + data.data.counter_all_data.data.set.home_consumption + left_pv_power = (data.data.pv_all_data.data.get.power + + data.data.counter_all_data.data.set.home_consumption) self.data.set.power_limit = left_pv_power * -1 log.debug(f"Speicher in Höhe des PV-Ertrags laden: {self.data.set.power_limit/1000}kW") elif charge_mode == BatChargeMode.BAT_FORCE_CHARGE: From b22923017fff0be4089826835184465efb398911 Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Fri, 22 May 2026 08:51:46 +0200 Subject: [PATCH 4/7] fix indentation --- packages/control/bat_all.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/control/bat_all.py b/packages/control/bat_all.py index 2268f0d875..1ef9314e31 100644 --- a/packages/control/bat_all.py +++ b/packages/control/bat_all.py @@ -587,7 +587,7 @@ def get_power_limit(self): # PV-Ueberschuss abzueglich Hausverbrauch als Ladeleistung des Speichers nutzen. # Bei geringem Ueberschuss wird Hausverbrauch durch Speicher ausgeglichen left_pv_power = (data.data.pv_all_data.data.get.power + - data.data.counter_all_data.data.set.home_consumption) + data.data.counter_all_data.data.set.home_consumption) self.data.set.power_limit = left_pv_power * -1 log.debug(f"Speicher in Höhe des PV-Ertrags laden: {self.data.set.power_limit/1000}kW") elif charge_mode == BatChargeMode.BAT_FORCE_CHARGE: From 66529a15574a31786c2a01806e480d397d1f0cdc Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Fri, 22 May 2026 09:19:02 +0200 Subject: [PATCH 5/7] handle negative pv-production; add test --- packages/control/bat_all.py | 10 ++++++---- packages/control/bat_all_test.py | 6 +++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/control/bat_all.py b/packages/control/bat_all.py index 1ef9314e31..d5e2d4e9c6 100644 --- a/packages/control/bat_all.py +++ b/packages/control/bat_all.py @@ -586,10 +586,12 @@ def get_power_limit(self): elif self.data.config.power_limit_mode == BatPowerLimitMode.MODE_CHARGE_PV_PRODUCTION.value: # PV-Ueberschuss abzueglich Hausverbrauch als Ladeleistung des Speichers nutzen. # Bei geringem Ueberschuss wird Hausverbrauch durch Speicher ausgeglichen - left_pv_power = (data.data.pv_all_data.data.get.power + - data.data.counter_all_data.data.set.home_consumption) - self.data.set.power_limit = left_pv_power * -1 - log.debug(f"Speicher in Höhe des PV-Ertrags laden: {self.data.set.power_limit/1000}kW") + pv_power = min(data.data.pv_all_data.data.get.power, 0) + left_pv_power = (pv_power + + data.data.counter_all_data.data.set.home_consumption) * -1 + self.data.set.power_limit = left_pv_power + log.debug("Speicher in Höhe des verbliebenen PV-Überschusses " + f"laden: {self.data.set.power_limit/1000}kW") elif charge_mode == BatChargeMode.BAT_FORCE_CHARGE: # maximal konfigurierte Ladeleistung des Speichers setzen max_charge_power_total = 0 diff --git a/packages/control/bat_all_test.py b/packages/control/bat_all_test.py index cb62e326d7..e74f9e11c1 100644 --- a/packages/control/bat_all_test.py +++ b/packages/control/bat_all_test.py @@ -192,6 +192,7 @@ class BatControlParams: bat_power: float = -10 bat_soc: float = 50.0 evu_power: float = 200 + pv_power: float = -654 bat_control_permitted: bool = True bat_control_activated: bool = True max_charge_power: float = 5000 @@ -242,6 +243,9 @@ class BatControlParams: power_limit_mode=BatPowerLimitMode.MODE_DISCHARGE_HOME_CONSUMPTION.value), BatControlParams("Fahrzeuge laden, Ladung PV Überschuss", 198, power_limit_mode=BatPowerLimitMode.MODE_CHARGE_PV_PRODUCTION.value), + BatControlParams("Fahrzeuge laden, Ladung PV Überschuss, PV-Negativ", -456, + power_limit_mode=BatPowerLimitMode.MODE_CHARGE_PV_PRODUCTION.value, + pv_power=100), ] @@ -265,7 +269,7 @@ def test_active_bat_control(params: BatControlParams, data_, monkeypatch): # b_all.data.get.soc = 50.0 data.data.counter_all_data = hierarchy_standard() data.data.counter_all_data.data.set.home_consumption = 456 - data.data.pv_all_data.data.get.power = -654 + data.data.pv_all_data.data.get.power = params.pv_power data.data.cp_all_data.data.get.power = 1400 data.data.counter_data["counter0"].data.get.power = params.evu_power data.data.bat_all_data = b_all From 8d5099317defc320061460f640e1a314300e9cd3 Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Fri, 22 May 2026 09:35:25 +0200 Subject: [PATCH 6/7] Better Log and test description --- packages/control/bat_all.py | 8 ++++++-- packages/control/bat_all_test.py | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/control/bat_all.py b/packages/control/bat_all.py index d5e2d4e9c6..819c6250cd 100644 --- a/packages/control/bat_all.py +++ b/packages/control/bat_all.py @@ -590,8 +590,12 @@ def get_power_limit(self): left_pv_power = (pv_power + data.data.counter_all_data.data.set.home_consumption) * -1 self.data.set.power_limit = left_pv_power - log.debug("Speicher in Höhe des verbliebenen PV-Überschusses " - f"laden: {self.data.set.power_limit/1000}kW") + if self.data.set.power_limit > 0: + log.debug("Speicher in Höhe des verbliebenen PV-Überschusses " + f"laden: {self.data.set.power_limit/1000}kW") + else: + log.debug("Speicher Entladen um Hausverbrauch zu decken: " + f"{self.data.set.power_limit/1000}kW") elif charge_mode == BatChargeMode.BAT_FORCE_CHARGE: # maximal konfigurierte Ladeleistung des Speichers setzen max_charge_power_total = 0 diff --git a/packages/control/bat_all_test.py b/packages/control/bat_all_test.py index e74f9e11c1..a5da866014 100644 --- a/packages/control/bat_all_test.py +++ b/packages/control/bat_all_test.py @@ -243,7 +243,7 @@ class BatControlParams: power_limit_mode=BatPowerLimitMode.MODE_DISCHARGE_HOME_CONSUMPTION.value), BatControlParams("Fahrzeuge laden, Ladung PV Überschuss", 198, power_limit_mode=BatPowerLimitMode.MODE_CHARGE_PV_PRODUCTION.value), - BatControlParams("Fahrzeuge laden, Ladung PV Überschuss, PV-Negativ", -456, + BatControlParams("Fahrzeuge laden, Ladung PV Überschuss, Eigenverbrauch PV-Anlage", -456, power_limit_mode=BatPowerLimitMode.MODE_CHARGE_PV_PRODUCTION.value, pv_power=100), ] From 6adc8186e322ca989ce0c077321c7a9ee8a07097 Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Fri, 22 May 2026 09:56:29 +0200 Subject: [PATCH 7/7] Umlaut --- packages/control/bat_all.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/control/bat_all.py b/packages/control/bat_all.py index 819c6250cd..a372359bcd 100644 --- a/packages/control/bat_all.py +++ b/packages/control/bat_all.py @@ -584,8 +584,8 @@ def get_power_limit(self): self.data.set.power_limit = data.data.counter_all_data.data.set.home_consumption * -1 log.debug(f"Speicher-Leistung begrenzen auf {self.data.set.power_limit/1000}kW") elif self.data.config.power_limit_mode == BatPowerLimitMode.MODE_CHARGE_PV_PRODUCTION.value: - # PV-Ueberschuss abzueglich Hausverbrauch als Ladeleistung des Speichers nutzen. - # Bei geringem Ueberschuss wird Hausverbrauch durch Speicher ausgeglichen + # PV-Überschuss abzüglich Hausverbrauch als Ladeleistung des Speichers nutzen. + # Bei geringem Überschuss wird Hausverbrauch durch Speicher ausgeglichen pv_power = min(data.data.pv_all_data.data.get.power, 0) left_pv_power = (pv_power + data.data.counter_all_data.data.set.home_consumption) * -1