From ecb17382bc635fc8b23e2c2d5bc795fcad36be8d Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 20 May 2026 15:52:44 +0200 Subject: [PATCH 1/2] phase switch: reset reserved power if vehicle is unplugged during phase switch --- packages/control/chargepoint/chargepoint.py | 5 +++- packages/control/ev/ev.py | 27 ++++++++++++++------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/packages/control/chargepoint/chargepoint.py b/packages/control/chargepoint/chargepoint.py index a8aed69958..47d178cdff 100644 --- a/packages/control/chargepoint/chargepoint.py +++ b/packages/control/chargepoint/chargepoint.py @@ -184,6 +184,9 @@ def _process_charge_stop(self) -> None: self.data.set.ocpp_transaction_id, self.data.set.rfid) self.data.set.ocpp_transaction_id = None + # muss vor dem Zurücksetzen der control parameter aufgerufen werden + self.data.set.charging_ev_data.reset_phase_switch(self.data.control_parameter) + self.data.set.charging_ev_data.reset_phase_switch_delay(self.data.control_parameter, self.get_max_phase_hw()) self.reset_control_parameter_at_charge_stop() data.data.counter_all_data.get_evu_counter().reset_switch_on_off(self) if self.data.get.plug_state is False and self.data.set.plug_state_prev is True: @@ -665,7 +668,7 @@ def update(self, ev_list: Dict[str, Ev]) -> None: if self.chargemode_changed or self.submode_changed: data.data.counter_all_data.get_evu_counter().reset_switch_on_off(self) - charging_ev.reset_phase_switch(self.data.control_parameter) + charging_ev.reset_phase_switch_delay(self.data.control_parameter, self.get_max_phase_hw()) if self.chargemode_changed: self.data.control_parameter.failed_phase_switches = 0 message = message_ev if message_ev else message diff --git a/packages/control/ev/ev.py b/packages/control/ev/ev.py index fa5071806b..ee8360973a 100644 --- a/packages/control/ev/ev.py +++ b/packages/control/ev/ev.py @@ -429,21 +429,30 @@ def _remaining_phase_switch_time(self, control_parameter: ControlParameter, control_parameter.timestamp_phase_switch_buffer_start = None return True, None - def reset_phase_switch(self, control_parameter: ControlParameter): + def reset_phase_switch_delay(self, control_parameter: ControlParameter, max_phases: int): """ Zurücksetzen der Zeitstempel und reservierten Leistung. Die Phasenumschaltung kann nicht abgebrochen werden! """ - if control_parameter.state == ChargepointState.PHASE_SWITCH_DELAY: + control_parameter.timestamp_phase_switch_buffer_start = None + if control_parameter.state == ChargepointState.PHASE_SWITCH_DELAY and control_parameter.phases == 1: # Wenn der Timer läuft, ist den Control-Parametern die alte Phasenzahl hinterlegt. - if control_parameter.phases == 1: - reserved = control_parameter.required_current * \ - 3 * 230 - self.ev_template.data.max_current_single_phase * 230 - data.data.counter_all_data.get_evu_counter().data.set.reserved_surplus -= reserved - log.debug( - "Zurücksetzen der reservierten Leistung für die Phasenumschaltung. reservierte Leistung: " + - str(data.data.counter_all_data.get_evu_counter().data.set.reserved_surplus)) # bei der Umschaltung 3p1p wird keine Leistung reserviert + evu_counter = data.data.counter_all_data.get_evu_counter() + reserved = max(0, control_parameter.min_current * max_phases * 230 - + self.ev_template.data.max_current_single_phase * 230) + evu_counter.data.set.reserved_surplus -= reserved + log.debug(f"Zurücksetzen von {reserved}W reservierter Leistung für die Phasenumschaltung. " + f"reservierte Leistung: {evu_counter.data.set.reserved_surplus} W") + control_parameter.state = ChargepointState.CHARGING_ALLOWED + + def reset_phase_switch(self, control_parameter: ControlParameter): + if control_parameter.state == ChargepointState.PERFORMING_PHASE_SWITCH: + evu_counter = data.data.counter_all_data.get_evu_counter() + if control_parameter.phases == 1: + evu_counter.data.set.reserved_surplus -= self.ev_template.data.max_current_single_phase * 230 + else: + evu_counter.data.set.reserved_surplus -= self.ev_template.data.max_current_single_phase * 3 * 230 def get_ev_to_rfid(rfid: Optional[str] = None, vehicle_id: Optional[str] = None) -> Optional[int]: From bcd71d6dc74c941304ff6ece8fd4b21105421aa8 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 20 May 2026 15:58:54 +0200 Subject: [PATCH 2/2] review --- packages/control/ev/ev.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/control/ev/ev.py b/packages/control/ev/ev.py index ee8360973a..c7ee700c9c 100644 --- a/packages/control/ev/ev.py +++ b/packages/control/ev/ev.py @@ -435,6 +435,7 @@ def reset_phase_switch_delay(self, control_parameter: ControlParameter, max_phas Die Phasenumschaltung kann nicht abgebrochen werden! """ control_parameter.timestamp_phase_switch_buffer_start = None + control_parameter.state = ChargepointState.CHARGING_ALLOWED if control_parameter.state == ChargepointState.PHASE_SWITCH_DELAY and control_parameter.phases == 1: # Wenn der Timer läuft, ist den Control-Parametern die alte Phasenzahl hinterlegt. # bei der Umschaltung 3p1p wird keine Leistung reserviert @@ -444,7 +445,6 @@ def reset_phase_switch_delay(self, control_parameter: ControlParameter, max_phas evu_counter.data.set.reserved_surplus -= reserved log.debug(f"Zurücksetzen von {reserved}W reservierter Leistung für die Phasenumschaltung. " f"reservierte Leistung: {evu_counter.data.set.reserved_surplus} W") - control_parameter.state = ChargepointState.CHARGING_ALLOWED def reset_phase_switch(self, control_parameter: ControlParameter): if control_parameter.state == ChargepointState.PERFORMING_PHASE_SWITCH: