ModbusAttr und zusammenhängende Register

Begonnen von freetz, 26 Mai 2023, 23:33:54

Vorheriges Thema - Nächstes Thema

freetz

Hallo zusammen,

ich frage meinen SolarEdge Wechselrichter über das ModbusAttr-Modul ab und bin damit eigentlich sehr zufrieden.
Das Problem ist nur, dass einige Register nicht "für sich" stehen, so z.B. die momentane PV-Produktion in Watt, sondern über ein weiteres Register die Zehnerpotenz mitgeliefert wird. Wenn also 35 als momentane Leistung übermittelt werden und im Faktor-Register eine 2, dann bedeutet das 350*10^2 = 3500 Watt.
Das Problem ist, dass ModbusAttr die angelegten Werte anscheinend einzeln abfragt und es durch die Verzögerung passieren kann, dass Leistung und Faktor nicht mehr stimmen. Wenn also als im obigen Beispiel die Leistung auf 3500 und der Faktor auf 0, dann bedeutet das das gleiche, aber wenn FHEM den Faktor gerade abgefragt hat, und da noch eine 2 steht, bedeutet das dann auf einmal eine Leistung von 3500*10^2 = 350000 Watt.

Das ist normalerweise kein Problem, denn spätestens im nächsten Abruf korrigiert sich das dann ja wieder, aber da ich auf diesen Wert ein DOIF laufen habe, der entsprechend der PV-Produktion Handlungen vornimmt, habe ich da dann mitunter fleißiges Hin- und Herschalten bei den entsprechend daran anknüpfenden Geräten.

Ich würde das gerne dadurch verhindern, dass ich Leistung und Faktor über einen Aufruf auslese. Das würde theoretisch auch gehen, weil die Werte in direkt hintereinander liegenden Registern gespeichert sind. Statt zweimal einen 16-Bit Wert, würde ich dann einen 32-Bit Wert auslesen. Die Frage ist nur, wie ich dann die entsprechende Berechnung durchführen kann, um die ersten 16 Bit mit einer aus den zweiten 16 Bit gebildeten Zehnerpotenz multiplizieren kann. Denn so wie ich es verstehe, kann ich ja nur mit Perls Pack- und sprintf-Funktion arbeiten, aber damit geht das glaube ich nicht.

Hat da jemand eine Idee, wie man das am sinnvollsten löst?

Vielen Dank im Voraus,

F.
Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/bsb_lan

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

freetz

#1
Ok, die besten Fragen sind die, die man sich mit etwas längerem Googlen selber beantworten kann:
Ich hatte die -expr Möglichkeit übersehen, damit lässt sich das sehr gut umsetzen:
obj-h40083-expr ((($val >> 16) & 0x8000) ? -((~($val >> 16) & 0xffff) + 1) : ($val >> 16)) * (10 ** (($val & 0x8000) ? -((~$val & 0xffff) + 1) : $val))
obj-h40083-len 2
obj-h40083-reading Power_Ac
obj-h40083-unpack L>

Vielleicht hilft's ja noch jemandem, der bei der Suche darüber stolpert. Zumindest die Umwandlung von unsigned 16 Bit Integern in signed 16 Bit Integer fand ich geschickt gelöst. Oder könnte man hier in -expr auch unpack in Verbindung mit $val einsetzen? Dann wäre es vermutlich noch "lesbarer"...
Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/bsb_lan

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

PotatoFritz

Aus https://forum.fhem.de/index.php?topic=80767.msg853782#msg853782

habe ich folgendes gelesen :
obj-h40083-reading I_AC_Power
obj-h40083-len 2
obj-h40083-unpack s>s>
obj-h40083-expr $val[0] * (10 ** $val[1])

freetz

Oh, danke, das ist ja sehr viel eleganter, super!
Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/bsb_lan

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan