From 866addf9e8ecbbd1317cd24863278c0444eb7efa Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 20 Aug 2025 12:32:34 +0200 Subject: [PATCH 01/11] set phases in use after start if unknown --- .../chargepoint_module.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/modules/internal_chargepoint_handler/chargepoint_module.py b/packages/modules/internal_chargepoint_handler/chargepoint_module.py index 74eaf00d46..949d28ee72 100644 --- a/packages/modules/internal_chargepoint_handler/chargepoint_module.py +++ b/packages/modules/internal_chargepoint_handler/chargepoint_module.py @@ -1,9 +1,11 @@ import logging import time +from helpermodules.broker import BrokerClient from helpermodules.logger import ModifyLoglevelContext from helpermodules.utils.error_handling import CP_ERROR, ErrorTimerContext +from helpermodules.utils.topic_parser import decode_payload from modules.common.abstract_chargepoint import AbstractChargepoint from modules.common.component_context import SingleComponentUpdateContext from modules.common.component_state import ChargepointState @@ -42,7 +44,6 @@ def __init__(self, local_charge_point_num: int, hide_exception=True) self.client_error_context.error_timestamp = internal_cp.get.error_timestamp self.old_plug_state = False - self.old_phases_in_use = 0 self.old_chargepoint_state = ChargepointState(plug_state=False, charge_state=False, imported=None, @@ -65,6 +66,19 @@ def __init__(self, local_charge_point_num: int, self.current_branch = SubData.system_data["system"].data["current_branch"] self.current_commit = SubData.system_data["system"].data["current_commit"] + def on_connect(client, userdata, flags, rc): + client.subscribe(f"openWB/internal_chargepoint/{self.local_charge_point_num}/get/phases_in_use") + + def on_message(client, userdata, message): + self.old_phases_in_use = decode_payload(message.payload) + + self.old_phases_in_use = None + BrokerClient(f"subscribeInternalCp{self.local_charge_point_num}", on_connect, on_message).start_finite_loop() + + if self.old_phases_in_use == 0 or self.old_phases_in_use is None: + self.perform_phase_switch(1, 4) + self.old_phases_in_use = 1 + def set_current(self, current: float) -> None: with SingleComponentUpdateContext(self.fault_state, update_always=False): formatted_current = round(current*100) if self._precise_current else round(current) From 8f9748907b341f33e9847f8abda78aaed56914af Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Fri, 22 Aug 2025 11:00:30 +0200 Subject: [PATCH 02/11] fix phase switch after plugging --- packages/control/chargepoint/chargepoint.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/control/chargepoint/chargepoint.py b/packages/control/chargepoint/chargepoint.py index 70f6928fe3..0d2ed3144b 100644 --- a/packages/control/chargepoint/chargepoint.py +++ b/packages/control/chargepoint/chargepoint.py @@ -390,13 +390,14 @@ def _is_phase_switch_required(self) -> bool: self.data.control_parameter.failed_phase_switches += 1 else: # Umschaltung vor Ladestart zulassen - if self.data.set.log.imported_since_plugged != 0: + if (self.data.set.log.imported_since_plugged != 0 and + self.data.control_parameter.failed_phase_switches == 0): phase_switch_required = False self.set_state_and_log( "Keine Phasenumschaltung, da wiederholtes Anstoßen der Umschaltung in den übergreifenden " "Ladeeinstellungen deaktiviert wurde. Die aktuelle " "Phasenzahl wird bis zum Abstecken beibehalten.") - self.data.control_parameter.failed_phase_switches += 1 + self.data.control_parameter.failed_phase_switches += 1 return phase_switch_required STOP_CHARGING = ", dafür wird die Ladung unterbrochen." From aa6513e4a78b5e8830c23506ae52ed13ad6f5a5c Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Mon, 25 Aug 2025 11:03:18 +0200 Subject: [PATCH 03/11] don't wait keep charge active duration in case of manual chargestate change --- packages/control/phase_switch.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/control/phase_switch.py b/packages/control/phase_switch.py index 89d0edd407..ca4b3bc84b 100644 --- a/packages/control/phase_switch.py +++ b/packages/control/phase_switch.py @@ -38,8 +38,6 @@ def _perform_phase_switch(chargepoint_module: AbstractChargepoint, phases: int, time.sleep(5) # Phasenumschaltung entsprechend Modul chargepoint_module.switch_phases(phases, ev.ev_template.data.phase_switch_pause) - # Die Ladung wird in start_charging wieder gestartet, wenn phase_switch_timestamp wieder auf None gesetzt wird. - time.sleep(ev.ev_template.data.keep_charge_active_duration) except Exception: log.exception("Fehler im Phasenumschaltungs-Modul") From fdab6421b0d5503b85601a24128d09a0927d1d1a Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 27 Aug 2025 14:10:46 +0200 Subject: [PATCH 04/11] fix retry phase switch --- packages/control/chargepoint/chargepoint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/control/chargepoint/chargepoint.py b/packages/control/chargepoint/chargepoint.py index 0d2ed3144b..ead1d9971b 100644 --- a/packages/control/chargepoint/chargepoint.py +++ b/packages/control/chargepoint/chargepoint.py @@ -391,7 +391,7 @@ def _is_phase_switch_required(self) -> bool: else: # Umschaltung vor Ladestart zulassen if (self.data.set.log.imported_since_plugged != 0 and - self.data.control_parameter.failed_phase_switches == 0): + self.data.control_parameter.failed_phase_switches > 0): phase_switch_required = False self.set_state_and_log( "Keine Phasenumschaltung, da wiederholtes Anstoßen der Umschaltung in den übergreifenden " From 3be317faf6aacbba5ba296187100f144dc03b56f Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 27 Aug 2025 14:59:26 +0200 Subject: [PATCH 05/11] fix temporary charge template after plugging --- packages/control/chargepoint/chargepoint.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/control/chargepoint/chargepoint.py b/packages/control/chargepoint/chargepoint.py index ead1d9971b..e3fc3d9dd7 100644 --- a/packages/control/chargepoint/chargepoint.py +++ b/packages/control/chargepoint/chargepoint.py @@ -826,8 +826,9 @@ def _get_charging_ev(self, vehicle: int, ev_list: Dict[str, Ev]) -> Ev: if self.data.set.charging_ev_prev != vehicle: Pub().pub(f"openWB/set/vehicle/{charging_ev.num}/get/force_soc_update", True) log.debug("SoC nach EV-Wechsel") - self.update_charge_template(charging_ev.charge_template) - if self.data.set.charge_template.data.id != charging_ev.charge_template.data.id: + # wenn vorher kein anderes Fahrzeug zugeordnet war, Ladeprofil nicht zurücksetzen + if ((self.data.set.charging_ev_prev != vehicle and self.data.set.charging_ev_prev != -1) or + (self.data.set.charge_template.data.id != charging_ev.charge_template.data.id)): self.update_charge_template(charging_ev.charge_template) self.data.set.charging_ev_data = charging_ev self.data.set.charging_ev = vehicle From 38f432ec14bb3bf5f470db8460a047abcd318728 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 3 Sep 2025 09:28:03 +0200 Subject: [PATCH 06/11] fix pro+ soc and vehicle id --- packages/modules/common/store/_chargepoint_internal.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/modules/common/store/_chargepoint_internal.py b/packages/modules/common/store/_chargepoint_internal.py index d16e821742..b4f3cc5560 100644 --- a/packages/modules/common/store/_chargepoint_internal.py +++ b/packages/modules/common/store/_chargepoint_internal.py @@ -24,7 +24,7 @@ def update(self): pub_to_broker(f"{topic_prefix}/phases_in_use", self.state.phases_in_use, 2) pub_to_broker(f"{topic_prefix}/charge_state", self.state.charge_state, 2) pub_to_broker(f"{topic_prefix}/plug_state", self.state.plug_state, 2) - pub_to_broker(f"{topic_prefix}/rfid", self.state.rfid) + pub_to_broker(f"{topic_prefix}/vehicle_id", self.state.vehicle_id) pub_to_broker(f"{topic_prefix}/serial_number", self.state.serial_number) pub_to_broker(f"{topic_prefix}/evse_current", self.state.evse_current, 2) pub_to_broker(f"{topic_prefix}/max_evse_current", self.state.max_evse_current, 2) @@ -32,11 +32,11 @@ def update(self): pub_to_broker(f"{topic_prefix}/current_branch", self.state.current_branch) pub_to_broker(f"{topic_prefix}/current_commit", self.state.current_commit) if self.state.soc is not None: - pub_to_broker(f"{topic_prefix}/get/soc", self.state.soc) + pub_to_broker(f"{topic_prefix}/soc", self.state.soc) if self.state.soc_timestamp is not None: pub_to_broker(f"{topic_prefix}/soc_timestamp", self.state.soc_timestamp) if self.state.rfid_timestamp is not None: - pub_to_broker(f"{topic_prefix}/vehicle_id", self.state.vehicle_id) + pub_to_broker(f"{topic_prefix}/rfid", self.state.rfid) pub_to_broker(f"{topic_prefix}/rfid_timestamp", self.state.rfid_timestamp) From a860a931a7c4a189faa30fa92d96d35e9ada4519 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 3 Sep 2025 15:00:12 +0200 Subject: [PATCH 07/11] reset failed phase switches at charge stop --- packages/control/chargepoint/chargepoint.py | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/control/chargepoint/chargepoint.py b/packages/control/chargepoint/chargepoint.py index e3fc3d9dd7..9c4396cdd6 100644 --- a/packages/control/chargepoint/chargepoint.py +++ b/packages/control/chargepoint/chargepoint.py @@ -779,6 +779,7 @@ def update(self, ev_list: Dict[str, Ev]) -> None: if self.data.set.charge_state_prev and self.data.get.charge_state is False: Pub().pub(f"openWB/set/vehicle/{self.data.config.ev}/get/force_soc_update", True) log.info(f"SoC-Abfrage nach Ladeunterbrechung, cp{self.num}, ev{self.data.config.ev}") + self.reset_control_parameter_at_charge_stop() except Exception: log.exception(f"Fehler bei Ladestop,cp{self.num}") From c29a4bbeeb11d2e91b3df927ebebc2a7b36f8f54 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 3 Sep 2025 15:01:46 +0200 Subject: [PATCH 08/11] help --- packages/control/chargepoint/chargepoint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/control/chargepoint/chargepoint.py b/packages/control/chargepoint/chargepoint.py index 9c4396cdd6..ee124b089a 100644 --- a/packages/control/chargepoint/chargepoint.py +++ b/packages/control/chargepoint/chargepoint.py @@ -386,7 +386,7 @@ def _is_phase_switch_required(self) -> bool: phase_switch_required = False self.set_state_and_log( "Keine Phasenumschaltung, da die maximale Anzahl an Fehlversuchen erreicht wurde. Die " - "aktuelle Phasenzahl wird bis zum Abstecken beibehalten.") + "aktuelle Phasenzahl wird bis zur nächsten Ladeunterbrechung beibehalten.") self.data.control_parameter.failed_phase_switches += 1 else: # Umschaltung vor Ladestart zulassen From 242056fbc4c0cb60e32b197a7e5c1f770698f14b Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 3 Sep 2025 15:38:15 +0200 Subject: [PATCH 09/11] fix phase switch before charge start --- packages/control/chargepoint/chargepoint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/control/chargepoint/chargepoint.py b/packages/control/chargepoint/chargepoint.py index ee124b089a..209d4c170c 100644 --- a/packages/control/chargepoint/chargepoint.py +++ b/packages/control/chargepoint/chargepoint.py @@ -376,7 +376,7 @@ def _is_phase_switch_required(self) -> bool: self.check_deviating_contactor_states(self.data.set.phases_to_use, self.data.control_parameter.phases)) and # Wenn der Ladevorgang gestartet wird, muss vor dem ersten Laden umgeschaltet werden. - self.data.set.current != 0): + self.data.get.charge_state is False): phase_switch_required = True if phase_switch_required: # Umschaltung fehlgeschlagen From eaf85118cc58e1f08610071576ae1b31fac6ab03 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 3 Sep 2025 15:48:05 +0200 Subject: [PATCH 10/11] ammend --- packages/control/chargepoint/chargepoint.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/control/chargepoint/chargepoint.py b/packages/control/chargepoint/chargepoint.py index 209d4c170c..e247fc8d50 100644 --- a/packages/control/chargepoint/chargepoint.py +++ b/packages/control/chargepoint/chargepoint.py @@ -913,7 +913,8 @@ def cp_ev_chargemode_support_phase_switch(self) -> bool: def cp_ev_support_phase_switch(self) -> bool: return (self.data.config.auto_phase_switch_hw and self.data.get.evse_signaling != EvseSignaling.HLC and - self.data.set.charging_ev_data.ev_template.data.prevent_phase_switch is False) + (self.data.set.charging_ev_data.ev_template.data.prevent_phase_switch is False or + self.data.set.log.imported_since_plugged == 0)) def chargemode_support_phase_switch(self) -> bool: control_parameter = self.data.control_parameter From 5b0fa3699259f0cb69e2ca9f08ae5c239d43bafb Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Thu, 4 Sep 2025 15:19:26 +0200 Subject: [PATCH 11/11] switch to one phase after cold start --- .../chargepoint_module.py | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/packages/modules/internal_chargepoint_handler/chargepoint_module.py b/packages/modules/internal_chargepoint_handler/chargepoint_module.py index 949d28ee72..8b34b021d0 100644 --- a/packages/modules/internal_chargepoint_handler/chargepoint_module.py +++ b/packages/modules/internal_chargepoint_handler/chargepoint_module.py @@ -4,6 +4,7 @@ from helpermodules.broker import BrokerClient from helpermodules.logger import ModifyLoglevelContext +from helpermodules.utils import run_command from helpermodules.utils.error_handling import CP_ERROR, ErrorTimerContext from helpermodules.utils.topic_parser import decode_payload from modules.common.abstract_chargepoint import AbstractChargepoint @@ -66,18 +67,19 @@ def __init__(self, local_charge_point_num: int, self.current_branch = SubData.system_data["system"].data["current_branch"] self.current_commit = SubData.system_data["system"].data["current_commit"] - def on_connect(client, userdata, flags, rc): - client.subscribe(f"openWB/internal_chargepoint/{self.local_charge_point_num}/get/phases_in_use") - - def on_message(client, userdata, message): - self.old_phases_in_use = decode_payload(message.payload) - - self.old_phases_in_use = None - BrokerClient(f"subscribeInternalCp{self.local_charge_point_num}", on_connect, on_message).start_finite_loop() - - if self.old_phases_in_use == 0 or self.old_phases_in_use is None: + if float(run_command.run_command(["cat", "/proc/uptime"]).split(" ")[0]) < 180: self.perform_phase_switch(1, 4) self.old_phases_in_use = 1 + else: + def on_connect(client, userdata, flags, rc): + client.subscribe(f"openWB/internal_chargepoint/{self.local_charge_point_num}/get/phases_in_use") + + def on_message(client, userdata, message): + self.old_phases_in_use = decode_payload(message.payload) + + self.old_phases_in_use = None + BrokerClient(f"subscribeInternalCp{self.local_charge_point_num}", + on_connect, on_message).start_finite_loop() def set_current(self, current: float) -> None: with SingleComponentUpdateContext(self.fault_state, update_always=False):