Ich hoffe, dass dieser Thread hier richtig aufgehangen ist. Kennt jm. Sourcen für das Auslesen des EM24 über TCP/IP.
Gerne über Python.
Bietet das EM24 keine Webdienst-Endpoint.
Oder wäre es wirklich so einfach:
from pymodbus.client.sync import ModbusTcpClient SERVER_IP = '192.168.178.61' SERVER_PORT = 502 ADDRESS_START = 37 #ADDRESS_LENGTH = 10 DEVICE_ID = 228 var_Power = 5000 client = ModbusTcpClient(host=SERVER_IP, port=SERVER_PORT) rq = client.write_ / read_ print rq client.close()
EM24 redet Modbus. Bei Victron gibt es eine Registerliste. Die kannst du dir runterladen.
Von Carlo Gavazzi gibt es ein Tool UCS7 nennt sich das. Damit kannst du den EM24 auch auslesen. Bin mir aber nicht sicher ob das Tool auch Modbus TCP kann oder nur RTU.
Damit kannst du auch eine Mitschnitt machen und dir die Register ansehen.
Wenn du ein Raspi mit Venus OS hast klappt das alles schon automatisch. Damit kannst du dann auch mit Node Red die Daten selbst weiter verarbeiten oder die Daten via MQTT irgendwo hin schicken.
Danke, ich wollte nicht gleich mit Kanonen auf Spatzen schießen, erst mal mit einfachen Bordmittel selbst testen. Was ich an dem obigen (kopierten 😉 Schnippsel nicht verstehe ist die Startadresse von 37.
Laut:
file:///home/stefan/Downloads/EM24.Ethernet.Protocol.Rev.1.2.pdf
S.5 sehe ich Modicon-Adressen 30.000 und mehr. Wenn ich bspw. "nur" die kumulierte Momentanleistung haben möchte, würde ich die 300041 nehmen. Ist das korrekt.
Dann wäre das Snippet oben echt simpel.
Ok, das war doch einfacher als gedacht. Im Folgenden ein Snipet um die kumulierte Leistung aus dem EM24 rauszuholen (Quick & Dirty, also bitte keine Kritik an meine Coding-Fähigkeiten)
from pymodbus.client import ModbusTcpClient
SERVER_IP = '10.1.1.50'
SERVER_PORT = 502
ADDRESS_START = 1
# ADDRESS_LENGTH = 10
DEVICE_ID = 228
client = ModbusTcpClient(host=SERVER_IP, port=SERVER_PORT)
val = client.connect()
if not val:
print("***** Connection error **********")
rq = client.read_input_registers(address=0x28)
print(rq.registers)
client.close()
Natürlich nicht vergessen die Bib zu installieren
Jetzt bräuchte ich doch noch mal fachkundigen rat. Ich habe folgenden Funktion in python:
def auslesen(): global momentanleistung, programmStatus, SERVER_IP, SERVER_PORT versuche = 5 for i in range(versuche): try: client = ModbusTcpClient(host=SERVER_IP, port=SERVER_PORT) request = client.read_holding_registers(40, 2) momentanleistung = request.registers[0] /10 client.close() except: # Fehler bei Auslesung der Sensoren if i < versuche - 1: continue else: programmStatus = 0 break
Die Werte stimmen auch, allerdings erhalte ich unsinnige Ergebnisse, vermutlich einen Überlauf, wenn ich einspeise
und das EM24 negative Werte ausgibt. Übe den iobroker bekomme ich problemlos die negativen Werte ausgespuckt über
das gleiche Register, ich vermute also, dass ich request.registers[0] vor der Variablenübername in momentanleistung noch dekodieren
muss, die Frage ist nur wie? Ich finde leider auch mit Tante google keine Hinweise dazu. Hat jm. einen klugen Rat? Danke
Ich hatte ähnliche Probleme im ioBroker, hat ein bissel Recherche bedurft, um die korrekten Einstellungen zu bekommen, folgndes habe ich
genutzt:
Allerdings ist schon komisch das im Handbuch zum EM42 das Register 40 als INT32 ausgewiesen ist, damit bekomme ich aber nur Datenmüll. Ich gehe mal davon aus, dass Vorzeichen behafteter 16 BIT dem 32BIT entspricht.