Seite 1 von 2
					
				Modbus auslesen
				Verfasst: So Apr 03, 2022 1:29 pm
				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)
 
			
					
				Re: Modbus auslesen
				Verfasst: So Apr 03, 2022 4:03 pm
				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.
 
			
					
				Re: Modbus auslesen
				Verfasst: Mo Apr 04, 2022 5:15 am
				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
 
			
					
				Re: Modbus auslesen
				Verfasst: Mo Apr 04, 2022 6:27 am
				von Becker
				Ladeleistung ist Int32be:
 
			
					
				Re: Modbus auslesen
				Verfasst: Mo Apr 04, 2022 1:54 pm
				von bforpc
				Moin,
was mich zu meiner ursprünglichen Frage bringt, warum das python Script bei
eine 0 ausgibt. Ein
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
 
			
					
				Re: Modbus auslesen
				Verfasst: Mo Apr 04, 2022 2:26 pm
				von Becker
				Ja du brauchst 10100 + 10101 für das 32bit Register.
Manchmal hilft ein Bild mehr als Worte:
(ist zwar von SMA aber gleiches Prinzip)
oder du nimmst MQTT  

 
			
					
				Re: Modbus auslesen
				Verfasst: Di Apr 05, 2022 9:23 am
				von bforpc
				Hallo Becker,
danke für deine Antwort. Leider stehe ich jetzt völlig auf dem Schlauch.
Das Register 10100 ist laut openweb
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
 
			
					
				Re: Modbus auslesen
				Verfasst: Di Apr 05, 2022 9:47 am
				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.
			 
			
					
				Re: Modbus auslesen
				Verfasst: Di Apr 05, 2022 10:10 am
				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
 
			
					
				Re: Modbus auslesen
				Verfasst: Di Apr 05, 2022 10:24 am
				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