diff --git a/packages/control/bat_all.py b/packages/control/bat_all.py index 255858a658..8df18ee0d7 100644 --- a/packages/control/bat_all.py +++ b/packages/control/bat_all.py @@ -318,31 +318,6 @@ def setup_bat(self): except Exception: log.exception("Fehler im Bat-Modul") - def _charging_power_left_while_recovering(self, config) -> float: - """ Speicher-Vorrang, waehrend sich der Speicher auf dem Weg zum naechsten SoC-Ziel befindet - (unterhalb Mindest-SoC, oder oberhalb Mindest-SoC aber noch nicht wieder beim Maximal-SoC - angekommen, hysteresis_discharge=False): ermittelt, wie viel Leistung den Fahrzeugen dabei - verbleibt, unter Beruecksichtigung einer optional reservierten Ladeleistung. - """ - if self.data.get.power < 0: - # Wenn der Speicher entladen wird, darf diese Leistung nicht zum Laden der Fahrzeuge - # genutzt werden. Wenn der Speicher schneller regelt als die LP, würde sonst der Speicher - # reduziert werden. - charging_power_left = self.data.get.power - self.data.set.regulate_up = True - else: - if config.power_reserve_active: - # Die Differenz zwischen aktueller Batterie-Leistung und Reserveleistung bestimmt, - # was fuer EV-Ladung verbleibt (positiv) oder zusaetzlich benoetigt wird (negativ). - charging_power_left = self.data.get.power - config.power_reserve - if charging_power_left < 0: - self.data.set.regulate_up = True - else: - # Speicher wird geladen - charging_power_left = 0 - self.data.set.regulate_up = True - return charging_power_left - def get_charging_power_left_diff(self): """Ermittelt die Differenz zur aktuellen Batterie-Leistung, die zum Laden der EV verwendet werden darf. @@ -374,18 +349,30 @@ def get_charging_power_left_diff(self): # Speicher soll geladen werden um min SoC zu erreichen if self.data.get.soc < config.min_soc: self.data.set.hysteresis_discharge = False - charging_power_left = self._charging_power_left_while_recovering(config) + if self.data.get.power < 0: + # Wenn der Speicher entladen wird, darf diese Leistung nicht zum Laden der Fahrzeuge + # genutzt werden. Wenn der Speicher schneller regelt als die LP, würde sonst der Speicher + # reduziert werden. + charging_power_left = self.data.get.power + self.data.set.regulate_up = True + else: + # Speicher-Vorrang bis zum Min-Soc + if config.power_reserve_active: + # Die Differenz zwischen aktueller Batterie-Leistung und Reserveleistung bestimmt, + # was fuer EV-Ladung verbleibt (positiv) oder zusaetzlich benoetigt wird (negativ). + charging_power_left = self.data.get.power - config.power_reserve + if charging_power_left < 0: + self.data.set.regulate_up = True + else: + # Speicher wird geladen + charging_power_left = 0 + self.data.set.regulate_up = True # Speicher zwischen min und max SoC elif int(self.data.get.soc) >= config.min_soc and int(self.data.get.soc) < config.max_soc: # Speicher soll aktiv weder ge- noch entladen werden. # Mindest-SoC wird gehalten oder der Speicher mit weiterem vorhanden Überschuss geladen. if self.data.set.hysteresis_discharge is False: - # Speicher befindet sich noch in der Erholung nach Unterschreiten des Mindest-SoC: - # Vorrang fuer den Speicher bis zum Erreichen des Maximal-SoC (hysteresis_discharge - # wird erst dort wieder True), analog zum Zweig unterhalb des Mindest-SoC - sonst - # bleibt der Speicher dauerhaft knapp oberhalb des Mindest-SoC haengen, weil die - # Hysterese nie zurueckgesetzt wird. - charging_power_left = self._charging_power_left_while_recovering(config) + charging_power_left = self.data.get.power # Speicher darf wegen Hysterese bis min_soc entladen werden. else: if self.data.set.power_limit is None: @@ -417,11 +404,8 @@ def get_charging_power_left_diff(self): absolute_bat_discharge_power) log.debug(f"Erlaubte Entlade-Leistung nutzen {charging_power_left}W") else: - # Entladung nicht erlaubt: nur eine tatsächliche Entladung darf nicht ans - # Fahrzeug weitergereicht werden, sonst wird der Speicher entladen, obwohl der - # Nutzer das nicht erlaubt hat. Lädt der Speicher dagegen, bleibt diese Leistung - # weiterhin für ihn reserviert. - charging_power_left = max(base_power, 0) + # Speicher sollte weder ge- noch entladen werden. + charging_power_left = base_power else: log.debug("Keine erlaubte Entladeleistung freigeben, da der Speicher mit einer vorgegeben " "Leistung entladen wird.") @@ -457,11 +441,8 @@ def get_charging_power_left_diff(self): absolute_bat_discharge_power) log.debug(f"Erlaubte Entlade-Leistung nutzen {charging_power_left}W") else: - # Entladung nicht erlaubt: nur eine tatsächliche Entladung darf nicht ans Fahrzeug - # weitergereicht werden, sonst wird der Speicher entladen, obwohl der Nutzer das - # nicht erlaubt hat. Lädt der Speicher dagegen, bleibt diese Leistung weiterhin für - # ihn reserviert. - charging_power_left = max(base_power, 0) + # Speicher sollte weder ge- noch entladen werden. + charging_power_left = base_power else: log.debug("Keine erlaubte Entladeleistung freigeben, da der Speicher mit einer vorgegeben " "Leistung entladen wird.") diff --git a/packages/control/bat_all_test.py b/packages/control/bat_all_test.py index 0985f3e6c5..4f0a6f7cbe 100644 --- a/packages/control/bat_all_test.py +++ b/packages/control/bat_all_test.py @@ -128,9 +128,9 @@ class Params: Params("Mindest-SoC, SoC nicht erreicht, Speicher-Reserve ausgenutzt, Speicher lädt", ChargemodeConfigBat(mode="min_soc_bat_mode", power_reserve=2000, power_reserve_active=True), 2200, 40, 200, False), - Params("Mindest-SoC, SoC erreicht, Entladung nicht erlaubt, Speicher entlädt trotzdem", - ChargemodeConfigBat(mode="min_soc_bat_mode"), -500, 90, 0, False), - Params("Mindest-SoC, SoC erreicht, Entladung nicht erlaubt, Speicher lädt", + Params("Mindest-SoC, SoC erreicht, Speicher entlädt", ChargemodeConfigBat(mode="min_soc_bat_mode"), -500, 90, -500, + False), + Params("Mindest-SoC, SoC erreicht, Speicher lädt", ChargemodeConfigBat(mode="min_soc_bat_mode"), 500, 90, 500, False), Params("Mindest-SoC, SoC erreicht, Speicher ist voll", ChargemodeConfigBat(mode="min_soc_bat_mode"), 0, 100, 0, False), @@ -156,23 +156,14 @@ class Params: "Speicher-Sperre aktiv"), ChargemodeConfigBat(mode="min_soc_bat_mode", power_discharge=500, power_discharge_active=True), 400, 90, 0, False, 600), - Params(("Mindest-SoC, Hysterese, Erholung nach Unterschreiten, Speicher-Vorrang bis Maximal-SoC"), - ChargemodeConfigBat(mode="min_soc_bat_mode"), 400, 60, -100, True, hysteresis_discharge=False), - Params(("Mindest-SoC, Hysterese, Erholung nach Unterschreiten, Speicher-Reserve aktiv"), - ChargemodeConfigBat(mode="min_soc_bat_mode", power_reserve=2000, power_reserve_active=True), - 2200, 60, 200, False, hysteresis_discharge=False), - Params(("Mindest-SoC, Hysterese, Erholung nach Unterschreiten, Speicher entlädt noch"), - ChargemodeConfigBat(mode="min_soc_bat_mode"), -300, 60, -400, True, hysteresis_discharge=False), + Params(("Mindest-SoC, Hysterese, EV-Vorrang, keine Speichernutzung"), + ChargemodeConfigBat(mode="min_soc_bat_mode"), 400, 60, 400, False, hysteresis_discharge=False), Params(("Mindest-SoC, Hysterese, Speicherentladung, Speichernutzung erlaubt"), ChargemodeConfigBat(mode="min_soc_bat_mode", power_discharge=500, power_discharge_active=True), 400, 60, 900, False, hysteresis_discharge=True), Params(("Mindest-SoC, Hysterese, Speicherentladung, Speichernutzung erlaubt, Speicher-Sperre aktiv"), ChargemodeConfigBat(mode="min_soc_bat_mode", power_discharge=500, power_discharge_active=True), 400, 60, 0, False, 600, hysteresis_discharge=True), - Params(("Mindest-SoC, Hysterese, Entladung nicht erlaubt, Speicher entlädt trotzdem"), - ChargemodeConfigBat(mode="min_soc_bat_mode"), -500, 60, 0, False, hysteresis_discharge=True), - Params(("Mindest-SoC, Hysterese, Entladung nicht erlaubt, Speicher lädt"), - ChargemodeConfigBat(mode="min_soc_bat_mode"), 500, 60, 500, False, hysteresis_discharge=True), ]