From 79889454cd708b9915f546b49e53dbb0decd2a4b Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Fri, 19 Sep 2025 15:36:20 +0200 Subject: [PATCH 1/3] move retry_failed_phase_switches and phase_switch_delay to pv charging settings --- packages/control/chargepoint/chargepoint.py | 6 ++-- .../control/chargepoint/chargepoint_test.py | 5 ++- packages/control/ev/ev.py | 3 +- packages/control/general.py | 8 ++--- packages/helpermodules/create_debug.py | 31 ++++++++++--------- packages/helpermodules/setdata.py | 4 +-- packages/helpermodules/update_config.py | 23 +++++++++----- 7 files changed, 45 insertions(+), 35 deletions(-) diff --git a/packages/control/chargepoint/chargepoint.py b/packages/control/chargepoint/chargepoint.py index e2a02c1119..237ba42b22 100644 --- a/packages/control/chargepoint/chargepoint.py +++ b/packages/control/chargepoint/chargepoint.py @@ -382,7 +382,7 @@ def _is_phase_switch_required(self) -> bool: if phase_switch_required: # Umschaltung fehlgeschlagen if self.data.set.phases_to_use != self.data.get.phases_in_use: - if data.data.general_data.data.chargemode_config.retry_failed_phase_switches: + if data.data.general_data.data.chargemode_config.pv_charging.retry_failed_phase_switches: if self.data.control_parameter.failed_phase_switches > self.MAX_FAILED_PHASE_SWITCHES: phase_switch_required = False self.set_state_and_log( @@ -911,9 +911,9 @@ def hw_supports_phase_switch(self) -> bool: self.data.set.log.imported_since_plugged == 0)) def failed_phase_switches_reached(self) -> bool: - if ((data.data.general_data.data.chargemode_config.retry_failed_phase_switches and + if ((data.data.general_data.data.chargemode_config.pv_charging.retry_failed_phase_switches and self.data.control_parameter.failed_phase_switches > self.MAX_FAILED_PHASE_SWITCHES) or - (data.data.general_data.data.chargemode_config.retry_failed_phase_switches is False and + (data.data.general_data.data.chargemode_config.pv_charging.retry_failed_phase_switches is False and self.data.control_parameter.failed_phase_switches == 1)): self.set_state_and_log( "Keine Phasenumschaltung, da die maximale Anzahl an Fehlversuchen erreicht wurde. ") diff --git a/packages/control/chargepoint/chargepoint_test.py b/packages/control/chargepoint/chargepoint_test.py index 4bdac31c1d..bc5251cc3c 100644 --- a/packages/control/chargepoint/chargepoint_test.py +++ b/packages/control/chargepoint/chargepoint_test.py @@ -135,7 +135,10 @@ def test_is_phase_switch_required(params: Params): cp.data.get.charge_state = params.charge_state cp.data.control_parameter.failed_phase_switches = params.failed_phase_switches data.data_init(Mock()) - data.data.general_data.data.chargemode_config.retry_failed_phase_switches = params.retry_failed_phase_switches + # Zeile aufteilen, um Lesbarkeit zu verbessern + data.data.general_data.data.chargemode_config.pv_charging.retry_failed_phase_switches = ( + params.retry_failed_phase_switches + ) # evaluation ret = cp._is_phase_switch_required() diff --git a/packages/control/ev/ev.py b/packages/control/ev/ev.py index 1d76f1a4a6..b1c1c54767 100644 --- a/packages/control/ev/ev.py +++ b/packages/control/ev/ev.py @@ -314,13 +314,12 @@ def auto_phase_switch(self, phases_to_use = control_parameter.phases phases_in_use = control_parameter.phases pv_config = data.data.general_data.data.chargemode_config.pv_charging - cm_config = data.data.general_data.data.chargemode_config if charge_template.data.chargemode.pv_charging.feed_in_limit: feed_in_yield = pv_config.feed_in_yield else: feed_in_yield = 0 all_surplus = data.data.counter_all_data.get_evu_counter().get_usable_surplus(feed_in_yield) - delay = cm_config.phase_switch_delay * 60 + delay = pv_config.phase_switch_delay * 60 if phases_in_use == 1: direction_str = f"Umschaltung von 1 auf {max_phases}" required_reserved_power = (control_parameter.min_current * max_phases * 230 - diff --git a/packages/control/general.py b/packages/control/general.py index 52d8bf7a7e..388e83514a 100644 --- a/packages/control/general.py +++ b/packages/control/general.py @@ -38,6 +38,9 @@ class PvCharging: "topic": "chargemode_config/pv_charging/max_bat_soc"}) bat_mode: BatConsiderationMode = field(default=BatConsiderationMode.EV_MODE.value, metadata={ "topic": "chargemode_config/pv_charging/bat_mode"}) + retry_failed_phase_switches: bool = field( + default=False, + metadata={"topic": "chargemode_config/pv_charging/retry_failed_phase_switches"}) switch_off_delay: int = field(default=60, metadata={ "topic": "chargemode_config/pv_charging/switch_off_delay"}) switch_off_threshold: int = field(default=0, metadata={ @@ -54,12 +57,7 @@ def pv_charging_factory() -> PvCharging: @dataclass class ChargemodeConfig: - phase_switch_delay: int = field(default=5, metadata={ - "topic": "chargemode_config/phase_switch_delay"}) pv_charging: PvCharging = field(default_factory=pv_charging_factory) - retry_failed_phase_switches: bool = field( - default=False, - metadata={"topic": "chargemode_config/retry_failed_phase_switches"}) unbalanced_load_limit: int = field( default=18, metadata={"topic": "chargemode_config/unbalanced_load_limit"}) unbalanced_load: bool = field(default=False, metadata={ diff --git a/packages/helpermodules/create_debug.py b/packages/helpermodules/create_debug.py index 1d1d97393c..1160b8290e 100644 --- a/packages/helpermodules/create_debug.py +++ b/packages/helpermodules/create_debug.py @@ -111,21 +111,22 @@ def config_and_state(): if secondary is False: with ErrorHandlingContext(): chargemode_config = data.data.general_data.data.chargemode_config - parsed_data += ("\n## General Charge Config/ PV ##\n" - f"Phase_Switch_Delay: {chargemode_config.phase_switch_delay} min\n" - f"Retry_Failed_Phase_Switches: {chargemode_config.retry_failed_phase_switches}\n" - f"Control_Range: {chargemode_config.pv_charging.control_range}W\n" - f"Switch_On_Threshold: {chargemode_config.pv_charging.switch_on_threshold}W\n" - f"Switch_On_Delay: {chargemode_config.pv_charging.switch_on_delay}s\n" - f"Switch_Off_Threshold: {chargemode_config.pv_charging.switch_off_threshold}W\n" - f"Switch_Off_Delay: {chargemode_config.pv_charging.switch_off_delay}s\n" - f"Feed_In_Yield: {chargemode_config.pv_charging.feed_in_yield}W\n" - f"Bat_Mode: {chargemode_config.pv_charging.bat_mode}\n" - f"Min_Bat_SoC: {chargemode_config.pv_charging.min_bat_soc}%\n" - f"Bat_Power_Reserve_Active: {chargemode_config.pv_charging.bat_power_reserve_active}\n" - f"Bat_Power_Reserve: {chargemode_config.pv_charging.bat_power_reserve}W\n" - f"Bat_Power_Discharge_Active: {chargemode_config.pv_charging.bat_power_discharge_active}\n" - f"Bat_Power_Discharge: {chargemode_config.pv_charging.bat_power_discharge}W\n") + parsed_data += ( + "\n## General Charge Config/ PV ##\n" + f"Phase_Switch_Delay: {chargemode_config.pv_charging.phase_switch_delay} min\n" + f"Retry_Failed_Phase_Switches: {chargemode_config.pv_charging.retry_failed_phase_switches}\n" + f"Control_Range: {chargemode_config.pv_charging.control_range}W\n" + f"Switch_On_Threshold: {chargemode_config.pv_charging.switch_on_threshold}W\n" + f"Switch_On_Delay: {chargemode_config.pv_charging.switch_on_delay}s\n" + f"Switch_Off_Threshold: {chargemode_config.pv_charging.switch_off_threshold}W\n" + f"Switch_Off_Delay: {chargemode_config.pv_charging.switch_off_delay}s\n" + f"Feed_In_Yield: {chargemode_config.pv_charging.feed_in_yield}W\n" + f"Bat_Mode: {chargemode_config.pv_charging.bat_mode}\n" + f"Min_Bat_SoC: {chargemode_config.pv_charging.min_bat_soc}%\n" + f"Bat_Power_Reserve_Active: {chargemode_config.pv_charging.bat_power_reserve_active}\n" + f"Bat_Power_Reserve: {chargemode_config.pv_charging.bat_power_reserve}W\n" + f"Bat_Power_Discharge_Active: {chargemode_config.pv_charging.bat_power_discharge_active}\n" + f"Bat_Power_Discharge: {chargemode_config.pv_charging.bat_power_discharge}W\n") if secondary is False: with ErrorHandlingContext(): parsed_data += f"\n## Hierarchy ##\n{get_hierarchy(data.data.counter_all_data.data.get.hierarchy)}\n" diff --git a/packages/helpermodules/setdata.py b/packages/helpermodules/setdata.py index 1e4b6caeb6..7fc675333e 100644 --- a/packages/helpermodules/setdata.py +++ b/packages/helpermodules/setdata.py @@ -731,7 +731,7 @@ def process_general_topic(self, msg: mqtt.MQTTMessage): elif "openWB/set/general/chargemode_config/unbalanced_load_limit" in msg.topic: self._validate_value(msg, int, [(10, 32)]) elif ("openWB/set/general/chargemode_config/unbalanced_load" in msg.topic or - "openWB/set/general/chargemode_config/retry_failed_phase_switches" in msg.topic or + "openWB/set/general/chargemode_config/pv_charging/retry_failed_phase_switches" in msg.topic or "openWB/set/general/chargemode_config/pv_charging/bat_power_discharge_active" in msg.topic or "openWB/set/general/chargemode_config/pv_charging/bat_power_reserve_active" in msg.topic): self._validate_value(msg, bool) @@ -742,7 +742,7 @@ def process_general_topic(self, msg: mqtt.MQTTMessage): self._validate_value(msg, int, [(0, float("inf"))]) elif "openWB/set/general/chargemode_config/pv_charging/switch_off_threshold" in msg.topic: self._validate_value(msg, float) - elif "openWB/set/general/chargemode_config/phase_switch_delay" in msg.topic: + elif "openWB/set/general/chargemode_config/pv_charging/phase_switch_delay" in msg.topic: self._validate_value(msg, int, [(5, 60)]) elif "openWB/set/general/chargemode_config/pv_charging/control_range" in msg.topic: self._validate_value(msg, int, collection=list) diff --git a/packages/helpermodules/update_config.py b/packages/helpermodules/update_config.py index 75d1fd5f3f..12dd3b5f79 100644 --- a/packages/helpermodules/update_config.py +++ b/packages/helpermodules/update_config.py @@ -40,7 +40,7 @@ from control.ev.charge_template import EcoCharging, get_charge_template_default from control.ev import ev from control.ev.ev_template import EvTemplateData -from control.general import ChargemodeConfig, Prices +from control.general import Prices, PvCharging from control.optional_data import Ocpp from modules.common.abstract_vehicle import GeneralVehicleConfig from modules.common.component_type import ComponentType @@ -57,7 +57,7 @@ class UpdateConfig: - DATASTORE_VERSION = 100 + DATASTORE_VERSION = 101 valid_topic = [ "^openWB/bat/config/bat_control_permitted$", @@ -230,7 +230,7 @@ class UpdateConfig: "^openWB/general/chargemode_config/pv_charging/switch_on_delay$", "^openWB/general/chargemode_config/pv_charging/switch_off_threshold$", "^openWB/general/chargemode_config/pv_charging/switch_off_delay$", - "^openWB/general/chargemode_config/phase_switch_delay$", + "^openWB/general/chargemode_config/pv_charging/phase_switch_delay$", "^openWB/general/chargemode_config/pv_charging/control_range$", "^openWB/general/chargemode_config/pv_charging/min_bat_soc$", "^openWB/general/chargemode_config/pv_charging/max_bat_soc$", @@ -238,7 +238,7 @@ class UpdateConfig: "^openWB/general/chargemode_config/pv_charging/bat_power_discharge_active$", "^openWB/general/chargemode_config/pv_charging/bat_power_reserve$", "^openWB/general/chargemode_config/pv_charging/bat_power_reserve_active$", - "^openWB/general/chargemode_config/retry_failed_phase_switches$", + "^openWB/general/chargemode_config/pv_charging/retry_failed_phase_switches$", # obsolet, Daten hieraus müssen nach prices/ überführt werden "^openWB/general/price_kwh$", "^openWB/general/prices/bat$", @@ -546,9 +546,9 @@ class UpdateConfig: ("openWB/general/chargemode_config/pv_charging/switch_on_delay", 30), ("openWB/general/chargemode_config/pv_charging/switch_on_threshold", 1500), ("openWB/general/chargemode_config/pv_charging/feed_in_yield", 0), - ("openWB/general/chargemode_config/phase_switch_delay", 7), - ("openWB/general/chargemode_config/retry_failed_phase_switches", - ChargemodeConfig().retry_failed_phase_switches), + ("openWB/general/chargemode_config/pv_charging/phase_switch_delay", 7), + ("openWB/general/chargemode_config/pv_charging/retry_failed_phase_switches", + PvCharging().retry_failed_phase_switches), ("openWB/general/chargemode_config/unbalanced_load", False), ("openWB/general/chargemode_config/unbalanced_load_limit", 18), ("openWB/general/control_interval", 10), @@ -2600,3 +2600,12 @@ def upgrade_datastore_99(self) -> None: self.__update_topic("openWB/general/chargemode_config/pv_charging/max_bat_soc", min_bat_soc) self.__update_topic("openWB/system/datastore_version", 100) + + def upgrade_datastore_100(self) -> None: + def upgrade(topic: str, payload) -> Optional[dict]: + if "openWB/set/general/chargemode_config/retry_failed_phase_switches" == topic: + return {"openWB/set/general/chargemode_config/pv_charging/retry_failed_phase_switches": payload} + if "openWB/set/general/chargemode_config/pv_charging/phase_switch_delay" == topic: + return {"openWB/set/general/chargemode_config/phase_switch_delay": payload} + self._loop_all_received_topics(upgrade) + self.__update_topic("openWB/system/datastore_version", 101) From 1e2ca3a3caafeee959b158e4c6b46304a0049714 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Mon, 3 Nov 2025 14:43:51 +0100 Subject: [PATCH 2/3] clean up --- packages/control/chargepoint/chargepoint_test.py | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/control/chargepoint/chargepoint_test.py b/packages/control/chargepoint/chargepoint_test.py index bc5251cc3c..d3de25e8a3 100644 --- a/packages/control/chargepoint/chargepoint_test.py +++ b/packages/control/chargepoint/chargepoint_test.py @@ -135,7 +135,6 @@ def test_is_phase_switch_required(params: Params): cp.data.get.charge_state = params.charge_state cp.data.control_parameter.failed_phase_switches = params.failed_phase_switches data.data_init(Mock()) - # Zeile aufteilen, um Lesbarkeit zu verbessern data.data.general_data.data.chargemode_config.pv_charging.retry_failed_phase_switches = ( params.retry_failed_phase_switches ) From e6be4d1d3679835176319531ac6b42a724df063e Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Tue, 4 Nov 2025 07:14:13 +0100 Subject: [PATCH 3/3] fix --- packages/helpermodules/update_config.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/helpermodules/update_config.py b/packages/helpermodules/update_config.py index 12dd3b5f79..54af2f8617 100644 --- a/packages/helpermodules/update_config.py +++ b/packages/helpermodules/update_config.py @@ -2603,9 +2603,9 @@ def upgrade_datastore_99(self) -> None: def upgrade_datastore_100(self) -> None: def upgrade(topic: str, payload) -> Optional[dict]: - if "openWB/set/general/chargemode_config/retry_failed_phase_switches" == topic: - return {"openWB/set/general/chargemode_config/pv_charging/retry_failed_phase_switches": payload} - if "openWB/set/general/chargemode_config/pv_charging/phase_switch_delay" == topic: - return {"openWB/set/general/chargemode_config/phase_switch_delay": payload} + if "openWB/general/chargemode_config/retry_failed_phase_switches" == topic: + return {"openWB/general/chargemode_config/pv_charging/retry_failed_phase_switches": payload} + if "openWB/general/chargemode_config/phase_switch_delay" == topic: + return {"openWB/general/chargemode_config/pv_charging/phase_switch_delay": payload} self._loop_all_received_topics(upgrade) self.__update_topic("openWB/system/datastore_version", 101)