diff --git a/packages/control/algorithm/algorithm.py b/packages/control/algorithm/algorithm.py index baebea5f52..9ad593e036 100644 --- a/packages/control/algorithm/algorithm.py +++ b/packages/control/algorithm/algorithm.py @@ -57,7 +57,7 @@ def _check_auto_phase_switch_delay(self) -> None: """ for cp in data.data.cp_data.values(): try: - if cp.data.set.charging_ev != -1: + if cp.data.control_parameter.required_current != 0: charging_ev = cp.data.set.charging_ev_data control_parameter = cp.data.control_parameter if cp.cp_state_hw_support_phase_switch() and control_parameter.template_phases == 0: diff --git a/packages/control/algorithm/filter_chargepoints.py b/packages/control/algorithm/filter_chargepoints.py index 593b0674cd..7af2f319f3 100644 --- a/packages/control/algorithm/filter_chargepoints.py +++ b/packages/control/algorithm/filter_chargepoints.py @@ -25,7 +25,7 @@ def get_chargepoints_by_mode(mode_tuple: Tuple[Optional[str], str, bool]) -> Lis # enthält alle LP, auf die das Tupel zutrifft valid_chargepoints = [] for cp in data.data.cp_data.values(): - if cp.data.set.charging_ev != -1: + if cp.data.control_parameter.required_current != 0: if ((cp.data.control_parameter.prio == prio) and (cp.data.control_parameter.chargemode == mode or mode is None) and diff --git a/packages/control/algorithm/filter_chargepoints_test.py b/packages/control/algorithm/filter_chargepoints_test.py index 78a27af9f8..a8b74dc8b0 100644 --- a/packages/control/algorithm/filter_chargepoints_test.py +++ b/packages/control/algorithm/filter_chargepoints_test.py @@ -96,42 +96,41 @@ def mock_cp(cp: Chargepoint, num: int): @pytest.mark.parametrize( - "set_mode_tuple, charging_ev_1, mode_tuple_1, charging_ev_2, mode_tuple_2, expected_valid_chargepoints", + "set_mode_tuple, required_current_1, mode_tuple_1, mode_tuple_2, expected_valid_chargepoints", [ pytest.param((Chargemode.SCHEDULED_CHARGING, Chargemode.INSTANT_CHARGING, False), - 1, (Chargemode.SCHEDULED_CHARGING, + 6, (Chargemode.SCHEDULED_CHARGING, Chargemode.INSTANT_CHARGING, False), - 1, (Chargemode.SCHEDULED_CHARGING, + (Chargemode.SCHEDULED_CHARGING, Chargemode.INSTANT_CHARGING, False), [mock_cp1, mock_cp2], id="fits mode"), pytest.param((Chargemode.SCHEDULED_CHARGING, Chargemode.INSTANT_CHARGING, False), - -1, (Chargemode.SCHEDULED_CHARGING, - Chargemode.INSTANT_CHARGING, False), - 1, (Chargemode.SCHEDULED_CHARGING, + 0, (Chargemode.SCHEDULED_CHARGING, Chargemode.INSTANT_CHARGING, False), - [mock_cp2], id="cp1 has no charging car"), + (Chargemode.SCHEDULED_CHARGING, + Chargemode.INSTANT_CHARGING, False), + [mock_cp2], id="cp1 should not charge"), pytest.param((Chargemode.SCHEDULED_CHARGING, Chargemode.INSTANT_CHARGING, False), - 1, (Chargemode.SCHEDULED_CHARGING, + 6, (Chargemode.SCHEDULED_CHARGING, Chargemode.INSTANT_CHARGING, False), - 1, (Chargemode.SCHEDULED_CHARGING, + (Chargemode.SCHEDULED_CHARGING, Chargemode.INSTANT_CHARGING, True), [mock_cp1], id="cp2 is prioritized") ]) def test_get_chargepoints_by_mode(set_mode_tuple: Tuple[Optional[str], str, bool], - charging_ev_1: int, + required_current_1: int, mode_tuple_1: Tuple[str, str, bool], - charging_ev_2: int, mode_tuple_2: Tuple[str, str, bool], expected_valid_chargepoints): # setup - def setup_cp(cp: Chargepoint, charging_ev: int, mode_tuple: Tuple[str, str, bool]) -> Chargepoint: - cp.data.set.charging_ev = charging_ev + def setup_cp(cp: Chargepoint, required_current: float, mode_tuple: Tuple[str, str, bool]) -> Chargepoint: + cp.data.control_parameter.required_current = required_current cp.data.control_parameter.prio = mode_tuple[2] cp.data.control_parameter.chargemode = mode_tuple[0] cp.data.control_parameter.submode = mode_tuple[1] return cp - data.data.cp_data = {"cp1": setup_cp(mock_cp1, charging_ev_1, mode_tuple_1), - "cp2": setup_cp(mock_cp2, charging_ev_2, mode_tuple_2)} + data.data.cp_data = {"cp1": setup_cp(mock_cp1, required_current_1, mode_tuple_1), + "cp2": setup_cp(mock_cp2, 6, mode_tuple_2)} # evaluation valid_chargepoints = filter_chargepoints.get_chargepoints_by_mode(set_mode_tuple) diff --git a/packages/control/algorithm/integration_test/conftest.py b/packages/control/algorithm/integration_test/conftest.py index 22eac7fd59..dd91361d37 100644 --- a/packages/control/algorithm/integration_test/conftest.py +++ b/packages/control/algorithm/integration_test/conftest.py @@ -27,7 +27,6 @@ def data_() -> None: for i in range(3, 6): data.data.cp_data[f"cp{i}"].template = CpTemplate() data.data.cp_data[f"cp{i}"].data.config.phase_1 = i-2 - data.data.cp_data[f"cp{i}"].data.set.charging_ev = i data.data.cp_data[f"cp{i}"].data.set.charging_ev_data = Ev(i) data.data.cp_data[f"cp{i}"].data.set.charging_ev_data.ev_template.data.max_current_single_phase = 32 data.data.cp_data[f"cp{i}"].data.get.plug_state = True diff --git a/packages/control/algorithm/surplus_controlled_test.py b/packages/control/algorithm/surplus_controlled_test.py index e13e827542..962eca835b 100644 --- a/packages/control/algorithm/surplus_controlled_test.py +++ b/packages/control/algorithm/surplus_controlled_test.py @@ -140,9 +140,10 @@ def test_get_chargepoints_submode_pv_charging(submode_1: Chargemode, expected_chargepoints: List[Chargepoint]): # setup def setup_cp(cp: Chargepoint, submode: str) -> Chargepoint: - cp.data.set.charging_ev = Ev(0) + cp.data.set.charging_ev_data = Ev(0) cp.data.control_parameter.chargemode = Chargemode.PV_CHARGING cp.data.control_parameter.submode = submode + cp.data.control_parameter.required_current = 6 return cp data.data.cp_data = {"cp1": setup_cp(mock_cp1, submode_1), "cp2": setup_cp(mock_cp2, submode_2)} diff --git a/packages/control/chargelog/chargelog.py b/packages/control/chargelog/chargelog.py index 06d4057188..e60f61942c 100644 --- a/packages/control/chargelog/chargelog.py +++ b/packages/control/chargelog/chargelog.py @@ -125,8 +125,6 @@ def save_interim_data(chargepoint, charging_ev, immediately: bool = True): try: log_data = chargepoint.data.set.log # Es wurde noch nie ein Auto zugeordnet - if charging_ev == -1: - return if log_data.imported_since_mode_switch == 0: # Die Daten wurden schon erfasst. return @@ -134,7 +132,7 @@ def save_interim_data(chargepoint, charging_ev, immediately: bool = True): if chargepoint.data.get.power != 0: # Das Fahrzeug hat die Ladung noch nicht beendet. Der Logeintrag wird später erstellt. return - save_data(chargepoint, charging_ev, immediately) + save_data(chargepoint, charging_ev) chargepoint.reset_log_data_chargemode_switch() except Exception: log.exception("Fehler im Ladelog-Modul") @@ -154,16 +152,13 @@ def save_and_reset_data(chargepoint, charging_ev, immediately: bool = True): Soll sofort ein Eintrag erstellt werden oder gewartet werden, bis die Ladung beendet ist. """ try: - if charging_ev == -1: - # Es wurde noch nie ein Auto zugeordnet. - return if not immediately: if chargepoint.data.get.power != 0: # Das Fahrzeug hat die Ladung noch nicht beendet. Der Logeintrag wird später erstellt. return if chargepoint.data.set.log.imported_since_mode_switch > 0: # Die Daten wurden noch nicht erfasst. - save_data(chargepoint, charging_ev, immediately) + save_data(chargepoint, charging_ev) chargepoint.reset_log_data() except Exception: log.exception("Fehler im Ladelog-Modul") @@ -187,7 +182,7 @@ def _get_range_charged(log_data, charging_ev) -> float: charging_ev.ev_template.data.average_consump), 2)) -def save_data(chargepoint, charging_ev, immediately: bool = True): +def save_data(chargepoint, charging_ev): """ json-Objekt für den Log-Eintrag erstellen, an die Datei anhängen und die Daten, die sich auf den Ladevorgang beziehen, löschen. @@ -198,17 +193,13 @@ def save_data(chargepoint, charging_ev, immediately: bool = True): charging_ev: class EV, das an diesem Ladepunkt lädt. (Wird extra übergeben, da es u.U. noch nicht zugewiesen ist und nur die Nummer aus dem Broker in der LP-Klasse hinterlegt ist.) - reset: bool - Wenn die Daten komplett zurückgesetzt werden, wird nicht der Zwischenzählerstand für - imported_at_mode_switch notiert. Sonst schon, damit zwischen save_data und dem nächsten collect_data keine - Daten verloren gehen. """ if chargepoint.data.set.log.imported_since_mode_switch != 0: - new_entry = _create_entry(chargepoint, charging_ev, immediately) + new_entry = _create_entry(chargepoint, charging_ev) write_new_entry(new_entry) -def _create_entry(chargepoint, charging_ev, immediately: bool = True): +def _create_entry(chargepoint, charging_ev): log_data = chargepoint.data.set.log # Daten vor dem Speichern nochmal aktualisieren, auch wenn nicht mehr geladen wird. log_data.imported_since_plugged = get_value_or_default(lambda: round( diff --git a/packages/control/chargepoint/chargepoint.py b/packages/control/chargepoint/chargepoint.py index b28de0ca83..e8fddeab60 100644 --- a/packages/control/chargepoint/chargepoint.py +++ b/packages/control/chargepoint/chargepoint.py @@ -1,19 +1,3 @@ -"""Ladepunkt-Logik - -charging_ev: EV, das aktuell laden darf -charging_ev_prev: EV, das vorher geladen hat. Dies wird benötigt, da wenn das EV nicht mehr laden darf, z.B. weil -Autolock aktiv ist, gewartet werden muss, bis die Ladeleistung 0 ist und dann erst der Eintrag im Protokoll erstellt -werden kann. -charging_ev = -1 zeigt an, dass der LP im Algorithmus nicht berücksichtigt werden soll. Ist das Ev abgesteckt, wird -auch charging_ev_prev -1 und im nächsten Zyklus kann ein neues Profil geladen werden. - -ID-Tag/Code-Eingabe: -Mit einem ID-Tag/Code kann optional der Ladepunkt freigeschaltet werden, es wird gleichzeitig immer ein EV damit -zugeordnet, mit dem nach der Freischaltung geladen werden soll. Wenn max 5 Min nach dem Scannen kein Auto -angesteckt wird, wird der Tag verworfen. Ebenso wenn kein EV gefunden wird. -Tag-Liste: Tags, mit denen der Ladepunkt freigeschaltet werden kann. Ist diese leer, kann mit jedem Tag der Ladepunkt -freigeschaltet werden. -""" from dataclasses import asdict import dataclasses import logging @@ -215,41 +199,28 @@ def _process_charge_stop(self) -> None: self.data.set.ocpp_transaction_id, self.data.set.rfid) Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/ocpp_transaction_id", None) - if self.data.set.charging_ev_prev != -1: - # Daten zurücksetzen, wenn nicht geladen werden soll. - self.reset_control_parameter_at_charge_stop() - data.data.counter_all_data.get_evu_counter().reset_switch_on_off( - self, data.data.ev_data["ev"+str(self.data.set.charging_ev_prev)]) - # Abstecken - if not self.data.get.plug_state: - self.data.control_parameter = control_parameter_factory() - # Standardprofil nach Abstecken laden - if self.data.set.charge_template.data.load_default: - self.data.config.ev = 0 - Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/config/ev", 0) - # Ladepunkt nach Abstecken sperren - if self.template.data.disable_after_unplug: - self.data.set.manual_lock = True - Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/manual_lock", True) - log.debug("/set/manual_lock True") - # Ev wurde noch nicht aktualisiert. - # Ladeprofil aus den Einstellungen laden. - if data.data.general_data.data.temporary_charge_templates_active: - self.update_charge_template( - data.data.ev_data["ev"+str(self.data.set.charging_ev_prev)].charge_template) - chargelog.save_and_reset_data(self, data.data.ev_data["ev"+str(self.data.set.charging_ev_prev)]) - self.data.set.charging_ev_prev = -1 - Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/charging_ev_prev", - self.data.set.charging_ev_prev) - self.data.set.rfid = None - Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/rfid", None) - self.data.set.plug_time = None - Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/plug_time", None) - self.data.set.phases_to_use = self.data.get.phases_in_use - Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/phases_to_use", - self.data.set.phases_to_use) - self.data.set.charging_ev = -1 - Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/charging_ev", -1) + 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: + self.data.control_parameter = control_parameter_factory() + if self.data.set.charge_template.data.load_default: + self.data.config.ev = 0 + Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/config/ev", 0) + if self.template.data.disable_after_unplug: + self.data.set.manual_lock = True + Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/manual_lock", True) + log.debug("/set/manual_lock True") + if data.data.general_data.data.temporary_charge_templates_active: + self.update_charge_template( + data.data.ev_data["ev"+str(self.data.config.ev)].charge_template) + chargelog.save_and_reset_data(self, data.data.ev_data["ev"+str(self.data.config.ev)]) + self.data.set.rfid = None + Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/rfid", None) + self.data.set.plug_time = None + Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/plug_time", None) + self.data.set.phases_to_use = self.data.get.phases_in_use + Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/phases_to_use", + self.data.set.phases_to_use) self.data.set.current = 0 Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/current", 0) self.data.set.energy_to_charge = 0 @@ -710,8 +681,7 @@ def update(self, ev_list: Dict[str, Ev]) -> None: self.check_phase_switch_completed() if self.chargemode_changed or self.submode_changed: - data.data.counter_all_data.get_evu_counter().reset_switch_on_off( - self, charging_ev) + data.data.counter_all_data.get_evu_counter().reset_switch_on_off(self) charging_ev.reset_phase_switch(self.data.control_parameter) if self.chargemode_changed: self.data.control_parameter.failed_phase_switches = 0 @@ -724,14 +694,6 @@ def update(self, ev_list: Dict[str, Ev]) -> None: # Wenn die Nachrichten gesendet wurden, EV wieder löschen, wenn das EV im Algorithmus nicht # berücksichtigt werden soll. if not state: - if self.data.set.charging_ev != -1: - # Altes EV merken - self.data.set.charging_ev_prev = self.data.set.charging_ev - Pub().pub("openWB/set/chargepoint/"+str(self.num) + - "/set/charging_ev_prev", self.data.set.charging_ev_prev) - self.data.set.charging_ev = -1 - Pub().pub("openWB/set/chargepoint/" + - str(self.num)+"/set/charging_ev", -1) log.debug(f'LP {self.num}, EV: {self.data.set.charging_ev_data.data.name}' f' (EV-Nr.{vehicle}): Lademodus ' f'{self.data.set.charge_template.data.chargemode.selected}, Submodus: ' @@ -816,18 +778,16 @@ def _get_charging_ev(self, vehicle: int, ev_list: Dict[str, Ev]) -> Ev: " verwendet.") charging_ev = ev_list["ev0"] vehicle = 0 - if self.data.set.charging_ev_prev != vehicle: + if self.data.config.ev != vehicle: Pub().pub(f"openWB/set/vehicle/{charging_ev.num}/get/force_soc_update", True) log.debug("SoC nach EV-Wechsel") # 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 + if (self.data.config.ev != vehicle 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 - Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/charging_ev", vehicle) - self.data.set.charging_ev_prev = vehicle - Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/charging_ev_prev", vehicle) + self.data.config.ev = vehicle + Pub().pub(f"openWB/set/chargepoint/{self.num}/config", dataclasses.asdict(self.data.config)) return charging_ev def update_charge_template(self, charge_template: ChargeTemplate) -> None: diff --git a/packages/control/chargepoint/chargepoint_all.py b/packages/control/chargepoint/chargepoint_all.py index 219227b039..02de7cd17d 100644 --- a/packages/control/chargepoint/chargepoint_all.py +++ b/packages/control/chargepoint/chargepoint_all.py @@ -47,13 +47,12 @@ def no_charge(self): control_parameter = chargepoint.data.control_parameter if (not chargepoint.data.get.plug_state or # Kein EV, das Laden soll - chargepoint.data.set.charging_ev == -1 or # Kein EV, das auf das Ablaufen der Einschalt- oder Phasenumschaltverzögerung wartet - (chargepoint.data.set.charging_ev != -1 and - control_parameter.state != ChargepointState.PERFORMING_PHASE_SWITCH and + (control_parameter.state != ChargepointState.PERFORMING_PHASE_SWITCH and control_parameter.state != ChargepointState.PHASE_SWITCH_DELAY and control_parameter.state != ChargepointState.SWITCH_OFF_DELAY and - control_parameter.state != ChargepointState.SWITCH_ON_DELAY)): + control_parameter.state != ChargepointState.SWITCH_ON_DELAY and + control_parameter.state != ChargepointState.NO_CHARGING_ALLOWED)): continue else: break diff --git a/packages/control/chargepoint/chargepoint_data.py b/packages/control/chargepoint/chargepoint_data.py index ad5e296c4d..6a4f435c3e 100644 --- a/packages/control/chargepoint/chargepoint_data.py +++ b/packages/control/chargepoint/chargepoint_data.py @@ -148,8 +148,6 @@ def log_factory() -> Log: @dataclass class Set: - charging_ev: int = -1 - charging_ev_prev: int = -1 charge_template: ChargeTemplate = field(default_factory=charge_template_factory) current: float = 0 energy_to_charge: float = 0 diff --git a/packages/control/chargepoint/chargepoint_template.py b/packages/control/chargepoint/chargepoint_template.py index f028416714..741bd21eb6 100644 --- a/packages/control/chargepoint/chargepoint_template.py +++ b/packages/control/chargepoint/chargepoint_template.py @@ -87,7 +87,6 @@ def get_ev(self, rfid: str, vehicle_id: str, assigned_ev: int) -> int: message: str Status-Text """ - num = -1 message = None try: if data.data.optional_data.data.rfid.active and (rfid is not None or vehicle_id is not None): @@ -103,4 +102,4 @@ def get_ev(self, rfid: str, vehicle_id: str, assigned_ev: int) -> int: except Exception: log.exception( "Fehler in der Ladepunkt-Profil Klasse") - return num, "Keine Ladung, da ein interner Fehler aufgetreten ist: " + traceback.format_exc() + return assigned_ev, "Keine Ladung, da ein interner Fehler aufgetreten ist: " + traceback.format_exc() diff --git a/packages/control/counter.py b/packages/control/counter.py index 4ba0262561..146db1d345 100644 --- a/packages/control/counter.py +++ b/packages/control/counter.py @@ -11,7 +11,6 @@ from control.algorithm.filter_chargepoints import get_chargepoints_by_chargemodes from control.algorithm.utils import get_medium_charging_current from control.chargemode import Chargemode -from control.ev.ev import Ev from control.chargepoint.chargepoint import Chargepoint from control.chargepoint.chargepoint_state import ChargepointState from dataclass_utils.factories import currents_list_factory, voltages_list_factory @@ -475,22 +474,14 @@ def switch_off_check_threshold(self, chargepoint: Chargepoint) -> bool: chargepoint.set_state_and_log(msg) return charge - def reset_switch_on_off(self, chargepoint: Chargepoint, charging_ev: Ev): - """ Zeitstempel und reservierte Leistung löschen - - Parameter - --------- - chargepoint: dict - Ladepunkt, für den die Werte zurückgesetzt werden sollen - charging_ev: dict - EV, das dem Ladepunkt zugeordnet ist - """ + def reset_switch_on_off(self, chargepoint: Chargepoint): try: if chargepoint.data.control_parameter.timestamp_switch_on_off is not None: chargepoint.data.control_parameter.timestamp_switch_on_off = None evu_counter = data.data.counter_all_data.get_evu_counter() - # Wenn bereits geladen wird, freigegebene Leistung freigeben. Wenn nicht geladen wird, reservierte - # Leistung freigeben. + # Wenn bereits geladen wird, lief die Abschaltverzögerung -> Leistung, die nach Abschalten frei + # geworden wäre, nicht mehr zum zur Verfügung stehenden Überschuss zählen. + # Wenn nicht geladen wird, reservierte Leistung freigeben. pv_config = data.data.general_data.data.chargemode_config.pv_charging if not chargepoint.data.get.charge_state: evu_counter.data.set.reserved_surplus -= (pv_config.switch_on_threshold diff --git a/packages/control/ocpp_test.py b/packages/control/ocpp_test.py index e56eaee676..5dae1c50ff 100644 --- a/packages/control/ocpp_test.py +++ b/packages/control/ocpp_test.py @@ -37,9 +37,9 @@ def test_start_transaction(mock_data, monkeypatch): def test_stop_transaction(mock_data, monkeypatch): cp = Chargepoint(1, None) cp.data.config.ocpp_chargebox_id = "cp1" + cp.data.config.ev = 1 cp.data.get.plug_state = False cp.data.set.ocpp_transaction_id = 124 - cp.data.set.charging_ev_prev = 1 cp.chargepoint_module = ChargepointModule(Mqtt()) cp.template = CpTemplate() diff --git a/packages/control/process.py b/packages/control/process.py index f4d06f68b4..0ff08fc038 100644 --- a/packages/control/process.py +++ b/packages/control/process.py @@ -31,7 +31,7 @@ def process_algorithm_results(self) -> None: for cp in data.data.cp_data.values(): try: control_parameter = cp.data.control_parameter - if cp.data.set.charging_ev != -1: + if control_parameter.state != ChargepointState.NO_CHARGING_ALLOWED or cp.data.set.current != 0: # Ladelog-Daten müssen vor dem Setzen des Stroms gesammelt werden, # damit bei Phasenumschaltungs-empfindlichen EV sicher noch nicht geladen wurde. chargelog.collect_data(cp) @@ -43,13 +43,10 @@ def process_algorithm_results(self) -> None: cp.set_timestamp_charge_start() else: # LP, an denen nicht geladen werden darf - if cp.data.set.charging_ev_prev != -1: - chargelog.save_interim_data( - cp, data.data.ev_data - ["ev" + str(cp.data.set.charging_ev_prev)], - immediately=False) - cp.data.set.current = 0 - Pub().pub("openWB/set/chargepoint/"+str(cp.num)+"/set/current", 0) + chargelog.save_interim_data( + cp, data.data.ev_data + ["ev" + str(cp.data.config.ev)], + immediately=False) control_parameter.state = ChargepointState.NO_CHARGING_ALLOWED if cp.data.get.state_str is not None: Pub().pub("openWB/set/chargepoint/"+str(cp.num)+"/get/state_str", diff --git a/packages/helpermodules/setdata.py b/packages/helpermodules/setdata.py index 8ae3f3e980..645bdc779a 100644 --- a/packages/helpermodules/setdata.py +++ b/packages/helpermodules/setdata.py @@ -472,12 +472,8 @@ def process_chargepoint_topic(self, msg: mqtt.MQTTMessage): elif re.search("chargepoint/[0-9]+/config$", msg.topic) is not None: self._validate_value(msg, "json") elif subdata.SubData.cp_data.get(f"cp{get_index(msg.topic)}"): - if ("/set/charging_ev" in msg.topic or - "/set/charging_ev_prev" in msg.topic or - "/set/ev_prev" in msg.topic): - self._validate_value(msg, int, [(-1, float("inf"))]) - elif ("/set/current" in msg.topic or - "/set/current_prev" in msg.topic): + if ("/set/current" in msg.topic or + "/set/current_prev" in msg.topic): if hardware_configuration.get_hardware_configuration_setting("dc_charging"): self._validate_value(msg, float, [(float("-inf"), 0), (0, 0), (6, 32), (0, 450)]) else: @@ -503,6 +499,8 @@ def process_chargepoint_topic(self, msg: mqtt.MQTTMessage): self._validate_value(msg, int) elif "/set/log" in msg.topic: self._validate_value(msg, "json") + elif "/set/ev_prev" in msg.topic: + self._validate_value(msg, int, [(0, float("inf"))]) elif "/config/ev" in msg.topic: self._validate_value( msg, int, [(0, float("inf"))], pub_json=True) diff --git a/packages/helpermodules/subdata.py b/packages/helpermodules/subdata.py index 1f43f8afe2..4bb039a8f1 100644 --- a/packages/helpermodules/subdata.py +++ b/packages/helpermodules/subdata.py @@ -27,7 +27,7 @@ from helpermodules.utils.run_command import run_command from helpermodules.utils.topic_parser import decode_payload, get_index, get_second_index from helpermodules.pub import Pub -from dataclass_utils import dataclass_from_dict +from dataclass_utils import asdict, dataclass_from_dict from modules.common.abstract_vehicle import CalculatedSocState, GeneralVehicleConfig from modules.common.configurable_backup_cloud import ConfigurableBackupCloud from modules.common.configurable_tariff import ConfigurableFlexibleTariff, ConfigurableGridFee @@ -439,13 +439,8 @@ def process_chargepoint_topic(self, var: Dict[str, chargepoint.Chargepoint], msg self.set_json_payload_class(var["cp"+index].chargepoint.data.get.connected_vehicle, 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): - # Wenn das Auto noch nicht zugeordnet ist, wird der SoC nach der Zuordnung aktualisiert - if var["cp"+index].chargepoint.data.set.charging_ev > -1: - Pub().pub(f'openWB/set/vehicle/{var["cp"+index].chargepoint.data.set.charging_ev}' - '/get/force_soc_update', True) - elif var["cp"+index].chargepoint.data.set.charging_ev_prev > -1: - Pub().pub(f'openWB/set/vehicle/{var["cp"+index].chargepoint.data.set.charging_ev_prev}' - '/get/force_soc_update', True) + 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")): @@ -478,7 +473,8 @@ def process_chargepoint_config_topic(self, var: Dict[str, chargepoint.CpTemplate index = get_index(msg.topic) payload = decode_payload(msg.payload) if (var["cp"+index].chargepoint.chargepoint_module is None or - payload != var["cp"+index].chargepoint.chargepoint_module.config): + payload["configuration"] != asdict(var["cp"+index + ].chargepoint.chargepoint_module.config.configuration)): mod = importlib.import_module( ".chargepoints."+payload["type"]+".chargepoint_module", "modules") config = dataclass_from_dict(mod.chargepoint_descriptor.configuration_factory, payload) diff --git a/packages/helpermodules/update_config.py b/packages/helpermodules/update_config.py index d9da9a4148..c164bf7572 100644 --- a/packages/helpermodules/update_config.py +++ b/packages/helpermodules/update_config.py @@ -143,7 +143,6 @@ class UpdateConfig: "^openWB/chargepoint/[0-9]+/get/connected_vehicle/config$", "^openWB/chargepoint/[0-9]+/get/rfid$", "^openWB/chargepoint/[0-9]+/get/rfid_timestamp$", - "^openWB/chargepoint/[0-9]+/set/charging_ev$", "^openWB/chargepoint/[0-9]+/set/charge_template$", "^openWB/chargepoint/[0-9]+/set/current$", "^openWB/chargepoint/[0-9]+/set/energy_to_charge$", @@ -154,7 +153,6 @@ class UpdateConfig: "^openWB/chargepoint/[0-9]+/set/rfid$", "^openWB/chargepoint/[0-9]+/set/log$", "^openWB/chargepoint/[0-9]+/set/phases_to_use$", - "^openWB/chargepoint/[0-9]+/set/charging_ev_prev$", "^openWB/chargepoint/[0-9]+/set/ocpp_transaction_id$", "^openWB/chargepoint/[0-9]+/set/ocpp_transaction_active$", diff --git a/packages/modules/update_soc.py b/packages/modules/update_soc.py index cbf3974b17..b2d35b5d14 100644 --- a/packages/modules/update_soc.py +++ b/packages/modules/update_soc.py @@ -100,7 +100,7 @@ def _get_vehicle_update_data(self, ev_num: int) -> VehicleUpdateData: ev_template = subdata.SubData.ev_template_data[f"et{ev.data.ev_template}"] for cp_state_update in list(subdata.SubData.cp_data.values()): cp = cp_state_update.chargepoint - if cp.data.set.charging_ev == ev_num or cp.data.set.charging_ev_prev == ev_num: + if cp.data.config.ev == ev_num: plug_state = cp.data.get.plug_state charge_state = cp.data.get.charge_state imported = cp.data.get.imported @@ -128,7 +128,7 @@ def _get_vehicle_update_data(self, ev_num: int) -> VehicleUpdateData: soc_from_cp=soc_from_cp, timestamp_soc_from_cp=timestamp_soc_from_cp, last_soc_timestamp=soc_timestamp, - last_soc=ev.data.get.soc) + last_soc=ev.data.get.soc if ev.data.get.soc is not None else soc_from_cp) def _filter_failed_store_threads(self, threads_store: List[Thread]) -> List[Thread]: ev_data = copy.deepcopy(subdata.SubData.ev_data) diff --git a/packages/modules/update_soc_test.py b/packages/modules/update_soc_test.py index 74526e1c75..376af80f66 100644 --- a/packages/modules/update_soc_test.py +++ b/packages/modules/update_soc_test.py @@ -55,7 +55,7 @@ def test_get_ev_state(ev_num: int, set_charge_state: bool, expected_charge_state: bool): # setup - SubData.cp_data["cp0"].chargepoint.data.set.charging_ev = ev_num + SubData.cp_data["cp0"].chargepoint.data.config.ev = ev_num SubData.cp_data["cp0"].chargepoint.data.get.charge_state = set_charge_state # execution