From b059e175c087964ca9e6738da3e43eb30fee187f Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Mon, 31 Jul 2023 10:03:54 +0200 Subject: [PATCH] fix amount limit --- packages/control/chargepoint/chargepoint.py | 2 +- packages/control/ev.py | 51 +++++++++++++-------- packages/helpermodules/setdata.py | 4 +- packages/helpermodules/update_config.py | 2 +- 4 files changed, 36 insertions(+), 23 deletions(-) diff --git a/packages/control/chargepoint/chargepoint.py b/packages/control/chargepoint/chargepoint.py index 709da1a2a2..f689f1d088 100644 --- a/packages/control/chargepoint/chargepoint.py +++ b/packages/control/chargepoint/chargepoint.py @@ -807,7 +807,7 @@ def update(self, ev_list: Dict[str, Ev]) -> None: charging_ev.data.control_parameter.phases = min( self.get_phases_by_selected_chargemode(), max_phase_hw) state, message_ev, submode, required_current, phases = charging_ev.get_required_current( - self.data.set.log.imported_since_mode_switch, + self.data.get.imported, max_phase_hw, self.cp_ev_support_phase_switch()) phases = self.set_phases(phases) diff --git a/packages/control/ev.py b/packages/control/ev.py index 7d1816d072..8a45259f6b 100644 --- a/packages/control/ev.py +++ b/packages/control/ev.py @@ -141,8 +141,8 @@ class ControlParameter: timestamp_perform_phase_switch: Optional[str] = None submode: Chargemode_enum = Chargemode_enum.STOP chargemode: Chargemode_enum = Chargemode_enum.STOP - used_amount_instant_charging: float = 0 - imported_at_plan_start: float = 0 + imported_instant_charging: Optional[float] = None + imported_at_plan_start: Optional[float] = None current_plan: Optional[str] = None state: ChargepointState = ChargepointState.NO_CHARGING_ALLOWED @@ -230,9 +230,9 @@ def reset_ev(self): Pub().pub("openWB/set/vehicle/"+str(self.num) + "/control_parameter/chargemode", "stop") Pub().pub("openWB/set/vehicle/"+str(self.num) + - "/control_parameter/used_amount_instant_charging", 0) + "/control_parameter/imported_instant_charging", None) Pub().pub("openWB/set/vehicle/"+str(self.num) + - "/control_parameter/imported_at_plan_start", 0) + "/control_parameter/imported_at_plan_start", None) Pub().pub("openWB/set/vehicle/"+str(self.num) + "/control_parameter/current_plan", None) Pub().pub("openWB/set/vehicle/"+str(self.num) + @@ -242,8 +242,8 @@ def reset_ev(self): self.data.control_parameter.timestamp_perform_phase_switch = None self.data.control_parameter.submode = "stop" self.data.control_parameter.chargemode = "stop" - self.data.control_parameter.used_amount_instant_charging = 0 - self.data.control_parameter.imported_at_plan_start = 0 + self.data.control_parameter.imported_instant_charging = None + self.data.control_parameter.imported_at_plan_start = None self.data.control_parameter.current_plan = None self.data.control_parameter.state = ChargepointState.NO_CHARGING_ALLOWED except Exception: @@ -268,7 +268,7 @@ def soc_interval_expired(self, soc_update_data: SocUpdateData) -> bool: return request_soc def get_required_current(self, - charged_since_mode_switch: float, + imported: float, max_phases: int, phase_switch_supported: bool) -> Tuple[bool, Optional[str], str, float, int]: """ ermittelt, ob und mit welchem Strom das EV geladen werden soll (unabhängig vom Lastmanagement) @@ -295,7 +295,9 @@ def get_required_current(self, state = True try: if self.charge_template.data.chargemode.selected == "scheduled_charging": - used_amount = charged_since_mode_switch - self.data.control_parameter.imported_at_plan_start + if self.data.control_parameter.imported_at_plan_start is None: + self.data.control_parameter.imported_at_plan_start = imported + used_amount = imported - self.data.control_parameter.imported_at_plan_start plan_data = self.charge_template.scheduled_charging_recent_plan( self.data.get.soc, self.ev_template, @@ -309,10 +311,10 @@ def get_required_current(self, if (self.charge_template.data.chargemode.scheduled_charging.plans[plan_data.num].limit. selected == "amount" and name != self.data.control_parameter.current_plan): - self.data.control_parameter.imported_at_plan_start = charged_since_mode_switch + self.data.control_parameter.imported_at_plan_start = imported Pub().pub( f"openWB/set/vehicle/{self.num}/control_parameter/imported_at_plan_start", - charged_since_mode_switch) + imported) else: name = None required_current, submode, message, phases = self.charge_template.scheduled_charging_calc_current( @@ -327,7 +329,12 @@ def get_required_current(self, # Wenn Zielladen auf Überschuss wartet, prüfen, ob Zeitladen aktiv ist. if (submode != "instant_charging" and self.charge_template.data.time_charging.active): - used_amount = charged_since_mode_switch - self.data.control_parameter.imported_at_plan_start + if self.data.control_parameter.imported_at_plan_start is None: + self.data.control_parameter.imported_at_plan_start = imported + Pub().pub( + f"openWB/set/vehicle/{self.num}/control_parameter/imported_at_plan_start", + imported) + used_amount = imported - self.data.control_parameter.imported_at_plan_start tmp_current, tmp_submode, tmp_message, name = self.charge_template.time_charging( self.data.get.soc, used_amount @@ -335,6 +342,12 @@ def get_required_current(self, if tmp_current > 0: self.data.control_parameter.current_plan = name Pub().pub(f"openWB/set/vehicle/{self.num}/control_parameter/current_plan", name) + # Wenn mit einem neuen Plan geladen wird, muss auch die Energiemenge von neuem gezählt werden. + if name != self.data.control_parameter.current_plan: + self.data.control_parameter.imported_at_plan_start = imported + Pub().pub( + f"openWB/set/vehicle/{self.num}/control_parameter/imported_at_plan_start", + imported) required_current = tmp_current submode = tmp_submode message = tmp_message @@ -342,15 +355,15 @@ def get_required_current(self, if self.charge_template.data.chargemode.selected == "instant_charging": # Wenn der Submode auf stop gestellt wird, wird auch die Energiemenge seit Wechsel des Modus # zurückgesetzt, dann darf nicht die Energiemenge erneute geladen werden. - if (self.charge_template.data.chargemode.instant_charging.limit.selected == "amount" and - charged_since_mode_switch > self.data.control_parameter.used_amount_instant_charging): - self.data.control_parameter.used_amount_instant_charging = charged_since_mode_switch + if self.data.control_parameter.imported_instant_charging is None: + self.data.control_parameter.imported_instant_charging = imported Pub().pub( - f"openWB/set/vehicle/{self.num}/control_parameter/used_amount_instant_charging", - charged_since_mode_switch) + f"openWB/set/vehicle/{self.num}/control_parameter/imported_instant_charging", + imported) + used_amount = imported - self.data.control_parameter.imported_instant_charging required_current, submode, message = self.charge_template.instant_charging( self.data.get.soc, - self.data.control_parameter.used_amount_instant_charging) + used_amount) elif self.charge_template.data.chargemode.selected == "pv_charging": required_current, submode, message = self.charge_template.pv_charging( self.data.get.soc, self.ev_template.data.min_current) @@ -659,7 +672,7 @@ def time_charging(self, def instant_charging(self, soc: float, - used_amount_instant_charging: float) -> Tuple[int, str, Optional[str]]: + imported_instant_charging: float) -> Tuple[int, str, Optional[str]]: """ prüft, ob die Lademengenbegrenzung erreicht wurde und setzt entsprechend den Ladestrom. """ message = None @@ -676,7 +689,7 @@ def instant_charging(self, else: return 0, "stop", self.INSTANT_CHARGING_SOC_REACHED elif instant_charging.limit.selected == "amount": - if used_amount_instant_charging < self.data.chargemode.instant_charging.limit.amount: + if imported_instant_charging < self.data.chargemode.instant_charging.limit.amount: return instant_charging.current, "instant_charging", message else: return 0, "stop", self.INSTANT_CHARGING_AMOUNT_REACHED diff --git a/packages/helpermodules/setdata.py b/packages/helpermodules/setdata.py index 48ce51b56f..41a0dd4b19 100644 --- a/packages/helpermodules/setdata.py +++ b/packages/helpermodules/setdata.py @@ -134,7 +134,7 @@ def _validate_value(self, msg: mqtt.MQTTMessage, data_type, ranges=[], collectio else: log.error(f"Payload ungültig: Topic {msg.topic}, Payload {value} sollte ein String sein.") elif data_type == int or data_type == float: - if self._validate_min_max_value(value, msg, data_type, ranges): + if self._validate_min_max_value(value, msg, data_type, ranges) or isinstance(value, type(None)): valid = True elif data_type == bool: valid, value = self._validate_bool_value(value, msg) @@ -432,7 +432,7 @@ def process_vehicle_topic(self, msg: mqtt.MQTTMessage): "/control_parameter/timestamp_perform_phase_switch" in msg.topic or "/control_parameter/current_plan" in msg.topic): self._validate_value(msg, str) - elif ("/control_parameter/used_amount_instant_charging" in msg.topic or + elif ("/control_parameter/imported_instant_charging" in msg.topic or "/control_parameter/imported_at_plan_start" in msg.topic): self._validate_value(msg, float, [(0, float("inf"))]) elif "/control_parameter/state" in msg.topic: diff --git a/packages/helpermodules/update_config.py b/packages/helpermodules/update_config.py index 347cfedc3d..0e55d13cd1 100644 --- a/packages/helpermodules/update_config.py +++ b/packages/helpermodules/update_config.py @@ -231,7 +231,7 @@ class UpdateConfig: "^openWB/vehicle/[0-9]+/control_parameter/timestamp_auto_phase_switch$", "^openWB/vehicle/[0-9]+/control_parameter/timestamp_perform_phase_switch$", "^openWB/vehicle/[0-9]+/control_parameter/timestamp_switch_on_off$", - "^openWB/vehicle/[0-9]+/control_parameter/used_amount_instant_charging$", + "^openWB/vehicle/[0-9]+/control_parameter/imported_instant_charging$", "^openWB/vehicle/[0-9]+/control_parameter/phases$", "^openWB/vehicle/[0-9]+/control_parameter/state$", "^openWB/vehicle/[0-9]+/set/ev_template$",