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/3zk9KeShttps://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

150 comments

  • 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)

  • 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?

  • 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..

  • 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

  • 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!

  • 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 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

  • 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.

  • 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
    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

  • 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,
    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,
    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, 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

  • 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:

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

  • 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.

  • 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

  • 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?

  • 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,

    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,
    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

  • 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 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

    • 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)

  • 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()

  • 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!

  • 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, 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.

  • 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:

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

  • 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.

  • 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! 😉

    • 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.

  • 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

    • 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

    • 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’)

  • 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?

  • 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.

  • 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,

    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,
    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

  • 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.

  • 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”.

  • 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

  • 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?

  • 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 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

  • 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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.