diff --git a/RECAP.md b/RECAP.md index 51cf895..07997c1 100644 --- a/RECAP.md +++ b/RECAP.md @@ -1,7 +1,89 @@ # RECAP — etm-powersync-app · reprise de session -> **Session 2026-08-25.** Branche **`feature/beta-add-config`**. Rien n'est poussé. +> **Session 2026-08-25.** Branche **`feature/beta-add-config`**, **poussée**. > La section « État au 2026-06-30 » plus bas reste valable pour tout ce qu'elle décrit. +> La **soirée du 25** (lot C) est en tête ci-dessous ; le reste de la journée suit. + +--- + +## Soirée 2026-08-25 — LOT C : les écrans de configuration par charge + +### Ce qui a été livré + +| Commit | Contenu | +|---|---| +| `2a8ad95` | **Lot C** — fusion des deux écrans, écrans de mécanisme, grisage par introspection | +| `f0aa0fd` | Harnais `integration_test` — l'IU sur le téléphone, contre `.75` | +| `98e2874` | Diagnostic de montage d'écran (MIUI bloquait l'installation) | +| `15a5263` | **L'IU tourne sur l'appareil** : chaîne complète vérifiée contre `.75` | +| `38475e0` | Compteurs réseau honnêtes + le sélecteur clair/sombre s'applique partout | +| `3d2aab2` | **Les écrans suivent enfin la maquette** — sélecteurs, table d'états, budget, borne | + +- **L'écran « Ordre de service » a disparu** ; son chemin de données (`LoadConfigProvider`) a + migré dans « Rôles & appareils », jamais l'inverse. L'entrée de menu est retirée. + Les charges viennent de `GetLoadConfig`, plus de `LoadDescriptor` reconstruits depuis des + `EmsRole` — LM-201 interdit de toute façon de déclarer `dhw` **et** `heatPump` pour une PAC + sans ballon séparé. +- **Trois écrans de mécanisme** (routeur de relais / modulable / SG-Ready) avec sélecteurs de + Things **par nom** filtrés sur l'interface nymea, table d'états SG-Ready éditable + (SG1/SG2 choisis une fois, en haut), temporisations, « Compteur dédié » grisé avec sa + raison, « Inclure dans l'arbitrage », et **validation avant envoi**. +- **Grisage dérivé de `JSONRPC.Introspect`**, jamais codé en dur : trois états et non deux — + écrivable, `r:` (mesure, pas fonction manquante), absent — plus « inconnu » quand le schéma + n'a pas pu être lu. +- **`setChargingInfo()` était INOPÉRANT** : namespace `EnergyPlugin.*` inexistant, champs + `mode`/`targetSoc`/`endTime`/`minCurrent` au lieu de + `chargingMode`/`targetPercentage`/`endDateTime`. Vérifié par appel réel : + `Missing required key: chargingMode`. Corrigé, et le refus remonte désormais au lieu d'être + avalé pendant que l'état local mentait. +- **Tableau de bord** : « Depuis réseau » lisait l'**opposé** du compteur d'export au lieu de + `totalAcquisition` — 0,0 kWh en permanence. Et les deux tuiles disaient « aujourd'hui » sur + des compteurs cumulés. Corrigé, avec un plafond de plausibilité contre les valeurs + corrompues que la box publie (cf. brief plugin §1). +- **Thème** : 126 sites basculés vers les variantes contextuelles ; 9 restent en constante + (tables statiques sans `BuildContext`). + +### Vérifié SUR L'APPAREIL, contre `.75` + +``` +[appareil] schéma lu — nymea 1.15.2+… · NymeaEnergy 0.8 · AirConditioning 1.1 +[appareil] écran de configuration monté +[appareil] charges lues : [chauffe-eau, pac-terrain] +[appareil] écriture → LoadSaveState.confirmed +[appareil] libellé restauré : chauffe-eau +``` + +`adb shell input` est refusé par MIUI ; la voie qui marche est `integration_test`, qui +s'exécute **dans le processus de l'app**. Détail et pièges : `docs/RELEVE_LOTC.md` §2. + +### L'erreur de la soirée, et sa leçon + +**Les écrans ont d'abord été construits sans ouvrir `docs/mockups/`.** Les maquettes — dont +celle des mécanismes, mise à jour le soir même — étaient dans le dépôt et décrivaient +précisément tout ce qui manquait ensuite. Tout a été à refaire (`3d2aab2`). +**`docs/mockups/*.html` fait autorité sur la forme des écrans**, au même titre que +`INTERFACE_etmvariableload.md` sur le contrat. + +### Ouvert — repris le 2026-08-26 au matin + +1. **Le glissement (drag & drop)** ne semble rien produire. À départager : le geste est-il + avalé par le `ListView` parent, ou n'y a-t-il simplement rien à déplacer ? Sur `.75` il n'y + a **qu'une charge par domaine** — le test décisif est de mettre les deux dans le même + domaine. +2. **Le sélecteur de mécanisme est non cliquable**, et c'était mon choix — à tort : la maquette + le donne comme un champ enregistré (`enregistré · adapter`). À rendre actif, avec la + bascule de charge utile et l'avertissement de reconstruction. +3. Le chip de domaine s'affiche **sans libellé** sur la carte de charge. +4. Les **9 sites de couleur** hors thème (tables statiques, peintres). +5. **Zones de climatisation** : `ac_screen.dart` n'appelle aucune méthode `AirConditioning`, + ses 4 pièces sont des constantes de maquette, et `.75` déclare zéro zone. Le câblage est un + lot en soi — la box, elle, expose **8 méthodes toutes en écriture**. + +### Pour l'agent plugin + +Sept constats côté moteur : `BRIEF_agent_plugin.md` dans le dépôt **plugin**. Le plus visible +est le §1 — les compteurs cumulés d'`Energy.GetPowerBalance` sont corrompus (9,1 × 10³³ kWh), +alors que le Thing compteur est sain. ---