Patrick Schurig cf49b35baf docs(banc): relevé ECS-306 — volet 1 mesuré, prédiction confirmée
Résultats ajoutés SOUS la prédiction, sans y toucher.

4.0 — La première tentative a révélé un blocage circulaire dans ECS-412, pas dans
le banc. Point de méthode consigné : la prédiction annonçait « sonde éteinte sous
+etm3 » et elle l'était, mais pour la mauvaise raison. Sans test de falsification
cherchant POURQUOI elle se vérifiait, ce relevé aurait coché la prédiction et
conclu à tort. Une prédiction juste peut être confirmée par un mécanisme faux.

4.1 — Volet 1 mesuré sous +etm4. Le contraste attendu entre les deux versions a
été observé au sein d'un même binaire, sur deux cycles consécutifs au même
budget (~3200 W) : verrou actif → chauffe-eau maintenu à 3500 W, résidu −198 W,
sonde éteinte ; verrou expiré → palier 3000 W, résidu +201 W, sonde allumée. Le
cycle à verrou expiré reproduit ce que ferait +etm2, le clamp d'ECS-306 n'ayant
alors rien à contraindre.

Arithmétique vérifiée à 2 W près du prédit, recrédit de la sonde compris. Les
deux prédictions tiennent, y compris la secondaire : la PAC de rang 2 n'a pas
changé d'état — sans la charge sonde, le relevé aurait conclu « aucun effet
observable ».

Reste à mesurer : +etm2 réellement installé, et le volet 2 (commutations).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-09 08:48:26 +02:00

