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
39 lines
1.5 KiB
JSON
39 lines
1.5 KiB
JSON
{
|
|
"_source": "dump réel HEMS 192.168.1.75, NymeaEnergy.GetLoadTelemetry, cycle 2026-08-25T16:47:00Z — plugin 1.15.2+etm15.",
|
|
"_note": "Même banc que loadtelemetry_hems75_v3.json, trois cycles plus tôt : la PAC y porte un verrou minStateHold actif (60 s restantes). Conservé parce que 'lock' est OPTIONNEL — un dump pris au mauvais moment n'en contient aucun, et la lecture du verrou n'y serait pas éprouvée. Les secondes restantes datent du cycle : elles ne se décomptent pas côté app.",
|
|
"telemetry": {
|
|
"budget": {
|
|
"allocatedW": 6500,
|
|
"evReservedW": 0,
|
|
"recreditedW": 6500,
|
|
"remainingW": 8396.900390625,
|
|
"surplusW": 8396.900390625
|
|
},
|
|
"degradedMode": false,
|
|
"loads": [
|
|
{
|
|
"allocatedW": 3500,
|
|
"available": true,
|
|
"decision": {
|
|
"code": "SURPLUS_SETPOINT",
|
|
"params": { "budgetW": 11897, "setpointW": 3500, "stepped": true }
|
|
},
|
|
"loadId": "chauffe-eau",
|
|
"mechanism": { "kind": "relay", "maxStageW": 3500, "stageW": 3500 }
|
|
},
|
|
{
|
|
"allocatedW": 3000,
|
|
"available": true,
|
|
"decision": {
|
|
"code": "SG_FORCED",
|
|
"params": { "budgetW": 11397, "estimatedW": 3000 }
|
|
},
|
|
"loadId": "pac-terrain",
|
|
"lock": { "kind": "minStateHold", "remainingS": 60 },
|
|
"mechanism": { "estimatedPowerW": 3000, "kind": "sgReady", "state": 4 }
|
|
}
|
|
],
|
|
"timestamp": "2026-08-25T16:47:00Z"
|
|
}
|
|
}
|