Kaifa MA309 auslesen Smart Meter (EVN)

Voraussetzungen Hardware (Bauteileliste unten)

  • Kaifa MA309 von der Netz Niederösterreich
  • Passwort für die Kundenschnittstelle (siehe unten)
  • Raspberry Pi 4
  • USB zu MBus Adappter

Voraussetzungen Software

  • Raspbian
  • Python3
  • Libraries
    • gurux_dlms
    • beautifulsoup4
    • paho-mqtt

Verkabelung des M-Bus Adapter

Der Sagemcom Drehstromzähler T210-D hat unter seinen grünen Abdeckung eine Buchse für ein RJ-12 Kabel. Mithilfe des RJ-12 Kabels kann der M-Bus Adapter verkabelt werden. Die zwei mittleren Pins werden benötigt. Die beiden Drähte werden an den M-Bus Adapter angeklemmt.

Verkabelung M-Bus Adapter

Einbau im Schaltschrank

Das RJ-12 Kabel wird einfach unter der grünen Abdeckung des Smart Meters angesteckt und der Raspberry mit seinem Hutschienen Gehäuse montiert. Der Raspberry benötigt noch Strom welchen er über das Original Netzteil bezieht. Der MBus-USB Adapter wird in der USB Port eingesteckt und ein Netzwerkkabel angeschlossen.

Passwort für die Kundenschnittstelle

Das individuelle Passwort muss man bei der Netz Niederösterreich anfragen. Am besten schreibt man eine Email an smartmeter@netz-noe.at. Die Email muss die Zählernummer, Handynummer und Kundennummer oder Vertragskontonummer enthalten.
Als Antwort erhält man eine verschlüsselte .zip das Passwort für die Datei erhält man als SMS und kann die Datei entpacken. Darin befindet sich ein PDF mit dem Zugangscode.

Installation

Es müssen folgende Pakete Installiert werden.

sudo apt-get install python3-pip
sudo apt install python3 idle3        # installiert Python3
sudo pip3 install gurux-dlms          # library für die Übersetzung in eine XML
sudo pip3 install beautifulsoup4      # library beautifulsoup4 
sudo pip3 install paho-mqtt           # library für die MQTT Verbindung
sudo pip3 install lxml                # library für XML Parser
sudo pip3 install pyserial            # library für die Seriele Schnittstelle
sudo pip3 install cryptography        # library für die Entschlüsselung

Programm herunterladen und anpassen

Der Code ist auf der Plattform Github veröffentlicht und ist Open Source und somit kann ihn jeder herunterladen oder auf seine Bedürfnisse anpassen!

Es müssen nur noch einige Anpassungen vorgenommen werden.

Hier muss der Code von der PDF von der EVN eingegeben werden.

# EVN Schlüssel eingeben zB. "36C66639E48A8CA4D6BC8B282A793BBB"
evn_schluessel = "EVN Schlüssel"

Dann kann man entscheiden ob man MQTT nutzen will, wenn man TRUE auswählt muss man einen gültigen MQTT Broker IP Adresse eingegeben werden ein Beispiel ist angeführt. Wenn der MQTT Server mit Username und Passwort versehen ist muss Programmiert werden ich habe zum Testen eine offene Verbindung angestrebt um mögliche Fehlerquellen auszuschließen.

#MQTT Verwenden (True | False)
useMQTT = True

#MQTT Broker IP adresse Eingeben ohne Port!
mqttBroker = "192.168.8.99"

Es sollte der richtige Comport eingestellt werden wenn es Probleme gibt muss dieser eventuell verändert werden.

#Comport Config/Init
comport = "/dev/ttyUSB0"

Erste Inbetriebnahme

Als erstes sollten alle MQTT Funktionen auf FALSE gestellt werden um mögliche Fehler zu beseitigen. Nur die Variable printValue = True muss so bleiben.
Die Variable evn_schluessel muss mit dem Schlüssel aus der PDF ersetz werden.

evn_schluessel = "36C66639E48A8CA4D6BC8B282A793BBB"

Wenn man das Programm in einer Programmierumgebung hat dann kann man es mit Run testen ob alles läuft. Sonst muss man es über den folgenden Befehl starten. Gegebenenfalls muss man den Pfad wo die Datei liegt ändern.

sudo python3 /home/pi/Desktop/EvnSmartmeterMQTT.py

ldung mit dem Text “Fehler beim Synchronisieren. Programm bitte ein weiteres Mal Starten” muss man das Programm nach kurzer Wartezeit neu starten.

MQTT Topics

Diese können bei Bedarf abgeändert werden. Standardmäßig sind folgende eingestellt.

TopicKommentarEinheit
Smartmeter/WirkenergiePbezogene EnergieWh
Smartmeter/WirkenergieNgelieferte EnergieWh
Smartmeter/MomentanleistungPMomentanleistung BezugW
Smartmeter/MomentanleistungNMomentanleistung LieferungW
Smartmeter/MomentanleistungMomentanleistung Summe aus Bezug und LieferungW
Smartmeter/SpannungL1Spannung an L1V
Smartmeter/SpannungL2Spannung an L2V
Smartmeter/SpannungL3Spannung an L3V
Smartmeter/StromL1Strom an L1A
Smartmeter/StromL2Strom an L2A
Smartmeter/StromL3Strom an L3A
Smartmeter/LeistungsfaktorLeistungsfaktor
MQTT Standard Topic´s

Bauteilliste und Unterstützung

Alle Links sind Affiliate Links. Somit unterstützt ihr diese und weitere Projekte von mir.
Spendenlink: https://www.paypal.me/greenMikeEU

Produkt
wird
benötigt
AmazonAliexpress
Raspberry Pi 4Jahttps://amzn.to/3pPliDB
Raspberry Pi 4 Starter SetJahttps://amzn.to/3Jz589v
Raspberry Pi 4 Hutschienen GehäuseNeinhttps://amzn.to/3HwsUkn
USB-zu-MBUS-Slave-Modul Ja https://amzn.to/3H4ox3hhttps://s.click.aliexpress.com/e/_DDzNUPp
RJ-12 Kabel Ja https://amzn.to/3EPZvQs
Schaltschrank SteckdoseNeinhttps://amzn.to/32Mb3HB
Bauteilliste

MQTT Nachrichten in Datenbank speichern

Ich habe zu diesem Thema einen eigenen Beitrag geschrieben.

Auswertung der Daten

Dazu habe ich einen eigenen Beitrag geschrieben.

Grafana Auswertung

