+etm23 rend à chaque borne détectée une entrée GetLoadConfig, et l'invariant loads[] ⊆ GetLoadConfig est rétabli. Sur .75 : 2 entrées → 4. L'app s'appuyait déjà sur cet invariant pour résoudre libellé, domaine et rang de toute charge publiée. Vérifié sur machine avant d'écrire quoi que ce soit : - l'aller-retour verbatim reste NEUTRE avec les quatre entrées (loadconfig_roundtrip.dart, verdict IDENTIQUE) ; - une entrée evcharger porte id/label/domain/priority/enabled, mode dynamic, et AUCUNE charge utile de mécanisme. Trois défauts que ce contrat révèle côté app : 1. isVariableLoad était défini par défaut (« ni relais ni sg-ready »), donc une borne y tombait. L'écran de mécanisme lui proposait une puissance nominale, des paliers et des temporisations — des réglages qui n'existent pas pour elle et dont l'écriture partirait quand même. Pire, le sélecteur offrait de la basculer en routeur de relais : une bascule que basculerMecanisme() sait construire et qu'aucun écran ne sait défaire. Une borne a maintenant sa section, en lecture seule, qui dit pourquoi il n'y a rien à régler. 2. BorneSection existait pour rattraper des bornes qui n'apparaissaient nulle part. Elles apparaissent maintenant dans leur domaine : la section les afficherait DEUX fois, en affirmant qu'elles n'ont « ni rang ni domaine » et qu'elles ne passent pas par SetLoadConfig. Trois affirmations devenues fausses. Retirée ; son contenu de runtime vit désormais dans l'écran de mécanisme, où il a un sens. 3. Le rang par défaut d'une borne est un ARTEFACT, et l'écran le disait comme un réglage. À la création le plugin donne « le plus petit rang existant moins un, borné à 1 » ; le chauffe-eau occupant déjà le rang 1, l'intention « en tête » dégénère en égalité — trois charges à 1 sur le banc. Le tri reste total (l'id départage), donc l'ordre est reproductible, et c'est précisément ce qui le rend crédible : l'installateur lit un classement plausible et n'y touche pas, validant un ordre que personne n'a posé. Une note le nomme, et disparaît dès le premier vrai réglage. Le glissement, lui, n'a demandé aucun cas particulier — c'était tout l'intérêt d'avoir une seule liste. Vérifié par test, y compris l'inversion borne / charge pilotée. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016vrTVifar2GN5rtUh89Wkq
139 lines
3.5 KiB
JSON
139 lines
3.5 KiB
JSON
{
|
|
"_source": "dump reel HEMS 192.168.1.75, plugin 1.15.2+etm24, NymeaEnergy.GetLoadConfig, 2026-08-27",
|
|
"_note": "Le lot plugin 3g-2 (+etm23) cree d office une entree LoadConfig par borne detectee, pour retablir l invariant loads[] inclus dans GetLoadConfig. Deux entrees adapter=evcharger, mode=dynamic, domain=ev, SANS aucune charge utile de mecanisme. Noter les trois priority a 1 : rang par defaut degenere en egalite, artefact et non choix.",
|
|
"loadConfigs": [
|
|
{
|
|
"adapter": "relay-router",
|
|
"domain": "ecs",
|
|
"enabled": true,
|
|
"id": "chauffe-eau",
|
|
"label": "chauffe-eau",
|
|
"maxPowerW": 0,
|
|
"meterThingId": "4938b26a-d862-437f-b681-aaff7bce23ff",
|
|
"minOffS": 60,
|
|
"minOnS": 60,
|
|
"minPowerW": 0,
|
|
"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"
|
|
}
|
|
],
|
|
"sensorThingId": "",
|
|
"sgReady": {}
|
|
},
|
|
{
|
|
"adapter": "sg-ready",
|
|
"domain": "heating",
|
|
"enabled": true,
|
|
"id": "pac-terrain",
|
|
"label": "PAC banc",
|
|
"maxPowerW": 0,
|
|
"meterThingId": "e37be924-c5c5-4858-ad0c-c82650b96db0",
|
|
"minOffS": 0,
|
|
"minOnS": 0,
|
|
"minPowerW": 0,
|
|
"mode": "fixed",
|
|
"needs": {
|
|
"dailyDeadline": "",
|
|
"minEnergyWhPerDay": 0
|
|
},
|
|
"powerLevels": [],
|
|
"priority": 2,
|
|
"relays": [],
|
|
"sensorThingId": "",
|
|
"sgReady": {
|
|
"minStateHoldS": 300,
|
|
"states": [
|
|
{
|
|
"estimatedPowerW": 0,
|
|
"relays": [
|
|
"{beaf92e1-aedc-4b84-9ce4-e423648638cc}"
|
|
],
|
|
"state": 1
|
|
},
|
|
{
|
|
"estimatedPowerW": 1200,
|
|
"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
|
|
}
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"adapter": "evcharger",
|
|
"domain": "ev",
|
|
"enabled": true,
|
|
"id": "{09e520fd-d472-47c4-8887-6e7759372889}",
|
|
"label": "Simulated wallbox",
|
|
"maxPowerW": 0,
|
|
"meterThingId": "",
|
|
"minOffS": 0,
|
|
"minOnS": 0,
|
|
"minPowerW": 0,
|
|
"mode": "dynamic",
|
|
"needs": {
|
|
"dailyDeadline": "",
|
|
"minEnergyWhPerDay": 0
|
|
},
|
|
"powerLevels": [],
|
|
"priority": 1,
|
|
"relays": [],
|
|
"sensorThingId": "",
|
|
"sgReady": {}
|
|
},
|
|
{
|
|
"adapter": "evcharger",
|
|
"domain": "ev",
|
|
"enabled": true,
|
|
"id": "{88160e45-7df2-48cc-9639-f0d15ae6e382}",
|
|
"label": "Terra AC Charger (TCP)",
|
|
"maxPowerW": 0,
|
|
"meterThingId": "",
|
|
"minOffS": 0,
|
|
"minOnS": 0,
|
|
"minPowerW": 0,
|
|
"mode": "dynamic",
|
|
"needs": {
|
|
"dailyDeadline": "",
|
|
"minEnergyWhPerDay": 0
|
|
},
|
|
"powerLevels": [],
|
|
"priority": 1,
|
|
"relays": [],
|
|
"sensorThingId": "",
|
|
"sgReady": {}
|
|
}
|
|
]
|
|
}
|