From bb77039c821b696f42559ba55c963370fdbd7ac0 Mon Sep 17 00:00:00 2001 From: Patrick Schurig Date: Tue, 25 Aug 2026 14:31:58 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20RECAP=20session=202026-08-25=20+=20acc?= =?UTF-8?q?=C3=A8s=20ssh=20banc=20.75?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Point d'arrêt avant redémarrage machine. Consigne l'état du lot B app, le bloqueur (lot plugin non déployé sur .75), le partage vérifié/non-vérifié, et la question ouverte sur la fusion /energy/setup ↔ /energy/loads. Note l'accès ssh au banc désormais documenté dans CLAUDE.md : il lève la limite qui rendait le critère 7-1bis (non-reconstruction des adaptateurs) invérifiable faute de journal. Co-Authored-By: Claude Opus 5 (1M context) --- CLAUDE.md | 5 +++ RECAP.md | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index d8be544..2bf1868 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -3,6 +3,11 @@ --- +# ssh banc .75 +Accès banc `.75` : ssh etm@192.168.1.75 (clé déjà installée). +Ni root ni nymea n'existent. Journal : journalctl -u nymead. +--- + ## Mon rôle Interface utilisateur Flutter du HEMS ETM-PowerSync. Je communique **exclusivement via JSON-RPC nymea port 4444**. diff --git a/RECAP.md b/RECAP.md index 79c4db4..52599e6 100644 --- a/RECAP.md +++ b/RECAP.md @@ -1,5 +1,107 @@ # RECAP — etm-powersync-app · reprise de session +> **Session 2026-08-25.** Branche **`feature/beta-add-config`**. Rien n'est poussé. +> La section « État au 2026-06-30 » plus bas reste valable pour tout ce qu'elle décrit. + +--- + +## Session 2026-08-25 — ce qui a été fait + +### Commits ajoutés +| Commit | Contenu | +|---|---| +| `7ca4297` | **Lot B app** — ordre de service des charges, locale, ossature i18n | +| `40ac3b2` | Fixtures : dump réel `GetLoadConfig` + schéma introspecté de `.75` | + +### 1. Menus (demande initiale) +- « Rôles & appareils » et « Options développeur » → **section MODE INSTALLATEUR** uniquement. +- Groupes / Scènes / Médias / Garages → **masqués par défaut**. Le drawer lit désormais + `AppSettingsProvider.visibleScreens` (ces 4 écrans y étaient **déjà** à `visible: false` ; + le drawer les affichait en dur et ignorait le réglage). +- Garde de routeur `_isInstallerRoute` (`main.dart:41`) : `/settings/system*`, + `/settings/app/developer`, `/energy/setup`, `/energy/loads` → redirection vers `/` si le + mode installateur est verrouillé. Couvre l'URL directe, le deep-link et l'auto-lock 10 min. +- Liens SUPPORT corrigés : doc → `https://docs.etm-powersync.fr/`, Telegram → + `https://t.me/etm_powersync_support`, **Discord retiré** (commenté sur place). + +### 2. Investigations rendues (constats factuels, pas de code) +- **Locale nymea** : gérée **PAR CONNEXION** (`o:locale` dans `Hello`, + `m_clientLocales`). Pas de forçage `LANG`/`LC_ALL` dans l'unité systemd. **Mais** sur 784 + chaînes affichables de `.75`, l'allemand en change **1**, le français **0** : aucun + catalogue `.qm` fr n'est livré. Les `displayName` = identifiants anglais. +- **Frontière RPC / runtime de l'arbitre** : quasi rien ne sort. Seuls `degradedMode` + (notification `ChargingSchedulesChanged` **uniquement** — pas relisable par `Get`), les + deux ratios d'énergie, `chargingState` de l'EV et le plan de recharge franchissent. + Allocation, budget, verrous, paliers, `available`, motifs : **journal seulement**. + `SurplusContext` / `LoadContextTelemetry` n'ont aucune sérialisation sortante. + +### 3. Lot B app — livré +- `models/load_config_entry.dart` — **vue en lecture** au-dessus de la map brute ; écriture + par `patched()` depuis la map d'origine, jamais de re-sérialisation. +- `services/load_priority.dart` — `groupByDomain` / `flattenToPayload` / + `applyDefaultDomainOrder` / miroir client de `validateSet()`. +- `providers/load_config_provider.dart` — séquence `pending → LoadConfigChanged → + confirmed|diverged`. Ne conclut jamais sur l'acquittement du RPC. +- `screens/energy/load_order_screen.dart` — route `/energy/loads`, gatée installateur. +- i18n : `flutter_localizations` + `intl` + `lib/l10n/app_fr.arb` + `l10n.yaml`. + Extension `context.l10n`. Français seul. +- `NymeaEnergy.GetLoadConfig` / `SetLoadConfig` deviennent **réels** (c'étaient des stubs). +- **Locale** envoyée à chaque `Hello`, demandée + retenue journalisées. + +### 4. ⚠️ Piège désamorcé — à ne pas réintroduire +`EnergySetupProvider.persist()` appelait `setLoadConfig(buildLoadDescriptors())`, une +**reconstruction depuis le modèle typé**, et `_commit()` l'appelle à chaque changement d'UI. +Inoffensif tant que le RPC était un stub ; destructeur une fois réel (`SetLoadConfig` +remplace **tout l'ensemble** → la charge `chauffe-eau` de `.75` aurait été écrasée). +**Émission débranchée**, raison documentée sur place. + +--- + +## ⛔ BLOQUEUR PRINCIPAL À LA REPRISE + +**Le lot plugin `brief-plugin-lotB-telemetrie.md` n'est PAS déployé sur `.75`.** +Introspect au 2026-08-25 : toujours **19 méthodes / 13 notifications**. + +``` +GetLoadTelemetry : ABSENT +LoadTelemetryChanged : ABSENT +o:domain : ABSENT du schéma SetLoadConfig +``` + +Conséquence : critères **4 à 8** du brief lot B hors d'atteinte (domaine, télémétrie +vivante, fraîcheur, défaut/`ClearLoadFault`, code inconnu réel). Tant que ce lot n'est pas +sur la box, **il n'y a plus rien d'utile à faire côté app sur ce périmètre**. + +## Vérifié / non vérifié (lot B app) + +| Critère | Statut | +|---|---| +| §7-1 aller-retour neutre | ✅ **sur `.75` en vrai** — `SetLoadConfig` verbatim → relecture identique | +| §7-1bis non-rebuild ECS-412 | ⚠️ lecture de code seulement (`sameHardware()`), journal non consulté | +| §7-2 aplatissement réversible | ✅ **test unitaire seul** — `.75` n'a qu'une charge | +| §7-3 config non contiguë | ✅ **test unitaire seul** — fixture synthétique | +| §7-4 à §7-8 | ❌ bloqués (lot plugin) | +| §7-9 locale | ✅ protocole vérifié sur `.75` ; ⚠️ **chemin app jamais exécuté sur appareil** (adb refusé) | +| §7-10 analyze / tests / gating | ✅ 25 issues = ligne de base, 30/30 tests | + +## Question ouverte à trancher + +Le brief désignait « Rôles & appareils » (`/energy/setup`) comme écran cible, mais cet écran +est bâti sur le modèle **inverse** (il construit des `LoadDescriptor` depuis des `EmsRole`). +J'ai créé `/energy/loads` à côté et laissé `/energy/setup` intact. **Fusionner les deux est +une refonte, pas un câblage** — décision Patrick attendue. + +## Nouveauté à exploiter à la reprise + +`CLAUDE.md` documente désormais l'accès banc : `ssh etm@192.168.1.75` (clé installée), +journal via `journalctl -u nymead`. **Cela lève la limite qui rendait §7-1bis invérifiable** +— au prochain aller-retour neutre, lire le journal pour confirmer qu'aucune reconstruction +d'adaptateurs n'a lieu. + +--- + +# RECAP — etm-powersync-app · reprise de session + > État au 2026-06-30. Branche **`feature/beta-add-config`** (9 commits au-dessus de `master`). > **Rien n'est poussé** (push différé). **Aucun merge** vers master/silo.