diff --git a/packages/control/chargepoint/chargepoint.py b/packages/control/chargepoint/chargepoint.py index e8fddeab60..11370ef9d5 100644 --- a/packages/control/chargepoint/chargepoint.py +++ b/packages/control/chargepoint/chargepoint.py @@ -663,7 +663,6 @@ def update(self, ev_list: Dict[str, Ev]) -> None: self.get_max_phase_hw(), self.hw_supports_phase_switch(), self.template.data.charging_type, - self.data.control_parameter.timestamp_chargemode_changed or create_timestamp(), self.data.set.log.imported_since_plugged, self.hw_bidi_capable(), self.data.get.phases_in_use) diff --git a/packages/control/ev/charge_template.py b/packages/control/ev/charge_template.py index 41c206528a..39b6302bb4 100644 --- a/packages/control/ev/charge_template.py +++ b/packages/control/ev/charge_template.py @@ -309,6 +309,8 @@ def eco_charging(self, log.exception("Fehler im ev-Modul "+str(self.data.id)) return 0, "stop", "Keine Ladung, da ein interner Fehler aufgetreten ist: "+traceback.format_exc(), 0 + BUFFER = -1200 # nach mehr als 20 Min Überschreitung wird der Termin als verpasst angesehen + def _find_recent_plan(self, plans: List[ScheduledChargingPlan], soc: float, @@ -317,7 +319,6 @@ def _find_recent_plan(self, max_hw_phases: int, phase_switch_supported: bool, charging_type: str, - chargemode_switch_timestamp: float, control_parameter: ControlParameter, soc_request_interval_offset: int, hw_bidi: bool): @@ -329,7 +330,7 @@ def _find_recent_plan(self, f"oder im Plan {p.name} als Begrenzung Energie einstellen.") try: plans_diff_end_date.append( - {p.id: timecheck.check_end_time(p, chargemode_switch_timestamp)}) + {p.id: timecheck.check_end_time(p, self.BUFFER)}) log.debug(f"Verbleibende Zeit bis zum Zieltermin [s]: {plans_diff_end_date}") except Exception: log.exception("Fehler im ev-Modul "+str(self.data.id)) @@ -341,10 +342,7 @@ def _find_recent_plan(self, if len(sorted_plans) == 1: plan_dict = sorted_plans[0] elif (len(sorted_plans) > 1 and - list(sorted_plans[0].values())[0] < 0 and - list(sorted_plans[1].values())[0] < 43200): - # wenn der erste Plan in der Liste in der Vergangenheit liegt, dann den zweiten nehmen, wenn dessen - # Zielzeit weniger als 12 h entfernt ist. + list(sorted_plans[0].values())[0] < self.BUFFER): plan_dict = sorted_plans[1] else: plan_dict = sorted_plans[0] @@ -375,7 +373,6 @@ def scheduled_charging(self, max_hw_phases: int, phase_switch_supported: bool, charging_type: str, - chargemode_switch_timestamp: float, control_parameter: ControlParameter, soc_request_interval_offset: int, bidi_state: BidiState) -> Optional[SelectedPlan]: @@ -390,7 +387,6 @@ def scheduled_charging(self, max_hw_phases, phase_switch_supported, charging_type, - chargemode_switch_timestamp, control_parameter, soc_request_interval_offset, bidi_state) diff --git a/packages/control/ev/charge_template_test.py b/packages/control/ev/charge_template_test.py index 3cf5bb1437..7efe22f3dc 100644 --- a/packages/control/ev/charge_template_test.py +++ b/packages/control/ev/charge_template_test.py @@ -195,8 +195,7 @@ def test_calculate_duration(selected: str, "end_time_mock, expected_plan_num", [ pytest.param([1000, 1500, 2000], 0, id="nächster Zieltermin Plan 0"), - pytest.param([-100, 1000, 2000], 1, id="Plan 0 abgelaufen, Plan 1 innerhalb der nächsten 12h"), - pytest.param([-100, 45000, 50000], 0, id="Plan 0 abgelaufen, Plan 1 nicht innerhalb der nächsten 12h"), + pytest.param([-100, 45000, 50000], 0, id="Plan 0 abgelaufen, nächster Tag"), pytest.param([1500, 2000, 1000], 2, id="nächster Zieltermin Plan 2"), pytest.param([None]*3, 0, id="kein Plan"), ]) @@ -217,7 +216,7 @@ def test_scheduled_charging_recent_plan(end_time_mock, # execution selected_plan = ct._find_recent_plan( - plans, 60, EvTemplate(), 200, 3, True, ChargingType.AC.value, 1652688000, control_parameter, 0, False) + plans, 60, EvTemplate(), 200, 3, True, ChargingType.AC.value, control_parameter, 0, False) # evaluation if selected_plan: diff --git a/packages/control/ev/ev.py b/packages/control/ev/ev.py index b1c1c54767..7fa73ff08a 100644 --- a/packages/control/ev/ev.py +++ b/packages/control/ev/ev.py @@ -120,7 +120,6 @@ def get_required_current(self, max_phases_hw: int, phase_switch_supported: bool, charging_type: str, - chargemode_switch_timestamp: float, imported_since_plugged: float, bidi: BidiState, phases_in_use: int) -> Tuple[bool, Optional[str], str, float, int]: @@ -166,7 +165,6 @@ def get_required_current(self, max_phases_hw, phase_switch_supported, charging_type, - chargemode_switch_timestamp, control_parameter, soc_request_interval_offset, bidi) diff --git a/packages/helpermodules/timecheck.py b/packages/helpermodules/timecheck.py index 1d9437313b..f436d90769 100644 --- a/packages/helpermodules/timecheck.py +++ b/packages/helpermodules/timecheck.py @@ -113,18 +113,14 @@ def is_timeframe_valid(now: datetime.datetime, begin: datetime.datetime, end: da def check_end_time(plan: ScheduledChargingPlan, - chargemode_switch_timestamp: Optional[float]) -> Optional[float]: - """ prüft, ob der in angegebene Zeitpunkt abzüglich der Dauer jetzt ist. + buffer: Optional[float]) -> Optional[float]: + """ gibt die verbleibende Zeit in Sekunden zurück. Return ------ neg: Zeitpunkt vorbei pos: verbleibende Sekunden """ - def missed_date_still_active(remaining_time: float) -> bool: - return (chargemode_switch_timestamp and - remaining_time.total_seconds() < 0 and - end.timestamp() < chargemode_switch_timestamp) now = datetime.datetime.today() end = datetime.datetime.strptime(plan.time, '%H:%M') remaining_time = None @@ -135,7 +131,7 @@ def missed_date_still_active(remaining_time: float) -> bool: elif plan.frequency.selected == "daily": end = end.replace(now.year, now.month, now.day) remaining_time = end - now - if missed_date_still_active(remaining_time): + if remaining_time.total_seconds() < buffer: # Wenn auf Zielladen umgeschaltet wurde und der Termin noch nicht vorbei war, noch auf diesen Termin laden. end = end + datetime.timedelta(days=1) remaining_time = end - now @@ -145,17 +141,13 @@ def missed_date_still_active(remaining_time: float) -> bool: end = end.replace(now.year, now.month, now.day) end += datetime.timedelta(days=_get_next_charging_day(plan.frequency.weekly, now.weekday())) remaining_time = end - now - if missed_date_still_active(remaining_time): + if remaining_time.total_seconds() < buffer: end = end.replace(now.year, now.month, now.day) end += datetime.timedelta(days=_get_next_charging_day(plan.frequency.weekly, now.weekday()+1)+1) remaining_time = end - now else: raise TypeError(f'Unbekannte Häufigkeit {plan.frequency.selected}') - if chargemode_switch_timestamp and end.timestamp() < chargemode_switch_timestamp: - # Als auf Zielladen umgeschaltet wurde, war der Termin schon vorbei - return None - else: - return remaining_time.total_seconds() + return remaining_time.total_seconds() def _get_next_charging_day(weekly: List[bool], weekday: int) -> int: diff --git a/packages/helpermodules/timecheck_test.py b/packages/helpermodules/timecheck_test.py index d45f0b8227..38cb6d605e 100644 --- a/packages/helpermodules/timecheck_test.py +++ b/packages/helpermodules/timecheck_test.py @@ -22,9 +22,7 @@ def __init__(self, name: str, @pytest.mark.parametrize("time, selected, date, expected_remaining_time", [pytest.param("9:00", "once", "2022-05-16", 1148, id="once"), - pytest.param("7:55", "once", "2022-05-16", None, id="missed date, plugged before"), - pytest.param("8:05", "once", "2022-05-16", - - 2152, id="once missed date, plugged after"), + pytest.param("8:05", "once", "2022-05-16", -2152, id="once missed date"), pytest.param("12:00", "daily", [], 11948, id="daily today"), pytest.param("2:00", "daily", [], 62348, id="daily missed today, use next day"), pytest.param("7:55", "weekly", [True, False, False, False, @@ -45,9 +43,7 @@ def test_check_end_time(time: str, setattr(plan.frequency, selected, date) # execution - remaining_time = timecheck.check_end_time( - plan, - chargemode_switch_timestamp=datetime.datetime.strptime("5/16/2022 8:00", "%m/%d/%Y %H:%M").timestamp()) + remaining_time = timecheck.check_end_time(plan, 1200) # evaluation assert remaining_time == expected_remaining_time