Les deux règles du moteur sont prises. Il leur manque trois choses pour être
affichables :
1. `ECO_FLOOR_MISSED` sous `unmeasurable` — la cause porte la nuance et
`missingWh` absent est juste, mais le COÛT manque. Sous le taux constant le
moteur aura acheté exactement la cible et il le sait exactement : il l'a
commandé. `draw.committedW` est une puissance par cycle, pas un cumul.
`purchasedWh` est légitime là où `deliveredWh` ne l'est pas — l'un est une
comptabilité, l'autre une mesure absente. Sans lui, la règle « ce que ça coûte
par jour » ne peut être qu'une estimation de l'app.
2. Le signal de déclaration doit vivre dans `GetLoadConfig` en lecture seule, pas
dans la télémétrie : `measurement` n'existe que pour les charges de `loads[]`,
et une charge qu'on déclare est justement celle qui n'y est pas. Avec sa
raison — aucun compteur / compteur sans énergie / borne sans `sessionEnergy` —
parce que le geste de l'installateur en dépend. `meterThingId` ne suffit pas :
un compteur peut publier la puissance sans l'énergie.
3. Après une bascule `unmeasurable → measured`, `deliveredWh` compte depuis la
nouvelle base pendant que `targetWh` reste la cible entière : la paire cesse
d'être une fraction, et une barre afficherait « 0,5 sur 4,0 » après une
bascule où 3 kWh ont pu être achetés. Soit `targetWh` est rebasée, soit un
champ dit depuis quand on mesure. Aucune barre avant que ce soit tranché.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GKM8FDNHZWogAsjjfB8pSw