Le relevé du 2026-08-26 a montré DCW_SF passant de -2 à -1 entre une batterie à l'arrêt et une batterie en charge, sur le même onduleur, à quelques secondes d'intervalle. Un DCW brut de 20000 vaut 200,0 W avec le premier facteur et 2000,0 W avec le second. Ce que ça casserait est de la même famille que d08cf50 mais plus discret : pas de dénormal, pas d'erreur Modbus, un appareil qui se déclare connected, et une puissance simplement dix fois fausse. La propriété tient aujourd'hui parce que libnymea-sunspec lit les 90 registres du modèle 160 en une transaction et relit les facteurs du bloc fixe AVANT les blocs répétés — deux propriétés qui vivent en amont, que rien dans le compilateur ne tient, et qu'une optimisation de la lecture ferait sauter sans aucun signe extérieur. Le commentaire est donc à l'endroit qui en dépend : au-dessus de storageModuleReadings(), qui consomme dcPower(), avec un pointeur au site de readBlockData() et sur le champ ModuleReading::dcPower. Le README documente en outre le côté exploitation de D-9 : un onduleur qui publie le 124 sans le 160 porte energystorage avec un currentPower figé à zéro, avec les deux lignes de journal exactes à chercher et la commande pour les trouver.
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.