work: Реализована работа расписания. Проведен первый тест.

This commit is contained in:
Fedorov Dmitriy
2026-09-13 23:04:35 +03:00
parent 419b8efe33
commit 4c665d9108
9 changed files with 1398 additions and 1 deletions
+312
View File
@@ -0,0 +1,312 @@
from datetime import datetime
from schedule import (
ScheduleActionType,
ScheduleService,
load_schedule,
)
SCHEDULE_FILE = "config/schedule.yaml"
def print_result(title, result):
print()
print("=" * 70)
print(title)
print("=" * 70)
print(f"Enabled: {result.enabled}")
if result.current is not None:
print(
f"Current: "
f"{result.current.when} | "
f"{result.current.template} | "
f"{result.current.point.action.type}"
)
else:
print("Current: None")
if result.next is not None:
print(
f"Next: "
f"{result.next.when} | "
f"{result.next.template} | "
f"{result.next.point.action.type}"
)
else:
print("Next: None")
print(f"Auto: {result.auto_active}")
print(f"Settings: {result.scheduled_settings.to_dict()}")
def main():
print("Загрузка schedule.yaml...")
config = load_schedule(SCHEDULE_FILE)
print("YAML успешно загружен и проверен.")
print()
service = ScheduleService(config)
# --------------------------------------------------------------
# TEST 1
# Понедельник 06:30
#
# Текущая точка должна быть 00:00 power off.
# Следующая — 07:00.
# --------------------------------------------------------------
result = service.resolve(
datetime(2026, 9, 14, 6, 30)
)
print_result(
"TEST 1 — Monday 06:30",
result,
)
assert result.current.when.hour == 0
assert result.next.when.hour == 7
assert result.auto_active is False
assert result.scheduled_settings.power is False
# --------------------------------------------------------------
# TEST 2
# Понедельник 07:30
#
# Должны накопиться параметры из точки 07:00.
# --------------------------------------------------------------
result = service.resolve(
datetime(2026, 9, 14, 7, 30)
)
print_result(
"TEST 2 — Monday 07:30",
result,
)
settings = result.scheduled_settings
assert result.current.when.hour == 7
assert result.next.when.hour == 9
assert result.auto_active is False
assert settings.power is True
assert settings.speed == 2
assert settings.heater is True
assert settings.target_temp == 20
assert settings.mode == "outside"
# --------------------------------------------------------------
# TEST 3
# Понедельник 10:00
#
# В 09:00 поменялась только скорость.
#
# Остальные значения должны сохраниться от 07:00.
# --------------------------------------------------------------
result = service.resolve(
datetime(2026, 9, 14, 10, 0)
)
print_result(
"TEST 3 — Monday 10:00",
result,
)
settings = result.scheduled_settings
assert result.current.when.hour == 9
assert result.next.when.hour == 13
assert settings.power is True
assert settings.speed == 1
assert settings.heater is True
assert settings.target_temp == 20
assert settings.mode == "outside"
# --------------------------------------------------------------
# TEST 4
# Понедельник 13:10
#
# Последняя точка AUTO.
# --------------------------------------------------------------
result = service.resolve(
datetime(2026, 9, 14, 13, 10)
)
print_result(
"TEST 4 — Monday 13:10 / AUTO",
result,
)
assert result.current.point.action.type == ScheduleActionType.AUTO
assert result.auto_active is True
assert result.next.when.hour == 17
assert result.next.when.minute == 0
# Накопленные настройки при AUTO не стираются.
assert result.scheduled_settings.speed == 1
assert result.scheduled_settings.power is True
# --------------------------------------------------------------
# TEST 5
# Понедельник 17:10
#
# AUTO закончился.
# Speed должен стать 3.
# --------------------------------------------------------------
result = service.resolve(
datetime(2026, 9, 14, 17, 10)
)
print_result(
"TEST 5 — Monday 17:10",
result,
)
assert result.auto_active is False
assert result.current.when.hour == 17
assert result.current.when.minute == 0
assert result.next.when.hour == 17
assert result.next.when.minute == 30
assert result.scheduled_settings.speed == 3
# --------------------------------------------------------------
# TEST 6
# Понедельник 17:40
#
# Снова AUTO.
# --------------------------------------------------------------
result = service.resolve(
datetime(2026, 9, 14, 17, 40)
)
print_result(
"TEST 6 — Monday 17:40 / AUTO",
result,
)
assert result.auto_active is True
assert result.current.when.hour == 17
assert result.current.when.minute == 30
assert result.next.when.hour == 23
# Последний scheduled speed всё равно должен помнить 3.
assert result.scheduled_settings.speed == 3
# --------------------------------------------------------------
# TEST 7
# Понедельник 23:15
#
# Heater off, speed 1.
# --------------------------------------------------------------
result = service.resolve(
datetime(2026, 9, 14, 23, 15)
)
print_result(
"TEST 7 — Monday 23:15",
result,
)
settings = result.scheduled_settings
assert result.auto_active is False
assert settings.speed == 1
assert settings.heater is False
# --------------------------------------------------------------
# TEST 8
# Суббота 09:30
#
# Проверяем переключение на weekend.
# --------------------------------------------------------------
result = service.resolve(
datetime(2026, 9, 19, 9, 30)
)
print_result(
"TEST 8 — Saturday 09:30",
result,
)
assert result.current.template == "weekend"
assert result.next.template == "weekend"
settings = result.scheduled_settings
assert settings.power is True
assert settings.speed == 1
assert settings.heater is True
assert settings.target_temp == 20
# --------------------------------------------------------------
# TEST 9
# Суббота 10:30
#
# Weekend AUTO.
# --------------------------------------------------------------
result = service.resolve(
datetime(2026, 9, 19, 10, 30)
)
print_result(
"TEST 9 — Saturday 10:30 / AUTO",
result,
)
assert result.current.template == "weekend"
assert result.auto_active is True
# --------------------------------------------------------------
# TEST 10
# Проверяем переход через полночь.
#
# Вторник 00:30.
# В 00:00 вторника уже должна действовать power off.
# --------------------------------------------------------------
result = service.resolve(
datetime(2026, 9, 15, 0, 30)
)
print_result(
"TEST 10 — Tuesday 00:30",
result,
)
assert result.current.when.day == 15
assert result.current.when.hour == 0
assert result.scheduled_settings.power is False
print()
print("=" * 70)
print("ALL SCHEDULE TESTS PASSED")
print("=" * 70)
if __name__ == "__main__":
main()