docs(sunspec): D-10 — la géométrie des modèles est figée à la découverte

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) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y3gzsuwENJfJtvuNDT3xGn
This commit is contained in:
Patrick Schurig 2026-08-26 17:17:02 +02:00
parent 2bb3ff570b
commit f8c0f24c40

View File

@ -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.