etm-powersync-app/test/fixtures/loadtelemetry_hems75_thingmissing.json
Patrick Schurig 33d89a8c26 fix(ev): la réserve THING_MISSING est levée par la mesure, et la carte véhicule part
Deux gestes que le relevé du banc a tranchés, dans les deux sens.

1. THING_MISSING — MESURÉ, la réserve tombe

GetLoadTelemetry sur .75, 2026-08-28 10:29 UTC : la Terra AC supprimée est publiée
available=false · faultCode=THING_MISSING · decision=LOAD_UNAVAILABLE{frozenW:0} ·
mechanism.kind=evcharger. Le code SORT. Le test de rendu ne repose plus sur une trame
composée mais sur cette capture (test/fixtures/loadtelemetry_hems75_thingmissing.json).

Le masquage relevé mardi (etmvariableloadadapter.cpp:148-150, m_faulted testé avant que
THING_MISSING ne puisse s'exprimer) concerne l'adaptateur des charges VARIABLES — relais
et SG-Ready. L'adaptateur evcharger n'a pas ce chemin, d'où la différence. Il n'est donc
pas corrigé, seulement contourné par le hasard du chemin de code : remonté au brief
moteur avec la trame, parce que les deux codes envoient le client faire deux gestes
différents — « écriture échouée » fait démonter un coffret, « appareil absent » fait
rouvrir nymea.

2. EVChargingCard — elle part, et la monter aurait publié de la fiction

Trois des grandeurs qu'elle affiche ne sont JAMAIS lues sur la box : chargingMode,
chargingPower (3,6 kW) et solarSourcePercent (82 %) sont des valeurs par défaut de
EnergyData — _updateEnergyData ne les touche pas, et le mode n'est écrit qu'en optimiste
après une commande, jamais relu par GetChargingInfos. Sa feuille « Paramètres de charge »
proposait en plus un courant minimum, qui n'existe dans aucun contrat, et son bouton
« Enregistrer » ne faisait que Navigator.pop : rien n'était écrit. Ce n'était pas du code
mort à ranimer, c'était un écran à réécrire depuis le modèle.

⚠️ Et la surface vivante est pire que la morte : _EVWidget (favorites_screen.dart:419)
affiche les MÊMES valeurs par défaut comme si elles étaient mesurées — « 3600 W »,
« 82 % solaire », « Mode PV » — et écrit le mode sur des pastilles de 7 à 10 px sans
restituer un refus. Entrée 🔴 au TODO, avec ce qu'une carte de recharge peut dire
aujourd'hui : le mode lu par GetChargingInfos, la puissance mesurée du Thing, l'échéance
comme intention saisie. Ni SOC (n'existe pas), ni chargeEnergy (remis à zéro à chaque
interruption), ni courant minimum, ni phaseCount.

146 tests passent. flutter analyze : 27 remarques, deux de moins qu'avant — les deux
étaient dans le fichier supprimé.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SQbZKrWqsMFP1Lh2jjjd9f
2026-08-28 12:36:00 +02:00

85 lines
2.2 KiB
JSON

{
"_note": "Capturé pour éprouver le RENDU de THING_MISSING sur une charge réelle. La Terra AC Charger (TCP) a été supprimée de nymea le 2026-08-26 ; son entrée LoadConfig survit au rang 4, et la télémétrie la publie available=false / faultCode=THING_MISSING / decision=LOAD_UNAVAILABLE{frozenW:0}, mechanism.kind=evcharger. ⚠️ Le masquage relevé mardi (etmvariableloadadapter.cpp:148-150, m_faulted testé avant THING_MISSING) concerne l'adaptateur des charges VARIABLES : sur l'adaptateur evcharger, le code sort tel quel. Les deux autres bornes (Simulated wallbox, V2C Trydan) sont absentes de loads[] — aucun véhicule branché, comportement +etm24.",
"_source": "dump réel HEMS 192.168.1.75, NymeaEnergy.GetLoadTelemetry, 2026-08-28 10:29 UTC — plugin 1.15.2+etm24.",
"telemetry": {
"budget": {
"allocatedW": 5000,
"evReservedW": 0,
"recreditedW": 5000,
"remainingW": 5741.7001953125,
"surplusW": 5741.7001953125
},
"degradedMode": false,
"loads": [
{
"allocatedW": 3500,
"available": true,
"decision": {
"code": "SURPLUS_SETPOINT",
"params": {
"budgetW": 9242,
"setpointW": 3500,
"stepped": true
}
},
"funding": "surplus",
"loadId": "chauffe-eau",
"measuredW": 1500,
"mechanism": {
"kind": "relay",
"maxStageW": 3500,
"stageW": 3500,
"stagesW": [
0,
500,
1000,
1500,
2000,
2500,
3000,
3500
]
}
},
{
"allocatedW": 1500,
"available": true,
"decision": {
"code": "LOCK_MIN_STATE_HOLD",
"params": {
"state": 3
}
},
"funding": "surplus",
"loadId": "pac-terrain",
"lock": {
"kind": "minStateHold",
"remainingS": 60
},
"measuredW": 800,
"mechanism": {
"estimatedPowerW": 1500,
"kind": "sgReady",
"state": 3
}
},
{
"allocatedW": 0,
"available": false,
"decision": {
"code": "LOAD_UNAVAILABLE",
"params": {
"frozenW": 0
}
},
"faultCode": "THING_MISSING",
"funding": "surplus",
"loadId": "{88160e45-7df2-48cc-9639-f0d15ae6e382}",
"mechanism": {
"kind": "evcharger"
}
}
],
"timestamp": "2026-08-28T10:29:00Z"
}
}