From e723f19a120f6961ed676bef04df177940a65008 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Mon, 16 Mar 2026 12:24:09 +0100 Subject: [PATCH 1/3] fix cp metadata --- .../algorithm/additional_current_test.py | 4 ++-- packages/control/auto_phase_switch_test.py | 6 ++--- packages/control/chargepoint/chargepoint.py | 3 --- .../control/chargepoint/chargepoint_data.py | 9 ++------ packages/control/counter_test.py | 4 ++-- packages/control/ev/charge_template.py | 13 +++++++++-- packages/control/ev/charge_template_test.py | 22 +++++++++---------- packages/control/ev/ev.py | 4 ++-- packages/helpermodules/subdata.py | 8 ++++--- 9 files changed, 38 insertions(+), 35 deletions(-) diff --git a/packages/control/algorithm/additional_current_test.py b/packages/control/algorithm/additional_current_test.py index e1f57b6309..f3f733ed35 100644 --- a/packages/control/algorithm/additional_current_test.py +++ b/packages/control/algorithm/additional_current_test.py @@ -4,7 +4,7 @@ from control.chargepoint.chargepoint import Chargepoint, ChargepointData from control.chargepoint.chargepoint_data import Set from control.chargepoint.control_parameter import ControlParameter -from control.ev.charge_template import ChargeTemplate +from control.ev.charge_template import instantiate_charge_template_without_metadata from control.ev.ev import Ev from control.limiting_value import LoadmanagementLimit from control.loadmanagement import LimitingValue @@ -30,7 +30,7 @@ def test_set_loadmangement_message(set_current, limit, expected_msg, monkeypatch): # setup ev = Ev(0) - ev.charge_template = ChargeTemplate() + ev.charge_template = instantiate_charge_template_without_metadata() cp1 = Chargepoint(1, None) cp1.data = ChargepointData(set=Set(current=set_current), control_parameter=ControlParameter(required_currents=[8]*3)) diff --git a/packages/control/auto_phase_switch_test.py b/packages/control/auto_phase_switch_test.py index f5a1883985..901e8831ff 100644 --- a/packages/control/auto_phase_switch_test.py +++ b/packages/control/auto_phase_switch_test.py @@ -6,7 +6,7 @@ from control.counter import Counter, CounterData, Set from control.limiting_value import LoadmanagementLimit -from control.ev.charge_template import ChargeTemplate +from control.ev.charge_template import instantiate_charge_template_without_metadata from control.pv_all import PvAll from control.bat_all import BatAll from control.general import General @@ -135,7 +135,7 @@ def test_auto_phase_switch(monkeypatch, vehicle: Ev, params: Params): control_parameter.state = params.state # execution - phases_to_use, current, message = vehicle.auto_phase_switch(ChargeTemplate(), + phases_to_use, current, message = vehicle.auto_phase_switch(instantiate_charge_template_without_metadata(), control_parameter, 0, max(params.get_currents), @@ -177,7 +177,7 @@ def test_check_phase_switch_conditions(evse_current: int, # execution phase_switch, condition_msg = ev._check_phase_switch_conditions( - ChargeTemplate(), + instantiate_charge_template_without_metadata(), ControlParameter(phases=3-get_currents.count(0)), evse_current, get_currents, diff --git a/packages/control/chargepoint/chargepoint.py b/packages/control/chargepoint/chargepoint.py index ac94d529e5..15e594f26d 100644 --- a/packages/control/chargepoint/chargepoint.py +++ b/packages/control/chargepoint/chargepoint.py @@ -1,5 +1,4 @@ from dataclasses import asdict -import dataclasses import logging from threading import Thread, Event import traceback @@ -754,8 +753,6 @@ def _get_charging_ev(self, vehicle: int, ev_list: Dict[str, Ev]) -> Ev: def update_charge_template(self, charge_template: ChargeTemplate) -> None: # Prüfen, ob ein temporäres Ladeprofil aktiv ist und dieses übernehmen self.data.set.charge_template = charge_template - 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/chargepoint/chargepoint_data.py b/packages/control/chargepoint/chargepoint_data.py index bc601a5247..f06396a759 100644 --- a/packages/control/chargepoint/chargepoint_data.py +++ b/packages/control/chargepoint/chargepoint_data.py @@ -4,7 +4,7 @@ from control.chargepoint.chargepoint_template import CpTemplate from control.chargepoint.control_parameter import ControlParameter, control_parameter_factory -from control.ev.charge_template import ChargeTemplate +from control.ev.charge_template import ChargeTemplate, instantiate_charge_template_with_metadata from control.ev.ev import Ev from dataclass_utils.factories import currents_list_factory, empty_dict_factory, voltages_list_factory from helpermodules.constants import NO_ERROR @@ -140,10 +140,6 @@ class Get: voltages: List[float] = field(default_factory=voltages_list_factory) -def charge_template_factory() -> ChargeTemplate: - return ChargeTemplate() - - def ev_factory() -> Ev: return Ev(0) @@ -154,8 +150,7 @@ def log_factory() -> Log: @dataclass class Set: - charge_template: ChargeTemplate = field(default_factory=charge_template_factory, - metadata={"topic": "set/charge_template"}) + charge_template: ChargeTemplate = field(default_factory=instantiate_charge_template_with_metadata) current: float = field(default=0, metadata={"topic": "set/current"}) ev_prev: int = field(default=0, metadata={"topic": "set/ev_prev"}) log: Log = field(default_factory=log_factory, metadata={"topic": "set/log"}) diff --git a/packages/control/counter_test.py b/packages/control/counter_test.py index 4b3e59466a..b28298bb01 100644 --- a/packages/control/counter_test.py +++ b/packages/control/counter_test.py @@ -8,7 +8,7 @@ from control.chargepoint.chargepoint import Chargepoint from control.counter import Counter, CounterData, Get from control.ev.ev import Ev -from control.ev.charge_template import ChargeTemplate +from control.ev.charge_template import instantiate_charge_template_without_metadata from control.general import General from control.chargepoint.chargepoint_state import ChargepointState from modules.common.fault_state import FaultStateLevel @@ -140,7 +140,7 @@ def test_switch_on_threshold_reached(params: Params, caplog, general_data_fixtur cp.data.control_parameter.phases = 1 cp.data.control_parameter.state = params.state cp.data.control_parameter.timestamp_switch_on_off = params.timestamp_switch_on_off - ev.data.charge_template = ChargeTemplate() + ev.data.charge_template = instantiate_charge_template_without_metadata() ev.data.charge_template.data.chargemode.pv_charging.feed_in_limit = params.feed_in_limit cp.data.set.charging_ev_data = ev mock_calc_switch_on_power = Mock(return_value=[params.surplus, params.threshold]) diff --git a/packages/control/ev/charge_template.py b/packages/control/ev/charge_template.py index f96976fd76..d0bcd89023 100644 --- a/packages/control/ev/charge_template.py +++ b/packages/control/ev/charge_template.py @@ -133,8 +133,7 @@ class SelectedPlan: class ChargeTemplate: """ Klasse der Lade-Profile """ - data: ChargeTemplateData = field(default_factory=charge_template_data_factory, metadata={ - "topic": ""}) + data: ChargeTemplateData = field(default_factory=charge_template_data_factory) CHARGING_PRICE_EXCEEDED = ("Der aktuelle Strompreis liegt über dem maximalen Strompreis. ") CHARGING_PRICE_LOW = "Laden, da der aktuelle Strompreis unter dem maximalen Strompreis liegt." @@ -694,3 +693,13 @@ def bidi_charging_allowed(self, selected_plan: int, soc: float): for plan in self.data.chargemode.scheduled_charging.plans: if plan.id == selected_plan: return soc < plan.limit.soc_limit + + +def instantiate_charge_template_with_metadata() -> ChargeTemplate: + template = ChargeTemplate() + template.__dataclass_fields__['data'].metadata = {"topic": "set/charge_template"} + return template + + +def instantiate_charge_template_without_metadata() -> ChargeTemplate: + return ChargeTemplate() diff --git a/packages/control/ev/charge_template_test.py b/packages/control/ev/charge_template_test.py index 68fe7c4d83..6fef995338 100644 --- a/packages/control/ev/charge_template_test.py +++ b/packages/control/ev/charge_template_test.py @@ -7,7 +7,7 @@ from control import data from control import optional from control.chargepoint.control_parameter import ControlParameter -from control.ev.charge_template import SelectedPlan +from control.ev.charge_template import SelectedPlan, instantiate_charge_template_without_metadata from control.chargepoint.charging_type import ChargingType from control.ev.charge_template import ChargeTemplate from control.ev.ev_template import EvTemplate, EvTemplateData @@ -61,7 +61,7 @@ def test_time_charging(plans: Dict[int, TimeChargingPlan], soc: float, used_amou expected: Tuple[int, str, Optional[str], Optional[str]], monkeypatch): # setup - ct = ChargeTemplate() + ct = instantiate_charge_template_without_metadata() ct.data.time_charging.plans = plans check_plans_timeframe_mock = Mock(return_value=plan_found) monkeypatch.setattr(timecheck, "check_plans_timeframe", check_plans_timeframe_mock) @@ -88,7 +88,7 @@ def test_time_charging(plans: Dict[int, TimeChargingPlan], soc: float, used_amou def test_instant_charging(selected: str, current_soc: float, used_amount: float, expected: Tuple[int, str, Optional[str]]): # setup - ct = ChargeTemplate() + ct = instantiate_charge_template_without_metadata() ct.data.chargemode.instant_charging.limit.selected = selected ct.data.chargemode.instant_charging.limit.amount = 1000 @@ -118,7 +118,7 @@ def test_pv_charging(min_soc: int, used_amount: float, expected: Tuple[int, str, Optional[str], int]): # setup - ct = ChargeTemplate() + ct = instantiate_charge_template_without_metadata() ct.data.chargemode.pv_charging.min_soc = min_soc ct.data.chargemode.pv_charging.min_current = min_current ct.data.chargemode.pv_charging.phases_to_use = 0 @@ -151,7 +151,7 @@ def test_calc_remaining_time(phases_to_use, phase_switch_supported, expected, monkeypatch): # setup - ct = ChargeTemplate() + ct = instantiate_charge_template_without_metadata() plan = ScheduledChargingPlan(phases_to_use=phases_to_use) calculate_duration_mock = Mock(side_effect=calc_duration) monkeypatch.setattr(ChargeTemplate, "_calculate_duration", calculate_duration_mock) @@ -179,7 +179,7 @@ def test_calculate_duration(selected: str, expected_duration: float, expected_missing_amount: float): # setup - ct = ChargeTemplate() + ct = instantiate_charge_template_without_metadata() plan = ScheduledChargingPlan(bidi_charging_enabled=bidi_charging_enabled) plan.limit.selected = selected # execution @@ -208,7 +208,7 @@ def test_scheduled_charging_recent_plan(end_time_mock, check_end_time_mock = Mock(side_effect=end_time_mock) monkeypatch.setattr(timecheck, "check_end_time", check_end_time_mock) control_parameter = ControlParameter() - ct = ChargeTemplate() + ct = instantiate_charge_template_without_metadata() plan_mock_0 = Mock(spec=ScheduledChargingPlan, active=True, current=14, id=0, limit=Limit(selected="amount")) plan_mock_1 = Mock(spec=ScheduledChargingPlan, active=True, current=14, id=1, limit=Limit(selected="amount")) plan_mock_2 = Mock(spec=ScheduledChargingPlan, active=True, current=14, id=2, limit=Limit(selected="amount")) @@ -265,7 +265,7 @@ def test_scheduled_charging_calc_current(plan_data: SelectedPlan, bidi_charging_enabled: bool, expected: Tuple[float, str, str, int]): # setup - ct = ChargeTemplate() + ct = instantiate_charge_template_without_metadata() plan = ScheduledChargingPlan(active=True, id=0) plan.limit.selected = selected plan.bidi_charging_enabled = bidi_charging_enabled @@ -284,7 +284,7 @@ def test_scheduled_charging_calc_current(plan_data: SelectedPlan, def test_scheduled_charging_calc_current_no_plans(): # setup - ct = ChargeTemplate() + ct = instantiate_charge_template_without_metadata() # execution ret = ct.scheduled_charging_calc_current( @@ -314,7 +314,7 @@ def test_scheduled_charging_calc_current_no_plans(): def test_scheduled_charging_calc_current_consider_soc_request_interval_offset( selected_limit: str, charge_state: bool, expected: Tuple[float, str, str, int]): # setup - ct = ChargeTemplate() + ct = instantiate_charge_template_without_metadata() plan = ScheduledChargingPlan() plan.limit.selected = selected_limit @@ -401,7 +401,7 @@ def test_scheduled_charging_calc_current_electricity_tariff( datetime_mock.now.return_value = datetime.datetime.fromtimestamp(LOADING_HOURS_TODAY[0]) monkeypatch.setattr(datetime, "datetime", datetime_mock) - ct = ChargeTemplate() + ct = instantiate_charge_template_without_metadata() plan = ScheduledChargingPlan(active=True, limit=ScheduledLimit(selected="soc", soc_scheduled=soc_scheduled, soc_limit=sco_limit)) plan.et_active = True diff --git a/packages/control/ev/ev.py b/packages/control/ev/ev.py index 47005c40b3..780b527e6d 100644 --- a/packages/control/ev/ev.py +++ b/packages/control/ev/ev.py @@ -19,7 +19,7 @@ from fnmatch import fnmatch from control import data -from control.ev.charge_template import ChargeTemplate +from control.ev.charge_template import ChargeTemplate, instantiate_charge_template_without_metadata from control.algorithm.utils import get_medium_charging_current from control.chargepoint.chargepoint_state import ChargepointState, PHASE_SWITCH_STATES from control.chargepoint.charging_type import ChargingType @@ -89,7 +89,7 @@ class Ev: def __init__(self, index: int): try: self.ev_template: EvTemplate = EvTemplate() - self.charge_template: ChargeTemplate = ChargeTemplate() + self.charge_template: ChargeTemplate = instantiate_charge_template_without_metadata() self.soc_module: ConfigurableVehicle = None self.num = index self.data = EvData() diff --git a/packages/helpermodules/subdata.py b/packages/helpermodules/subdata.py index b40f826d5e..5c43883919 100644 --- a/packages/helpermodules/subdata.py +++ b/packages/helpermodules/subdata.py @@ -15,7 +15,8 @@ from control.chargepoint.chargepoint_data import Log from control.chargepoint.chargepoint_state_update import ChargepointStateUpdate from control.chargepoint.chargepoint_template import CpTemplate, CpTemplateData -from control.ev.charge_template import ChargeTemplate, ChargeTemplateData +from control.ev.charge_template import (ChargeTemplate, ChargeTemplateData, instantiate_charge_template_with_metadata, + instantiate_charge_template_without_metadata) from control.ev import ev from control.ev.ev_template import EvTemplate, EvTemplateData from control.limiting_value import LoadmanagementLimit @@ -352,7 +353,7 @@ def process_vehicle_charge_template_topic(self, var: Dict[str, ChargeTemplate], if "ct"+index in var: var.pop("ct"+index) if "ct"+index not in var: - var["ct"+index] = ChargeTemplate() + var["ct"+index] = instantiate_charge_template_without_metadata() new_charge_template = dataclass_from_dict(ChargeTemplateData, decode_payload(msg.payload)) template_changed = new_charge_template != var["ct"+index].data var["ct"+index].data = new_charge_template @@ -433,7 +434,8 @@ 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: - var["cp"+index].chargepoint.data.set.charge_template = ChargeTemplate() + var["cp"+index].chargepoint.data.set.charge_template = \ + instantiate_charge_template_with_metadata() var["cp"+index].chargepoint.data.set.charge_template.data = dataclass_from_dict( ChargeTemplateData, decode_payload(msg.payload)) else: From 69d423e32f5cedfba0cd623c9c0561155d0c437d Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Mon, 16 Mar 2026 15:20:27 +0100 Subject: [PATCH 2/3] Revert "fix cp metadata" This reverts commit e723f19a120f6961ed676bef04df177940a65008. --- .../algorithm/additional_current_test.py | 4 ++-- packages/control/auto_phase_switch_test.py | 6 ++--- packages/control/chargepoint/chargepoint.py | 3 +++ .../control/chargepoint/chargepoint_data.py | 9 ++++++-- packages/control/counter_test.py | 4 ++-- packages/control/ev/charge_template.py | 13 ++--------- packages/control/ev/charge_template_test.py | 22 +++++++++---------- packages/control/ev/ev.py | 4 ++-- packages/helpermodules/subdata.py | 8 +++---- 9 files changed, 35 insertions(+), 38 deletions(-) diff --git a/packages/control/algorithm/additional_current_test.py b/packages/control/algorithm/additional_current_test.py index f3f733ed35..e1f57b6309 100644 --- a/packages/control/algorithm/additional_current_test.py +++ b/packages/control/algorithm/additional_current_test.py @@ -4,7 +4,7 @@ from control.chargepoint.chargepoint import Chargepoint, ChargepointData from control.chargepoint.chargepoint_data import Set from control.chargepoint.control_parameter import ControlParameter -from control.ev.charge_template import instantiate_charge_template_without_metadata +from control.ev.charge_template import ChargeTemplate from control.ev.ev import Ev from control.limiting_value import LoadmanagementLimit from control.loadmanagement import LimitingValue @@ -30,7 +30,7 @@ def test_set_loadmangement_message(set_current, limit, expected_msg, monkeypatch): # setup ev = Ev(0) - ev.charge_template = instantiate_charge_template_without_metadata() + ev.charge_template = ChargeTemplate() cp1 = Chargepoint(1, None) cp1.data = ChargepointData(set=Set(current=set_current), control_parameter=ControlParameter(required_currents=[8]*3)) diff --git a/packages/control/auto_phase_switch_test.py b/packages/control/auto_phase_switch_test.py index 901e8831ff..f5a1883985 100644 --- a/packages/control/auto_phase_switch_test.py +++ b/packages/control/auto_phase_switch_test.py @@ -6,7 +6,7 @@ from control.counter import Counter, CounterData, Set from control.limiting_value import LoadmanagementLimit -from control.ev.charge_template import instantiate_charge_template_without_metadata +from control.ev.charge_template import ChargeTemplate from control.pv_all import PvAll from control.bat_all import BatAll from control.general import General @@ -135,7 +135,7 @@ def test_auto_phase_switch(monkeypatch, vehicle: Ev, params: Params): control_parameter.state = params.state # execution - phases_to_use, current, message = vehicle.auto_phase_switch(instantiate_charge_template_without_metadata(), + phases_to_use, current, message = vehicle.auto_phase_switch(ChargeTemplate(), control_parameter, 0, max(params.get_currents), @@ -177,7 +177,7 @@ def test_check_phase_switch_conditions(evse_current: int, # execution phase_switch, condition_msg = ev._check_phase_switch_conditions( - instantiate_charge_template_without_metadata(), + ChargeTemplate(), ControlParameter(phases=3-get_currents.count(0)), evse_current, get_currents, diff --git a/packages/control/chargepoint/chargepoint.py b/packages/control/chargepoint/chargepoint.py index 15e594f26d..ac94d529e5 100644 --- a/packages/control/chargepoint/chargepoint.py +++ b/packages/control/chargepoint/chargepoint.py @@ -1,4 +1,5 @@ from dataclasses import asdict +import dataclasses import logging from threading import Thread, Event import traceback @@ -753,6 +754,8 @@ def _get_charging_ev(self, vehicle: int, ev_list: Dict[str, Ev]) -> Ev: def update_charge_template(self, charge_template: ChargeTemplate) -> None: # Prüfen, ob ein temporäres Ladeprofil aktiv ist und dieses übernehmen self.data.set.charge_template = charge_template + 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/chargepoint/chargepoint_data.py b/packages/control/chargepoint/chargepoint_data.py index f06396a759..bc601a5247 100644 --- a/packages/control/chargepoint/chargepoint_data.py +++ b/packages/control/chargepoint/chargepoint_data.py @@ -4,7 +4,7 @@ from control.chargepoint.chargepoint_template import CpTemplate from control.chargepoint.control_parameter import ControlParameter, control_parameter_factory -from control.ev.charge_template import ChargeTemplate, instantiate_charge_template_with_metadata +from control.ev.charge_template import ChargeTemplate from control.ev.ev import Ev from dataclass_utils.factories import currents_list_factory, empty_dict_factory, voltages_list_factory from helpermodules.constants import NO_ERROR @@ -140,6 +140,10 @@ class Get: voltages: List[float] = field(default_factory=voltages_list_factory) +def charge_template_factory() -> ChargeTemplate: + return ChargeTemplate() + + def ev_factory() -> Ev: return Ev(0) @@ -150,7 +154,8 @@ def log_factory() -> Log: @dataclass class Set: - charge_template: ChargeTemplate = field(default_factory=instantiate_charge_template_with_metadata) + charge_template: ChargeTemplate = field(default_factory=charge_template_factory, + metadata={"topic": "set/charge_template"}) current: float = field(default=0, metadata={"topic": "set/current"}) ev_prev: int = field(default=0, metadata={"topic": "set/ev_prev"}) log: Log = field(default_factory=log_factory, metadata={"topic": "set/log"}) diff --git a/packages/control/counter_test.py b/packages/control/counter_test.py index b28298bb01..4b3e59466a 100644 --- a/packages/control/counter_test.py +++ b/packages/control/counter_test.py @@ -8,7 +8,7 @@ from control.chargepoint.chargepoint import Chargepoint from control.counter import Counter, CounterData, Get from control.ev.ev import Ev -from control.ev.charge_template import instantiate_charge_template_without_metadata +from control.ev.charge_template import ChargeTemplate from control.general import General from control.chargepoint.chargepoint_state import ChargepointState from modules.common.fault_state import FaultStateLevel @@ -140,7 +140,7 @@ def test_switch_on_threshold_reached(params: Params, caplog, general_data_fixtur cp.data.control_parameter.phases = 1 cp.data.control_parameter.state = params.state cp.data.control_parameter.timestamp_switch_on_off = params.timestamp_switch_on_off - ev.data.charge_template = instantiate_charge_template_without_metadata() + ev.data.charge_template = ChargeTemplate() ev.data.charge_template.data.chargemode.pv_charging.feed_in_limit = params.feed_in_limit cp.data.set.charging_ev_data = ev mock_calc_switch_on_power = Mock(return_value=[params.surplus, params.threshold]) diff --git a/packages/control/ev/charge_template.py b/packages/control/ev/charge_template.py index d0bcd89023..f96976fd76 100644 --- a/packages/control/ev/charge_template.py +++ b/packages/control/ev/charge_template.py @@ -133,7 +133,8 @@ class SelectedPlan: class ChargeTemplate: """ Klasse der Lade-Profile """ - data: ChargeTemplateData = field(default_factory=charge_template_data_factory) + data: ChargeTemplateData = field(default_factory=charge_template_data_factory, metadata={ + "topic": ""}) CHARGING_PRICE_EXCEEDED = ("Der aktuelle Strompreis liegt über dem maximalen Strompreis. ") CHARGING_PRICE_LOW = "Laden, da der aktuelle Strompreis unter dem maximalen Strompreis liegt." @@ -693,13 +694,3 @@ def bidi_charging_allowed(self, selected_plan: int, soc: float): for plan in self.data.chargemode.scheduled_charging.plans: if plan.id == selected_plan: return soc < plan.limit.soc_limit - - -def instantiate_charge_template_with_metadata() -> ChargeTemplate: - template = ChargeTemplate() - template.__dataclass_fields__['data'].metadata = {"topic": "set/charge_template"} - return template - - -def instantiate_charge_template_without_metadata() -> ChargeTemplate: - return ChargeTemplate() diff --git a/packages/control/ev/charge_template_test.py b/packages/control/ev/charge_template_test.py index 6fef995338..68fe7c4d83 100644 --- a/packages/control/ev/charge_template_test.py +++ b/packages/control/ev/charge_template_test.py @@ -7,7 +7,7 @@ from control import data from control import optional from control.chargepoint.control_parameter import ControlParameter -from control.ev.charge_template import SelectedPlan, instantiate_charge_template_without_metadata +from control.ev.charge_template import SelectedPlan from control.chargepoint.charging_type import ChargingType from control.ev.charge_template import ChargeTemplate from control.ev.ev_template import EvTemplate, EvTemplateData @@ -61,7 +61,7 @@ def test_time_charging(plans: Dict[int, TimeChargingPlan], soc: float, used_amou expected: Tuple[int, str, Optional[str], Optional[str]], monkeypatch): # setup - ct = instantiate_charge_template_without_metadata() + ct = ChargeTemplate() ct.data.time_charging.plans = plans check_plans_timeframe_mock = Mock(return_value=plan_found) monkeypatch.setattr(timecheck, "check_plans_timeframe", check_plans_timeframe_mock) @@ -88,7 +88,7 @@ def test_time_charging(plans: Dict[int, TimeChargingPlan], soc: float, used_amou def test_instant_charging(selected: str, current_soc: float, used_amount: float, expected: Tuple[int, str, Optional[str]]): # setup - ct = instantiate_charge_template_without_metadata() + ct = ChargeTemplate() ct.data.chargemode.instant_charging.limit.selected = selected ct.data.chargemode.instant_charging.limit.amount = 1000 @@ -118,7 +118,7 @@ def test_pv_charging(min_soc: int, used_amount: float, expected: Tuple[int, str, Optional[str], int]): # setup - ct = instantiate_charge_template_without_metadata() + ct = ChargeTemplate() ct.data.chargemode.pv_charging.min_soc = min_soc ct.data.chargemode.pv_charging.min_current = min_current ct.data.chargemode.pv_charging.phases_to_use = 0 @@ -151,7 +151,7 @@ def test_calc_remaining_time(phases_to_use, phase_switch_supported, expected, monkeypatch): # setup - ct = instantiate_charge_template_without_metadata() + ct = ChargeTemplate() plan = ScheduledChargingPlan(phases_to_use=phases_to_use) calculate_duration_mock = Mock(side_effect=calc_duration) monkeypatch.setattr(ChargeTemplate, "_calculate_duration", calculate_duration_mock) @@ -179,7 +179,7 @@ def test_calculate_duration(selected: str, expected_duration: float, expected_missing_amount: float): # setup - ct = instantiate_charge_template_without_metadata() + ct = ChargeTemplate() plan = ScheduledChargingPlan(bidi_charging_enabled=bidi_charging_enabled) plan.limit.selected = selected # execution @@ -208,7 +208,7 @@ def test_scheduled_charging_recent_plan(end_time_mock, check_end_time_mock = Mock(side_effect=end_time_mock) monkeypatch.setattr(timecheck, "check_end_time", check_end_time_mock) control_parameter = ControlParameter() - ct = instantiate_charge_template_without_metadata() + ct = ChargeTemplate() plan_mock_0 = Mock(spec=ScheduledChargingPlan, active=True, current=14, id=0, limit=Limit(selected="amount")) plan_mock_1 = Mock(spec=ScheduledChargingPlan, active=True, current=14, id=1, limit=Limit(selected="amount")) plan_mock_2 = Mock(spec=ScheduledChargingPlan, active=True, current=14, id=2, limit=Limit(selected="amount")) @@ -265,7 +265,7 @@ def test_scheduled_charging_calc_current(plan_data: SelectedPlan, bidi_charging_enabled: bool, expected: Tuple[float, str, str, int]): # setup - ct = instantiate_charge_template_without_metadata() + ct = ChargeTemplate() plan = ScheduledChargingPlan(active=True, id=0) plan.limit.selected = selected plan.bidi_charging_enabled = bidi_charging_enabled @@ -284,7 +284,7 @@ def test_scheduled_charging_calc_current(plan_data: SelectedPlan, def test_scheduled_charging_calc_current_no_plans(): # setup - ct = instantiate_charge_template_without_metadata() + ct = ChargeTemplate() # execution ret = ct.scheduled_charging_calc_current( @@ -314,7 +314,7 @@ def test_scheduled_charging_calc_current_no_plans(): def test_scheduled_charging_calc_current_consider_soc_request_interval_offset( selected_limit: str, charge_state: bool, expected: Tuple[float, str, str, int]): # setup - ct = instantiate_charge_template_without_metadata() + ct = ChargeTemplate() plan = ScheduledChargingPlan() plan.limit.selected = selected_limit @@ -401,7 +401,7 @@ def test_scheduled_charging_calc_current_electricity_tariff( datetime_mock.now.return_value = datetime.datetime.fromtimestamp(LOADING_HOURS_TODAY[0]) monkeypatch.setattr(datetime, "datetime", datetime_mock) - ct = instantiate_charge_template_without_metadata() + ct = ChargeTemplate() plan = ScheduledChargingPlan(active=True, limit=ScheduledLimit(selected="soc", soc_scheduled=soc_scheduled, soc_limit=sco_limit)) plan.et_active = True diff --git a/packages/control/ev/ev.py b/packages/control/ev/ev.py index 780b527e6d..47005c40b3 100644 --- a/packages/control/ev/ev.py +++ b/packages/control/ev/ev.py @@ -19,7 +19,7 @@ from fnmatch import fnmatch from control import data -from control.ev.charge_template import ChargeTemplate, instantiate_charge_template_without_metadata +from control.ev.charge_template import ChargeTemplate from control.algorithm.utils import get_medium_charging_current from control.chargepoint.chargepoint_state import ChargepointState, PHASE_SWITCH_STATES from control.chargepoint.charging_type import ChargingType @@ -89,7 +89,7 @@ class Ev: def __init__(self, index: int): try: self.ev_template: EvTemplate = EvTemplate() - self.charge_template: ChargeTemplate = instantiate_charge_template_without_metadata() + self.charge_template: ChargeTemplate = ChargeTemplate() self.soc_module: ConfigurableVehicle = None self.num = index self.data = EvData() diff --git a/packages/helpermodules/subdata.py b/packages/helpermodules/subdata.py index 5c43883919..b40f826d5e 100644 --- a/packages/helpermodules/subdata.py +++ b/packages/helpermodules/subdata.py @@ -15,8 +15,7 @@ from control.chargepoint.chargepoint_data import Log from control.chargepoint.chargepoint_state_update import ChargepointStateUpdate from control.chargepoint.chargepoint_template import CpTemplate, CpTemplateData -from control.ev.charge_template import (ChargeTemplate, ChargeTemplateData, instantiate_charge_template_with_metadata, - instantiate_charge_template_without_metadata) +from control.ev.charge_template import ChargeTemplate, ChargeTemplateData from control.ev import ev from control.ev.ev_template import EvTemplate, EvTemplateData from control.limiting_value import LoadmanagementLimit @@ -353,7 +352,7 @@ def process_vehicle_charge_template_topic(self, var: Dict[str, ChargeTemplate], if "ct"+index in var: var.pop("ct"+index) if "ct"+index not in var: - var["ct"+index] = instantiate_charge_template_without_metadata() + var["ct"+index] = ChargeTemplate() new_charge_template = dataclass_from_dict(ChargeTemplateData, decode_payload(msg.payload)) template_changed = new_charge_template != var["ct"+index].data var["ct"+index].data = new_charge_template @@ -434,8 +433,7 @@ 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: - var["cp"+index].chargepoint.data.set.charge_template = \ - instantiate_charge_template_with_metadata() + 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)) else: From e7061c72063779ed12c12e4cc900895ccb010298 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Mon, 16 Mar 2026 15:24:24 +0100 Subject: [PATCH 3/3] fix --- packages/control/chargepoint/chargepoint_data.py | 3 +-- packages/control/ev/charge_template.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/control/chargepoint/chargepoint_data.py b/packages/control/chargepoint/chargepoint_data.py index bc601a5247..b346e336aa 100644 --- a/packages/control/chargepoint/chargepoint_data.py +++ b/packages/control/chargepoint/chargepoint_data.py @@ -154,8 +154,7 @@ def log_factory() -> Log: @dataclass class Set: - charge_template: ChargeTemplate = field(default_factory=charge_template_factory, - metadata={"topic": "set/charge_template"}) + charge_template: ChargeTemplate = field(default_factory=charge_template_factory) current: float = field(default=0, metadata={"topic": "set/current"}) ev_prev: int = field(default=0, metadata={"topic": "set/ev_prev"}) log: Log = field(default_factory=log_factory, metadata={"topic": "set/log"}) diff --git a/packages/control/ev/charge_template.py b/packages/control/ev/charge_template.py index f96976fd76..1a235c1422 100644 --- a/packages/control/ev/charge_template.py +++ b/packages/control/ev/charge_template.py @@ -134,7 +134,7 @@ class ChargeTemplate: """ Klasse der Lade-Profile """ data: ChargeTemplateData = field(default_factory=charge_template_data_factory, metadata={ - "topic": ""}) + "topic": "set/charge_template"}) CHARGING_PRICE_EXCEEDED = ("Der aktuelle Strompreis liegt über dem maximalen Strompreis. ") CHARGING_PRICE_LOW = "Laden, da der aktuelle Strompreis unter dem maximalen Strompreis liegt."