0.6.2: pallino rosso solo per un allarme che ferma la macchina (avviso = ambra)

Il pallino era rosso per qualunque voce nell'elenco errori: un semplice avviso
(compressore limitato dalla temperatura esterna, caso reale del 10/10) sembrava
un guasto. Ora il ponte espone in /summary anche error_severity e
alarm_stopping, e il livello 3 (rosso) e' riservato agli allarmi che fermano la
macchina o di severita' CRITICAL/ERROR; avviso = ambra. Copertina allineata.

6 verifiche nuove nell'harness del nucleo (avviso/stop/critical/error/
precedenza sul modo attivo/gravita' ignota = ambra).
This commit is contained in:
2026-10-10 18:16:04 +02:00
parent 4050b3b5d7
commit a281a7e112
9 changed files with 108 additions and 13 deletions
+25 -1
View File
@@ -53,7 +53,7 @@ CREDS = BASE / "aira.json"
TOKENS = BASE / "aira_tokens.json"
POOL_CFG = BASE / "aira_config.json"
VERSION = "0.4.0"
VERSION = "0.6.2"
# --------------------------------------------------------------------------- #
@@ -195,6 +195,23 @@ def summarize(st: dict) -> dict:
errs = st.get("errors") or []
# ---- gravita' degli errori -------------------------------------------
# La severita' arriva come stringa ("SEVERITY_WARNING") e le voci possono
# essere piu' di una: si normalizza al nome nudo e si tiene la peggiore.
# "allarme che ferma" NON si deduce dalla severita': sta nei metadati
# (compreso quello del compressore).
_GRAVITA = {"WARNING": 1, "ERROR": 2, "CRITICAL": 3}
_meta = st.get("error_metadata") or {}
alarm_stopping = bool(_meta.get("hp_has_stopping_alarms")) or bool(
_meta.get("compressor_has_stopping_alarm"))
severita = ""
for _voce in errs if isinstance(errs, list) else []:
_nome = str((_voce or {}).get("severity") or "")
if _nome.startswith("SEVERITY_"):
_nome = _nome[len("SEVERITY_"):]
if _GRAVITA.get(_nome, 0) > _GRAVITA.get(severita, 0):
severita = _nome
# ---- dati del dispositivo (per la pagina "Impianto": accessori + riepilogo,
# come la scheda "Accessori" e il "Riepilogo impostazioni" dell'app ufficiale)
hp_id = g("heat_pump_id", "value") or ""
@@ -249,6 +266,13 @@ def summarize(st: dict) -> dict:
"zone2_mode": g("current_pump_mode_state", "zone_2"),
"zone2_cooling_setpoint": g("zone_setpoints_cooling", "zone_2"),
"errors_count": len(errs) if isinstance(errs, list) else 0,
# Gravita' degli errori, per il pallino di stato dell'app: un semplice
# avviso (WARNING) non deve diventare rosso come un allarme che ferma la
# macchina. "error_metadata" dice se c'e' un allarme che ferma; le voci
# di "errors" portano la severita' di ognuna (normalizzata senza il
# prefisso SEVERITY_, cosi' la UI non dipende dal protobuf).
"alarm_stopping": alarm_stopping,
"error_severity": severita,
"pump_updated": g("aws_iot_received_time") or st.get("time"),
# Identificativo e versioni: l'app ufficiale mostra le prime 6 cifre
# dell'UUID come "Dispositivo ID".