Refresh partiel e-ink : ne redessine que la zone changée, full refresh ~1h

Backend : endpoints /frame.meta (ligne 'MODE X Y W H SEQ') + /frame.png qui
servent un crop de la zone modifiée (diff PIL par client) ou l'image pleine.
Full refresh forcé tous les N cycles (MONITORINK_FULL_EVERY=12, ~1h) ou si la
zone change sur plus de 60% de l'écran. Mode 'noop' quand rien ne change.

Anti-429 : l'usage Claude est mis en cache (MONITORINK_USAGE_TTL=120s) avec
repli sur la dernière valeur connue en cas d'erreur transitoire.

Kobo : monitorinkloop.sh récupère meta puis png et fait un fbink partiel
(-g file=,x=,y=) sans flash, full refresh (-c -f) en mode full. Refresh 5 min.
This commit is contained in:
jerem
2026-06-15 18:42:32 +02:00
parent ce20d3675d
commit c7395d1c37
8 changed files with 257 additions and 27 deletions

View File

@@ -88,6 +88,22 @@ class Config:
cache_ttl_seconds: int = field(
default_factory=lambda: int(_get("MONITORINK_CACHE_TTL", "120"))
)
# Intervalle mini entre deux appels réels à l'endpoint /usage de Claude (rate-limité).
# Indépendant de la cadence de rendu : protège du 429 quand on rend souvent (dev 30 s).
usage_ttl_seconds: int = field(
default_factory=lambda: int(_get("MONITORINK_USAGE_TTL", "120"))
)
# --- Refresh partiel e-ink (endpoints /frame.*) ---
# Un full refresh est forcé tous les N cycles pour effacer le ghosting (1=toujours full).
# En prod 12 (~1 h à 5 min/cycle) ; en dev on descend à 2 (~1 min à 30 s/cycle).
full_refresh_every: int = field(
default_factory=lambda: int(_get("MONITORINK_FULL_EVERY", "12"))
)
# Si la zone modifiée dépasse cette fraction de l'écran, on bascule en full (partiel inutile).
partial_max_ratio: float = field(
default_factory=lambda: float(_get("MONITORINK_PARTIAL_MAX_RATIO", "0.6"))
)
@property
def ha_entities(self) -> list[HAEntity]: