Stromverbrauch mit PZEM-004T und ModbusAttr

Begonnen von ivor, 15 August 2021, 13:20:10

Vorheriges Thema - Nächstes Thema

ivor

Hallo zusammen

Ich kriege irgendwie auch nach langem Wiki- und Forenlesen das ModbusAttr nicht mit der Doku von PZEM-004T zusammen und bräuchte ein wenig Starthilfe.

Ich habe drei PZEM-004T (pro Phase einen), welche via TTL auf USB an den FHEM host angehängt sind:

defmod MbPzem004t1 Modbus /dev/serial/by-id/usb-Silicon_Labs_CP2108_Quad_USB_to_UART_Bridge_0001-if00-port0@9600
defmod MbPzem004t2 Modbus /dev/serial/by-id/usb-Silicon_Labs_CP2108_Quad_USB_to_UART_Bridge_0001-if01-port0@9600
defmod MbPzem004t3 Modbus /dev/serial/by-id/usb-Silicon_Labs_CP2108_Quad_USB_to_UART_Bridge_0001-if02-port0@9600
defmod MbAttrPzem004t1 ModbusAttr 1 5 RTU


...so nun hört es schon auf beim Verständnis, wie bekomme ich die Read  measurement aus Kapitel 2.3:
https://innovatorsguru.com/wp-content/uploads/2019/06/PZEM-004T-V3.0-Datasheet-User-Manual.pdf
mit dem ModbusAttr hin?

Besten Dank für ein paar Hinweise.

gruss ivo

StefanStrobel

Hallo Ivo,

Du musst noch Objekte definieren. Beispiele findest Du zahlreich im Forum und in der Referenz.
Laut dem von Dir verlinkten Datenblatt kann man die Register mit function code 4 als input Register lesen.
Also sowas wie

obj-i0-reading current
obj-i0-unpack S
obj-i0-expr $val / 10


Dann noch dass die Register auch zyklisch abgefragt werden sollen:

dev-i-defPoll 1


etc.
Steht so alles in der Commandref ...

Gruß
   Stefan

ivor


Salü Stefan

Besten Dank für die Antwort. Ich bekomme nun einige Werte, welche für mich noch nicht viel Sinn machen, da werde ich mal aber mal rumspielen.
Was für mich noch unklar ist, wie spreche ich den jeweilige tty Port an, davon habe ich ja drei:

define MbPzem004t1 Modbus /dev/serial/by-id/usb-Silicon_Labs_CP2108_Quad_USB_to_UART_Bridge_0001-if00-port0@9600
define MbPzem004t2 Modbus /dev/serial/by-id/usb-Silicon_Labs_CP2108_Quad_USB_to_UART_Bridge_0001-if01-port0@9600
define MbPzem004t3 Modbus /dev/serial/by-id/usb-Silicon_Labs_CP2108_Quad_USB_to_UART_Bridge_0001-if02-port0@9600


Ich habe angenommen, dass dies mittels <id> passiert:
define MbAttrPzem004t1 ModbusAttr 1 5 RTU
define MbAttrPzem004t2 ModbusAttr 2 5 RTU
define MbAttrPzem004t3 ModbusAttr 3 5 RTU


Im Forum habe ich zwar bereits ein Thread dazu gefunden, jedoch scheint der versandet zu sein und ich konnte keine Lösung finden.

gruss ivo

StefanStrobel

Hallo ivo,

dafür gibt es das IODev-Attribut:


attr MbAttrPzem004t1 IODev MbPzem004t1

usw.

Bei einem RS485-Bus hängen übrigens meist mehrere Slaves und ein Master am selben Kabel. Es würde Dir also ein Adapter mit einem RS485-Interface reichen. Dann nimmt ModbusAttr das eine mögliche Interface und schickt darüber die Requests zum jeweiligen Slave, der per Modbus-Id angesprochen wird.

Wenn Du jeden Zähler einzeln verkabeln möchtest, dann musst Du auf Fhem-Seite dem Modbus-Attr-Device sagen, über welches physische Interface es senden soll.

Gruss
   Stefan

ivor

#4
Ich wollte noch meine Lösung posten - falls jemand mal vor dem gleichen Problem steht.

Folgender Aufbau:
Phase 1 -> PZEM-004T -> CP2108_Quad_USB_Port0
Phase 2 -> PZEM-004T -> CP2108_Quad_USB_Port1
Phase 3 -> PZEM-004T -> CP2108_Quad_USB_Port2


define MbPzem004t1 Modbus /dev/serial/by-id/usb-Silicon_Labs_CP2108_Quad_USB_to_UART_Bridge_0001-if00-port0@9600
define MbAttrPzem004t1 ModbusAttr 1 5 RTU
attr MbAttrPzem004t1 IODev MbPzem004t1
attr MbAttrPzem004t1 dev-i-defPoll 1
attr MbAttrPzem004t1 obj-i0-expr $val / 10
attr MbAttrPzem004t1 obj-i0-len 1
attr MbAttrPzem004t1 obj-i0-reading Voltage_V
attr MbAttrPzem004t1 obj-i0-unpack n
attr MbAttrPzem004t1 obj-i1-expr $val / 1000
attr MbAttrPzem004t1 obj-i1-len 2
attr MbAttrPzem004t1 obj-i1-reading Current_A
attr MbAttrPzem004t1 obj-i1-unpack n
attr MbAttrPzem004t1 obj-i3-expr $val / 10
attr MbAttrPzem004t1 obj-i3-len 2
attr MbAttrPzem004t1 obj-i3-reading Power_W
attr MbAttrPzem004t1 obj-i3-unpack n
attr MbAttrPzem004t1 obj-i5-len 2
attr MbAttrPzem004t1 obj-i5-reading Energy_Wh
attr MbAttrPzem004t1 obj-i5-unpack n
attr MbAttrPzem004t1 obj-i7-expr $val / 10
attr MbAttrPzem004t1 obj-i7-len 1
attr MbAttrPzem004t1 obj-i7-reading Frequency_Hz
attr MbAttrPzem004t1 obj-i7-unpack n
attr MbAttrPzem004t1 obj-i8-expr $val / 100
attr MbAttrPzem004t1 obj-i8-len 1
attr MbAttrPzem004t1 obj-i8-reading PowerFactor
attr MbAttrPzem004t1 obj-i8-unpack n
attr MbAttrPzem004t1 obj-i9-len 1
attr MbAttrPzem004t1 obj-i9-reading AlarmStatus
attr MbAttrPzem004t1 obj-i9-unpack n

define MbPzem004t2 Modbus /dev/serial/by-id/usb-Silicon_Labs_CP2108_Quad_USB_to_UART_Bridge_0001-if01-port0@9600
define MbAttrPzem004t2 ModbusAttr 1 5 RTU
attr MbAttrPzem004t2 IODev MbPzem004t2
attr MbAttrPzem004t2 dev-i-defPoll 1
attr MbAttrPzem004t2 obj-i0-expr $val / 10
attr MbAttrPzem004t2 obj-i0-len 1
attr MbAttrPzem004t2 obj-i0-reading Voltage_V
attr MbAttrPzem004t2 obj-i0-unpack n
attr MbAttrPzem004t2 obj-i1-expr $val / 1000
attr MbAttrPzem004t2 obj-i1-len 2
attr MbAttrPzem004t2 obj-i1-reading Current_A
attr MbAttrPzem004t2 obj-i1-unpack n
attr MbAttrPzem004t2 obj-i3-expr $val / 10
attr MbAttrPzem004t2 obj-i3-len 2
attr MbAttrPzem004t2 obj-i3-reading Power_W
attr MbAttrPzem004t2 obj-i3-unpack n
attr MbAttrPzem004t2 obj-i5-len 2
attr MbAttrPzem004t2 obj-i5-reading Energy_Wh
attr MbAttrPzem004t2 obj-i5-unpack n
attr MbAttrPzem004t2 obj-i7-expr $val / 10
attr MbAttrPzem004t2 obj-i7-len 1
attr MbAttrPzem004t2 obj-i7-reading Frequency_Hz
attr MbAttrPzem004t2 obj-i7-unpack n
attr MbAttrPzem004t2 obj-i8-expr $val / 100
attr MbAttrPzem004t2 obj-i8-len 1
attr MbAttrPzem004t2 obj-i8-reading PowerFactor
attr MbAttrPzem004t2 obj-i8-unpack n
attr MbAttrPzem004t2 obj-i9-len 1
attr MbAttrPzem004t2 obj-i9-reading AlarmStatus
attr MbAttrPzem004t2 obj-i9-unpack n

define MbPzem004t3 Modbus /dev/serial/by-id/usb-Silicon_Labs_CP2108_Quad_USB_to_UART_Bridge_0001-if02-port0@9600
define MbAttrPzem004t3 ModbusAttr 1 5 RTU
attr MbAttrPzem004t3 IODev MbPzem004t3
attr MbAttrPzem004t3 dev-i-defPoll 1
attr MbAttrPzem004t3 obj-i0-expr $val / 10
attr MbAttrPzem004t3 obj-i0-len 1
attr MbAttrPzem004t3 obj-i0-reading Voltage_V
attr MbAttrPzem004t3 obj-i0-unpack n
attr MbAttrPzem004t3 obj-i1-expr $val / 1000
attr MbAttrPzem004t3 obj-i1-len 2
attr MbAttrPzem004t3 obj-i1-reading Current_A
attr MbAttrPzem004t3 obj-i1-unpack n
attr MbAttrPzem004t3 obj-i3-expr $val / 10
attr MbAttrPzem004t3 obj-i3-len 2
attr MbAttrPzem004t3 obj-i3-reading Power_W
attr MbAttrPzem004t3 obj-i3-unpack n
attr MbAttrPzem004t3 obj-i5-len 2
attr MbAttrPzem004t3 obj-i5-reading Energy_Wh
attr MbAttrPzem004t3 obj-i5-unpack n
attr MbAttrPzem004t3 obj-i7-expr $val / 10
attr MbAttrPzem004t3 obj-i7-len 1
attr MbAttrPzem004t3 obj-i7-reading Frequency_Hz
attr MbAttrPzem004t3 obj-i7-unpack n
attr MbAttrPzem004t3 obj-i8-expr $val / 100
attr MbAttrPzem004t3 obj-i8-len 1
attr MbAttrPzem004t3 obj-i8-reading PowerFactor
attr MbAttrPzem004t3 obj-i8-unpack n
attr MbAttrPzem004t3 obj-i9-len 1
attr MbAttrPzem004t3 obj-i9-reading AlarmStatus
attr MbAttrPzem004t3 obj-i9-unpack n




Danke für den Tipp, dass mehrere Devices am gleichen RS485 hängen können - hab ich irgendwie gar nicht gepeilt...