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
SunSpec
Connect nymea to SunSpec devices over Modbus TCP
Supported Things
- SunSpec Inverter
- Model ID 101 & 111 Single phase inverter
- Model ID 102 & 112 Split phase inverter
- Model ID 103 & 113 Three phase inverter
- SunSpec Meter
- Model ID 201 & 211 Single phase meter
- Model ID 202 & 212 Split phase meter
- Model ID 203 & 213 Three phase meter
- SunSpec Storage
- Model ID 124 (state of charge, status, setpoints)
- Model ID 160 (instantaneous power,
StCha/StDisChablocks) - Model ID 120 (rated capacity,
WHRtg)
Tested connections
- SolarEdge (with custom battery)
Requirements
- The package 'nymea-plugin-sunspec' must be installed.
- The SunSpec device must support SunSpec over modbus TCP
More
Exploitation — batterie visible mais non mesurable
Depuis 1.15.2+etm10, la thingClass SunSpec Storage déclare l'interface
energystorage. C'est ce qui la rend visible au bilan de puissance de nymea
(currentPowerStorage), à la réserve de recharge du véhicule, et à la réserve du
waterfall. Avant, elle ne déclarait que battery et aucun des trois ne la
trouvait.
L'état currentPower se lit dans le modèle 160, pas dans le modèle 124 qui
n'a aucun registre de puissance. Conséquence à connaître avant de diagnostiquer
une batterie « à zéro » :
Un onduleur SunSpec qui publie le modèle 124 sans modèle 160 porte l'interface
energystorageavec uncurrentPowerqui ne bougera jamais de zéro. C'est le cas des appareils SunSpec génériques. La batterie apparaît alors dans le bilan, comptée pour 0 W — ce qui se lit « ni charge ni décharge », et non « je ne sais pas ».
Ce cas est annoncé une fois par thing dans le journal de nymead, au
démarrage ou au premier relevé qui suit la découverte. Deux formulations, selon
la cause :
W | SunSpec: Storage "<nom>" has no model 160 on its connection: currentPower
has no register to read and will stay at 0. This storage is visible to the
energy balance but not measurable.
W | SunSpec: Storage "<nom>" has a model 160 but no StCha/StDisCha block:
currentPower has nothing to read and will stay at 0.
La seconde forme est le cas d'un onduleur hybride sans batterie câblée : il
publie N = 2 (les deux strings PV) et aucun bloc batterie.
À vérifier en premier sur un site où currentPowerStorage reste à zéro :
journalctl -u nymead | grep -i "will stay at 0"
Si la ligne est là, le défaut est dans ce que l'appareil publie, pas dans nymea. Si elle est absente, la batterie est mesurée et le zéro est une vraie mesure.
L'état capacity (kWh) vient de WHRtg du modèle 120. Quand la plaque
signalétique ne l'implémente pas, l'état est laissé tel quel plutôt que remis
à zéro : un zéro se lirait comme une mesure. Aucune règle du moteur ne lit
capacity à ce jour.
Détail du raisonnement, de la mesure du signe et de l'écart assumé :
DIVERGENCES.md, entrée D-9.