Modbus auslesen

Fragen zur Nutzung, Features, usw..
bforpc
Beiträge: 105
Registriert: Mo Mär 28, 2022 3:34 pm

Modbus auslesen

Beitrag von bforpc »

Hallo Forum,

ich habe unten stehendes Python script, welches mir die Ladeleistung auselsen soll (laut https://openwb.de/main/wp-content/uploa ... openWB.pdf)
Leider bekomme ich dort immer nur 0 zurück, obwohl eine Auto dranhängt, welches auch geladen wird.

Code: Alles auswählen

#!/usr/bin/env python3

from pymodbus.constants import Defaults
from pymodbus.constants import Endian
from pymodbus.client.sync import ModbusTcpClient as ModbusClient
from pymodbus.payload import BinaryPayloadDecoder
from datetime import datetime
import urllib.request, sys, os, time, textwrap, subprocess, time, getopt, struct, json, ast, requests


client = ModbusClient("192.168.1.8", port='502')
val=client.connect()
msg     = client.read_input_registers(10100, unit=1)
decoder = BinaryPayloadDecoder.fromRegisters(msg.registers, byteorder=Endian.Big)
msg     = decoder.decode_16bit_int()

print(msg)
Gero
Beiträge: 2816
Registriert: Sa Feb 20, 2021 9:55 am

Re: Modbus auslesen

Beitrag von Gero »

Probier mal, ob der eingebaute modbustester Dir den erwarteten Wert zurückliefert:

http://openWB.fritz.box/openWB/web/tool ... dtest.html

Ich probiere bei sowas immer gerne mit Werten, die längere Zeit konstant bleiben. Sowas wie ConfiguredChargepoints.
openWB-series2, openWB-Buchse, E3/DC S10pro+19.5kWh, 30kWp Ost-Süd, Model 3 und Ion
bforpc
Beiträge: 105
Registriert: Mo Mär 28, 2022 3:34 pm

Re: Modbus auslesen

Beitrag von bforpc »

Hallo,

mit dem Modbustester teste ich mich quasi selnbst, oder?
Hier die Ausgabe

Code: Alles auswählen

url /openWB/web/tools/trace/modtest.php?ip=192.168.1.8&start=10100&len=20&id=1&fun=3
parmeters parsed ip 192.168.1.8 start 10100 len 20 id 1 fun 3
04/04/2022, 07:13:58 opentrace read input register ip 192.168.1.8 start 10100 len 20 id 1
04/04/2022, 07:13:58 opentrace start 10100 + 0 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 1 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 2 inhalt 13 0XD
04/04/2022, 07:13:58 opentrace start 10100 + 3 inhalt 46552 0XB5D8
04/04/2022, 07:13:58 opentrace start 10100 + 4 inhalt 23040 0X5A00
04/04/2022, 07:13:58 opentrace start 10100 + 5 inhalt 23090 0X5A32
04/04/2022, 07:13:58 opentrace start 10100 + 6 inhalt 23060 0X5A14
04/04/2022, 07:13:58 opentrace start 10100 + 7 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 8 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 9 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 10 inhalt 1 0X1
04/04/2022, 07:13:58 opentrace start 10100 + 11 inhalt 1 0X1
04/04/2022, 07:13:58 opentrace start 10100 + 12 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 13 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 14 inhalt 1 0X1
04/04/2022, 07:13:58 opentrace start 10100 + 15 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 16 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 17 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 18 inhalt 0 0X0
04/04/2022, 07:13:58 opentrace start 10100 + 19 inhalt 0 0X0
Bfo
Becker
Beiträge: 765
Registriert: Mi Okt 07, 2020 4:34 pm

Re: Modbus auslesen

Beitrag von Becker »

Ladeleistung ist Int32be:
32.jpg
openWB series2 Buchse (2021)
go-eCharger HOME+ 22 kW (2022)
bforpc
Beiträge: 105
Registriert: Mo Mär 28, 2022 3:34 pm

Re: Modbus auslesen

Beitrag von bforpc »

Moin,

was mich zu meiner ursprünglichen Frage bringt, warum das python Script bei

Code: Alles auswählen

msg     = decoder.decode_16bit_int()
eine 0 ausgibt. Ein

Code: Alles auswählen

msg     = decoder.decode_32bit_int()
zeigt mir den Fehler

struct.error: unpack requires a buffer of 4 bytes

Scheint also nur ein 8/16Bit Feld zu sein, oder habe ich das falsch verstanden?

Bfo
Becker
Beiträge: 765
Registriert: Mi Okt 07, 2020 4:34 pm

Re: Modbus auslesen

Beitrag von Becker »

Ja du brauchst 10100 + 10101 für das 32bit Register.
Manchmal hilft ein Bild mehr als Worte:
1323.png
(ist zwar von SMA aber gleiches Prinzip)

oder du nimmst MQTT :lol:
openWB series2 Buchse (2021)
go-eCharger HOME+ 22 kW (2022)
bforpc
Beiträge: 105
Registriert: Mo Mär 28, 2022 3:34 pm

Re: Modbus auslesen

Beitrag von bforpc »

Hallo Becker,
danke für deine Antwort. Leider stehe ich jetzt völlig auf dem Schlauch.

Das Register 10100 ist laut openweb

Code: Alles auswählen

10100 sint32 Read LP 1 Actual Power Watt
Wofür ist 10101 (steht nicht in der Liste) und in wiefern brauche ich diesen zweiten?
Ich bin absoluter Neuling mit der openWB und mit python sowieso.

Mein Wunsch ist, mit dem python script aus dem 1. Post die aktuelle Ladeleistung vom LP1 und LP2 zu bekommen. Sonst nichts.
Kannst du mir bitte dahingehend einen Tip für das Script geben?

Bfo
LutzB
Beiträge: 3586
Registriert: Di Feb 25, 2020 9:23 am

Re: Modbus auslesen

Beitrag von LutzB »

Modbus ist leider nicht so trivial. Da müssen Werte in Registern richtig kombiniert werden, um nachher den richtigen Wert zu bekommen. Versuch es doch besser mit Mqtt. Da muss nicht interpretiert werden, sondern bekommt direkt den Wert. In Python ist das auch schnell umgesetzt.
bforpc
Beiträge: 105
Registriert: Mo Mär 28, 2022 3:34 pm

Re: Modbus auslesen

Beitrag von bforpc »

Das sagst so in deinem jugendlichen Leichtsinn :-)

Dann müsste ich das halt kombinieren. Andererseits wäre es mit den richtigen Werten doch kein Problem die openWB abzugragen. Sei's drum.
Leider habe ich noch weniger Erfahrung mit Mqtt, genauer gesagt: gar keine.

Gibt es da irgend etwas fertiges, oder ein "snippet", um die 2 von mir gewünschten Werte zu bekommen?
Ich wundere mich, dass sonst noch keiner nach so einer "trivialen" Auswertung gefragt hat (also 2 Werte auslesen).

Bfo
rleidner
Beiträge: 868
Registriert: Mo Nov 02, 2020 9:50 am

Re: Modbus auslesen

Beitrag von rleidner »

es sollte so gehen

Code: Alles auswählen

#!/usr/bin/env python3

from pymodbus.constants import Defaults
from pymodbus.constants import Endian
from pymodbus.client.sync import ModbusTcpClient as ModbusClient
from pymodbus.payload import BinaryPayloadDecoder
from datetime import datetime
import urllib.request, sys, os, time, textwrap, subprocess, time, getopt, struct, json, ast, requests


client = ModbusClient("192.168.1.171", port='502')
val=client.connect()
msg     = client.read_input_registers(10100, count=2, unit=1)
decoder = BinaryPayloadDecoder.fromRegisters(msg.registers, byteorder=Endian.Big)
msg     = decoder.decode_32bit_int()

print(msg)
Wichtig sind "count=2" und "decode_32bit", ...

IMHO ist mqtt deutlich einfacher und klarer als das Gefummel in den Modbus Registern
openWB-2 Standard+ | openWB EVU Kit v2 MID| 9,9kWp mit Kostal Plenticore 8.5 plus | VW ID.3, Kia EV6, Smart EQ forfour
Antworten