From 31ef03fd4b16a396c710a334ed31bd14ed101ec2 Mon Sep 17 00:00:00 2001 From: Patrick Schurig Date: Tue, 25 Aug 2026 19:25:33 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20=C2=A77-4=20clos=20=E2=80=94=20l'affect?= =?UTF-8?q?ation=20de=20domaine=20survit=20au=20red=C3=A9marrage=20de=20ny?= =?UTF-8?q?mead?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Patrick a relancé le service à 18:23:45. LoadConfigStore recharge 2 configs depuis /var/lib/nymea/energy-load-configuration.json et la relecture RPC est identique clé par clé à celle d'avant l'arrêt : chauffe-eau→ecs, pac-terrain→hvac. Le redémarrage montre aussi la reprise à froid vue du dehors (ECS-411-b) : les adaptateurs journalisent ce qu'ils ont LU sur les contacts, avec la mention « correspondance exacte » — l'état de départ est constaté, pas supposé. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01XPUo3RMr8SzK6qbFtfBm8H --- RECAP.md | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/RECAP.md b/RECAP.md index adf8c11..55a0e67 100644 --- a/RECAP.md +++ b/RECAP.md @@ -111,6 +111,12 @@ La télémétrie ne repasse **jamais** à `available: true`. Une app qui aurait « défaut levé » sur le retour du RPC aurait menti deux secondes plus tard. C'est la justification, mesurée, de l'état `pending` maintenu 130 s puis conclu `stillFaulty`. +**La reprise à froid lit le matériel, elle ne le suppose pas.** Au redémarrage de 18:23:45, +`RelayRouter` et `SgReadyAdapter` journalisent ce qu'ils ont **lu** sur les contacts — +« palier 0 W [correspondance exacte] ; relais lus : … », « état 3 (~1500 W estimés) +[correspondance exacte] ; contacts lus : … ». C'est ECS-411-b vu du dehors : l'état de +départ de l'arbitre est constaté, jamais reconstitué de mémoire. + **Le défaut publié est `WRITE_FAILED`, pas `THING_MISSING`.** L'écriture est tentée, échoue faute de Thing, l'échelle s'épuise, et `m_faulted` masque le second code (`etmvariableloadadapter.cpp:148-150`, l'ordre des `if`). Ne pas coder l'UI en supposant @@ -126,7 +132,7 @@ expliquer un refus à l'installateur, elle ne peut que le rapporter. | Critère | Verdict | |---|---| -| **§7-4 domaine** | ✅ **sur `.75`** — écrit par le code d'écriture de l'app (`domain_assign.dart` importe `patched()`/`flattenToPayload()`), relu identique, persisté dans `/var/lib/nymea/energy-load-configuration.json` (`domain='ecs'` / `'hvac'`). ⚠️ **le redémarrage de `nymead` n'a PAS été exercé** : `sudo` demande un mot de passe sur `.75`. | +| **§7-4 domaine** | ✅ **sur `.75`, redémarrage compris** — écrit par le code d'écriture de l'app (`domain_assign.dart` importe `patched()`/`flattenToPayload()`), relu identique, persisté dans `/var/lib/nymea/energy-load-configuration.json`, et **survit au redémarrage de `nymead`** (18:23:45, relancé par Patrick) : `LoadConfigStore` recharge 2 configs depuis le fichier et la relecture RPC est identique **clé par clé** à celle d'avant l'arrêt. | | **§7-5 télémétrie vivante** | ✅ **sur `.75`** — trames non sollicitées, allocation 500 → 3000 → 3500 W, `SG_NORMAL` → `LOCK_MIN_STATE_HOLD`, verrou 241 → 180 → 120 s. | | **§7-6 fraîcheur** | ✅ **protocole mesuré sur `.75`** (battement ~59 s, cycle qui avance d'une minute) ; ⚠️ la **bascule d'affichage** est éprouvée en test unitaire, pas à l'écran — l'app n'a jamais tourné sur appareil (voir §7-9). | | **§7-7 défaut** | ✅ **sur `.75`** — défaut provoqué, `available: false`, `faultCode` rendu en français, `ClearLoadFault` exercé et son inefficacité **constatée sur la télémétrie**. ⚠️ pas de fixture brute : le dump n'a pas été conservé (`--dump` le capturera au prochain passage). | @@ -154,7 +160,7 @@ identique clé par clé à celle lue avant la sonde. | §7-1bis non-rebuild ECS-412 | ✅ **sur `.75`** — journal lu : 2 charges inchangées, 0 reconstruite | | §7-2 aplatissement réversible | ✅ **test unitaire seul** — `.75` n'a que deux charges, désormais dans deux domaines | | §7-3 config non contiguë | ✅ **test unitaire seul** — fixture synthétique | -| §7-4 domaine | ✅ **sur `.75`** ; ⚠️ redémarrage `nymead` non exercé (sudo verrouillé) | +| §7-4 domaine | ✅ **sur `.75`**, redémarrage de `nymead` compris | | §7-5 télémétrie vivante | ✅ **sur `.75`** | | §7-6 fraîcheur | ✅ protocole sur `.75` ; ⚠️ bascule d'affichage en test unitaire seul | | §7-7 défaut | ✅ **sur `.75`** (sonde `fault_probe.dart`) | @@ -164,13 +170,11 @@ identique clé par clé à celle lue avant la sonde. ## Ce qui reste à faire sur ce lot -1. **Redémarrer `nymead` sur `.75`** et relire la configuration — dernier morceau du §7-4. - `sudo systemctl restart nymead` demande un mot de passe que l'agent n'a pas. -2. **Faire tourner l'app sur appareil** (`adb` refusé jusqu'ici). Tant que ça n'est pas +1. **Faire tourner l'app sur appareil** (`adb` refusé jusqu'ici). Tant que ça n'est pas fait, §7-6 et §7-9 restent des vérifications de protocole, pas d'écran. -3. **Capturer une fixture brute de défaut** au prochain passage de `fault_probe.dart` +2. **Capturer une fixture brute de défaut** au prochain passage de `fault_probe.dart` (`--dump`). -4. **Écran de réglage par charge** — l'agent plugin le demande explicitement : +3. **Écran de réglage par charge** — l'agent plugin le demande explicitement : `pac-terrain` est désormais renommable, classable, rangeable, désactivable. Le brief du lot B limitait l'écriture à `priority` + `o:domain` ; renommer et désactiver sont **hors de ce lot**, et attendent un arbitrage.