34 lines
1 KiB
Python
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
|