From b006f58760077b94d4c042ec54904f3ec3faab91 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Fri, 24 Oct 2025 13:42:18 +0200 Subject: [PATCH 1/3] draft --- packages/helpermodules/subdata.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/helpermodules/subdata.py b/packages/helpermodules/subdata.py index 64833a3b95..1f025fa679 100644 --- a/packages/helpermodules/subdata.py +++ b/packages/helpermodules/subdata.py @@ -338,18 +338,17 @@ def process_vehicle_charge_template_topic(self, var: Dict[str, ChargeTemplate], if "ct"+index not in var: var["ct"+index] = ChargeTemplate() var["ct"+index].data = dataclass_from_dict(ChargeTemplateData, decode_payload(msg.payload)) - # Temporäres ChargeTemplate aktualisieren, wenn persistentes geändert wird for vehicle in self.ev_data.values(): if vehicle.data.charge_template == int(index): for cp in self.cp_data.values(): - if (((cp.chargepoint.data.set.charging_ev != -1 and + if ((cp.chargepoint.data.set.charging_ev != -1 and cp.chargepoint.data.set.charging_ev == vehicle.num) or - cp.chargepoint.data.config.ev == vehicle.num) and - cp.chargepoint.data.get.plug_state is False): + cp.chargepoint.data.config.ev == vehicle.num): if decode_payload(msg.payload) == "": Pub().pub(f"openWB/chargepoint/{cp.chargepoint.num}/set/charge_template", "") - else: - cp.chargepoint.update_charge_template(var["ct"+index]) + elif self.general_data.data.temporary_charge_templates: + Pub().pub( + f"openWB/chargepoint/{cp.chargepoint.num}/set/charge_template", decode_payload(msg.payload)) except Exception: log.exception("Fehler im subdata-Modul") From 5c942f702e1011ea71ffe9c1bf95f859354d9da9 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Fri, 24 Oct 2025 13:42:33 +0200 Subject: [PATCH 2/3] draft --- packages/control/chargepoint/chargepoint.py | 17 ++++------------- packages/control/general.py | 1 + packages/helpermodules/subdata.py | 5 ++++- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/packages/control/chargepoint/chargepoint.py b/packages/control/chargepoint/chargepoint.py index f06e68960a..29a3816f55 100644 --- a/packages/control/chargepoint/chargepoint.py +++ b/packages/control/chargepoint/chargepoint.py @@ -843,20 +843,11 @@ def _get_charging_ev(self, vehicle: int, ev_list: Dict[str, Ev]) -> Ev: Pub().pub("openWB/set/chargepoint/"+str(self.num)+"/set/charging_ev_prev", vehicle) return charging_ev - def _clear_template_topics(self, topic: str) -> None: - def on_connect(client, userdata, flags, rc): - client.subscribe(topic, 2) - - def __get_payload(client, userdata, msg): - received_topics.append(msg.topic) - received_topics = [] - BrokerClient("processBrokerBranch", on_connect, __get_payload).start_finite_loop() - for topic in received_topics: - Pub().pub(topic, "") - def update_charge_template(self, charge_template: ChargeTemplate) -> None: - Pub().pub(f"openWB/set/chargepoint/{self.num}/set/charge_template", - dataclasses.asdict(charge_template.data)) + if data.data.general_data.data.temporary_charge_templates: + # Prüfen, ob ein temporäres Ladeprofil aktiv ist und dieses übernehmen + Pub().pub(f"openWB/set/chargepoint/{self.num}/set/charge_template", + dataclasses.asdict(charge_template.data)) def _pub_connected_vehicle(self, vehicle: Ev): """ published die Daten, die zur Anzeige auf der Hauptseite benötigt werden. diff --git a/packages/control/general.py b/packages/control/general.py index cb862a0d05..bce63b6327 100644 --- a/packages/control/general.py +++ b/packages/control/general.py @@ -100,6 +100,7 @@ class GeneralData: http_api: bool = field( default=False, metadata={"topic": "http_api"}) mqtt_bridge: bool = False + temporary_charge_templates: bool = False prices: Prices = field(default_factory=prices_factory) range_unit: str = "km" diff --git a/packages/helpermodules/subdata.py b/packages/helpermodules/subdata.py index 1f025fa679..aae26baa4d 100644 --- a/packages/helpermodules/subdata.py +++ b/packages/helpermodules/subdata.py @@ -9,7 +9,7 @@ import subprocess import paho.mqtt.client as mqtt -from control import bat_all, bat, counter, counter_all, general, io_device, optional, pv, pv_all +from control import bat_all, bat, counter, counter_all, data, general, io_device, optional, pv, pv_all from control.chargepoint import chargepoint from control.chargepoint.chargepoint_all import AllChargepoints from control.chargepoint.chargepoint_data import Log @@ -411,6 +411,9 @@ def process_chargepoint_topic(self, var: Dict[str, chargepoint.Chargepoint], msg var["cp"+index].chargepoint.data.set.log = dataclass_from_dict( Log, decode_payload(msg.payload)) elif "charge_template" in msg.topic: + if self.general_data.data.temporary_charge_templates: + payload = decode_payload(msg.payload) + Pub().pub(f'openWB/vehicle/template/{payload["id"]}/charge_template', payload) 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)) From 56371c94b653706c951a14a9130e25009402d500 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Fri, 24 Oct 2025 15:22:39 +0200 Subject: [PATCH 3/3] temp charge templates optional --- packages/control/chargepoint/chargepoint.py | 3 +-- packages/control/general.py | 2 +- packages/helpermodules/setdata.py | 28 +++++++++++++++++++-- packages/helpermodules/subdata.py | 17 ++----------- packages/helpermodules/update_config.py | 20 ++++++++++++--- 5 files changed, 46 insertions(+), 24 deletions(-) diff --git a/packages/control/chargepoint/chargepoint.py b/packages/control/chargepoint/chargepoint.py index 29a3816f55..38cfe05fdc 100644 --- a/packages/control/chargepoint/chargepoint.py +++ b/packages/control/chargepoint/chargepoint.py @@ -36,7 +36,6 @@ from control import phase_switch from control.chargepoint.chargepoint_state import CHARGING_STATES, ChargepointState from control.text import BidiState -from helpermodules.broker import BrokerClient from helpermodules.phase_mapping import convert_single_evu_phase_to_cp_phase from helpermodules.pub import Pub from helpermodules import timecheck @@ -844,7 +843,7 @@ def _get_charging_ev(self, vehicle: int, ev_list: Dict[str, Ev]) -> Ev: return charging_ev def update_charge_template(self, charge_template: ChargeTemplate) -> None: - if data.data.general_data.data.temporary_charge_templates: + if data.data.general_data.data.temporary_charge_templates_active: # Prüfen, ob ein temporäres Ladeprofil aktiv ist und dieses übernehmen Pub().pub(f"openWB/set/chargepoint/{self.num}/set/charge_template", dataclasses.asdict(charge_template.data)) diff --git a/packages/control/general.py b/packages/control/general.py index bce63b6327..95253b3b2f 100644 --- a/packages/control/general.py +++ b/packages/control/general.py @@ -100,7 +100,7 @@ class GeneralData: http_api: bool = field( default=False, metadata={"topic": "http_api"}) mqtt_bridge: bool = False - temporary_charge_templates: bool = False + temporary_charge_templates_active: bool = False prices: Prices = field(default_factory=prices_factory) range_unit: str = "km" diff --git a/packages/helpermodules/setdata.py b/packages/helpermodules/setdata.py index a18eaebb9d..1fdbecf030 100644 --- a/packages/helpermodules/setdata.py +++ b/packages/helpermodules/setdata.py @@ -10,6 +10,7 @@ import paho.mqtt.client as mqtt import logging +from control import data from helpermodules import hardware_configuration, subdata from helpermodules.broker import BrokerClient from helpermodules.pub import Pub, pub_single @@ -407,6 +408,26 @@ def process_vehicle_charge_template_topic(self, msg: mqtt.MQTTMessage): try: if "charge_template" in msg.topic: self._validate_value(msg, "json") + if data.data.general_data.data.temporary_charge_templates_active is False: + if "openWB/set/chargepoint/" in msg.topic and "/set/charge_template" in msg.topic: + payload = decode_payload(msg.payload) + Pub().pub(f"openWB/vehicle/template/charge_template/{payload['id']}", payload) + else: + get_index(msg.topic) + + for vehicle in data.data.ev_data.values(): + if vehicle.data.charge_template == int(get_index(msg.topic)): + for cp in data.data.cp_data.values(): + if ((cp.data.set.charging_ev != -1 and + cp.data.set.charging_ev == vehicle.num) or + cp.data.config.ev == vehicle.num): + if decode_payload(msg.payload) == "": + Pub().pub( + f"openWB/chargepoint/{cp.num}/set/charge_template", "") + else: + Pub().pub( + f"openWB/chargepoint/{cp.num}/set/charge_template", + decode_payload(msg.payload)) else: self.__unknown_topic(msg) except Exception: @@ -551,7 +572,7 @@ def process_chargepoint_get_topics(self, msg): elif ("/get/evse_current" in msg.topic or "/get/max_evse_current" in msg.topic): # AC-EVSE: 0, 6-32, 600-3200, DC-EVSE 0-500 - self._validate_value(msg, float, [(0, 3200)]) + self._validate_value(msg, float, [(-3200, 3200)]) elif ("/get/version" in msg.topic or "/get/current_branch" in msg.topic or "/get/current_commit" in msg.topic): @@ -610,7 +631,8 @@ def process_pv_topic(self, msg: mqtt.MQTTMessage): "/get/yearly_exported" in msg.topic or "/get/energy" in msg.topic): self._validate_value(msg, float, [(0, float("inf"))]) - elif "/get/exported" in msg.topic: + elif ("/get/exported" in msg.topic or + "/get/imported" in msg.topic): self._validate_value(msg, float, [(0, float("inf"))]) elif "/get/power" in msg.topic: self._validate_value(msg, float) @@ -754,6 +776,8 @@ def process_general_topic(self, msg: mqtt.MQTTMessage): self._validate_value(msg, float, [(0, 99.99)]) elif "openWB/set/general/range_unit" in msg.topic: self._validate_value(msg, str) + elif "openWB/set/general/temporary_charge_templates_active" in msg.topic: + self._validate_value(msg, bool) elif "openWB/set/general/web_theme" in msg.topic: self._validate_value(msg, "json") elif ("openWB/set/general/charge_log_data_config" in msg.topic): diff --git a/packages/helpermodules/subdata.py b/packages/helpermodules/subdata.py index aae26baa4d..8a8a34ea58 100644 --- a/packages/helpermodules/subdata.py +++ b/packages/helpermodules/subdata.py @@ -9,7 +9,7 @@ import subprocess import paho.mqtt.client as mqtt -from control import bat_all, bat, counter, counter_all, data, general, io_device, optional, pv, pv_all +from control import bat_all, bat, counter, counter_all, general, io_device, optional, pv, pv_all from control.chargepoint import chargepoint from control.chargepoint.chargepoint_all import AllChargepoints from control.chargepoint.chargepoint_data import Log @@ -338,17 +338,7 @@ def process_vehicle_charge_template_topic(self, var: Dict[str, ChargeTemplate], if "ct"+index not in var: var["ct"+index] = ChargeTemplate() var["ct"+index].data = dataclass_from_dict(ChargeTemplateData, decode_payload(msg.payload)) - for vehicle in self.ev_data.values(): - if vehicle.data.charge_template == int(index): - for cp in self.cp_data.values(): - if ((cp.chargepoint.data.set.charging_ev != -1 and - cp.chargepoint.data.set.charging_ev == vehicle.num) or - cp.chargepoint.data.config.ev == vehicle.num): - if decode_payload(msg.payload) == "": - Pub().pub(f"openWB/chargepoint/{cp.chargepoint.num}/set/charge_template", "") - elif self.general_data.data.temporary_charge_templates: - Pub().pub( - f"openWB/chargepoint/{cp.chargepoint.num}/set/charge_template", decode_payload(msg.payload)) + except Exception: log.exception("Fehler im subdata-Modul") @@ -411,9 +401,6 @@ def process_chargepoint_topic(self, var: Dict[str, chargepoint.Chargepoint], msg var["cp"+index].chargepoint.data.set.log = dataclass_from_dict( Log, decode_payload(msg.payload)) elif "charge_template" in msg.topic: - if self.general_data.data.temporary_charge_templates: - payload = decode_payload(msg.payload) - Pub().pub(f'openWB/vehicle/template/{payload["id"]}/charge_template', payload) 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)) diff --git a/packages/helpermodules/update_config.py b/packages/helpermodules/update_config.py index 0d2cb26096..d0e70655b1 100644 --- a/packages/helpermodules/update_config.py +++ b/packages/helpermodules/update_config.py @@ -57,7 +57,7 @@ class UpdateConfig: - DATASTORE_VERSION = 96 + DATASTORE_VERSION = 97 valid_topic = [ "^openWB/bat/config/bat_control_permitted$", @@ -215,6 +215,7 @@ class UpdateConfig: "^openWB/general/grid_protection_timestamp$", "^openWB/general/grid_protection_random_stop$", "^openWB/general/range_unit$", + "^openWB/general/temporary_charge_templates_active$", "^openWB/general/notifications/selected$", "^openWB/general/notifications/configuration$", "^openWB/general/notifications/start_charging$", @@ -565,6 +566,7 @@ class UpdateConfig: ("openWB/general/prices/grid", Prices().grid), ("openWB/general/prices/pv", Prices().pv), ("openWB/general/range_unit", "km"), + ("openWB/general/temporary_charge_templates_active", False), ("openWB/general/web_theme", dataclass_utils.asdict(StandardLegacyWebTheme())), ("openWB/graph/config/duration", 120), ("openWB/internal_chargepoint/0/data/parent_cp", None), @@ -2350,9 +2352,6 @@ def upgrade(topic: str, payload) -> None: self.__update_topic("openWB/system/datastore_version", 88) def upgrade_datastore_88(self) -> None: - pub_system_message({}, "Änderungen, die du auf der Hauptseite vornimmst, gelten nur vorübergehend, bis das " - "Fahrzeug abgesteckt wird. \nDie dauerhaften Einstellungen aus dem Einstellungsmenü werden " - "danach automatisch wieder aktiviert.", MessageType.INFO) pub_system_message({}, "Es gibt ein neues Theme: das Koala-Theme! Smarthpone-optimiert und mit " "Energiefluss-Diagramm & Karten-Ansicht der Ladepunkte", MessageType.INFO) self.__update_topic("openWB/system/datastore_version", 89) @@ -2560,3 +2559,16 @@ def upgrade(topic: str, payload) -> Optional[dict]: return {topic: payload} self._loop_all_received_topics(upgrade) self.__update_topic("openWB/system/datastore_version", 96) + + def upgrade_datastore_96(self) -> None: + version = decode_payload(self.all_received_topics.get("openWB/system/version", "2.1.9")).split("-")[0] + major, minor, feature = (int(x) for x in version.split(".")) + if (2, 1, 7) <= (major, minor, feature) <= (2, 1, 8): + self.__update_topic("openWB/general/temporary_charge_templates_active", True) + pub_system_message( + {}, + "Die temporären Ladeeinstellungen können ab jetzt benutzerdefiniert unter Einstellungen -> Allgemein" + " -> Darstellung & Bedienung angewendet werden.", + MessageType.INFO, + ) + self.__update_topic("openWB/system/datastore_version", 97)