Constaté au banc à 14:41:58 : l'avertissement « has a model 160 but no StCha/StDisCha block » a été émis une fois, au démarrage, sur une machine dont les deux blocs existent et dont le currentPower a ensuite suivi la batterie correctement en charge, en décharge et au repos. Cause. libnymea-sunspec crée les blocs répétés d'un modèle depuis `initFinished`, émis pendant la PREMIÈRE lecture, juste avant `blockUpdated`. Sur ce premier signal les blocs existent mais n'ont jamais été remplis : tous les `IDStr` sont vides, rien ne se classe, et `hasBatteryBlocks()` répond faux. Cette réponse est exacte et hors sujet — la question n'était pas « pas de batterie » mais « pas encore lu ». Ce que le faux positif coûtait. Ce n'est pas du bruit : le README dit à l'exploitation de chercher cette ligne EN PREMIER pour distinguer une batterie cassée d'une batterie non mesurable. Une ligne qui sort à chaque démarrage sain ne distingue plus rien, et le diagnostic que ce lot venait d'installer était mort-né. Les deux questions sont maintenant posées séparément : `blocksAreIdentified()` avant `hasBatteryBlocks()`. Sans identification, on se tait et on attend le tour suivant — `readBlockData()` passe à chaque rafraîchissement de toute façon. Le garde en double au moment du binding disparaît aussi : les deux updaters se gardent eux-mêmes, un seul endroit à tenir à jour plutôt que deux qui peuvent diverger. Deux tests figent la distinction, dont un sur le cas où l'avertissement DOIT sortir — un GEN24 sans batterie, lu, identifié, sans bloc batterie. 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.