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
52 lines
1.6 KiB
JSON
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"
|
|
}
|
|
} |