Skip to content
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions packages/control/chargepoint/chargepoint_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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: ...
Comment on lines 254 to +260

Copilot AI Mar 11, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Im ChargepointProtocol sind find_duo_partner und set_state_and_log als @property deklariert, werden aber im Code als Methoden aufgerufen (self.find_duo_partner() / self.set_state_and_log(msg)). Das führt zu falschen Typinformationen (und ggf. MyPy/Pylance-Fehlern). Bitte beide als normale Methoden ohne @property definieren; data, num und template können Properties bleiben.

Copilot uses AI. Check for mistakes.
4 changes: 1 addition & 3 deletions packages/control/chargepoint/rfid.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.
"""
Expand Down Expand Up @@ -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]:
Expand Down
20 changes: 10 additions & 10 deletions packages/helpermodules/subdata.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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:
Expand All @@ -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()
Comment thread
LKuemmel marked this conversation as resolved.
Outdated
self.set_json_payload_class(var["cp"+index].chargepoint.data.get, msg)
Comment on lines +464 to 475

Copilot AI Mar 11, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Der Aufruf von clear_rfid() passiert im MQTT-Callback-Thread von subdata. Einige Implementierungen (z.B. HTTP-Requests / pub_single zu externen Hosts) können blockieren und damit die Verarbeitung weiterer Broker-Nachrichten verzögern. Besser wäre, das Clearing asynchron (Thread/Job-Queue) auszuführen, oder zumindest sicherzustellen, dass clear_rfid() hier garantiert non-blocking ist.

Copilot uses AI. Check for mistakes.
elif re.search("/chargepoint/[0-9]+/config$", msg.topic) is not None:
self.process_chargepoint_config_topic(var, msg)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Comment on lines -139 to 149

Copilot AI Mar 11, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ChargepointModule erbt von AbstractChargepoint, das clear_rfid() als @abstractmethod verlangt. Durch das Entfernen der (wenn auch leeren) Implementierung ist die Klasse wieder abstrakt und lässt sich nicht mehr instanziieren (TypeError). Bitte clear_rfid() hier wieder implementieren (idealerweise mit der passenden Pro-API zum Löschen des Tags), oder die Abstraktion anpassen, falls dieses Modul RFID nicht unterstützt.

Copilot uses AI. Check for mistakes.
Expand Down
3 changes: 2 additions & 1 deletion packages/modules/common/store/_chargepoint.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Loading