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
53 changes: 35 additions & 18 deletions packages/control/ev/charge_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -603,27 +603,44 @@ def scheduled_charging_calc_current(self,
# ist.
if plan.et_active:
def get_hours_message() -> str:
def end_of_today_timestamp() -> int:
return datetime.datetime.now().replace(
hour=23, minute=59, second=59, microsecond=999000).timestamp()

def is_loading_hour(hour: int) -> bool:
return data.data.optional_data.et_is_charging_allowed_hours_list(hour)
return ("Geladen wird "+("jetzt und "
if is_loading_hour(hour_list)
else '') +
"zu folgenden Uhrzeiten: " +
", ".join([tomorrow(hour) +
datetime.datetime.fromtimestamp(hour).strftime('%-H:%M')
for hour in (sorted(hour_list)
if not is_loading_hour(hour_list)
else (sorted(hour_list)[1:] if len(hour_list) > 1 else []))])
+ ".")

def end_of_today_timestamp() -> int:
return datetime.datetime.now().replace(
hour=23, minute=59, second=59, microsecond=999000).timestamp()

def tomorrow(timestamp: int) -> str:
return 'morgen ' if end_of_today_timestamp() < timestamp else ''

def convert_loading_hours_to_string(hour_list: List[int]) -> str:
if 1 < len(hour_list):
times_string = ", ".join(hour.strftime('%-H:%M') for hour in hour_list[:-1])
return times_string + " und " + hour_list[-1].strftime('%-H:%M')
else:
return ", ".join(hour.strftime('%-H:%M') for hour in hour_list)
midnight = end_of_today_timestamp()
loading_times_today = [datetime.datetime.fromtimestamp(hour)
for hour in sorted(hour_list) if hour <= midnight]
loading_times_today = (loading_times_today[1:]
if is_loading_hour(hour_list) else loading_times_today)
loading_times_tomorrow = [datetime.datetime.fromtimestamp(hour)
for hour in sorted(hour_list) if hour > midnight]

loading_message = "Geladen wird "+("jetzt"
if is_loading_hour(hour_list)
else '')
loading_message += ((" und " if is_loading_hour(hour_list) else "") +
f"heute {convert_loading_hours_to_string(loading_times_today)}"
if 0 < len(loading_times_today)
else '')
loading_message += (" sowie "
if 0 < len(loading_times_tomorrow)
else '')
loading_message += (f"morgen {convert_loading_hours_to_string(loading_times_tomorrow)}"
if 0 < len(loading_times_tomorrow)
else '')
return loading_message + '.'

hour_list = data.data.optional_data.et_get_loading_hours(
selected_plan.duration, selected_plan.remaining_time)
selected_plan.duration, selected_plan.duration + selected_plan.remaining_time)

log.debug(f"Günstige Ladezeiten: {hour_list}")
if data.data.optional_data.et_is_charging_allowed_hours_list(hour_list):
Expand Down
10 changes: 5 additions & 5 deletions packages/control/ev/charge_template_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -311,39 +311,39 @@ def test_scheduled_charging_calc_current_no_plans():
14,
"instant_charging",
ChargeTemplate.SCHEDULED_CHARGING_CHEAP_HOUR.format(
"Geladen wird jetzt und zu folgenden Uhrzeiten: morgen 8:00."),
"Geladen wird jetzt sowie morgen 8:00."),
3),
id="cheap_hour_charge_with_instant_charging"),
pytest.param(True, 79, 80, 70, LOADING_HOURS_TODAY,
(
14,
"instant_charging",
ChargeTemplate.SCHEDULED_CHARGING_CHEAP_HOUR.format(
"Geladen wird jetzt und zu folgenden Uhrzeiten: ."),
"Geladen wird jetzt."),
3),
id="SOC limit reached but scheduled SOC not, no further loading hours"),
pytest.param(False, 79, 80, 90, LOADING_HOURS_TODAY,
(
6,
"pv_charging",
ChargeTemplate.SCHEDULED_CHARGING_EXPENSIVE_HOUR.format(
"Geladen wird zu folgenden Uhrzeiten: 8:00."),
"Geladen wird heute 8:00."),
0),
id="expensive_hour_charge_with_pv"),
pytest.param(False, 79, 80, 70, LOADING_HOURS_TODAY,
(
0,
"stop",
ChargeTemplate.SCHEDULED_CHARGING_EXPENSIVE_HOUR_REACHED_MAX_SOC.format(
"Geladen wird zu folgenden Uhrzeiten: 8:00."),
"Geladen wird heute 8:00."),
3),
id="expensive_hour_no_charge_with_pv "),
pytest.param(False, 79, 80, 70, LOADING_HOURS_TODAY + LOADING_HOURS_TOMORROW,
(
0,
"stop",
ChargeTemplate.SCHEDULED_CHARGING_EXPENSIVE_HOUR_REACHED_MAX_SOC.format(
"Geladen wird zu folgenden Uhrzeiten: 8:00, morgen 8:00."),
"Geladen wird heute 8:00 sowie morgen 8:00."),
3),
id="expensive_hour_no_charge_with_pv scheduled for tomorrow"),
pytest.param(False, 79, 60, 80, LOADING_HOURS_TODAY,
Expand Down