Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion packages/control/chargepoint/chargepoint.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
12 changes: 4 additions & 8 deletions packages/control/ev/charge_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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):
Expand All @@ -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))
Expand All @@ -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]
Expand Down Expand Up @@ -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]:
Expand All @@ -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)
Expand Down
5 changes: 2 additions & 3 deletions packages/control/ev/charge_template_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"),
])
Expand All @@ -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:
Expand Down
2 changes: 0 additions & 2 deletions packages/control/ev/ev.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]:
Expand Down Expand Up @@ -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)
Expand Down
18 changes: 5 additions & 13 deletions packages/helpermodules/timecheck.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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:
Expand Down
8 changes: 2 additions & 6 deletions packages/helpermodules/timecheck_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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
Expand Down