From f8a43074138014316da96a566d9c421bb03bc092 Mon Sep 17 00:00:00 2001 From: s0170071 Date: Wed, 30 Sep 2026 08:19:09 +0200 Subject: [PATCH] internal_chargepoint_handler: CP nach Fehler/Abbruch immer wieder verbinden perform_phase_switch und perform_cp_interruption setzen den CP-Pin am Ende jeweils in einer eigenen Methode auf LOW. Wenn dazwischen eine Ausnahme auftritt (z.B. weil die EVSE den Strom nicht auf 0 zurueckmeldet, oder ein GPIO-Zugriff fehlschlaegt), wurde dieser letzte Schritt bisher uebersprungen und CP blieb dauerhaft getrennt (HIGH) - das Fahrzeug erkennt den Ladepunkt dann nicht mehr, bis der Dienst neu gestartet wird. Aenderungen: - Der eigentliche Ablauf wandert in eine private Methode (_perform_phase_switch / _perform_cp_interruption). Die oeffentliche Methode ruft diese in einem try auf und stellt in einem finally sicher, dass CP immer wieder auf LOW gesetzt wird, auch wenn eine Ausnahme durchgereicht wird. - Die GPIO-Pins werden jeweils einmal in der oeffentlichen Methode ermittelt und an die private Methode weitergereicht, statt sie in innerer und aeusserer Methode getrennt zu ermitteln. Das haelt beide Methoden im gleichen Muster und vermeidet, dass zwei Pin-Ermittlungen unbemerkt auseinanderlaufen koennten. --- .../chargepoint_module.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/modules/internal_chargepoint_handler/chargepoint_module.py b/packages/modules/internal_chargepoint_handler/chargepoint_module.py index 751c7cd544..e71202c11a 100644 --- a/packages/modules/internal_chargepoint_handler/chargepoint_module.py +++ b/packages/modules/internal_chargepoint_handler/chargepoint_module.py @@ -143,6 +143,16 @@ def store_state(chargepoint_state: ChargepointState) -> None: def perform_phase_switch(self, phases_to_use: int) -> None: gpio_cp, gpio_relay = self._client.get_pins_phase_switch(phases_to_use) + try: + self._perform_phase_switch(phases_to_use, gpio_cp, gpio_relay) + finally: + # Auch bei einem Fehler oder Abbruch muss CP wieder verbunden werden, sonst + # erkennt das Fahrzeug den Ladepunkt nicht mehr. + GPIO.output(gpio_cp, GPIO.LOW) # CP on + time.sleep(1) + self.old_phases_in_use = phases_to_use + + def _perform_phase_switch(self, phases_to_use: int, gpio_cp: int, gpio_relay: int) -> None: evse = self._client.evse_client with SingleComponentUpdateContext(self.fault_state, update_always=False, reraise=True): evse.set_current(0) @@ -159,12 +169,15 @@ def perform_phase_switch(self, phases_to_use: int) -> None: time.sleep(5) GPIO.output(gpio_relay, GPIO.LOW) # 3 on/off time.sleep(5) - GPIO.output(gpio_cp, GPIO.LOW) # CP on - time.sleep(1) - self.old_phases_in_use = phases_to_use def perform_cp_interruption(self, duration: int) -> None: gpio_cp = self._client.get_pins_cp_interruption() + try: + self._perform_cp_interruption(duration, gpio_cp) + finally: + GPIO.output(gpio_cp, GPIO.LOW) + + def _perform_cp_interruption(self, duration: int, gpio_cp: int) -> None: with SingleComponentUpdateContext(self.fault_state, update_always=False): self._client.evse_client.set_current(0) GPIO.setwarnings(False)