54 lines
1.5 KiB
Python
54 lines
1.5 KiB
Python
"""É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
|