190 comments

  • Hallo,

    Danke für das Script!
    Habe selbst einen MA110 1-Phasenzähler von TINETZ und bekomme leider dieselbe Fehlermeldung wie ein anderer oben. Wurde das weiterverfolgt? Kann gerne helfen da ich meine Zähler umbedingt auslesen will.

    Ich sehe, dass die HEX Werte Richtig ankommen mit header 68fafa68
    Meine Nachrichten sind anscheinend zweigeteilt, beim Beispiel unten gibt es eine Nachricht mit len=490 payload und danach noch eine die mit 68262668 startet.
    Die Doku steht jedoch, dass am Ende der Message “16” stehen sollte, das ist bei mir nicht der Fall.

    Hier die Details:

    68fafa6853ff000167db084b464d101000547382010921004de3c9087e720cde8e9884e6855ed57cd985ad0fdddfbad00f9a58ef7478f02f0be2e16cc50e9ace54ccebed9f3cad84bab63221ea4b1463ebd5d6b84318bf1dc1be6d1717ec9faf4b6aa77c5d72d1b27884c17e09bfca29f3604480a17f9649e9f9c68e3fd48d4e68ddcc7d3f4c322ed17d573b7c4819cad7ceac7ec732293a7e479a8f76647d41f4cbfa5b0630c208ce6dab33754c499a95448af58abe9a8700bf3016595403a499b27782a3290f1a6c15d7122065c194a00da08e200b75fd0e8bd30b5c5a19e593eedbcc4b80023d902abe9bfff6b4f6aa1f16d6fe8cf4c96e5f4cff782777166826266853ff11016700ce873f7a42748ccec8623760c9c2ad2c

    Traceback (most recent call last):
    File “/home/terra/EvnSmartmeterMQTT.py”, line 75, in
    WirkenergieP = int(str(results_32)[16:16+8],16)
    ValueError: invalid literal for int() with base 16: ”

    Ich sehe hier zwei Nachrchten:

    68fafa6853ff000167 = START1-L-L-START2-C-A-CI-STSAP-DTSAP
    payload = db084b464d101000547382010921004de3c9087e720cde8e9884e6855ed57cd985ad0fdddfbad00f9a58ef7478f02f0be2e16cc50e9ace54ccebed9f3cad84bab63221ea4b1463ebd5d6b84318bf1dc1be6d1717ec9faf4b6aa77c5d72d1b27884c17e09bfca29f3604480a17f9649e9f9c68e3fd48d4e68ddcc7d3f4c322ed17d573b7c4819cad7ceac7ec732293a7e479a8f76647d41f4cbfa5b0630c208ce6dab33754c499a95448af58abe9a8700bf3016595403a499b27782a3290f1a6c15d7122065c194a00da08e200b75fd0e8bd30b5c5a19e593eedbcc4b80023d902abe9bfff6b4f6aa1f16d6fe8cf4c96e5f4cff7827
    77 = CS
    16 = END

    6826266853ff110167 = START1-L-L-START2-C-A-CI-STSAP-DTSAP
    payload = 00ce873f7a42748ccec8623760c9c2ad
    2c = CS?

    • Update:

      Ich vermute die zweite Nachricht ist bei mir abgeschnitten, ich sehe in Zeile 53 das der read auf die ersten 282 Zeichen eingeschränkt ist.
      Wenn ich hier 282 auf 300 ändere bekomme ich die ganze zweite Nachricht mit “16” am Ende wie in der Doku steht

      daten = ser.read(size=300).hex()

      Klappt aber trotzdem nicht, die payloads müssten zusammengehängt werden soweit ich das laut Doku verstehe.

      Beispiel Output von gerade eben:

      68fafa6853ff000167db084b464d101000547382010921004de48343a3f1673096f9ced6dafc323c57ac7768d7e36f54eb753cf1869e3016de07cd46808124c08ba1a0c8e2bd65fb1240bca685c64411f53dc22f9dc77c50bde603a01ea2be82e77cbfd6427a47425f3dacecfe2f862931d5d8a1cdda4b26513b66c7538110468ee0264ad09580decbb111f75c1036a039a5a65ea67891c8951c040acc898a990caaa19ed95101f72c3ac5f32cbfbfc469ea01332bc12e66d32d608eb7651c02b3ac408e3621f612a3011991dfe832a4d8c5e9f0ee711164107588f55e828e19f93b85afc4a051a0a20593c70ec4e5db36c1c549abc1139922f662b36ce621166826266853ff110167af5505e9b8a3dda39de9ea1f7d29d3dc0786fdbf2741f0b83115dd0ea8c0a4b122e516

      Und geteilt ergibt das:

      ERSTE NACHRICHT:
      68fafa6853ff000167 = START1-L-L-START2-C-A-CI-STSAP-DTSAP
      payload = db084b464d101000547382010921004de48343a3f1673096f9ced6dafc323c57ac7768d7e36f54eb753cf1869e3016de07cd46808124c08ba1a0c8e2bd65fb1240bca685c64411f53dc22f9dc77c50bde603a01ea2be82e77cbfd6427a47425f3dacecfe2f862931d5d8a1cdda4b26513b66c7538110468ee0264ad09580decbb111f75c1036a039a5a65ea67891c8951c040acc898a990caaa19ed95101f72c3ac5f32cbfbfc469ea01332bc12e66d32d608eb7651c02b3ac408e3621f612a3011991dfe832a4d8c5e9f0ee711164107588f55e828e19f93b85afc4a051a0a20593c70ec4e5db36c1c549abc1139922f662b36ce6
      21 = CS
      16 = END

      ZWEITE NACHRICHT:
      6826266853ff110167 = START1-L-L-START2-C-A-CI-STSAP-DTSAP
      payload = af5505e9b8a3dda39de9ea1f7d29d3dc0786fdbf2741f0b83115dd0ea8c0a4b122
      e5 = CS
      16 = END

  • Hallo!

    Folgenden Adapter verwende ich:
    Greluma 2 Stück USB zu RS485… https://www.amazon.de/dp/B09P8CX69G?ref=ppx_pop_mob_ap_share

    Ich bekomme leider nur diese Rückmeldung:
    raspberrypi:~ $ python3 EVN.py
    000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    Traceback (most recent call last):
    File “EVN.py”, line 61, in
    while tr.findNextFrame(msg, pdu):
    File “/usr/local/lib/python3.7/dist-packages/gurux_dlms/GXDLMSTranslator.py”, line 171, in findNextFrame
    elif msg.interfaceType in (None, InterfaceType.WRAPPER) and data.getUInt16(data.position) == 0x1:
    File “/usr/local/lib/python3.7/dist-packages/gurux_dlms/GXByteBuffer.py”, line 338, in getUInt16
    raise ValueError(“getUInt16”)
    ValueError: getUInt16

    Liegt es am Adapter?

    Danke schon mal!

    • Hallo,
      ja der Adappter ist auf jeden Fall der falsche.
      In der Anleitung ist einer Verlinkt der definitiv funktioniert leider ist die Lieferzeit etwas länger (ca. 3 Wochen da er immer aus China kommt) leider habe ich noch keine alternative gefunden.

      LG Michael

  • Eingangs Vielen Dank für deine Mühe Michael. Sehr cooles Projekt.

    Falls Interesse besteht: Ich habe das ganze Projekt etwas verteilt und ohne NodeRed realisiert.
    Die Installation von Influx (bei mir läuft das ganze in einer postgreDB), Mosquitto u. Grafana habe ich in ein docker-compose file verpackt. So muss man sich nicht um die Installation der Infrastruktur kümmern.

    Setup des ganzen Projekts bis lauffähig sind 2 Bashscripte notwendig, dann läufts.

    mein Stack (up and running):
    – rp4
    – infrastruktur via docker-compose
    – postgreDB mit timeseries extension
    – SpringBoot Applikation fürs Backend(Influx u. postgre möglich) ebenfalls als DockerImage
    – Backup- u. Migrationsmöglichkeit historischer Daten möglich

    Setup:
    ./preparations.sh
    …restart des rp
    ./start_the_action.sh
    …done

  • Hallo .

    Da ich seit kurzen einen MA309 bekommen habe bin ich auf diese Webseite gestoßen.
    Und seither begeisterter Leser von diesem Blog.
    Super Arbeit.
    Dadurch konnte ich sogar als kompletter Linux Neueinsteiger ein Script zum laufen bringen.

    Nun hätte ich da noch eine Frage.
    Ich habe ja gelesen, das die Daten 2 Monate im Smartmeter gespeichert sind.
    Gibt es eine Möglichkeit alle gespeicherten Daten auszulesen ?

    Danke im Voraus

  • Hallo, habe einen Kaifa MA110.
    Das gibt mir immer wieder diesen Fehler aus, wenn ich das Script starte:

    Traceback (most recent call last):
    File “EvnSmartmeterMQTTKaifaMA309.py”, line 96, in
    StromL1 = int(str(results_16)[112:116],16)/100
    ValueError: invalid literal for int() with base 16: ”

    Kann es daran liegen, dass ich den 1-Phasigen MA110 Zähler habe?
    Ist es möglich das Script daran anzupassen?
    Danke im Voraus!

  • Experts, was muss angepasst werden? (Schnittstellenthema?)

    Traceback (most recent call last):
    File “/usr/lib/python3/dist-packages/serial/serialposix.py”, line 265, in open
    self.fd = os.open(self.portstr, os.O_RDWR | os.O_NOCTTY | os.O_NONBLOCK)
    FileNotFoundError: [Errno 2] No such file or directory: ‘/dev/ttyUSB0’

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File “/home/pi/Documents/github file/SmartMeterEVNKaifaMA309-main/EvnSmartmeterMQTTKaifaMA309.py”, line 48, in
    parity=serial.PARITY_NONE,
    File “/usr/lib/python3/dist-packages/serial/serialutil.py”, line 240, in __init__
    self.open()
    File “/usr/lib/python3/dist-packages/serial/serialposix.py”, line 268, in open
    raise SerialException(msg.errno, “could not open port {}: {}”.format(self._port, msg))
    serial.serialutil.SerialException: [Errno 2] could not open port /dev/ttyUSB0: [Errno 2] No such file or directory: ‘/dev/ttyUSB0’

  • Hallo Markus,
    ich hatte auch das gleiche Problem, bei mir kamen auch nur die 7 Datensätze. Ich habe auch mit der Salzburg AG Kontakt aufgenommen, aber leider keine Antwort erhalten.
    Aber ich habe ein Modul gefunden mit dem sämtliche Daten ausgelesen werden können und das funktioniert sehr gut.

    https://www.willhaben.at/iad/kaufen-und-verkaufen/d/smartmeter-kundenschnittstellenmodul-617449544/

    Kannst ja mal nachfragen wenn du interesse hast.
    lg Wolfgang

  • Kommen bei der Salzburg-AG wirklich nur so wenig Daten? 3x Spannung, 3x Strom, 1x Wirkleistung ?
    Laut Beschreibung bei der Salzburg Ag https://www.salzburgnetz.at/content/dam/salzburgnetz/dokumente/stromnetz/Technische-Beschreibung-Kundenschnittstelle.pdf sollten es mehr Daten sein.

    Ich habe oben angeführtes Script angepasst, bekomme aber nicht mehr Daten.

    ……

    tr = GXDLMSTranslator()
    ser = serial.Serial( port=comport,
    baudrate=2400,
    bytesize=serial.EIGHTBITS,
    parity=serial.PARITY_NONE,
    )

    while 1:
    #daten = ser.read(size=300).hex()
    #daten = ser.read(size=376).hex()
    daten = ser.read(size=376).hex()
    systemTitel = daten[22:38]
    frameCounter = daten[46:46+8]
    frame = daten[54:510]
    #print(“daten :\n”+ daten)
    frame = unhexlify(frame)
    encryption_key = unhexlify(evn_schluessel)
    init_vector = unhexlify(systemTitel + frameCounter)

    aesgcm = AESGCM(encryption_key)
    apdu = aesgcm.encrypt(init_vector, frame, b’0′).hex()
    #print(“apdu :\n”, apdu)
    try:
    xml = tr.pduToXml(apdu[:-32],)
    #print(“xml :\n”, xml)
    soup = BeautifulSoup(xml, ‘lxml’)
    #print(“soup: “, soup)
    results_32 = soup.find_all(‘uint32’)
    results_16 = soup.find_all(‘uint16’)
    #results_int16 = soup.find_all(‘int16’) # findet nix
    #print(“results_32”, results_32)
    #print(“results_16”, results_16)
    #print(“results_int16”, results_int16)
    #octetstring = soup.find_all(‘octetstring’)
    #print(“octetstring”, octetstring)
    except Exception as err:
    print(“Fehler beim Synchronisieren. Programm bitte nochmals starten.”)
    print()
    print(“Fehler: “, format(err))
    sys.exit()

    try:
    #Wirkleistung Bezug Watt
    WirkleistungPA = str(results_32[0])
    WirkleistungP = int(WirkleistungPA[WirkleistungPA.find(‘=’)+2:WirkleistungPA.find(‘=’)+10],16)

    #Wirkleistung Lieferung Watt # geht, aber bei mir immer 0
    #WirkleistungNA = str(results_32[1])
    #WirkleistungN = int(WirkleistungNA[WirkleistungNA.find(‘=’)+2:WirkleistungNA.find(‘=’)+10],16)

    #Wirkenergie Bezug in Wh
    #WirkenergiePA = str(results_32[2])
    #WirkenergieP = int(WirkenergiePA[WirkenergiePA.find(‘=’)+2:WirkenergiePA.find(‘=’)+10],16)/1000

    #Wirkenergie Lieferung in Wh # geht, aber bei mir immer 0
    #WirkenergieNA = str(results_32[3])
    #WirkenergieN = int(WirkenergieNA[WirkenergieNA.find(‘=’)+2:WirkenergieNA.find(‘=’)+10],16)/1000

    #Spannung L1
    SpannungL1A = str(results_16[0])
    SpannungL1 = int(SpannungL1A[SpannungL1A.find(‘=’)+2:SpannungL1A.find(‘=’)+6],16)*0.1

    #Spannung L2
    SpannungL2A = str(results_16[1])
    SpannungL2 = int(SpannungL2A[SpannungL2A.find(‘=’)+2:SpannungL2A.find(‘=’)+6],16)*0.1

    #Spannung L3
    SpannungL3A = str(results_16[2])
    SpannungL3 = int(SpannungL3A[SpannungL3A.find(‘=’)+2:SpannungL3A.find(‘=’)+6],16)*0.1

    #Strom L1
    StromL1A = str(results_16[3])
    StromL1 = int(StromL1A[StromL1A.find(‘=’)+2:StromL1A.find(‘=’)+6],16)*0.01

    #Strom L2
    StromL2A = str(results_16[4])
    StromL2 = int(StromL2A[StromL2A.find(‘=’)+2:StromL2A.find(‘=’)+6],16)*0.01

    #Strom L3
    StromL3A = str(results_16[5])
    StromL3 = int(StromL3A[StromL3A.find(‘=’)+2:StromL3A.find(‘=’)+6],16)*0.01

    #Leistungsfaktor
    #LeistungsfaktorA = str(results_16[0])
    #Leistungsfaktor = int(LeistungsfaktorA[LeistungsfaktorA.find(‘=’)+2:LeistungsfaktorA.find(‘=’)+6],16)*0.001

    if printValue:
    #print(‘___________________________________________’)
    print(‘Wirkleistung Bezug (W) : ‘ + str(WirkleistungP))
    #print(‘Wirkleistung Lieferung : ‘ + str(WirkleistungN))
    #print(‘Wirkenergie Bezug (Wh): ‘ + str(WirkenergieP))
    #print(‘Wirkenergie Lieferung : ‘ + str(WirkenergieN))
    #print(‘Spannung L1 : ‘ + str(SpannungL1))
    #print(‘Spannung L2: ‘ + str(SpannungL2))
    #print(‘Spannung L3: ‘ + str(SpannungL3))
    #print(‘Strom L1 : ‘ + str(StromL1))
    #print(‘Strom L2: ‘ + str(StromL2))
    #print(‘Strom L3: ‘ + str(StromL3))
    #print(‘Leistungsfaktor: ‘ + str(Leistungsfaktor))
    #print(‘___________________________________________’)

    #MQTT
    if useMQTT:
    client.publish(“Smartmeter/Wirkleistung”,WirkleistungP)
    #client.publish(“Smartmeter/Wirkenergie”,WirkenergieP)
    #client.publish(“Smartmeter/MomentanleistungP”,MomentanleistungP)
    #client.publish(“Smartmeter/MomentanleistungN”,MomentanleistungN)
    #client.publish(“Smartmeter/Momentanleistung”,MomentanleistungP – MomentanleistungN)
    client.publish(“Smartmeter/SpannungL1”,SpannungL1)
    client.publish(“Smartmeter/SpannungL2”,SpannungL2)
    client.publish(“Smartmeter/SpannungL3”,SpannungL3)
    client.publish(“Smartmeter/StromL1”,StromL1)
    client.publish(“Smartmeter/StromL2”,StromL2)
    client.publish(“Smartmeter/StromL3”,StromL3)
    #client.publish(“Smartmeter/Leistungsfaktor”,Leistungsfaktor)

    except BaseException as err:
    print(“Fehler2 beim Synchronisieren. Programm bitte ein weiteres mal Starten.”)
    print()
    print(“Fehler2: “, format(err))
    …..

  • Hallo,

    Gibt es die möglichkeit mehrere Smartmeter an einen Pi zu hängen?
    Ich habe 6! Stück und möchte nicht 6 Pi’s kaufen und einbauen.

  • Hallo,

    Hat alles auf Anhieb funktioniert – Super Leistung !

    Nun bin ich da über etwas “Drübergestolpert” und zwar

    import paho.mqtt.client as mqtt

    Geht das nur mit dem paho als mqtt client?

    Im IOBroker die Datenpunkte angelegt, aber da kommt leider nix an, nicht mal ein Fehler im log.

    LG Toni

  • Hallo
    Zunächst finde ich das eine interessante Lösung.
    Ich habe auch Kaifa Ma309 (IKB Innsbruck) mit den Bauteilen wie vorgeschlagen und Raspberry / Openhabian.
    Mein Script stolpert auch ueber die Parser lxml Fehlermeldung. Gibt es hier Abhilfe?

    Hat jemand eine Openhab Anbindung MQTT schon gebaut? Wäre sehr interessiert.

    LG
    Andreas

  • Hi, habe zwei issues gefixed:

    – eine Kleinigkeit bezüglich mqtt
    – und vorallem das “Synchronisationsproblem am m-bus”

    Eventuell sollte man es auf github committen. Es sieht jetzt bei mir so aus:

    #!/usr/bin/python3

    from gurux_dlms.GXByteBuffer import GXByteBuffer
    import serial
    import time
    from cryptography.hazmat.primitives.ciphers.aead import AESGCM
    from binascii import unhexlify
    import sys
    import string
    import paho.mqtt.client as mqtt
    from gurux_dlms.GXDLMSTranslator import GXDLMSTranslator
    from gurux_dlms.GXDLMSTranslatorMessage import GXDLMSTranslatorMessage
    from bs4 import BeautifulSoup

    # EVN Schlüssel eingeben zB. “36C66639E48A8CA4D6BC8B282A793BBB”
    evn_schluessel = “dein_Schlüssel”

    #MQTT Verwenden (True | False)
    useMQTT = True

    #MQTT Broker IP adresse Eingeben ohne Port!
    mqttBroker = “10.0.0.20”
    mqttuser =””
    mqttpasswort = “”
    #Aktuelle Werte auf Console ausgeben (True | False)
    printValue = True
    connected = False

    #Comport Config/Init
    comport = “/dev/ttyUSB0”

    #MQTT Init
    if useMQTT:
    try:
    client = mqtt.Client(“SmartMeter”)
    client.username_pw_set(mqttuser, mqttpasswort)
    client.connect(mqttBroker, port=1883)
    connected = True
    except:
    print(“Die Ip Adresse des Brokers ist falsch!”)
    sys.exit()

    tr = GXDLMSTranslator()
    tr.blockCipherKey = GXByteBuffer(evn_schluessel)
    tr.comments = True
    ser = serial.Serial( port=comport,
    baudrate=2400,
    bytesize=serial.EIGHTBITS,
    parity=serial.PARITY_NONE,
    timeout=1,
    inter_byte_timeout=0.2
    )

    while 1:
    nob = ser.inWaiting()
    while (nob != 282):
    nob1 = ser.inWaiting()
    time.sleep(0.3)
    nob = ser.inWaiting()
    if (nob1 == nob) and (nob282):
    daten = ser.read(nob).hex()
    print(“Invalid data detected (too large to be a block).”)

    daten = ser.read(size=282).hex()
    print(daten)

    msg = GXDLMSTranslatorMessage()
    msg.message = GXByteBuffer(daten)
    xml = “”
    pdu = GXByteBuffer()
    tr.completePdu = True
    l32 = 0
    l16 = 0
    try:
    while tr.findNextFrame(msg, pdu):
    pdu.clear()
    xml += tr.messageToXml(msg)

    soup = BeautifulSoup(xml, ‘lxml’)

    results_32 = soup.find_all(‘uint32’)
    results_16 = soup.find_all(‘uint16’)
    l32 = len(str(results_32))
    l16 = len(str(results_16))
    except:
    l32 = 1
    l16 = 1
    time.sleep(.1)

    print()

    if ((l32 > 2)) and ((l16 > 2)):
    #Wirkenergie A+ in Wattstunden
    WirkenergieP = int(str(results_32)[16:16+8],16)

    #Wirkenergie A- in Wattstunden
    WirkenergieN = int(str(results_32)[52:52+8],16)

    #Momentanleistung P+ in Watt
    MomentanleistungP = int(str(results_32)[88:88+8],16)

    #Momentanleistung P- in Watt
    MomentanleistungN = int(str(results_32)[124:124+8],16)

    #Spannung in Volt
    SpannungL1 = int(str(results_16)[16:20],16)/10
    SpannungL2 = int(str(results_16)[48:52],16)/10
    SpannungL3 = int(str(results_16)[80:84],16)/10

    #Strom in Ampere
    StromL1 = int(str(results_16)[112:116],16)/100
    StromL2 = int(str(results_16)[144:148],16)/100
    StromL3 = int(str(results_16)[176:180],16)/100

    #Leistungsfaktor
    Leistungsfaktor = int(str(results_16)[208:212],16)/1000

    if printValue:
    print(‘Wirkenergie+: ‘ + str(WirkenergieP))
    print(‘Wirkenergie: ‘ + str(WirkenergieN))
    print(‘MomentanleistungP+: ‘ + str(MomentanleistungP))
    print(‘MomentanleistungP-: ‘ + str(MomentanleistungN))
    print(‘Spannung L1: ‘ + str(SpannungL1))
    print(‘Spannung L2: ‘ + str(SpannungL2))
    print(‘Spannung L3: ‘ + str(SpannungL3))
    print(‘Strom L1: ‘ + str(StromL1))
    print(‘Strom L2: ‘ + str(StromL2))
    print(‘Strom L3: ‘ + str(StromL3))
    print(‘Leistungsfaktor: ‘ + str(Leistungsfaktor))
    print(‘Momentanleistung: ‘ + str(MomentanleistungP-MomentanleistungN))
    print()
    print()

    #MQTT
    if useMQTT:
    while not connected:
    try:
    client.reconnect()
    connected = True
    except:
    print(“Lost Connection to MQTT…Trying to reconnect in 2 Seconds”)
    time.sleep(2)

    client.publish(“Smartmeter/WirkenergieP”, WirkenergieP)
    client.publish(“Smartmeter/WirkenergieN”, WirkenergieN)
    client.publish(“Smartmeter/MomentanleistungP”, MomentanleistungP)
    client.publish(“Smartmeter/MomentanleistungN”, MomentanleistungN)
    client.publish(“Smartmeter/Momentanleistung”, MomentanleistungP – MomentanleistungN)
    client.publish(“Smartmeter/SpannungL1”, SpannungL1)
    client.publish(“Smartmeter/SpannungL2”, SpannungL2)
    client.publish(“Smartmeter/SpannungL3”, SpannungL3)
    client.publish(“Smartmeter/StromL1”, StromL1)
    client.publish(“Smartmeter/StromL2”, StromL2)
    client.publish(“Smartmeter/StromL3”, StromL3)
    client.publish(“Smartmeter/Leistungsfaktor”, Leistungsfaktor)
    #except BaseException as err:
    # print(“Fehler beim Synchronisieren. Programm bitte ein weiteres mal Starten.”)
    # print()
    # print(“Fehler: “, format(err))

    # sys.exit()

    Viele Grüße, Helmut

  • Hallo Michael,
    ich habe seit kurzem einen Kaifa MA309 SmartMeter in Betrieb und würde gerne die Daten über den IoBroker in eine Influx DB Datenbank laden. Diese dann mit Grafana, analog deinen Anleitungen auswerten.
    Aber da ich nicht sehr erfahren bin mit GitHub scheitere ich bereits mit den einfachsten Dingen.
    Ich habe auf meinem Raspberry PI4 die Programme laut deiner Anleitung
    sudo apt-get install python3-pip
    sudo apt install python3 idle3 # installiert Python3
    sudo pip3 install gurux-dlms # library für die Übersetzung in eine XML
    sudo pip3 install beautifulsoup4 # library beautifulsoup4
    sudo pip3 install paho-mqtt # library für die MQTT Verbindung
    sudo pip3 install lxml # library für XML Parser
    sudo pip3 install pyserial # library für die Seriele Schnittstelle
    sudo pip3 install cryptography # library für die Entschlüsselung
    ohne Probleme installiert.
    Jedoch mit der GitHub Datei kann ich nichts anfangen – wie bekomme ich diese auf meinen PI4 und wie kann ich die Daten abändern?
    Bitte um Unterstützung, da ich schon etwas verzweifle.
    lg Wolfgang

    • Hallo,

      kommt immer drauf an was alles auf den Raspberry Pi läuft. Wenn nur das Encoding drauf läuft wir der Pi 1 kein Problem sein.
      Das Skript läuft auf jedem Gerät was Python fähig ist. Ich habe es selber unter Windows getestet und eben unter Linux. Wenn du es testet auf einem Orange PI dann kannst mir gerne schreiben und eventuell den Verlinken.
      LG Michael

  • Hallo

    Kann dein Skript alle Daten auslesen vom Wechselrichter mit einzeiligen Display
    Hab nur Strang 1 und 2 zum auslesen im iobroker gefunden

    Brauche ich nun 2 Rasberry pi oder läuft alles auf einen
    Momentan log ich mal Daten auf SQL

    Werde mal versuchen den Rasberry im Zählerkasten positionieren um zu schauen ob WLAN reicht

    Mit freundlichen Grüßen Andi T

  • Hallo Michael

    Tolle Arbeit

    Kann Mann die Daten vom Zähler auch im Iobrocker anzeigen lassen
    Bin gerade dabei diesen zu Testen da er auf meinen alten Kostal Piko Wechselrichter zugreifen kann.
    Oder parallel am Rasbperry laufen und die Daten dort abrufen

    Danke Mit freundlichen Grüßen aus Randegg
    A.T

    • Hallo,

      die Daten kann man im IO Broker sicher über MQTT entgegennehmen.
      Welcher Kostal Piko ist das ich habe selber ein Skript dafür geschrieben da ich auch einen alten habe.
      LG Michael

  • OK, um mein eigenes Post zu beantworten, mit einem HoneywellDM515 bei den Innsbrucker Kommunalbetrieben ( ikb ) funktioniert Dein Script, etwas abgewandelt, ebenfalls!!!!

    import serial
    import time
    from cryptography.hazmat.primitives.ciphers.aead import AESGCM
    from binascii import unhexlify
    import sys
    import string
    import paho.mqtt.client as mqtt
    from gurux_dlms.GXDLMSTranslator import GXDLMSTranslator
    from bs4 import BeautifulSoup

    # EVN Schlüssel eingeben zB. “36C66639E48A8CA4D6BC8B282A793BBB”
    evn_schluessel = “5664755541335338746C79526361786A”

    #MQTT Verwenden (True | False)
    useMQTT = True

    #MQTT Broker IP adresse Eingeben ohne Port!
    mqttBroker = “192.168.6.165”
    mqttuser =”phil_mqtt”
    mqttpasswort = “fGli87ffIZzAa”
    mqttport = 1883

    #Aktuelle Werte auf Console ausgeben (True | False)
    printValue = True

    #Comport Config/Init
    comport = “/dev/ttyUSB0”

    #MQTT Init
    if useMQTT:
    try:
    client = mqtt.Client(“SmartMeter”)
    client.username_pw_set(mqttuser, mqttpasswort)
    client.connect(mqttBroker, mqttport)
    except:
    print(“Die Ip Adresse des Brokers ist falsch!”)
    sys.exit()

    tr = GXDLMSTranslator()
    ser = serial.Serial( port=comport,
    baudrate=2400,
    bytesize=serial.EIGHTBITS,
    parity=serial.PARITY_NONE,
    )

    while 1:
    daten = ser.read(size=300).hex()
    systemTitel = daten[22:38]
    frameCounter = daten[46:46+8]
    frame = daten[54:510]
    #print(daten)
    frame = unhexlify(frame)
    encryption_key = unhexlify(evn_schluessel)
    init_vector = unhexlify(systemTitel + frameCounter)

    aesgcm = AESGCM(encryption_key)
    apdu = aesgcm.encrypt(init_vector, frame, b’0′).hex()
    #print(“apdu :\n”, apdu)
    try:
    xml = tr.pduToXml(apdu[:-32],)
    #print(“xml: “, xml)
    soup = BeautifulSoup(xml, ‘lxml’)
    results_32 = soup.find_all(‘uint32’)
    results_16 = soup.find_all(‘uint16’)
    #results_int16 = soup.find_all(‘int16’) # findet nix
    #print(“results_32”, results_32)
    #print(“results_16”, results_16)
    #print(“results_int16”, results_int16)
    except Exception as err:
    print(“Fehler beim Synchronisieren. Programm bitte nochmals starten.”)
    print()
    print(“Fehler: “, format(err))
    sys.exit()

    try:
    #Wirkleistung Bezug Watt
    WirkleistungPA = str(results_32[0])
    WirkleistungP = int(WirkleistungPA[WirkleistungPA.find(‘=’)+2:WirkleistungPA.find(‘=’)+10],16)

    #Wirkleistung Lieferung Watt # geht, aber bei mir immer 0
    #WirkleistungNA = str(results_32[1])
    #WirkleistungN = int(WirkleistungNA[WirkleistungNA.find(‘=’)+2:WirkleistungNA.find(‘=’)+10],16)

    #Wirkenergie Bezug in Wh
    WirkenergiePA = str(results_32[2])
    WirkenergieP = int(WirkenergiePA[WirkenergiePA.find(‘=’)+2:WirkenergiePA.find(‘=’)+10],16)/1000

    #Wirkenergie Lieferung in Wh # geht, aber bei mir immer 0
    #WirkenergieNA = str(results_32[3])
    #WirkenergieN = int(WirkenergieNA[WirkenergieNA.find(‘=’)+2:WirkenergieNA.find(‘=’)+10],16)/1000

    #Spannung L1
    SpannungL1A = str(results_16[0])
    SpannungL1 = int(SpannungL1A[SpannungL1A.find(‘=’)+2:SpannungL1A.find(‘=’)+6],16)*0.1

    #Spannung L2
    #SpannungL2A = str(results_16[1])
    #SpannungL2 = int(SpannungL2A[SpannungL2A.find(‘=’)+2:SpannungL2A.find(‘=’)+6],16)*0.1

    #Spannung L3
    #SpannungL3A = str(results_16[2])
    #SpannungL3 = int(SpannungL3A[SpannungL3A.find(‘=’)+2:SpannungL3A.find(‘=’)+6],16)*0.1

    #Strom L1
    StromL1A = str(results_16[1])
    StromL1 = int(StromL1A[StromL1A.find(‘=’)+2:StromL1A.find(‘=’)+6],16)*0.01

    #Strom L2
    #StromL2A = str(results_16[4])
    #StromL2 = int(StromL2A[StromL2A.find(‘=’)+2:StromL2A.find(‘=’)+6],16)*0.01

    #Strom L3
    #StromL3A = str(results_16[5])
    #StromL3 = int(StromL3A[StromL3A.find(‘=’)+2:StromL3A.find(‘=’)+6],16)*0.01

    #Leistungsfaktor
    #LeistungsfaktorA = str(results_16[0])
    #Leistungsfaktor = int(LeistungsfaktorA[LeistungsfaktorA.find(‘=’)+2:LeistungsfaktorA.find(‘=’)+6],16)*0.001

    if printValue:
    print(‘Wirkleistung Bezug (W) : ‘ + str(WirkleistungP))
    #print(‘Wirkleistung Lieferung : ‘ + str(WirkleistungN))
    print(‘Wirkenergie Bezug (Wh): ‘ + str(WirkenergieP))
    #print(‘Wirkenergie Lieferung : ‘ + str(WirkenergieN))
    print(‘Spannung L1 : ‘ + str(SpannungL1))
    #print(‘Spannung L2: ‘ + str(SpannungL2))
    #print(‘Spannung L3: ‘ + str(SpannungL3))
    print(‘Strom L1 : ‘ + str(StromL1))
    #print(‘Strom L2: ‘ + str(StromL2))
    #print(‘Strom L3: ‘ + str(StromL3))
    #print(‘Leistungsfaktor: ‘ + str(Leistungsfaktor))
    print()

    #MQTT
    if useMQTT:
    client.publish(“Smartmeter/Wirkleistung”,WirkleistungP)
    client.publish(“Smartmeter/Wirkenergie”,WirkenergieP)
    #client.publish(“Smartmeter/MomentanleistungP”,MomentanleistungP)
    #client.publish(“Smartmeter/MomentanleistungN”,MomentanleistungN)
    #client.publish(“Smartmeter/Momentanleistung”,MomentanleistungP – MomentanleistungN)
    #client.publish(“Smartmeter/SpannungL1”,SpannungL1)
    #client.publish(“Smartmeter/SpannungL2”,SpannungL2)
    #client.publish(“Smartmeter/SpannungL3”,SpannungL3)
    #client.publish(“Smartmeter/StromL1”,StromL1)
    #client.publish(“Smartmeter/StromL2”,StromL2)
    #client.publish(“Smartmeter/StromL3”,StromL3)
    #client.publish(“Smartmeter/Leistungsfaktor”,Leistungsfaktor)
    except BaseException as err:
    print(“Fehler beim Synchronisieren. Programm bitte ein weiteres mal Starten.”)
    print()
    print(“Fehler: “, format(err))

    sys.exit()

    • Hallo Philipp,

      dein Skript funktioniert auch für den DM515 der Salzburg AG.

      Ich habe die readgrösse angepasst von 300 -> 376 “daten = ser.read(size=376).hex()
      Und es sind bei mir nur nur 6 results_16 3xStrom 3xSpannung und 1 results_32 Wirkleistung?
      Daher muss man die Ausgaben noch anpassen, sonst kommt ein “list index out of range” Fehler.

      Danke an greenmike und philipp

      • Hallo Hubert,
        ich verwende auch einen Smartmeter der Salzburg AG, zwar den Kaifa MA309 aber der sollte die gleichen Daten wie der DM515 liefern.
        Derzeit habe ich den GitHub Code mit Hilfe von Michael auf meinen Raspberry PI4 installiert. Der funktioniert aber nicht so wie er soll, deswegen hat mich Michael auf dein Skript verwiesen.
        Ich habe nur ein Problem, da ich nicht weiß wie ich das Skript auf meinem PI4 installieren bzw. zum Laufen bringe.
        Kannst du mir da bitte ein bisschen weiterhelfen?
        LG Wolfgang

  • Zur Info: Falls man einen unerkannten PL2303 Chips verwendet (bei mir PL2303GL), wird kein /dev/ttyUSB0 erzeugt, Linux-Kernelversion 5.13 bis 5.15 und 5.18 sind betroffen.
    Nun bekomme ich Daten von einem Honeywell-DM515, der gerade in Innsbruck von der ikb eingebaut wird, kann diese aber nicht entschlüsseln…
    Hat jemand mit besseren Programmierkenntnissen (als wie ich die habe) das hinbekommen?

  • Hallo,

    sorry ich weiß ich bin hier sicher im falschen Unterforum, ich weiß aber nicht wo ich sonst meine Frage unterbringen kann.
    Ich habe einen Hichi Wifi IR Lesekopf mit Tasmota gekauft und würde gerne meinen Smartmeter Siemens IM350 in Wien auslesen – kann mit hier irgendwer mit diesem Thema bitte helfen?

    VG
    Günter

  • Tausend Dank – funktionierte fast auf Anhieb. Anfangs brach das Script beim Parsen des Inhalts (findNextFrame) mehrmals ab, nachdem ich versucht hatte mich per screen zu verbinden (screen /dev/ttyUSB0 2400,cs8) und danach erneut das Script gestartet habe, hat es sofort und dauerhaft stabil funktioniert.

    Vielen vielen Dank für deine Arbeit und fürs Teilen – erspart mir ein komplett redundantes, zusätzliches “Kastl”.

  • Hey, ich versuche schon seit mehreren Tagen jetzt mit dem Programm Daten aus dem im Artikel erwähnten Smart-Meter auszulesen.

    Dafür habe ich mehrere RS485 zu USB Adapter schon probiert und an einen Raspberry Pi 4 angesteckt.

    Mein Problem ist jedes Mal, wenn ich das Programm starte, startet es zwar, aber es kommt überhaupt nichts an text, es bleibt einfach für immer leer, keine daten.
    Drehe ich aber die zwei Drähte um, sodass sie im Grunde verkehrt im Adapter stecken, bekomme ich error.

    Ich wäre sehr dankbar, wenn sie mir einen Ansatz geben könnte, warum ich es nicht schaffe, irgendwelche Daten zu bekommen.

  • Hallo,
    danke für das Kompliment.

    Zu den Fragen
    a) dass kann ich nicht genau sagen denn ich war einer der Ersten der den Key erhalten hat. Aber aus Erfahrung von den anderen so ca 1-2 Wochen.
    b) sie sollte immer Daten Senden diese sind aber verschlüsselt.
    c) Ob ein USB RS485 Adapter funktioniert weiß ich leider nicht. Die Pegel sind 29V (Logisch 1) und 12V (Logisch 0). Der TSS721A Chip wird nicht benötigt. Ich arbeite gerade an einer Schaltung um die Lieferschwierigkeiten zu umgehen. Der erste Prototype läuft auch schon am Steckbrett. Wenn die Schaltung fertig ist kann man Sie bei mir kaufen. Dann hat man eine Lieferzeit von ca 1-2 Tagen.

    LG Michael

  • Hallo Michael,

    Vielen Dank für deine tolle Arbeit! Ich bin vor 2 Tagen auf deinen Seite gestoßen.

    Habe mehrere Fragen
    a) Wie lange hat es bei euch gedauert, bis der EVN Key nach dem Anfordern da war ?
    b) ist die Schnittstelle standardmäßig aktiv ? Oder wird die erst beim Key anfordern freigeschaltet/aktiviert ?

    c) Adapter: sollte ein einfacher USB_RS485 Adapter auch funktioniert – oder brauchts f. den MBOS eine “inteligentere” Logic, ala TSS721A ?
    ( Hintergrund: Der von dir verlinkte Adapter hat mehr als 1 Monat Lieferzeit)

    Danke
    Martin

  • Hallo Michael,

    Hab gerade angefangen das bei mir auf einem Raspi3 umzusetzen! Bei mir scheint es schon beim installieren der Pakete Probleme zu geben!
    ————————————————————————–
    pi@Raspi:~ $ sudo pip3 install lxml
    Collecting lxml
    Downloading https://files.pythonhosted.org/packages/70/bb/7a2c7b4f8f434aa1ee801704bf08f1e53d7b5feba3d5313ab17003477808/lxml-4.9.1.tar.gz (3.4MB)
    100% |████████████████████████████████| 3.4MB 76kB/s
    Complete output from command python setup.py egg_info:
    Building lxml version 4.9.1.
    Building without Cython.
    Error: Please make sure the libxml2 and libxslt development packages are installed.

    —————————————-
    Command “python setup.py egg_info” failed with error code 1 in /tmp/pip-build-zis23dta/lxml/
    ————————————————————————–
    Danach gehts dann weiter mit :

    pi@Raspi:~ $ sudo pip3 install pyserial
    Requirement already satisfied: pyserial in /usr/lib/python3/dist-packages

    pi@Raspi:~ $ sudo pip3 install cryptography
    Requirement already satisfied: cryptography in /usr/lib/python3/dist-packages

    Starte ich dann dein Programm bekomme ich folgende Fehlermeldung:

    Traceback (most recent call last):
    File “/home/pi/EvnSmartmeter.py”, line 4, in
    from cryptography.hazmat.primitives.ciphers.aead import AESGCM
    File “/usr/lib/python3/dist-packages/thonny/backend.py”, line 305, in _custom_import
    module = self._original_import(*args, **kw)
    ImportError: No module named ‘cryptography.hazmat.primitives.ciphers.aead’

    Ich hoffe du kannst mich weiterhelfen! Habe einen EVN Kaifa MA309.

  • Hallo Michael,
    Ich habe mich jetzt länger mit der Schnittställe des EVN Zählers beschäftigt, da ich die Daten mit einem Arduino auslesen möchte. Dabei habe ich mit meinem Oszilloskop festgestellt, dass es 9 bits zwischen Start- und Stoppbit gibt. Dies bedeutet es ist ein Paritybit dabei (Even Parity in dem Fall). Ich hatte auch mit ein paar UART zu USB Wandlern Framing Errors, diese sind mit der Einstellung auf Even Parity auch weg. Parity Errors gibt es keine, somit sollte das passen. Du solltest in deinem Python Skript die Parity auch auf EVEN umstellen.

    LG Tobias (OE3TEC)

    • Dies sollte die meisten Probleme lösen, da dass Python Skript bei fehlerhaften Daten durch falsche UART Einstellungen abstürzt. Ich empfehle auch das Einlesen auf die ersten 4 Bytes (immer 68 FA FA 68) und das letzte Byte (immer 16) zu synchronisieren. Es kann auch zusätzlich die Checksumme (vorletztes Byte) zur Validierung des gesamten Datensatzes benutzt werden. Wie die Checksumme berechnet wird habe ich mir noch nicht angeschaut.

  • Servus,

    gehts nur mir so oder sind die Stromwerte (also Strom L1, L2 und L3) immer positiv, egal ob eingespeist wird oder bezogen?
    Kommt das vom Smartmeter selbst schon so “falsch” heraus?

    • Danke! für die Informationen!

      Sagemcom T210-D + Raspberry Zero W + Pegelwandler von Sigi
      wie von Sigi ermittelt mit 24V Z-Diode an der „internen“ 3,3V TTL RS232 des Raspberrys (für Kaifa MA309 mit 18V Z-Diode)
      /boot/config.txt: enable_uart=1
      /boot/cmdline.txt: console=serial0,115200 entfernen

      GND pin 6, RXD pin 10, 3,3V pin 1

      #!/usr/bin/env python3
      import time
      import serial

      ser = serial.Serial(
      port=’/dev/ttyAMA0′,
      baudrate = 2400,
      parity=serial.PARITY_NONE,
      bytesize=serial.EIGHTBITS,
      )

      while 1:
      x=ser.read(size=282).hex()
      print(x+’\n’)

  • Hallo,

    nutze jetzt den USB-Adapter aus dem Amazon-Link aber der wird offenbar nicht von einem Raspi3 erkannt.
    Die Fehlermeldung unter “dmesg” lautet:

    2445.019657] usb 1-1.2: USB disconnect, device number 4
    [ 2447.548756] usb 1-1.4: new full-speed USB device number 5 using dwc_otg
    [ 2447.652151] usb 1-1.4: New USB device found, idVendor=067b, idProduct=23d3, bcdDevice= 4.00
    [ 2447.652181] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
    [ 2447.652194] usb 1-1.4: Product: USB-Serial Controller
    [ 2447.652205] usb 1-1.4: Manufacturer: Prolific Technology Inc.
    [ 2447.652222] usb 1-1.4: SerialNumber: A:CUb198222
    [ 2447.653470] pl2303 1-1.4:1.0: pl2303 converter detected
    [ 2447.653519] pl2303 1-1.4:1.0: unknown device type, please report to linux-usb@vger.kernel.org

    An einem Windows-PC wird er erkannt und es fließen auch Daten über den seriellen Port.
    Nur am Raspberry bleibt der Port (dev/ttyAMA0) einfach stumm.

    Liegt das an der falschen Hardware ?
    lG
    Doris

    • Ich versuche jetzt das Ganze auf einem Windows-Rechner zum Laufen zu bringen auf dem der MBUS-Adapter funktioniert.
      Hier scheitere ich leider bei der Auswahl des richtigen COM-Ports.

      Mein Eintrag in Zeile45 des Skripts: ser = serial.Serial(“COM2”,2400,bytesize=serial.EIGHTBITS,parity=serial.PARITY_NONE)

      wird mit einem:

      raise SerialException(“could not open port {!r}: {!r}”.format(self.portstr, ctypes.WinError()))
      serial.serialutil.SerialException: could not open port ‘COM4’: FileNotFoundError(2, ‘Das System kann die angegebene Datei nicht finden.’, None, 2)

      quittiert.
      lG
      Dori

        • Ich habe auf meinen Raspi3 dieselbe Meldung wie Doris Gerstner und bekomme keine Wertw über den Port ttyAMA0 auf meinem Raspi3.

          10.512883] usbcore: registered new interface driver usbserial_generic
          [ 10.512974] usbserial: USB Serial support registered for generic
          [ 10.561940] usbcore: registered new interface driver pl2303
          [ 10.562071] usbserial: USB Serial support registered for pl2303
          [ 10.562222] pl2303 1-1.3:1.0: pl2303 converter detected
          [ 10.562261] pl2303 1-1.3:1.0: unknown device type, please report to linux-usb@vger.kernel.org

          Der Port (dev/ttyAMA0) liefert keine Werte bei beim Lesen ( daten = ser.read(size=282).hex() )
          Danke!

    • Hallo, ich hab hier leider das gleiche Thema.
      Adapter wird zwar erkannt > aber ich bekomm einfach keine ttyUSB* zugewiesen.
      Wenn ich usb-devices eingebe > sehe ich, dass er keinen Treiber geladen hat.
      Gibts hier einen workaround?

      danke

    • Hallo,
      gerne wenn du mich unterstützen möchtest, kaufe einfach über meinen Amazon Link kannst auch irgendetwas anderes Kaufen dafür bekomme, ich eine kleine Provision, ohne dass es dir Mehrkosten verursacht. Oder du spendest über den Paypal Link.

      Ich könnte es mir vorstellen das du beide Smart Meter auslesen kannst. Meines Wissen wird auch eine Zähler ID mitgeschickt die es ermöglicht die Daten dem Smart Meter zu zuordnen. Aber ich bin mir nicht sicher.
      LG Michael

      • Hallo,
        leider kommen keine Daten mehr an der seriellen Schnittstelle an, wenn man beide Smartmeter an das M-Bus to UART board anschließt.
        LG
        Michael

        • Hallo,
          das dacht ich mir dann müsste man schauen ob man an einem Raspberry PI 2 Serielle Schnittstellen Anschließen kann und das Skript das zweimal Starten.

          LG Michael

          • Ich hatte es auch nicht geschafft zwei Smartmeter mit einen MBUS Slave auszulesen.
            Ich habe daher einen zweier USB HUB an meine Raspi 1B angeschossen und dort jeweils einen MBUS Slave und starte zwei Pthyton Skripte.
            Damit immer der richtige USB Port den gleichen COM Port bekommt, habe ich eine udev Regel genutzt.

            Würde der COM Port vertauscht werden, läuft das Skript aber eh in einen Fehler.

  • Servus Mike,

    danke für Dein Projekt, netter Code. Habe es mit dem AliExpress-MBus-Adapter auf einem Pi Zero W unter Raspbian “Bullseye” zum Laufen gebracht.
    Allerdings habe ich folgende Python-Module nachinstallieren müssen:

    sudo apt install pip
    sudo pip install gurux_dlms Pyserial cryptography paho-mqtt beautifulsoup4 lxml

    Wichtig für alle Nachbauer: Nicht das Python-Modul “serial” installieren, sondern “Pyserial”, auch wenn die Fehlermeldung auf ersteres hindeutet!
    Den BS4-Fehler mit dem ‘lxml’-Parser hatte ich auch (obwohl lxml installiert ist), habe dann aber den internen ‘html.parser’ verwendet, der scheint auch zu funktionieren und ist eine Abhängigkeit weniger.

    Ich sende die MQTT-Messages auf einen lokalen Mosquitto-MQTT-Broker, der via Telegraf-MQTT-Plugin in die InfluxDB einspeist.

    Danke nochmals, ist jedenfalls eine Spende wert! 😉

  • mh… einen bus auslesen und dann daten via mqtt senden – so klingt es für mich – da würde doch eigentlich auch ein esp8266 reichen. müsste man natürlich software für anpassen, aber wäre doch eine viel preiswertere lösung, oder übersehe ich da was?

    • Hallo,
      da übersiehst du nichts, dass ist auch meine Wunschvorstellung aber leider habe ich gerade nicht viel Zeit zum Testen und Programmieren. Ich habe selber noch nicht viel Erfahrung. Daher habe ich es nur unter Python zum laufen gebracht und dachte mir ich veröffentlich schon mal diese Version viele haben schon einen Raspberry Pi zuhause.

  • Schönen Sonntag 🙂 Ich habe mal ein paar prints eingebaut:

    while tr.findNextFrame(msg, pdu):
    pdu.clear()
    xml += tr.messageToXml(msg)
    print(“XML: “+xml)
    soup = BeautifulSoup(xml, ‘lxml’)
    results_32 = soup.find_all(‘uint32’)
    results_16 = soup.find_all(‘uint16’)
    print(“**********************************”)
    print(results_16)
    print(results_32)
    print(“**********************************”)

    Es schaut so aus, als würden die Variablen nicht befüllt:

    XML:

    **********************************
    []
    []
    **********************************

  • Hallo, möchte vorweg sagen dass es sich hier um ein tolles Projekt handelt und schon mal danke sagen 🙂

    Ich bekomme leider auch einen Fehler wie Georg Banko.
    Verwende ein Ubuntu 20.04

    Traceback (most recent call last):
    File “/home/ulrich/Downloads/EvnSmartmeterMQTTKaifaMA309.py”, line 62, in
    while tr.findNextFrame(msg, pdu):
    File “/usr/local/lib/python3.8/dist-packages/gurux_dlms/GXDLMSTranslator.py”, line 195, in findNextFrame
    found = GXDLMS.getData(settings, data, reply, None)
    File “/usr/local/lib/python3.8/dist-packages/gurux_dlms/GXDLMS.py”, line 2269, in getData
    GXDLMS.__getWirelessMBusData(settings, reply, target)
    File “/usr/local/lib/python3.8/dist-packages/gurux_dlms/GXDLMS.py”, line 1114, in __getWirelessMBusData
    man = _GXCommon.decryptManufacturer(manufacturerID)
    File “/usr/local/lib/python3.8/dist-packages/gurux_dlms/internal/_GXCommon.py”, line 1810, in decryptManufacturer
    return str(c2, c1, c)
    TypeError: decoding str is not supported

      • Das Problem tritt bei mir beim Start auch öfter auf.
        Ich tippe auf ein “Synchronisationsproblem” im M-Bus.

        Manchmal muss man das Script einfach mehrfach starten bis es funktioniert. Wenn es dann läuft, dann ewig.

        Wenn man es als Service hinterlegt, dann ist das Problem irrelevant. Das OS startet das Script dann einfach so oft neu, bis es online geht.

  • Hallo, ich versuche, mit dem Script ein baugleiches Smartmeter der Salzburg AG auszulesen und bekommen den folgenden Fehler / der Schlüssel sollte aber passen – das habe ich geprüft: //* vielen Dank

    Traceback (most recent call last):
    File “SAGSmartmeterMQTT.py”, line 65, in
    while tr.findNextFrame(msg, pdu):
    File “/usr/local/lib/python3.7/dist-packages/gurux_dlms/GXDLMSTranslator.py”, line 195, in findNextFrame
    found = GXDLMS.getData(settings, data, reply, None)
    File “/usr/local/lib/python3.7/dist-packages/gurux_dlms/GXDLMS.py”, line 2269, in getData
    GXDLMS.__getWirelessMBusData(settings, reply, target)
    File “/usr/local/lib/python3.7/dist-packages/gurux_dlms/GXDLMS.py”, line 1114, in __getWirelessMBusData
    man = _GXCommon.decryptManufacturer(manufacturerID)
    File “/usr/local/lib/python3.7/dist-packages/gurux_dlms/internal/_GXCommon.py”, line 1810, in decryptManufacturer
    return str(c2, c1, c)
    TypeError: decoding str is not supported

  • Hallo,
    ich hätte einen BananaPI hier kann man auch Raspbian drauf installieren!
    Sollte eigentlich auch laufen oder?
    Und noch eine Frage ich hab eine PV Anlage mit Überschuss Einspeisung sprich dieser hat dann einen eigene Zählpunktnummer!
    Muss ich dann die Email in EVN Netz beide Nummern angeben?

    • Hallo,
      ich hatte zwar noch nie einen BananaPI aber es muss nur Python laufen dann kann man es nutzen habe es beim Programmieren auf meinem Windows PC laufen.
      Ich habe auch eine PV-Anlage aber nur einen Zähler. Ich habe nur die Kundennummer und Zählernummer gesendet. Aber ich denke die EVN wird sich melden wenn noch etwas Fehlt.
      LG Michael

      • Hallo nochmals!!
        Ok ich hab jetzt mal der NÖ netz eine anfrage geschickt. Gleichzeitig hab ich mir den Mbus adapter mal bei Amazon bestellt!
        2 fragen hätte ich noch.

        1. Brauche ich den MQTT server?
        2. Kannst du mit dieser art auch auslesen wieviel die PV anlage Produziert hat?

        • Hallo,

          1) Nein nicht unbedingt. Kommt immer auf deine Anforderungen drauf an. Wenn du schon ein Smarthome-System hast kann man es mit MQTT leicht einbinden. Wenn keines vorhanden kann man auch keine Daten austauschen mit einer Intelligenten Steckdose. Also ist ein MQTT Server nicht zwingend erforderlich.

          2) Ich kann nicht die PV Anlage auslesen aber ich kann sagen wie viel wurde in das Netz Eingespeist.

          LG Michael

          • Hm ok danke für die Infos!
            Das heißt du kannst die eigentlich mit Grafana nicht ermitteln wieviel KW du direkt aus der Anlage genommen hast!

            Könnte man hier z.b. einen Shelly 3em nutzen auf die 3 Phasen vom Wechselrichter anhängen und danach das in den Grafana einbinden und ausrechnen lassen?!

            Weil eigentlich ist es ja so. Leistung der PV Anlage minus Eingespeiste leistung ist direkt abgenommen von der Anlage!

          • Hast du das dann auch in Grafana Visualisiert?
            Kannst du hierzu vielleicht eine Anleitung machen wie das mit der Shelly funktioniert!?

            Besten dank!!

          • Schon gell!?
            Ich habe einen Huawei Wechselrichter. Diesen Könnt ich auch über dieses Programm auslesen und mit Grafana visualisieren!!

            Mal schaun ob ich das zustande bringe!

    • Heyy!
      Hab da noch eine Frage!

      Kann man in deiner Datenbank auch die Tarifpreise eintragen?

      Auch quasi Stundenweise? Weil ich habe jetzt einen Tages (08:00 – 20:00 Uhr) und Nacht (20:00 – 08:00) Tarif.
      Auch ändert sich mein Einspeis tarif jedes Quartal!

  • Super Aktion, danke. Ich kann Daten empfangen – nur irgendwie – wie hast du das gemacht mit der Datenbank? Gibts da auch Input? Ideal wäre auch wenn man den Verbrauch irgendwie zur Loxone bekommen könnt, zum Steuern 🙂

    • Hallo,
      ich bin gerade dabei einen weiteren Beitrag zu schreiben wie man die Daten über Node Red in eine Influxdatenbank bekommt und dann in Grafan Auswerten kann. Um die Daten in Loxone zu nutzen gibt es eine Möglichkeit die heißt Loxberry. Mit der kann mann MQTT Nachtichten in Loxone empfangen. Aber da kann ich leider keinen genauen Infos geben da ich kein Loxone verwende.
      LG Michael

      • Hier mal mein Programm:

        #sudo nano /etc/systemd/system/smartmeter
        from gurux_dlms.GXByteBuffer import GXByteBuffer
        import serial
        import time
        from cryptography.hazmat.primitives.ciphers.aead import AESGCM
        from binascii import unhexlify
        import sys
        import string
        import paho.mqtt.client as mqtt
        from gurux_dlms.GXDLMSTranslator import GXDLMSTranslator
        from gurux_dlms.GXDLMSTranslatorMessage import GXDLMSTranslatorMessage
        from bs4 import BeautifulSoup
        import socket

        UDP_IP = “xxx.xxx.xxx.xxx”
        UDP_PORT = xxxx

        # EVN Schlüssel eingeben zB. “36C66639E48A8CA4D6BC8B282A793BBB”
        evn_schluessel = “36C66639E48A8CA4D6BC8B282A793BBB”

        #MQTT Verwenden (True | False)
        useMQTT = False

        #MQTT Broker IP adresse Eingeben ohne Port!
        mqttBroker = “192.168.1.10”
        mqttuser =””
        mqttpasswort = “”
        #Aktuelle Werte auf Console ausgeben (True | False)
        printValue = True

        #Comport Config/Init
        comport = “/dev/ttyS0”

        #MQTT Init
        if useMQTT:
        try:
        client = mqtt.Client(“SmartMeter”)
        client.username_pw_set(mqttuser, mqttpasswort)
        client.connect(mqttBroker, port=1883)
        except:
        print(“Die Ip Adresse des Brokers ist falsch!”)
        sys.exit()

        tr = GXDLMSTranslator()
        tr.blockCipherKey = GXByteBuffer(evn_schluessel)
        tr.comments = True
        ser = serial.Serial( port=comport,
        baudrate=2400,
        bytesize=serial.EIGHTBITS,
        parity=serial.PARITY_NONE,
        )

        while 1:
        daten = ser.read(size=282).hex()

        msg = GXDLMSTranslatorMessage()
        msg.message = GXByteBuffer(daten)
        xml = “”
        pdu = GXByteBuffer()
        tr.completePdu = True
        while tr.findNextFrame(msg, pdu):
        pdu.clear()
        xml += tr.messageToXml(msg)

        soup = BeautifulSoup(xml, ‘lxml’)

        results_32 = soup.find_all(‘uint32’)
        results_16 = soup.find_all(‘uint16’)
        #print(results_16)

        #Wirkenergie A+ in KiloWattstunden
        WirkenergieP = int(str(results_32)[16:16+8],16)/1000

        #Wirkenergie A- in KiloWattstunden
        WirkenergieN = int(str(results_32)[52:52+8],16)/1000

        #Momentanleistung P+ in Watt
        MomentanleistungP = int(str(results_32)[88:88+8],16)

        #Momentanleistung P- in Watt
        MomentanleistungN = int(str(results_32)[124:124+8],16)

        #Spannung L1 in Volt
        SpannungL1 = int(str(results_16)[16:20],16)/10

        #Spannung L2 in Volt
        SpannungL2 = int(str(results_16)[48:52],16)/10

        #Spannung L3 in Volt
        SpannungL3 = int(str(results_16)[80:84],16)/10

        #Strom L1 in Ampere
        StromL1 = int(str(results_16)[112:116],16)/100

        #Strom L2 in Ampere
        StromL2 = int(str(results_16)[144:148],16)/100

        #Strom L3 in Ampere
        StromL3 = int(str(results_16)[176:180],16)/100

        #Leistungsfaktor
        Leistungsfaktor = int(str(results_16)[208:212],16)/1000

        if printValue:
        Momentanleistung = MomentanleistungP – MomentanleistungN

        #UPD senden
        WERTE = f”Wirkenergie+:{WirkenergieP}\ Wirkenergie:{WirkenergieN}\ MomentanleistungP+:{MomentanleistungP}\ MomentanleistungP-:{MomentanleistungN}\ SpannungL1:{SpannungL1}\ SpannungL2:{SpannungL2}\ SpannungL3:{SpannungL3}\ StromL1:{StromL1}\ StromL2:{StromL2}\ StromL3:{StromL3}\ Leistungsfaktor:{Leistungsfaktor}\ Momentanleistung:{Momentanleistung}”

        MESSAGE = str.encode(WERTE)

        sock = socket.socket(socket.AF_INET, # Internet
        socket.SOCK_DGRAM) # UDP
        sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))

        #MQTT
        if useMQTT:
        client.publish(“Smartmeter/WirkenergieP”, WirkenergieP)
        client.publish(“Smartmeter/WirkenergieN”, WirkenergieN)
        client.publish(“Smartmeter/MomentanleistungP”, MomentanleistungP)
        client.publish(“Smartmeter/MomentanleistungN”, MomentanleistungN)
        client.publish(“Smartmeter/Momentanleistung”, MomentanleistungP – MomentanleistungN)
        client.publish(“Smartmeter/SpannungL1”, SpannungL1)
        client.publish(“Smartmeter/SpannungL2”, SpannungL2)
        client.publish(“Smartmeter/SpannungL3”, SpannungL3)
        client.publish(“Smartmeter/StromL1”, StromL1)
        client.publish(“Smartmeter/StromL2”, StromL2)
        client.publish(“Smartmeter/StromL3”, StromL3)
        client.publish(“Smartmeter/Leistungsfaktor”, Leistungsfaktor)
        #except BaseException as err:
        # print(“Fehler beim Synchronisieren. Programm bitte ein weiteres mal Starten.”)
        # print()
        # print(“Fehler: “, format(err))

        # sys.exit()

    • soup = BeautifulSoup(xml, ‘lxml’)

      results_T = soup.find_all(‘datetime’)
      results_32 = soup.find_all(‘uint32’)
      results_16 = soup.find_all(‘uint16’)
      #print(results_16)
      TimeStampJahr = int(str(results_T)[18:18+4],16)
      #print(TimeStampJahr)
      TimeStampMonat = int(str(results_T)[22:22+2],16)
      #print(TimeStampMonat)
      TimeStampTag = int(str(results_T)[24:24+2],16)
      #print(TimeStampTag)
      TimeStampStd = int(str(results_T)[28:28+2],16)
      #print(TimeStampStd)
      TimeStampMin = int(str(results_T)[30:30+2],16)
      #print(TimeStampMin)
      TimeStampSek = int(str(results_T)[32:32+2],16)
      #print(TimeStampSek)

      • puuh, dann musst noch Strings konkatenieren und erst recht ein Datum draus parsen.
        ich hänge einfach nach dem auslesen der Werte ein

        date_to_add = [time.strftime(“%Y-%m-%d %H:%M:%S”)]

        an.

  • Hallo Michael,

    Echt stark dein Projekt!
    Ich habe deinen Code etwas umgebaut und lese alle Werte inkl. Zeitstempel ein. Läuft astrein. Ich benutze auch das Mbus modul von Mikroelektronika und setze dann auf Ethernet um. Zudem verwende ich einen NodeJs Server der die Werte gleich in die SPS schreibt. Deinen Script starte ich als child_process, somit habe ich die Kopplung bei Problemen wie Neustart usw. besser im Griff
    Aber echt geil wie du das mit der crypto Zeug hinbekommen hast!!!
    Melde dich mal, wir suchen immer wieder gute Leute die mit IT/OT/IoT was anfangen können!
    Top

  • Guten Tag, gleich vorweg, tolles Projekt! Leider scheitere ich beim Ausführen des Skripts. Ich habe das SmartMeter MA309M. Hat vielleicht jemand eine Idee warum? Ich bekomme diese Fehlermeldung:

    Traceback (most recent call last):
    File “/home/pi/Desktop/Logger.py”, line 73, in
    WirkenergieP = int(str(results_32)[16:16+8],16)/1000
    ValueError: invalid literal for int() with base 16: ”

  • Hallo,
    ich habe es geschafft mit dem Mbus modul von Mikroelektronika die Daten Seriell in den PI zu bekommen.

    https://at.rs-online.com/web/p/entwicklungstools-kommunikation-und-drahtlos/2167484?cm_mmc=AT-PLA-DS3A-_-google-_-CSS_AT_DE_Raspberry_Pi_%26_Arduino_und_Entwicklungstools_Whoop_HI-_-(AT:Whoop!)+Entwicklungstools+Kommunikation+und+Drahtlos-_-2167484&matchtype=&pla-352143129047&gclid=CjwKCAjwo8-SBhAlEiwAopc9W9sBmJEBbvGmGWuLyzhYl_vibX5ZUhCF-ISMVZ7spuwmvFqKnDLrdBoC8xUQAvD_BwE&gclsrc=aw.ds

    Es muss aber im Raspiconfig die Serielle Kommunikation fürs Terminal abgeschalten werden.

    Leider hab ich noch ein Problem mit den Python versionen, sodass ich das Datenpaket nicht entschlüssen kann.
    Habe aber testweise im Node-Red den Serial port abgegriffen, und da kommen alle 5 sekunden Daten an.
    EVN Zähler Sagem

    beste Grüße

  • hallo,

    vorweg – sehr lässiges Projekt! – danke für deinen einsatz!

    welchen stecker benutzt ihr um das modbus kabel an den smartmeter anzustecken – da braucht man ja diesen adapter.
    steht leider weder im text noch in den requirements.

    danke florian

  • Hallo Michael,

    könnte man bei dem MBus Modul die TTL seriellen RX/TX Pins direkt nach den beiden Optokoppler vor dem USB Chip abgreifen und direkt mit einen ESP32/ESP8266 verbinden?
    Könnte das funktionieren?

    LG Mario

  • Hallo, vielen Dank für diese Lösung. Ich hatte vor dem Kaifa den ISKRA von EVN über eine IR Schnittstelle und einen ESP8266 angebunden. Der wurde leider getauscht, mit DLMS ist es um einiges komplizierter. Energie Burgenland hat auf dem KAIFA übrigens die IR Schnittstelle freigeschaltet. Das Python Programm läuft bei mir gut, jedoch habe ich ein seltsames Phänomen: Während sich die WirkenergieP (also der Strombezug) mit dem Stromverbrauch hochzählt bleibt die WirkenergieN (also die Einspeisung meiner PV Anlage) solgange gleich, bis ich das Programm neu starte. Auch bleibt die MomentanleistungN immer 0, obwohl die PV Anlage einspeist. Ich habe auch einen Shelly 3EM installiert – er zeigt die Werte richtig an. Starte ich das Programm neu, sind die Werte da. Woran könnte das liegen?

  • Danke. Jedoch Scheitterts bei mir an der influx DB. Das wird leider nicht gezeigt und der dafür notwendige Kurs kostet 54€ :-(. Modul ist mit mosquitto verbunden. Sensoren werden erkannt unter Integration MQTT. (1 Gerät ,32 Entitäten). Influx DB konnte ich in grafana als Data source einfügen. Leider habe ich aber keine Ahnung wie ich nur die mqqt Daten in die influx DB bekomme. Wäre super wenn mir da jemand weiterhelfen könnte. Vielen Dank

    • Servus DaHype,
      Hast dir Home Assistent extra für dieses Projekt rauf gezogen oder hattest du es schon weil du damit andere Dinge steuerst/überwachst?
      Wenn es extra dafür verwendet wird, kann ich dir nur Iobroker empfehlen, damit ist es eigentlich ein Kinderspiel.
      Mfg

  • Könntest du das Dashboard zur Verfügung stellen? Ich habe ein SHRDZM Modul.Mqtt Daten kommen im Home Assistent bei mosquitto an. Jedoch dann stehe ich mit meinem Wissen an. Ich habe keine Ahnung wie ich nun die Daten in ein so schönes Dashboard bekomme wie bei dir. Bin für jede Hilfe dankbar.

  • OK danke – ich habs nun mit einem anderem Script geschafft.
    Könntest du dein Grafana Dashboard teilen oder die queries? Sieht sehr gut aus!

  • Ich bekomme folgende Fehlermeldung, jemand eine Idee?

    pi@raspberrypi:~/Documents/SmartMeterEVNKaifaMA309$sudopython3EvnSmartmeterMQ
    TTKaifaMA309.py
    68fafa6853ff000167db084b464d102000708c82015521002a509fe3a637a5ca49e345d222c814ce2
    6a46b4079c63e4adf213d64e2800e0b00aed944a9a90b951c82d3c133d72cc3eb4f69dd60933b4adl
    8d21548085248494481d00619d641184fba061a7eb99f45a7b258bca3bb3924676305cb7cf0c2dle5
    bc94f4edale7ee33e9534264107aea27d5faf07e90da500125397e6cdd197f1262afaf527922a02c6
    a975c73bb66b6356c5aff28c4bclaa43444a5aa52da69a6a40bf210368dcb61535d835b98cd25a878
    ab559bd136b8000b3a41411dc062a291f51120e7f318de758348b6b139ec978fe160dd5af69c71ffe
    7ca053817eb0ecd999ff9b95166872726853ff110167772c5ded815f7ba2feca558651df8aec65
    Traceback (most recent call last) :
    File
    “EvnsmartmeterMQTTKaifaMA309.py”,
    line 72,
    in

    WirkenergieP=int(str(results_32)[16:16+8],16)/1000
    ValueError: invalid literal for int() with base 16:

  • hallo, wegen fehlender verfügbarkeit der vorgeschlagenen adapter habe ich diesen:
    https://www.ebay.de/itm/273494912696?ssPageName=STRK%3AMEBIDX%3AIT&_trksid=p2060353.m2749.l2648
    bestellt. wegen des ttl ausganges muss ein FTDI vorgeschaltet werden um auf USB zu kommen. leider scheint beim datenstrom der init.string nicht auffindbar zu sein.
    Invalid Start Bytes… waiting
    Daten: 0000000063a8134884cd3581e020002495015b93c54d1299a4483fa14aebc4d297cc7f97d969993b6cd88c1046827f108e9cbdd42982234f02cf994ea98a16
    98168c48301b56d920c1eb5cd57aad1b4fb23b23e9e9bac89871d962acacf3d9359171352f349faa944e4c70dea2ee858b08cec616153b989a7afa391515aca5560581
    9913e4e8229c79b94b9d3e342cb2651a9a0c8836dbb88528b025ab78682ef11a48d28f54165b23ba9642a0abeb0eebb666e242493b6f97787411e149c32b960abe49ca
    7e2163ed56555b1bccac3aa7423241219f59aa5bcd97ba088b56693441492dcd52a856afc0a6de55000c4116db0b5942f36c6d01ff05141755d91bc66da36bb23a8987
    2559fe8d172800000100005050dd4104ec342257b06791c12595c115b41169c47e9133f43ece1860000400000000
    Invalid Start Bytes… waiting
    Daten: 002083195090cd3581e120002495050a81527084144ec57db22cb38219b58bac1f9ff90382d452ef5bef5c6c42f0590dfa6f134b0cfa2afd89ae706b3c31a9
    e8ebe91982a5f3c898caa65ad7d1c1da659efdb926606da11c4d80e90f9add9383255af56526f830a13335da2448ff7e1c2db56041b2944a9a32653a9b88e5aac51c9b
    040c6b54d42ef23420d64899418da539c2aaac922689fcf70162645190dd9b0dbb06649716deaeffcccd088f2073a74df13ac1248145ced46e436b3dbc2bd5cb4a1645
    be9b1785da0a971c3b842e75441541e5d6f64c5a6ea51a856aca4bab95508a79eee566e4f176765aed8a7035f3693574830a47001357493f7dd458bc38d459ffdb1e00
    000800db4a4414e8347e33e061534a4d8915a08bb01cdf852a88fc9f3604300000000000
    Invalid Start Bytes… waiting
    ……..

    • Hallo,
      ich kann ihnen anbieten meinen Adapter zu testen. Derzeit ist er unterwegs wird aber von Person zu Person weitergeschickt. Also ca. 1 Person pro Woche kann es mit dem verlinkten Adapter probieren. Da oft das der Fehler ist. Leider kann ich mir das auch nicht erklären warum ist aber leider so.
      Wer Interesse hat einfach per Mail bei mir melden. Am besten mit Telefonnummer und Adresse. Dann werde ich mich bei ihnen melden.

      LG Michael

  • Hallo Michael,
    wirklich gut beschrieben und genau das was ich suche für meinen Kaifa Zähler.
    Weißt du wo man den USB MBus Slave Adapter mit kürzerer Lieferzeit bekommt? Amazon und Ali Mitte/Ende April…

    Hättest du eventuell auch eine Idee ob man irgendwie eine Art Energy Harvesting am MBus machen kann?
    Idee wäre ein stromsparendes LoRaWAN (oder ähnliches) direkt von A/B Potential am Kaifa zu betreiben.
    Wenn ich das richtig verstanden habe stehen ja am Zähler für die Stromversorgung über M-Bus 4 M-Bus-Loads mit insgesamt 6mA und 32V zur Verfügung?
    Siehe https://oesterreichsenergie.at/fileadmin/user_upload/Smart_Meter-Plattform/20200201_Konzept_Kundenschnittstelle_SM.pdf

    Gruß

    Philipp

    • Hallo,
      ich habe schon einige Alternativen zum MBus Adapter probiert haben aber alle Anicht nicht wirklich funktioniert. Bzw auch schon öfters Mails beckommen warum es nicht funktioniert und da wurde meistens ein andere Adapter verwendet.

      Zum Thema Harwesting hab ich mir noch keine Gedanken gemacht. Da möchte ich den Code vorher auf einen ESP32 oder ESP8266 zum laufen bringen denn die benötigten weniger Strom.

      LG Michael

      • Hallo Michael, an einer Umsetzung von DLSM mit dem ESP8266 und einem RFM69 Modul, das die Werte an meine Hausautomatisierung (Openhab) über das Open MQTT Gateway überträgt arbeite ich auch schon. Ich hatte das mit einem ISKRA MT174 im Einsatz, auch aus dem angeführten Grund des geringeren Stromverbrauches. Ich plane es mit einem M-BUS TTL Converter zu machen, der aber erst aus China anreisen muss 😉

  • Hallo,
    ich habe es auch schon mit einem Arduino probiert aber hatte dann zu wenig Zeit um es weiter zu verfolgen. Bin aber nicht wirklich weit gekommen.

    Die meisten haben sowie so einen Homeassistent oder ähnliches am laufen.

    Ich habe das MBus Signal vom Zähler auf ein CAT6 Kabel aufgelegt und ca. 30 Meter zum Netzwerkschrank wo mein PI liegt gezogen. Hab die zwei Adern an den MBus Konverter angeschlossen und fertig. Also habe ich nicht wirklich einen PI geopfert. Es sollte auch ein Pi Zero genügen.

  • Hallo Michael,

    bei uns wurde gestern ein Kaifa MA309 eingebaut und ich würde den gern mit deinem Skript anbinden.
    Hast du das ganze schon mit einem Arduino getestet? Ich kenn mich mit den Arduino Boards nicht aus, nach kurzer Recherche wäre die Kombi aus Arduino MKR WiFi 1010 mit dem M-Bus Shield eine Variante.

    Einen Raspi für diesen Job zu “opfern” find ich Overkill, vor allem da die zurzeit teuer und schwer zu bekommen sind.
    Ich hab mir eine Liste der Teile gemacht und der Arduino kommt auf ~100€ (mit Hutschienengehäuse), dasselbe mit Raspberry 3B (den gibt es bei Az-Delivery noch zu kaufen) auf 125€. (beim Raspi bin ich nicht sicher, ob der USB-Adapter ins Hutschienengehäuse passt)

    LG

  • Hallo
    Bin Sehr begeistert von diesem Skript.
    Der Skript läuft sehr gut.
    Leider bricht nach ca.3-5 Stunden der Skript ab.
    Ist das normal oder hab ich etwas falsch?

    Danke
    MFG
    RCH

  • Auf meinem PI läuft auch OpenHab, daum hab ich bei der IP-Adresse für den mqttBroker “localhost” eingegeben. Hat das damit was zu tun?

  • Hallo
    mein PI3b spukt folgendes aus, ich stehe da voll aufm Schlauch kann mir da jemand weiter helfen?

    openhabian@openhabian:/opt $ sudo python3 /opt/EvnSmartmeterMQTT.py
    68fafa6853ff000167db084b464d65509908c381f82000022ee6d01f15b01eaba7c65e2f925565fca76091abc07210abc918fe2408efab7c50940ce95ed1a98bc224bc8e0698445ee57
    edd874c6087651f057674202970d33eaf88ef7dc2176dda3fcfd2fedb069e6ab5fe71b10539e091507af62a0e32a8b7b7eb46c70058ba49d23809f9345f264206e2a6dbf9ee220e8357
    3671ca5a8e1230f0ad9e9c3fcd5c173f740734239ce29ec5700696eb8acf458596218dab54a69b220eeb78171bb6fce503a6cb384d0e136b14dd6709b0a88b408762bb5751d7520df04
    11978ea4a6eba2a170758f8238821d163065ca57c7541feb5f0d4349ecd3ddd4f2f3d166814146853ff1101672a7d49005420d6438548aab1a10390a416
    Traceback (most recent call last):
    File “/opt/EvnSmartmeterMQTT.py”, line 61, in
    soup = BeautifulSoup(xml, ‘lxml’)
    File “/usr/local/lib/python3.9/dist-packages/bs4/__init__.py”, line 245, in __init__
    raise FeatureNotFound(
    bs4.FeatureNotFound: Couldn’t find a tree builder with the features you requested: lxml. Do you need to install a parser library?

    • Hallo,

      Welchen Samrt Meter benutzt du ? Verwendest du das richtige Skript für den jeweiligen Smart Meter? Welchen USB Adappter?
      bs4.FeatureNotFound: Couldn’t find a tree builder with the features you requested: lxml. Do you need to install a parser library?
      Die Fehlermedung sagt das der Parser fehlt
      sudo pip3 install lxml # library für XML Parser

      • Hallo
        Es ist ein KAIF Smartmeter vom Typ MA309MH4LAT1, und der USB-Adapter ist von Amazon “ZTSHBK USB-zu-MBUS-Slave-Modul Master-Slave-Kommunikation Debugging Busüberwachung ArtikelNr. B09F5FGYVS”
        Ich bin mir auch sicher das richtige Skript runtergeladen zuhaben.
        Ich hab auch alle Pakete installiert auch lxml. Ich nach dem installieren eine Hardcopy gemacht, die kann ich nachmittag “wenn ich zuhause bin” nachreichen.

  • Hallo Michael,
    Danke für deinen Beitrag.
    Nach anfänglichen Fehlern mit den Libraries bekomme ich aktuell als Ausgabe nur Nullen und/oder folgenden Fehler:

    Traceback (most recent call last):
    File “C:\Users\Lenovo\Desktop\Python\SmartMeter.py”, line 61, in
    while tr.findNextFrame(msg, pdu):
    File “C:\Users\Lenovo\AppData\Roaming\Python\Python37\site-packages\gurux_dlms\GXDLMSTranslator.py”, line 171, in findNextFrame
    elif msg.interfaceType in (None, InterfaceType.WRAPPER) and data.getUInt16(data.position) == 0x1:
    File “C:\Users\Lenovo\AppData\Roaming\Python\Python37\site-packages\gurux_dlms\GXByteBuffer.py”, line 321, in getUInt16
    raise ValueError(“getUInt16”)
    ValueError: getUInt16

    Hättest du eine Idee für mich, bin leider noch Anfänger mit Python.

    Danke
    LG

    • Hallo,

      welchen Adapter nutzt du denn was ich verlinkt habe ? Denn so ein ähnliches Problem hatten wir schon und da wurde ein anderer Adapter benutzt und mit meinem hat es dann Problemlos funktiniert.

      LG Michael

  • Danke Michael, für dein Script.

    Hab das ganze bei mir auf einen Raspi2 mit Raspberry Pi OS Lite laufen. Musste hier zwar bischen mit den Libary nachhelfen zum installieren

    sudo apt install python3-pip
    sudo pip3 install pyserial
    sudo apt install python3-lxml

    dann ging es bei mir.

    Leider ist mein China Stick nach 2 Moanten nicht gekommen. Ich hab mir aus GB folgenden bestellt (bisschen teurer aber funktioniert):
    https://www.packom.net/product/m-bus-master-hat/

    Dauert 1 Woche. (Hab 15€ Einfuhrgebühr)

    • Hallo,
      danke für deine Antwort und mich freud es sehr das du mit meiner Arbeit zufrieden bist.
      Hat es einen grund gegeben warum der stick von China nicht angekommen ist ?
      LG Michael

      • Nein, hab es bei amazon bestellt. Lt. Tracking durfte es nie verschickt worden sein. Sie meinten Zoll etc. – kann ich mir nur nicht vorstellen. Ist mir alles komisch vorgekommen. Geld hab ich dann sofort wieder bekommen – War nur ärgerlich.

        Bin aber ganz glücklich mit der Lösung von packom.net. Ist echt gut verarbeitet.

  • Hallo, erstmal Danke für deine Mühen.
    Ich habe das Skript bei mir laufen, allerdings läuft es nur max. zwei Minuten.
    Wenn ich mir die Länge der Daten ansehe
    daten = ser.read(size=282).hex()
    print(len(daten)), dann ist die Länge immer 564 Zeichen und wenn ich die
    print(len(results_16))
    print(len(results_32)) ausgebe ist das Ergebnis irgendwann 0 und das Programm endet danach mit einem Fehler
    Hast du hier einen Hinweis für mich?

    Länge DAten 564
    Soup Ausgabe:

    0
    0
    Länge DAten 564
    Traceback (most recent call last):
    File “EvnSmartmeterMQTTKaifaMA309.py”, line 66, in
    while tr.findNextFrame(msg, pdu):
    File “/home/pi/.local/lib/python3.7/site-packages/gurux_dlms/GXDLMSTranslator.py”, line 195, in findNextFrame
    found = GXDLMS.getData(settings, data, reply, None)
    File “/home/pi/.local/lib/python3.7/site-packages/gurux_dlms/GXDLMS.py”, line 2269, in getData
    GXDLMS.__getWirelessMBusData(settings, reply, target)
    File “/home/pi/.local/lib/python3.7/site-packages/gurux_dlms/GXDLMS.py”, line 1114, in __getWirelessMBusData
    man = _GXCommon.decryptManufacturer(manufacturerID)
    File “/home/pi/.local/lib/python3.7/site-packages/gurux_dlms/internal/_GXCommon.py”, line 1810, in decryptManufacturer
    return str(c2, c1, c)
    TypeError: decoding str is not supported

    • Hallo Hans,
      ich stehe genau so wie du hier bei diesem Fehler.
      Habe alles mit neu aufgesetztem Raspi-Z aufgesetzt.
      Hex-Daten werden ausgegeben und dann kommt die idente Fehlermeldung wie hier angeführt.
      Gibt es dafür einen Tip/eine Lösung?
      Vielen Dank!

  • Hab ein Problem mit der Datei
    beim Start kommt immer der selbe Fehler

    pi@raspberrypi:~/Desktop $ sudo python3 /home/pi/Desktop/EvnSmartmeterMQTT.py
    Traceback (most recent call last):
    File “/home/pi/Desktop/EvnSmartmeterMQTT.py”, line 2, in
    from gurux_dlms.GXByteBuffer import GXByteBuffer
    ImportError: No module named ‘gurux_dlms’

    Woran kann das liegen

    • Hallo,
      Da dürfte das gurux_dlms Packet nicht installiert sein. Eventuell auch in der Falschen Version.
      Versuche einfach mal mit. mindestens in der Version 1.0.117
      wenn du es schon installiert hast kannst du mit
      pip list
      alle Packete und deren Versionen auflisten lassen.
      sudo pip install gurux-dlms

  • Ergänzend: Alarm off … Seit 5 min läuft das Script auf einem neu aufgesetzten RPI 3 wunderbar und ohne Murren. Toll – da rein auf MQTT konzentriert. Spannend wird es noch morgen um 08:06. Zu diesem Zeitpunkt hat es das alte Service immer aus der Bahn geworfen. Ich vermute, dass zu diesem Zeitpunkt die EVN meinen Meter ausliest und damit die Schnittstelle kurz aussetzt. ich berichte..

  • Hi, Sollte das Skript auch unter einem Raspi3b+ laufen. Installation der Komponenten war kein Thema, dann aber nach Anpassung und erstem Start:
    Traceback (most recent call last):
    File “EvnSmartmeterMQTT.py”, line 65, in
    soup = BeautifulSoup(xml, ‘lxml’)
    File “/usr/local/lib/python3.7/dist-packages/bs4/__init__.py”, line 248, in __init__
    % “,”.join(features))
    bs4.FeatureNotFound: Couldn’t find a tree builder with the features you requested: lxml. Do you need to install a parser library?

    lxml ist aber installiert.

    Oder sollte man es nur ab Raspi4 versuchen?

  • Sorry, mein Kommentar ist offenbar verkürzt.. ich erhalte bei sudo python3 /home/pi/SmartMeter/evnsmartmeter.py den SyntaxError: invalid syntax bei line 141 (Directory habe ich SmartMeter genannt; das Script evnsmartmeter.py)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert