etm-powersync-app/test/fixtures/loadtelemetry_hems75_v3.json
Patrick Schurig dee20896c5 feat(télémétrie): lot B app — consommation de la télémétrie d'arbitrage
Le lot plugin B-bis (1.15.2+etm15) est sur .75 et GetLoadConfig/GetLoadTelemetry
concordent : les critères 4 à 8 du brief deviennent atteignables.

- models/load_telemetry.dart : vue en lecture. timestamp/budget/mechanism/lock/
  faultCode nullables — omis porte un sens que zéro ne porterait pas.
- services/telemetry_text.dart : rendu français des CODES (19 motifs, 3 défauts,
  3 verrous, 4 mécanismes). Repli lisible sur un code inconnu ET sur un code connu
  privé d'un paramètre : une phrase trouée a l'air d'une donnée, le code brut a
  l'air de ce qu'il est.
- providers/load_telemetry_provider.dart : instantané + LoadTelemetryChanged,
  fraîcheur à trois signaux (âge du timestamp, silence des trames, timestamp qui
  cesse d'avancer), machine à états de ClearLoadFault qui ne conclut JAMAIS sur
  l'acquittement du RPC.
- load_config_provider : assignDomain() en brouillon, énumération fermée.
- load_order_screen : budget, fraîcheur, mode dégradé, bloc par charge, encart
  défaut, menu de domaine.
- nymea_service : getLoadTelemetry(), clearLoadFault(), aiguillage de la
  notification. Une box sans la méthode s'annonce comme telle, pas comme en panne.

Seuil de fraîcheur à 180 s : le battement de cœur du plugin est de 60 s et le
timestamp avance d'un cycle par minute. Un seuil plus court crierait « données
anciennes » sur une installation vivante.

Fixtures v3 prises sur .75 après déploiement, dont un cycle porteur d'un verrou —
« lock » étant optionnel, un dump pris au mauvais moment ne l'éprouverait pas.

57 tests (30 avant), flutter analyze inchangé à 25 issues.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XPUo3RMr8SzK6qbFtfBm8H
2026-08-25 19:20:30 +02:00

52 lines
1.6 KiB
JSON

{
"_source": "dump réel HEMS 192.168.1.75, NymeaEnergy.GetLoadTelemetry, 2026-08-25 — plugin 1.15.2+etm15.",
"_note": "Charge utile IDENTIQUE à la notification LoadTelemetryChanged. loads[] ⊆ GetLoadConfig depuis etm15 : plus aucune charge arbitrée hors configuration. decision.code / faultCode sont des CODES à params numériques, jamais des phrases. 'timestamp' absent = aucun cycle depuis le démarrage ; 'budget' absent = mode dégradé L2. Identité vérifiable : surplusW + recreditedW - allocatedW == remainingW.",
"telemetry": {
"budget": {
"allocatedW": 6500,
"evReservedW": 0,
"recreditedW": 6500,
"remainingW": 4735.7001953125,
"surplusW": 4735.7001953125
},
"degradedMode": false,
"loads": [
{
"allocatedW": 3500,
"available": true,
"decision": {
"code": "SURPLUS_SETPOINT",
"params": {
"budgetW": 8236,
"setpointW": 3500,
"stepped": true
}
},
"loadId": "chauffe-eau",
"mechanism": {
"kind": "relay",
"maxStageW": 3500,
"stageW": 3500
}
},
{
"allocatedW": 3000,
"available": true,
"decision": {
"code": "SG_FORCED",
"params": {
"budgetW": 7736,
"estimatedW": 3000
}
},
"loadId": "pac-terrain",
"mechanism": {
"estimatedPowerW": 3000,
"kind": "sgReady",
"state": 4
}
}
],
"timestamp": "2026-08-25T16:50:00Z"
}
}