Also an sich ist es sehr einfach:
var mbm = modbusmaster()
mbm.connection('192.168.x.y:pppp') // TCP-Adresse und Port (falls nicht Standard: 502) des modbus-slaves eintragen
var status = mbm.readreg(40072)
log("Inverter Status = %d", status)
Ob die "Unit IDs" im Modbus-Kontext eine Bedeutung haben, ist mir unklar, ich denke eher nicht - die Registeradressen alleine sollten reichen, das richtige "Unit" anzusprechen.
Das status
-Beispiel liest einen uint16
-Wert, die meisten interessanten Werte in Deiner Tabelle sind aber float32
. Modbus-Register sind an sich immer 16bit; diese 32bit-floats sind jeweils in zwei aufeinanderfolgenden Registern gespeichert, und es gibt vier Arten, wie genau das codiert ist.
Mangels Testobjekt hatte ich den float32-Support bisher nicht bis ins p44script gezogen, aber hier ist die Gelegenheit! Also gibt's in der nächsten Beta (2.8.2.34) neue Funktionen readfreg
/writefreg
, um floats zu lesen und zu schreiben, und floatmode
um eine der vier Codierungsarten zu wählen - welche auf den Inverter passt müsste in der Doku irgendwo stehen.
mbm.floatmode('dcba') // scheint der üblichste Modus zu sein
var dcpower = mbm.readfreg(40084) // liest 40084+40085 und fügt sie zu einem float zusammen
log("DC Power = %f W", dcpower)
Diese Zugriffe kannst Du nun in ein passendes scripted device z.B. alle 5 min in einem on (every(0:05)) { ... }
ausführen, und damit die Sensoren des Devices befüllen. Die passenden Sensortypen gibts in DS, leider macht aber der dSS nichts direkt damit. Aber in Evaluatoren kannst Du die dann verwenden für eigene Logik, und dann mit dem Binär-Resultat im dSS Aktionen auslösen.
Das mal ganz grob, wenns weitere Fragen gibt, einfach melden!