concierge: lire airtria_ro depuis l'env/.env + alerte d'echec d'auth

Le mot de passe airtria_ro est desormais lu depuis AIRTRIA_RO_PASSWORD
(variable d'environnement, sinon .env monte dans le conteneur), plus depuis
.pg-airtria : EVCS renouvelle ce mot de passe, un fichier fige faisait echouer
l'auth EN SILENCE. readPgPassword LEVE (rattrapable) au lieu de process.exit ;
mot de passe resolu paresseusement dans makeClient.

Nouveau module concierge-health.js (meme patron que le moniteur LLM) : battement
de coeur horodate a CHAQUE cycle detect, statut live dans HA, et alerte WhatsApp
UNIQUEMENT sur transition ok<->erreur (dedup, pas de rappel periodique). Chemin
HA independant de PostgreSQL : l'alerte auth KO part meme quand c'est l'auth qui
tombe. Best-effort : si les helpers HA manquent, le concierge n'echoue pas.

- concierge-health.test.js : machine a etats (dedup + transitions) verifiee, sans reseau
- concierge-health-ha-package.yaml.draft : helpers HA (a integrer cote proprietaire)
- SPEC : source du secret corrigee + section supervision

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RZsbhyGmRwZogdoBwT6C6y
This commit is contained in:
2026-09-16 03:26:50 +02:00
parent d0805331ad
commit 6da250914d
6 changed files with 276 additions and 16 deletions

View File

@@ -96,8 +96,13 @@ aucun signal. VW et JEEP sont électriquement indiscernables l'une de l'autre
- ⚠️ NE PAS utiliser `evcs_lecture` : il a INSERT sur `evenement` (registre
d'audit partagé) — inadapté à un agent. Rôle DÉDIÉ `airtria_ro`, LOGIN +
SELECT sur `session_charge` et `evenement` uniquement, aucune écriture.
Mot de passe déposé protégé dans le workspace (.pg-airtria). Base evcs sur
10.10.10.22:5433.
Mot de passe = variable `AIRTRIA_RO_PASSWORD`, injectée dans le conteneur par le
`env_file: .env` du compose openclaw (secret dans /mnt/ARCH3/docker/openclaw/.env,
600, hors git). EVCS possède le rôle et peut RENOUVELER le mot de passe : le code lit
la variable d'environnement (source vivante), jamais un fichier figé — un `.pg-airtria`
périmé ferait échouer l'auth en silence. Après un changement du .env, RECRÉER le
conteneur (`docker compose up -d`) : un simple restart ne relit pas env_file. Base
evcs sur 10.10.10.22:5433.
- Colonnes utiles (session_charge, 17 col) : `debut` (clef, MS), `fin`,
`terminee`, `vehicule`, `vehicule_sur` (DEFAULT true → à basculer côté service),
`p_max_w` + `consigne_max_a` + `courant_max_a` (règle invité), `debranche_a`
@@ -325,3 +330,30 @@ aucune connaissance métier (ni routine, ni horaire, ni puissance), et aucune
- Prérequis à câbler : (1) accès lecture PostgreSQL pour Airtria
(`PG_LECTURE_PASSWORD`, déposé protégé comme le token HA) ; (2) création du
helper `input_text.airtria_vehicle_label` (max:255) dans le paquet HA.
## Supervision — alerte d'échec d'auth (2026-09-16)
Motivation : le 15/09, EVCS a renouvelé le mot de passe `airtria_ro` ; le concierge a
alors échoué à se connecter, mais EN SILENCE — sortie vide, donc aucun WhatsApp émis,
aucune trace visible : il cessait simplement de poser la question sans que personne le
sache. Même angle mort que le service EVCS (une trace écrite seulement AU RETOUR à la
normale, dans PG, donc jamais quand c'est PG qui tombe).
Correctif (module `concierge-health.js`, même patron que le moniteur LLM) :
- **Battement de cœur À CHAQUE cycle** : `input_datetime.concierge_last_run` reçoit un
horodatage (valeur qui CHANGE — HA ne rafraîchit pas le `last_changed` d'un helper
réécrit à l'identique). Un concierge mort devient détectable (capteur `binary_sensor`
de fraîcheur, > 20 min → « figé »).
- **Statut live** : `input_text.concierge_status` (max:255) = `OK · HH:MM` ou
`⚠️ <erreur> · HH:MM`.
- **Alerte WhatsApp UNIQUEMENT sur transition** (ok↔erreur), jamais un rappel périodique
(« events not states ») : une panne qui dure ne spamme pas le canal. Dédup par état
local `concierge-health-state.json`.
- **Chemin HA indépendant de PostgreSQL** : l'alerte « auth KO » part précisément quand
c'est l'auth qui tombe (le signal de vie n'emprunte pas le chemin qui tombe). Best-effort :
si les helpers manquent, le concierge n'échoue pas ; l'alerte WhatsApp part quand même
(elle ne dépend pas des helpers). Interrupteur `input_boolean.concierge_monitor_enabled`
(OFF = pas de WhatsApp, affichage maintenu).
- Refactor de `concierge-detection.js` : `readPgPassword()` LÈVE au lieu de `process.exit`,
mot de passe résolu paresseusement dans `makeClient()` → l'échec devient RATTRAPABLE par
l'étage live, qui le publie. Paquet HA : `concierge-health-ha-package.yaml.draft`.
Machine à états vérifiée par `concierge-health.test.js` (dédup + transitions, sans réseau).