From f8c0f24c40a7d96e01d2009d390c64ebce7af18a Mon Sep 17 00:00:00 2001 From: Patrick Schurig Date: Wed, 26 Aug 2026 17:17:02 +0200 Subject: [PATCH] =?UTF-8?q?docs(sunspec):=20D-10=20=E2=80=94=20la=20g?= =?UTF-8?q?=C3=A9om=C3=A9trie=20des=20mod=C3=A8les=20est=20fig=C3=A9e=20?= =?UTF-8?q?=C3=A0=20la=20d=C3=A9couverte?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Constaté en reconstruisant le banc le 2026-08-26. Le simulateur a été redémarré sans batterie puis de nouveau avec, sans jamais rompre la connexion TCP. Le plugin a continué de lire l'ancienne géométrie : `ProtocolError` toutes les 7 s sur le modèle 124 disparu, puis — une fois la batterie revenue — un `currentPower` FIGÉ à 0 pendant que les registres portaient StCha = 2000 W et ChaSt = Charging. Trois minutes de `thingPower` à 0.0 sur une batterie en charge. Un `systemctl restart nymead` force la redécouverte et la valeur repart immédiatement à 2000,0 W. Le défaut n'est donc ni dans le signe ni dans le mapping de D-9 : ceux-là sont justes et le prouvent dès que la découverte est refaite. Il est dans le fait qu'une liaison thing↔modèle est établie une fois et jamais reconsidérée — et le storage y est plus exposé que les autres things parce qu'il dépend maintenant de TROIS modèles au lieu d'un. Rare sur matériel, mais pas théorique : une mise à jour de firmware, ou une batterie ajoutée à un hybride déjà appairé, produisent la même transition. Le signal existe déjà et n'est pas exploité — le ProtocolError répété à une adresse jusque-là valide dit que la chaîne a bougé. Documenté, pas corrigé : cela touche au cycle de découverte, hors périmètre. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01Y3gzsuwENJfJtvuNDT3xGn --- sunspec/DIVERGENCES.md | 46 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/sunspec/DIVERGENCES.md b/sunspec/DIVERGENCES.md index 01bbc38..6e700a6 100644 --- a/sunspec/DIVERGENCES.md +++ b/sunspec/DIVERGENCES.md @@ -354,3 +354,49 @@ est en outre vérifiée **à la compilation** par `nymea-plugininfocompiler` : essayer `KiloWattHour` sur `currentPower` fait échouer le build avec « claims to implement interface "energystorage" but state "currentPower" has not matching unit ». + +--- + +## D-10 — la géométrie des modèles est figée à la découverte (MESURÉ) + +**Contexte.** Le plugin lie chaque thing à un `SunSpecModel` au moment de la +découverte : identifiant de modèle, registre de départ, longueur. Les modèles +compagnons du storage (160, 120) sont liés de la même façon, par +`bindStorageCompanionModels()`. + +**L'écart.** Rien ne redécouvre la chaîne tant que la **connexion** ne tombe pas. +Si l'appareil change la FORME de sa chaîne sans rompre le TCP, le plugin +continue de lire l'ancienne géométrie. + +**Mesure du 2026-08-26.** Le simulateur `.211` a été redémarré sans batterie, puis +de nouveau avec. Trois états successifs, connexion Modbus jamais rompue : + +| moment | chaîne | ce que fait le plugin | +|---|---|---| +| avant | 160 `L=88` (4 blocs) · 124 présent | `currentPower` suit la batterie | +| sans batterie | 160 `L=48` (2 blocs) · **124 absent** | `Read data block response error: ProtocolError` toutes les 7 s sur `"storage"` — il lit toujours 40355 | +| batterie revenue | 160 `L=88` · 124 présent | les erreurs cessent, mais **`currentPower` reste figé à sa dernière valeur** | + +`thingPower` du storage : `0.0` à 16:09, 16:10, 16:11 pendant que les registres +portaient `StCha = 2000 W` et `ChaSt = Charging`. Un `systemctl restart nymead` +force la redécouverte, et la valeur repart immédiatement — `2000.0` à 16:13. + +**Ce que cela apprend.** Le défaut n'est ni dans le signe ni dans le mapping de +D-9 : ceux-là sont justes, et le prouvent dès que la découverte est refaite. +Il est dans le fait qu'une liaison thing↔modèle est établie une fois et jamais +reconsidérée. Le storage y est plus exposé que les autres things parce qu'il +dépend de **trois** modèles au lieu d'un. + +**Portée réelle.** Au banc, c'est fréquent : tout redémarrage du simulateur avec +d'autres options change la chaîne. Sur du matériel, c'est rare mais pas +théorique — une mise à jour de firmware, ou une batterie ajoutée à un hybride +déjà appairé, produisent exactement cette transition. + +**Contournement aujourd'hui.** Redémarrer `nymead`, ou retirer et rajouter la +connexion. La perte de la connexion TCP suffit aussi, puisqu'elle déclenche une +redécouverte. + +**Comment lever.** Redécouvrir périodiquement, ou sur erreur Modbus répétée à une +adresse jusque-là valide — le `ProtocolError` toutes les 7 s du tableau ci-dessus +est précisément le signal que la chaîne a bougé, et il est actuellement journalisé +sans conséquence. Hors périmètre de D-9, qui ne touche pas au cycle de découverte.