NEWS
Abfrage ORNO OR-WE-516/ 517 Modbus, evtl. Script vorhanden?
-
Hallo IOBroker Forum,
hat zufällig jemand die oben genannten Zähler bereits per Modbus angeschlossen? Habe über die Suche nichts gefunden.
Mein Plan ist per Raspberry und mqtt die Daten an Iobroker zusenden. Gibt es hierfür bereits Erfahrungen bzw. fertige Python Scripts? Möchte vermeiden Stundenlang an der Modbus Abfrage zu Basteln. Die Herstellerdoku scheint auch Fehler zu behalten.
Das fertige Script für MQTT poste ich dann anschliessend hier.
Danke und Gruß
charakterkopf -
Habe mich durch den Modbus gewühlt und selbst einen Ersten Versuch unternommen:
Ihr benötigt neben dem Zähler ca 60€ nur einen USB RS485 Konverter von Ebay. Der Bus ist eigentlich noch mit 2 x 120 Ohm Widerständen abzuschliessen, klappt bei mir auch ohne.
Bitte die Importe im Script beachten:
import minimalmodbus import serial import time import struct import binascii import paho.mqtt.client as paho
Ziel ist das Script regelmässig die Daten auslesen und per MQTT Bereitstellen zu lassen.
Die Registernummer sind in Hexadezimal aus der ORNO Software ersichtlich (s. Herstellerseite).
-
So nachdem der Zähler installiert ist (Fachmann!!), hier das Finale Script.
Die Sendefrequenz kann eingestellt werden über die Sleep Funktion am Ende (Hier alle 15 Sekunden)
#!/usr/bin/env python3 import minimalmodbus import serial import time import struct import binascii import paho.mqtt.client as paho from time import gmtime, strftime def umwandeln_ieee(Wert): #Umwandlung Array of int ( 4 byte) in float nach IEEE 754 Wert2=str(hex(Wert)) Wert2=Wert2.replace('0x', '') if Wert2=='0': Wert2='00000000' Wert3=struct.unpack('>f', binascii.unhexlify(Wert2))[0] #Wert3= round(Wert3,3) return (Wert3) #Hilfvariable im bei Auslesefehler nicht zu senden go=True #mqtt Config Daten hier Eintragen mqtt_username="" mqtt_password="" mqtt_server="192.168.0.2" mqtt_port=1885 mqtt_subscribe="/Zaehler" def on_subscribe(client, userdata, mid, granted_qos): print("Gesendet!") def on_message(client, userdata, msg): print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload)) client = paho.Client(client_id="Zaehler", clean_session=True, userdata=None, protocol=paho.MQTTv31) client.on_subscribe = on_subscribe client.on_message = on_message client.username_pw_set(mqtt_username, mqtt_password) client.connect(mqtt_server, mqtt_port,60) client.subscribe(mqtt_subscribe, qos=1) #Adapter für Modbus Anlegen smartmeter = minimalmodbus.Instrument('/dev/ttyUSB0', 1,) # port name, slave address (in decimal) smartmeter.serial.baudrate = 9600 # Baud smartmeter.serial.bytesize = 8 smartmeter.serial.parity = serial.PARITY_EVEN # vendor default is EVEN smartmeter.serial.stopbits = 1 smartmeter.serial.timeout = 0.6 # seconds smartmeter.mode = minimalmodbus.MODE_RTU # rtu or ascii mode smartmeter.clear_buffers_before_each_transaction = False smartmeter.debug = False # set to "True" for debug mode #Debug Werte für L1 ausgeben werteausgeben= True while True: client.loop_start() #Werte Abfragen try: #Adresse = smartmeter.read_register(2, 0, 3, False) # registeraddress, number_of_decimals=0, functioncode=3, signed=False L1Spannung= umwandeln_ieee(smartmeter.read_long(14, 3, False, 0)) #registeraddress, functioncode=3, signed=False, byteorder=0) L2Spannung= umwandeln_ieee(smartmeter.read_long(16, 3, False, 0)) L3Spannung= umwandeln_ieee(smartmeter.read_long(18, 3, False, 0)) Frequency= umwandeln_ieee(smartmeter.read_long(20, 3, False, 0)) L1Strom= umwandeln_ieee(smartmeter.read_long(22, 3, False, 0)) L2Strom= umwandeln_ieee(smartmeter.read_long(24, 3, False, 0)) L3Strom= umwandeln_ieee(smartmeter.read_long(26, 3, False, 0)) Strom_gesamt=L1Strom+L2Strom+L3Strom Leistung_gesamt= umwandeln_ieee(smartmeter.read_long(28, 3, False, 0)) L1Leistung= umwandeln_ieee(smartmeter.read_long(30, 3, False, 0)) L2Leistung= umwandeln_ieee(smartmeter.read_long(32, 3, False, 0)) L3Leistung= umwandeln_ieee(smartmeter.read_long(34, 3, False, 0)) L1PowerFactor=umwandeln_ieee(smartmeter.read_long(54, 3, False, 0)) L2PowerFactor=umwandeln_ieee(smartmeter.read_long(56, 3, False, 0)) L3PowerFactor=umwandeln_ieee(smartmeter.read_long(58, 3, False, 0)) Verbrauch_gesamt=umwandeln_ieee(smartmeter.read_long(256, 3, False, 0)) #L1Verbrauch=umwandeln_ieee(smartmeter.read_long(258, 3, False, 0)) #L2Verbrauch=umwandeln_ieee(smartmeter.read_long(260, 3, False, 0)) #L3Verbrauch=umwandeln_ieee(smartmeter.read_long(262, 3, False, 0)) go=True; except: print ("\nEinlesen nicht geklappt, versuche es erneut in 15 Sekunden") go=False; if go: #Werte Ausgeben falls gewünscht if werteausgeben: print(strftime("\n%Y-%m-%d %H:%M:%S", gmtime())) print ("Aktuelle Werte:") #AdresseTxt = "Die Slave Adresse ist: %s" % Adresse #print (AdresseTxt) L1Spannungtxt = "L1Spannung ist: %f V" % L1Spannung print (L1Spannungtxt) L1Stromtxt = "L1Strom ist: %f A" % L1Strom print (L1Stromtxt) Frequencytxt = "Frequenz ist: %f hz" % Frequency print (Frequencytxt) L1Leistungtxt = "L1Leistung ist: %f KW/h" % L1Leistung print (L1Leistungtxt) L1PowerFactortxt = "L1Power Faktor ist: %f" % L1PowerFactor print (L1PowerFactortxt) Leistung_gesamttxt = "Leistung Gesamt ist: %f KW" % Leistung_gesamt print (Leistung_gesamttxt) # Werte Senden #client.publish("/Zaehler/Adresse",str(Adresse), qos=1) client.publish("/Zaehler/L1/L1Spannung",str(L1Spannung), qos=0) client.publish("/Zaehler/L2/L2Spannung",str(L2Spannung), qos=0) client.publish("/Zaehler/L3/L3Spannung",str(L3Spannung), qos=0) client.publish("/Zaehler/Gesamt/Frequency",str(Frequency), qos=0) client.publish("/Zaehler/L1/L1Strom",str(L1Strom), qos=0) client.publish("/Zaehler/L2/L2Strom",str(L2Strom), qos=0) client.publish("/Zaehler/L3/L3Strom",str(L3Strom), qos=0) client.publish("/Zaehler/Gesamt/Leistung_gesamt",str(Leistung_gesamt*1000), qos=0) client.publish("/Zaehler/L1/L1Leistung",str(L1Leistung*1000), qos=0) client.publish("/Zaehler/L2/L2Leistung",str(L2Leistung*1000), qos=0) client.publish("/Zaehler/L3/L3Leistung",str(L3Leistung*1000), qos=0) client.publish("/Zaehler/L1/L1PowerFactor",str(L1PowerFactor), qos=0) client.publish("/Zaehler/L2/L2PowerFactor",str(L2PowerFactor), qos=0) client.publish("/Zaehler/L3/L3PowerFactor",str(L3PowerFactor), qos=0) client.publish("/Zaehler/Gesamt/Verbrauch_gesamt",str(Verbrauch_gesamt), qos=0) client.publish("/Zaehler/Gesamt/Strom_gesamt",str(Strom_gesamt), qos=0) #client.publish("/Zaehler/L1/L1Verbrauch",str(L1Verbrauch), qos=1) #client.publish("/Zaehler/L2/L2Verbrauch",str(L2Verbrauch), qos=1) #client.publish("/Zaehler/L3/L3Verbrauch",str(L3Verbrauch), qos=1) time.sleep(15)
Getestet werden kann das Script mit:
python3 Scriptname.py
Zum dauerhaften ausführen habe ich eine Service eingerichtet, der beim Booten automatisch gestartet wird:- Service Datei erstellen: sudo nano /etc/systemd/system/smartmeter.service
- Inhalt der Datei, Pfade oder Dateinamen sind anzupassen:
[Unit] Description=smartmeter After=network.target [Service] ExecStart=/usr/bin/python3 -u smart.py WorkingDirectory=/home/pi/smartmeter StandardOutput=inherit StandardError=inherit Restart=always User=root [Install] WantedBy=multi-user.target
- Dienst Starten und Status ausgeben:
sudo systemctl start smartmeter
sudo systemctl status smartmeter.service
sudo systemctl stop smartmeter
- Dienst anschalten um bei einem Boot automatisch gestartet zu werden:
sudo systemctl enable smartmeter.service
Die Daten sollten dann in IObroker regelmässig eintreffen:
-
Hallo charakterkopf,
Wollte mich bedanken für deine Arbeit.
Läuft spitze bei mir. -
Danke
-
Tolle Arbeit!
Ich habe gelesen, dass es beim 516er und 517er nicht erkennbar ist, ob gerade ins Netz eingespeist wird, oder ob vom Netz bezogen wird. Kann das hier wer widerlegen?
-
@isexglei Ich kann es leider nur bestätigen
Ich versuche es jetzt mit einem Lovato DMED301, der sollte das können.
-
@charakterkopf Hi, erstmal danke, dass du deine Arbeit mit uns teilst. Ich bin absoluter Neuling auf dem Gebiet und wollte dich daher fragen wie du den Zähler und den PI verbunden hast....beziehungsweise, ist der PI in deinem Zählerkasten eingebaut oder wohin geht das Kabel samt USB-Adapter?
-
@herrniffler Servus, ich habe das Kabel (Netzwerkleitung) durch den Hausflur bis zum Raspberry Pi verlegt ca. 5m.
Der Raspberry wird über die Fritzbox mit Strom versorgt und hat noch mehr Funktionen (Anwensenheit / LED Leiste) deswegen war eine Montage im Schrank nicht möglich.
Gruß Martin
-
@charakterkopf Ich habe einen Orno 516 und einen Orno 517 jeweils über die den RS485 S0 Anschluss direkt per USB mit dem Raspi verbunden
Zum Auslesen nutze ich den Modbus AdapterdeviceId address name description unit type len factor offset role room poll wp 1 40015 L1 Voltage V floatbe 2 1 0 value true false 1 40017 L2 Voltage V floatbe 2 1 0 value true false 1 40019 L3 Voltage V floatbe 2 1 0 value true false 1 40021 Grid Frequency Hz floatbe 2 1 0 value true false 1 40023 L1 Current A floatbe 2 1 0 value true false 1 40025 L2 Current A floatbe 2 1 0 value true false 1 40027 L3 Current A floatbe 2 1 0 value true false 1 40029 Total Active Power kWh floatbe 2 1 0 value true false 1 40031 L1 Active Power kWh floatbe 2 1 0 value true false 1 40033 L2 Active Power kWh floatbe 2 1 0 value true false 1 40035 L3 Active Power kWh floatbe 2 1 0 value true false 1 40037 Total Reactive Power kVAR floatbe 2 1 0 value true false 1 40039 L1 Reactive Power kVAR floatbe 2 1 0 value true false 1 40041 L2 Reactive Power kVAR floatbe 2 1 0 value true false 1 40043 L3 Reactive Power kVAR floatbe 2 1 0 value true false 1 40045 Total Apparent Power kVA floatbe 2 1 0 value true false 1 40047 L1 Apparent Power kVA floatbe 2 1 0 value true false 1 40049 L2 Apparent Power kVA floatbe 2 1 0 value true false 1 40051 L3 Apparent Power kVA floatbe 2 1 0 value true false 1 40053 Total Power Factor PF floatbe 2 1 0 value true false 1 40055 L1 Power Factor PF floatbe 2 1 0 value true false 1 40057 L2 Power Factor PF floatbe 2 1 0 value true false 1 40059 L3 Power Factor PF floatbe 2 1 0 value true false 1 40067 Total Active Energy kWh floatbe 2 1 0 value true false 1 40069 L1 Active Energy kWh floatbe 2 1 0 value true false 1 40071 L2 Active Energy kWh floatbe 2 1 0 value true false 1 40073 L3 Active Energy kWh floatbe 2 1 0 value true false 1 40075 Forwarded Active Energy kWh floatbe 2 1 0 value true false 1 40077 L1 Forwarded Active Energy kWh floatbe 2 1 0 value true false 1 40079 L2 Forwarded Active Energy kWh floatbe 2 1 0 value true false 1 40081 L3 Forwarded Active Energy kWh floatbe 2 1 0 value true false
Ergebnis
-
@tbsjah said in Abfrage ORNO OR-WE-516/ 517 Modbus, evtl. Script vorhanden?:
@charakterkopf Ich habe einen Orno 516 und einen Orno 517 jeweils über die den RS485 S0 Anschluss direkt per USB mit dem Raspi verbunden
Hallo, Danke für die Idee und das Script!
Noch eine Frage zu der Verbindung, da ich alles vorbereiten möchte, bevor der Fachmann kommt.
Die USB RS485 Konverter von ebay haben alle erstmal nur Schraubklemmen.
- Vom USB-Stick muss ich dann lediglich einen 2-adrigen Klingeldraht bis zum Zählerkasten bekommen, mehr nicht, richtig?
- Am ORNO selbst wird der Draht direkt angeklemmt, d.h. kein Stecker?
- Habt ihr die Schraubklemmen am UBS-Stick noch irgendwie geschützt oder ist diese offene Verschraubung unkritisch?
Grüße
-
- richtig
- richtig
- Schrumpfschlauch
-
@tbsjah Danke!
-
@derdominik Hallo zusammen, welchen Adapter habt Ihr verwendet um den Zähler an den USB des Raspi zu bringen?
-
@easymeter
WINGONEER CH340E USB zu TTL USB zu RS485 Konverter Adapter Windows 7/8 XP Linux Vista https://www.amazon.de/dp/B016IG6X7I/ref=cm_sw_r_apan_i_YGFPE5GW06WD0FXAQXHX -
Danke für die Antwort. Nachdem ich mein System auf einen NUC umgezogen habe funktioniert das Auslesen mit dem Modbus Adapter mit den oben genannten Einstellungen fast auf Anhieb.
Mit der schon installierten Modbus Instanz, die ich im Backup schon hatte, hatte ich aber noch Probleme. Damit wollte es nicht rennen.
Nachdem ich die Instanz aber gelöscht und neu Installiert habe ging es wie gesagt auf Anhieb, wo auch immer das Problem lag. Die Versionen waren die gleichen....
Jetzt kommt aber bei mir die nächste Ausbaustufe:
Ich habe mehrere Zweige, die ich gerne erfassen möchte. Hat jemand schon mehrere Zähler an dem Modbus? Wie habt Ihr das dann gemacht? Wie kann die Modbus ID im Zähler angepasst werden?
Würde mich freuen, wenn jemand seine Erfahrungen teilen könnte. -
@easymeter Verbaut habe ich einen Orno 516 und einen Orno 517
Läuft über 2 separate Modbus Instanzen.Das wichtige ist dass du immer den richtigen USB Port ansprichst.
Bei jedem Neustart des Raspberry erhältst du neue Zuordnungen.Ganz gut erklär hier link
-
@tbsjah Danke für den Link. So ein ähnliches Vorgehen kenne ich. Mein Gedanke wäre es, da es ja ein "Bus" ist, die weiteren Zähler hintereinander am Modbus anzuschließen und mit deren ID dann auszulesen Auslieferungszustand ist bei mir "1" gewesen). Dazu muss man aber die Modbus ID anpassen, und da bin ich noch nicht weiter gekommen. Irgendwie muss man da dann ja schreibend an das Gerät, keine Ahnung, ob der Modbusadapter das bewerkstelligen kann.
Naja, mit weiteren Adaptern an anderen USB Ports wäre vielleicht auch ein Ansatz, die Dinger kosten ja auch nicht die Welt.....da muss ich nur mal schauen, wie sich der NUC dann mit USB Hubs verhält, langsam gehen mir die Ports aus ,-) -
@easymeter Ich haben einen simplen USB Verteiler angesteckt
Wichtig ist dann halt das du immer den richtigen Port ansprichst nach einem Neustart -
@tbsjah Bin heute auch etwas weiter gekommen.
Ich habe einen weiteren Zähler mit einem USB Adapter direkt am PC angeschlossen und dort mit der Software von ORNO (Gibts auf der HP von ORNO beim Zähler WE517 zum Download) die Zähler ID verändert.
Danach habe ich den Zähler hinter meinen bestehenden Zähler gehangen.
Im Modbus Adapter dann in den "Allgemeinen" Einstellungen den Haken bei "mehrere Geräte IDs" gesetzt und in den Holdingregister die weiteren Messpunkte angelegt. Dort knn in der zweiten Spalte "Slave-ID" die ID des Zählers eingetragen werden.
Damit klappt es auch mit min. zwei Zählern bei mir ohne weitere Probleme, die gewünschten Werte trudeln zuverlässig ein.