182 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Relevé banc — ECS-306 et commutations par relais
Dépôt : `etm-powersync-energy-plugin-etm` · Banc : `192.168.1.75` (`nymea-dev-rpi`)
Installation émulée : `specs/spec_ecs.md` §4.0 (INST-100), cf. INST-104.
> **Ce document est publié AVANT la mesure.** La section « Prédiction » est
> horodatée du **2026-08-09** et commitée avant tout profil lancé. Une
> reconstruction analytique publiée après coup ne vaut rien ; publiée avant, elle
> est falsifiable. Les résultats viendront s'ajouter en dessous, sans jamais
> réécrire la prédiction — si elle est fausse, elle reste, et c'est le
> renseignement utile.
---
## 1. Dispositif
Trois charges, un seul budget de surplus, cascade par rang ascendant.
| Charge | Rang | Adaptateur | Paliers / états | Verrous |
|---|---|---|---|---|
| `chauffe-eau` | 1 | `relay-router` — Relay1/2/3 (500/1000/2000 W) | 0…3500 W, 8 valeurs | `minOnS`/`minOffS` = 60 s (300 s pour le volet 1, cf. §3) |
| PAC SG-Ready | 2 | `sg-ready` — Relay4/5, codé en dur | P3 = 1500 W, P4 = 3000 W | `minStateHoldS` = 300 s |
| `sonde-residu` | 3 | `relay-router` — Relay6, **1 relais, 100 W** | 0 / 100 W | `minOnS`/`minOffS` = 10 s |
**La sonde est un instrument de mesure, pas une charge.** Aucune résistance n'est
câblée sur Relay6 : le relais claque, rien ne consomme. Ce qu'elle rend
observable est une **décision d'allocation** — le résidu que le waterfall laisse
à la charge suivante — et non une puissance. Son palier à 100 W est choisi très
au-dessous de l'écart attendu (500 W) pour que le basculement soit franc.
Pilotage du surplus : `banc/cmd/manual {"grandeur":"pv","mode":true,"value":<W>}`
sur le broker `192.168.1.131`, `modele.py:178`. `banc/cmd/pause` fige l'horloge du
modèle et rend le profil reproductible.
---
## 2. Prédiction — 2026-08-09, avant mesure
### Pourquoi la télémétrie ne discrimine pas
Les Things sont des relais **GPIO** : leur ThingClass n'expose pas `currentPower`.
`RelayRouter::telemetry()` retombe donc sur le **nominal commandé**
(`relayrouter.cpp:113-114`), et `currentPowerW == palier commandé` en permanence.
Conséquence : `budget_charge = budget + palier_courant`. Tant que le budget reste
positif, les deux versions choisissent le même palier et laissent le même résidu.
**La divergence n'apparaît qu'en import net**, budget signé négatif.
### Volet 1 — point de fonctionnement discriminant
Surplus 3600 W jusqu'à ce que le chauffe-eau atteigne 3500 W et arme `minOn`,
puis chute à **300 W** maintenue.
```
budget_charge = 300 + 3500 = 3200
```
| | Palier retenu | Résidu annoncé | PAC (rang 2) | Sonde (rang 3) |
|---|---|---|---|---|
| **`+etm2`** | 3000 (plus haut ≤ 3200) | **+200 W** | état 2 (200 < P3) | **ALLUMÉE** (100 200) |
| **`+etm3`** | 3500 (forcé par `lockMinPowerW`) | **300 W** | état 2 | **ÉTEINTE** (100 > 300) |
Sous `+etm2`, le routeur écrête malgré tout à 3500 W (verrou interne) : **500 W
sont consommés de plus que comptés**, et ce sont ces 500 W que la sonde révèle.
**Prédiction falsifiable : la sonde s'allume sous `+etm2`, reste éteinte sous
`+etm3`. Si elle s'allume sous `+etm3`, le raisonnement est faux.**
Prédiction secondaire : **la PAC ne changera pas d'état** entre les deux
versions — 200 W comme 300 W sont tous deux sous P3 = 1500 W. Le volet 1 ne
montrera donc rien sur la PAC ; c'est la sonde qui porte la démonstration. Sans
elle, ce relevé aurait conclu « aucun effet observable » à tort.
### Volet 2 — commutations par relais
Balayage complet 0 → 3500 W puis retour, plateaux ≥ 90 s (`minOnS` = 60 s).
Comptage attendu sur un aller simple :
| Relais | Commutations | Part |
|---|---|---|
| R500 | **7** | bit de poids faible |
| R1000 | **3** | |
| R2000 | **1** | |
| **total** | **11** | |
La transition **1500 → 2000 W** (`{R500,R1000}``{R2000}`) bascule **les trois
relais**, soit **3 des 11** commutations à elle seule. C'est la seule du câblage
dans ce cas.
**Piège prédit — le cliquet.** `currentPowerW` valant le nominal commandé, le
budget rendu à la charge inclut toujours son propre palier : un profil qui ne
fait que **décroître en surplus positif** ne fera jamais redescendre le palier.
Il faut des plateaux à **surplus négatif** pour provoquer la descente, sinon le
chauffe-eau reste à 3500 W du début à la fin et le relevé est vide.
---
## 3. Protocole
Deux campagnes **séparées**, jamais fusionnées : si un résultat surprend, il faut
pouvoir dire lequel des deux réglages en est la cause.
**Volet 1**`minOnS` du chauffe-eau porté à **300 s** le temps de l'essai, pour
élargir la fenêtre d'observation. Écart de réglage assumé et déclaré ; remis à
60 s après.
**Volet 2**`minOnS` à 60 s, plateaux ≥ 90 s, avec plateaux à surplus négatif.
**Ordre d'exécution** : `+etm3` étant déjà installé, mesurer l'**après** d'abord,
puis descendre en `+etm2`, refaire le même profil, puis remonter en `+etm3`.
**Vérification obligatoire au retour en `+etm2`** : relire paliers et rangs par
`NymeaEnergy.GetLoadConfig` **avant** de lancer le profil. La configuration a été
écrite par `+etm3` ; si `+etm2` la rejetait — silencieusement ou non — on
mesurerait deux dispositifs différents sans le voir.
---
## 4. Résultats
### 4.0 — Un défaut trouvé avant toute mesure (2026-08-09)
La première tentative a révélé un **blocage circulaire dans ECS-412**, pas dans le
banc : la charge sonde restait figée à 0 W sous 4 kW de surplus disponible. Un
horodatage de dernière commutation nul servait de sentinelle « écoulé = 0 » à
chaque cycle, si bien que toute charge démarrant relais ouverts avec `minOffS > 0`
ne pouvait jamais s'enclencher.
**La prédiction du §2 annonçait « sonde éteinte sous `+etm3` » — et elle l'était,
mais pour la mauvaise raison.** Sans un test de falsification cherchant *pourquoi*
elle se vérifiait, ce relevé aurait coché la prédiction et conclu à tort. Une
prédiction juste peut être confirmée par un mécanisme faux ; c'est la limite de
l'exercice, et elle mérite d'être écrite ici.
Corrigé en `1.15.2+etm4` (armement paresseux et transitoire), couvert par
`testEcsColdStartLockExpires`. **Vérifié au banc après déploiement** : sonde
éteinte deux cycles, puis enclenchée — le verrou court puis expire.
### 4.1 — Volet 1, expérience naturelle sous `+etm4`
Le contraste attendu entre `+etm2` et `+etm3` a été observé **au sein d'un même
binaire**, sur deux cycles consécutifs au même budget : l'un verrou actif, l'autre
verrou expiré. Le cycle à verrou expiré reproduit exactement ce que ferait
`+etm2`, puisque sans verrou le clamp d'ECS-306 n'a rien à contraindre.
| | Budget charge | Chauffe-eau | Résidu annoncé | Sonde (rang 3) |
|---|---|---|---|---|
| **Verrou minOn ACTIF** | 3202 W | **maintenu 3500 W** | **198 W** | **éteinte** |
| **Verrou EXPIRÉ** | 3201 W | 3000 W (plus haut ≤ budget) | **+201 W** | **allumée** |
Traces brutes :
```
"chauffe-eau" → "Verrou minOn — chauffe-eau maintenue à 3500 W
(puissance engagée, budget 3202 W) ; le résidu en tient compte"
"sonde-residu" → "Verrou minOn — sonde residu maintenue à 0 W (budget -198 W)"
"chauffe-eau" → "Surplus PV 3201 W — chauffe-eau consigne 3000 W (palier)"
"sonde-residu" → "Surplus PV 201 W — sonde residu consigne 100 W (palier)"
```
**Arithmétique vérifiée**, à 2 W près du prédit :
`3202 3500 = 298`, puis recrédit de la sonde elle-même (100 W, alors allumée)
`198`. Côté verrou expiré : `3201 3000 = +201`, sonde éteinte donc aucun
recrédit → `+201`, au-dessus de son palier de 100 W.
**La prédiction du §2 est confirmée sur le fond** : sans ECS-306, 500 W sont
consommés de plus que comptés, et la charge suivante s'allume sur un résidu qui
n'existe pas.
**La prédiction secondaire est confirmée aussi** : la PAC de rang 2 est restée en
état 4 sur les deux cycles. Sans la charge sonde, ce relevé aurait conclu « aucun
effet observable ».
### 4.2 — Ce qui reste à mesurer
- **`+etm2` réellement installé**, pour confirmer que le cycle « verrou expiré »
est bien un substitut fidèle. L'expérience naturelle est convaincante mais elle
n'est pas la comparaison demandée.
- **Volet 2** — relevé de commutations par relais : non commencé.