etm-powersync-app/test/fixtures/loadconfig_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

88 lines
2.4 KiB
JSON

{
"_source": "dump réel HEMS 192.168.1.75, NymeaEnergy.GetLoadConfig, 2026-08-25 — plugin 1.15.2+etm15 (lot B-bis : la PAC entre en configuration).",
"_note": "Deux charges : 'chauffe-eau' (relay-router) et 'pac-terrain' (sg-ready), cette dernière n'était PAS configurable avant etm15. Les deux ont domain:'' = non classé. Conserve les charges utiles VIDES des mécanismes inutilisés (sgReady:{}, powerLevels:[], relays:[]) — sérialisation par méta-objet. Ne PAS nettoyer : c'est ce qui rend l'aller-retour Get→Set neutre.",
"loadConfigs": [
{
"adapter": "relay-router",
"domain": "",
"enabled": true,
"id": "chauffe-eau",
"label": "chauffe-eau",
"maxPowerW": 0,
"minOffS": 60,
"minOnS": 60,
"mode": "fixed",
"needs": {
"dailyDeadline": "",
"minEnergyWhPerDay": 0
},
"powerLevels": [],
"priority": 1,
"relays": [
{
"powerW": 500,
"thingId": "{8538782f-2c8c-4a30-bfce-c8140f791c9b}"
},
{
"powerW": 1000,
"thingId": "{2ebe6bef-829b-4695-9d11-ddb4c16c5448}"
},
{
"powerW": 2000,
"thingId": "{b033b212-1adb-4df0-ba2b-8fa477de52a2}"
}
],
"sgReady": {}
},
{
"adapter": "sg-ready",
"domain": "",
"enabled": true,
"id": "pac-terrain",
"label": "PAC banc",
"maxPowerW": 0,
"minOffS": 0,
"minOnS": 0,
"mode": "fixed",
"needs": {
"dailyDeadline": "",
"minEnergyWhPerDay": 0
},
"powerLevels": [],
"priority": 2,
"relays": [],
"sgReady": {
"minStateHoldS": 300,
"states": [
{
"estimatedPowerW": 0,
"relays": [
"{beaf92e1-aedc-4b84-9ce4-e423648638cc}"
],
"state": 1
},
{
"estimatedPowerW": 0,
"relays": [],
"state": 2
},
{
"estimatedPowerW": 1500,
"relays": [
"{bf236e64-5ae7-4bf1-82a6-4ede03de75a6}"
],
"state": 3
},
{
"estimatedPowerW": 3000,
"relays": [
"{beaf92e1-aedc-4b84-9ce4-e423648638cc}",
"{bf236e64-5ae7-4bf1-82a6-4ede03de75a6}"
],
"state": 4
}
]
}
}
]
}