"""État de la liseuse Kobo (batterie), POUSSÉ par le script monitorinkloop.sh. Contrairement aux autres intégrations qui *tirent* leurs données depuis une API, ici la Kobo *pousse* son niveau de batterie en paramètres de l'URL /image.png à chaque fetch (elle seule connaît sa charge). On conserve la dernière valeur en mémoire, horodatée, pour la rendre au prochain dessin du dashboard. """ from __future__ import annotations import time from dataclasses import dataclass # Au-delà de ce délai sans nouvelle de la Kobo, la valeur est jugée périmée. STALE_AFTER_SECONDS = 1800 @dataclass class KoboState: percent: int | None = None charging: bool = False updated_ts: float = 0.0 @property def ok(self) -> bool: return self.percent is not None @property def age_seconds(self) -> float: return time.time() - self.updated_ts if self.updated_ts else float("inf") @property def stale(self) -> bool: return self.age_seconds > STALE_AFTER_SECONDS @property def low(self) -> bool: return self.percent is not None and self.percent <= 15 and not self.charging _state = KoboState() def record(percent: int | None, charging: bool) -> None: """Enregistre le dernier niveau rapporté par la Kobo (borné à 0-100).""" if percent is None: return _state.percent = max(0, min(100, percent)) _state.charging = charging _state.updated_ts = time.time() def current() -> KoboState: return _state