From 23bc2170676a4b58bffbda3ec33225ce488a596b Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Tue, 10 Mar 2026 14:30:27 +0100 Subject: [PATCH 1/4] rfid: improve clear rfid --- .../control/chargepoint/chargepoint_data.py | 9 +++++---- packages/control/chargepoint/rfid.py | 4 +--- packages/helpermodules/subdata.py | 20 +++++++++---------- .../openwb_pro/chargepoint_module.py | 3 --- packages/modules/common/store/_chargepoint.py | 3 ++- 5 files changed, 18 insertions(+), 21 deletions(-) diff --git a/packages/control/chargepoint/chargepoint_data.py b/packages/control/chargepoint/chargepoint_data.py index bc601a5247..eda414042e 100644 --- a/packages/control/chargepoint/chargepoint_data.py +++ b/packages/control/chargepoint/chargepoint_data.py @@ -9,7 +9,6 @@ from dataclass_utils.factories import currents_list_factory, empty_dict_factory, voltages_list_factory from helpermodules.constants import NO_ERROR from modules.chargepoints.openwb_pro.chargepoint_module import EvseSignaling -from modules.common.abstract_chargepoint import AbstractChargepoint @dataclass @@ -254,10 +253,12 @@ def __setstate__(self, state): class ChargepointProtocol(Protocol): @property - def template(self) -> CpTemplate: ... + def data(self) -> ChargepointData: ... @property - def chargepoint_module(self) -> AbstractChargepoint: ... + def find_duo_partner(self) -> Optional[int]: ... @property def num(self) -> int: ... @property - def data(self) -> ChargepointData: ... + def set_state_and_log(self, message: str) -> None: ... + @property + def template(self) -> CpTemplate: ... diff --git a/packages/control/chargepoint/rfid.py b/packages/control/chargepoint/rfid.py index 6d0fc9a5fd..83242a506c 100644 --- a/packages/control/chargepoint/rfid.py +++ b/packages/control/chargepoint/rfid.py @@ -28,14 +28,13 @@ def _link_rfid_to_cp(self: ChargepointProtocol) -> None: # keine Duo cp2_data is None): self.data.set.rfid = rfid - self.chargepoint_module.clear_rfid() self.data.get.rfid = None Pub().pub("openWB/chargepoint/"+str(self.num)+"/get/rfid", None) self.data.get.rfid_timestamp = None Pub().pub(f"openWB/set/chargepoint/{self.num}/get/rfid_timestamp", None) - def _validate_rfid(self) -> None: + def _validate_rfid(self: ChargepointProtocol) -> None: """Prüft, dass der Tag an diesem Ladepunkt gültig ist und dass dieser innerhalb von 5 Minuten einem EV zugeordnet wird. """ @@ -78,7 +77,6 @@ def _validate_rfid(self) -> None: Pub().pub(f"openWB/set/chargepoint/{self.num}/get/rfid", None) self.data.get.rfid_timestamp = None Pub().pub(f"openWB/set/chargepoint/{self.num}/get/rfid_timestamp", None) - self.chargepoint_module.clear_rfid() self.set_state_and_log(msg) def find_duo_partner(self: ChargepointProtocol) -> Optional[int]: diff --git a/packages/helpermodules/subdata.py b/packages/helpermodules/subdata.py index b40f826d5e..dd7f478306 100644 --- a/packages/helpermodules/subdata.py +++ b/packages/helpermodules/subdata.py @@ -411,7 +411,8 @@ def process_chargepoint_topic(self, var: Dict[str, chargepoint.Chargepoint], msg try: if re.search("/chargepoint/[0-9]+/", msg.topic) is not None: index = get_index(msg.topic) - if decode_payload(msg.payload) == "": + payload = decode_payload(msg.payload) + if payload == "": if re.search("/chargepoint/[0-9]+/config", msg.topic) is not None: log.debug("Stop des Handlers für den internen Ladepunkt.") self.event_stop_internal_chargepoint.set() @@ -430,12 +431,11 @@ def process_chargepoint_topic(self, var: Dict[str, chargepoint.Chargepoint], msg self.ev_template_data) if re.search("/chargepoint/[0-9]+/set/", msg.topic) is not None: if re.search("/chargepoint/[0-9]+/set/log$", msg.topic) is not None: - var["cp"+index].chargepoint.data.set.log = dataclass_from_dict( - Log, decode_payload(msg.payload)) + var["cp"+index].chargepoint.data.set.log = dataclass_from_dict(Log, payload) elif "charge_template" in msg.topic: var["cp"+index].chargepoint.data.set.charge_template = ChargeTemplate() var["cp"+index].chargepoint.data.set.charge_template.data = dataclass_from_dict( - ChargeTemplateData, decode_payload(msg.payload)) + ChargeTemplateData, payload) else: self.set_json_payload_class(var["cp"+index].chargepoint.data.set, msg) elif re.search("/chargepoint/[0-9]+/get/", msg.topic) is not None: @@ -448,22 +448,22 @@ def process_chargepoint_topic(self, var: Dict[str, chargepoint.Chargepoint], msg elif re.search("/chargepoint/[0-9]+/get/connected_vehicle/soc", msg.topic) is not None: self.set_json_payload_class(var["cp"+index].chargepoint.data.get.connected_vehicle.soc, msg) elif (re.search("/chargepoint/[0-9]+/get/soc$", msg.topic) is not None and - decode_payload(msg.payload) != var["cp"+index].chargepoint.data.get.soc): + payload != var["cp"+index].chargepoint.data.get.soc): Pub().pub(f'openWB/set/vehicle/{var["cp"+index].chargepoint.data.config.ev}' '/get/force_soc_update', True) self.set_json_payload_class(var["cp"+index].chargepoint.data.get, msg) elif (re.search("/chargepoint/[0-9]+/get/error_timestamp$", msg.topic) is not None and hasattr(var[f"cp{index}"].chargepoint.chargepoint_module, "client_error_context")): var["cp" + - index].chargepoint.chargepoint_module.client_error_context.error_timestamp = ( - decode_payload(msg.payload) - ) + index].chargepoint.chargepoint_module.client_error_context.error_timestamp = payload self.set_json_payload_class(var["cp"+index].chargepoint.data.get, msg) elif re.search("/chargepoint/[0-9]+/get/simulation$", msg.topic) is not None: var["cp"+index].chargepoint.chargepoint_module.sim_counter.data = dataclass_from_dict( - SimCounterState, - decode_payload(msg.payload)) + SimCounterState, payload) else: + if (re.search("/chargepoint/[0-9]+/get/rfid$", msg.topic) is not None and + payload is not None): + var["cp"+index].chargepoint.chargepoint_module.clear_rfid() self.set_json_payload_class(var["cp"+index].chargepoint.data.get, msg) elif re.search("/chargepoint/[0-9]+/config$", msg.topic) is not None: self.process_chargepoint_config_topic(var, msg) diff --git a/packages/modules/chargepoints/openwb_pro/chargepoint_module.py b/packages/modules/chargepoints/openwb_pro/chargepoint_module.py index 0c790f2280..ccfae4942d 100644 --- a/packages/modules/chargepoints/openwb_pro/chargepoint_module.py +++ b/packages/modules/chargepoints/openwb_pro/chargepoint_module.py @@ -144,9 +144,6 @@ def switch_phases(self, phases_to_use: int) -> None: self.__session.post(f'http://{self.config.configuration.ip_address}/connect.php', data={'phasetarget': str(1 if phases_to_use == 1 else 3)}) - def clear_rfid(self) -> None: - pass - def interrupt_cp(self, duration: int) -> None: self.__session.post(f'http://{self.config.configuration.ip_address}/connect.php', data={'cp_interrupt': True, diff --git a/packages/modules/common/store/_chargepoint.py b/packages/modules/common/store/_chargepoint.py index 3efbf7a1d3..c2f8c0664e 100644 --- a/packages/modules/common/store/_chargepoint.py +++ b/packages/modules/common/store/_chargepoint.py @@ -48,7 +48,8 @@ def update(self): pub_to_broker("openWB/set/chargepoint/" + str(self.num) + "/get/charge_state", self.state.charge_state, 2) if self.state.plug_state is not None: pub_to_broker("openWB/set/chargepoint/" + str(self.num) + "/get/plug_state", self.state.plug_state, 2) - pub_to_broker("openWB/set/chargepoint/" + str(self.num) + "/get/rfid", self.state.rfid) + if self.state.rfid is not None: + pub_to_broker("openWB/set/chargepoint/" + str(self.num) + "/get/rfid", self.state.rfid) if self.state.rfid_timestamp is not None: pub_to_broker("openWB/set/chargepoint/" + str(self.num) + "/get/rfid_timestamp", self.state.rfid_timestamp) pub_to_broker("openWB/set/chargepoint/" + str(self.num) + "/get/serial_number", self.state.serial_number) From 3cd0d8b4b2bf3d0c4dcf6e281bb6a94074f04e93 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 11 Mar 2026 16:04:01 +0100 Subject: [PATCH 2/4] remove pub --- packages/control/chargepoint/rfid.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/control/chargepoint/rfid.py b/packages/control/chargepoint/rfid.py index 83242a506c..764809b21f 100644 --- a/packages/control/chargepoint/rfid.py +++ b/packages/control/chargepoint/rfid.py @@ -3,7 +3,6 @@ from control import data from control.chargepoint.chargepoint_data import ChargepointProtocol -from helpermodules.pub import Pub from helpermodules import timecheck log = logging.getLogger(__name__) @@ -30,9 +29,7 @@ def _link_rfid_to_cp(self: ChargepointProtocol) -> None: self.data.set.rfid = rfid self.data.get.rfid = None - Pub().pub("openWB/chargepoint/"+str(self.num)+"/get/rfid", None) self.data.get.rfid_timestamp = None - Pub().pub(f"openWB/set/chargepoint/{self.num}/get/rfid_timestamp", None) def _validate_rfid(self: ChargepointProtocol) -> None: """Prüft, dass der Tag an diesem Ladepunkt gültig ist und dass dieser innerhalb von 5 Minuten einem EV @@ -48,8 +45,6 @@ def _validate_rfid(self: ChargepointProtocol) -> None: self.data.set.log.imported_at_plugtime == self.data.get.imported): if self.data.get.rfid_timestamp is None: self.data.get.rfid_timestamp = timecheck.create_timestamp() - Pub().pub(f"openWB/set/chargepoint/{self.num}/get/rfid_timestamp", - self.data.get.rfid_timestamp) return else: if timecheck.check_timestamp(self.data.get.rfid_timestamp, 300): @@ -64,7 +59,6 @@ def _validate_rfid(self: ChargepointProtocol) -> None: self.data.set.manual_lock = True if self.data.set.charging_ev_data.charge_template.data.load_default: self.data.config.ev = 0 - Pub().pub(f"openWB/set/chargepoint/{self.num}/get/rfid_timestamp", None) msg = ("Es ist in den letzten 5 Minuten kein EV angesteckt worden, dem " f"der ID-Tag {rfid} zugeordnet werden kann. Daher wird dieser verworfen.") else: @@ -74,9 +68,7 @@ def _validate_rfid(self: ChargepointProtocol) -> None: else: msg = "Identifikation von Fahrzeugen ist nicht aktiviert." self.data.get.rfid = None - Pub().pub(f"openWB/set/chargepoint/{self.num}/get/rfid", None) self.data.get.rfid_timestamp = None - Pub().pub(f"openWB/set/chargepoint/{self.num}/get/rfid_timestamp", None) self.set_state_and_log(msg) def find_duo_partner(self: ChargepointProtocol) -> Optional[int]: From 1cd477c9390b2b50687143777fcc29942aecc3fc Mon Sep 17 00:00:00 2001 From: LKuemmel <76958050+LKuemmel@users.noreply.github.com> Date: Wed, 11 Mar 2026 16:27:03 +0100 Subject: [PATCH 3/4] Update packages/helpermodules/subdata.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/helpermodules/subdata.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/helpermodules/subdata.py b/packages/helpermodules/subdata.py index dd7f478306..2c7b102f69 100644 --- a/packages/helpermodules/subdata.py +++ b/packages/helpermodules/subdata.py @@ -463,7 +463,15 @@ def process_chargepoint_topic(self, var: Dict[str, chargepoint.Chargepoint], msg else: if (re.search("/chargepoint/[0-9]+/get/rfid$", msg.topic) is not None and payload is not None): - var["cp"+index].chargepoint.chargepoint_module.clear_rfid() + chargepoint_module = var["cp"+index].chargepoint.chargepoint_module + if chargepoint_module is not None and hasattr(chargepoint_module, "clear_rfid"): + chargepoint_module.clear_rfid() + else: + log.debug( + "Received /get/rfid for chargepoint %s but chargepoint_module is not " + "initialized or has no clear_rfid().", + index, + ) self.set_json_payload_class(var["cp"+index].chargepoint.data.get, msg) elif re.search("/chargepoint/[0-9]+/config$", msg.topic) is not None: self.process_chargepoint_config_topic(var, msg) From 12238ba87b9465c032122ac527350843ad01b089 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Thu, 12 Mar 2026 06:44:56 +0100 Subject: [PATCH 4/4] review --- packages/control/chargepoint/chargepoint_data.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/control/chargepoint/chargepoint_data.py b/packages/control/chargepoint/chargepoint_data.py index eda414042e..a1117c36e2 100644 --- a/packages/control/chargepoint/chargepoint_data.py +++ b/packages/control/chargepoint/chargepoint_data.py @@ -255,10 +255,8 @@ class ChargepointProtocol(Protocol): @property def data(self) -> ChargepointData: ... @property - def find_duo_partner(self) -> Optional[int]: ... - @property def num(self) -> int: ... @property - def set_state_and_log(self, message: str) -> None: ... - @property def template(self) -> CpTemplate: ... + def find_duo_partner(self) -> Optional[int]: ... + def set_state_and_log(self, message: str) -> None: ...