ha-alarm-clock/custom_components/reveil/schedule.py
2026-09-20 20:48:17 +02:00

34 lines
1 KiB
Python

"""Calcul du prochain réveil (logique pure, sans dépendance à Home Assistant)."""
from __future__ import annotations
from collections.abc import Sequence
from datetime import datetime, time, timedelta
def next_ring(
now: datetime,
active: Sequence[bool],
times: Sequence[time],
*,
enabled: bool = True,
) -> datetime | None:
"""Retourne le prochain déclenchement strictement postérieur à `now`.
`active` et `times` ont 7 éléments, index 0 = lundi.
`now` doit être « aware » (fuseau horaire local).
"""
if not enabled or len(active) != 7 or len(times) != 7 or not any(active):
return None
# 8 jours : couvre le cas « seul aujourd'hui est actif et l'heure est passée »
for offset in range(8):
day = now.date() + timedelta(days=offset)
weekday = day.weekday()
if not active[weekday]:
continue
candidate = datetime.combine(day, times[weekday], tzinfo=now.tzinfo)
if candidate > now:
return candidate
return None