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.
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.
Topic | Kommentar | Einheit |
Smartmeter/WirkenergieP | bezogene Energie | Wh |
Smartmeter/WirkenergieN | gelieferte Energie | Wh |
Smartmeter/MomentanleistungP | Momentanleistung Bezug | W |
Smartmeter/MomentanleistungN | Momentanleistung Lieferung | W |
Smartmeter/Momentanleistung | Momentanleistung Summe aus Bezug und Lieferung | W |
Smartmeter/SpannungL1 | Spannung an L1 | V |
Smartmeter/SpannungL2 | Spannung an L2 | V |
Smartmeter/SpannungL3 | Spannung an L3 | V |
Smartmeter/StromL1 | Strom an L1 | A |
Smartmeter/StromL2 | Strom an L2 | A |
Smartmeter/StromL3 | Strom an L3 | A |
Smartmeter/Leistungsfaktor | Leistungsfaktor |
Bauteilliste und Unterstützung
Alle Links sind Affiliate Links. Somit unterstützt ihr diese und weitere Projekte von mir.
Spendenlink: https://www.paypal.me/MichaelReitbauer
Produkt | wird benötigt | Amazon | Aliexpress |
Raspberry Pi 4 | Ja | https://amzn.to/3pPliDB | |
Raspberry Pi 4 Starter Set | Ja | https://amzn.to/3Jz589v | |
Raspberry Pi 4 Hutschienen Gehäuse | Nein | https://amzn.to/3HwsUkn | |
USB-zu-MBUS-Slave-Modul | Ja | https://amzn.to/47MbgaC | https://s.click.aliexpress.com/e/_DDzNUPp |
RJ-12 Kabel | Ja | https://amzn.to/3EPZvQs | |
Schaltschrank Steckdose | Nein | https://amzn.to/32Mb3HB |
MQTT Nachrichten in Datenbank speichern
Ich habe zu diesem Thema einen eigenen Beitrag geschrieben.
Auswertung der Daten
Dazu habe ich einen eigenen Beitrag geschrieben.
Hallo,
falls noch jemand beim ausführen des Scripts den folgenden Fehler bekommt
ValueError: invalid literal for int() with base 16: ‘”02″>\n ‘
müsst ihr lediglich eine kleine Änderung am Script vornehmen.
Ändert die Zeile soup = BeautifulSoup(xml, ‘html5lib’) auf soup = BeautifulSoup(xml, ‘lxml’)
Diese Änderung wurde anscheinend am Script im Github vorgenommen, früher stand hier schon lxml.
Nach der Änderung läuft das Script wieder bei mir.
Hallo Michael,
ich glaube ich habe es endlich geschafft daß meine M-Bus Adapter Daten vom EVN Smartester Empfängt. Aber leider gibt es nur folgend Output… und nicht so einem schönen wie in deinem Video. Irgend eine Idee? LG Chris
root@raspi1:/opt/smartmeter# python3 AusleseSkript.py
68fafa6853ff000167db084b464d65509b0cb681f820000729b132d951da50a39dc8237b81c3a76447f76768bb34bd0ebd3aedb39934bfa9a1635fdaac5629930fb69d09e128dda4d4e14c595c37f4545ff4dcfa55bef22c443b063bc071088c37c41006dc4937f73008d89f0268b61f4caaa81c91d50edb0b9cda1dac96292c20182217bd1895cce6f36e160b7b1cc0a3cce2392d357c887804775ea499ad97391777cc2007b7487e82c34ccbbb6219e44593b990113a1ba49614c54f93df15396811ad870393312ee4cb3694885cc8e64d26711a95fea476164b0a06bfc62b89c98a50cb7bf80a1fee37a529dc2fb0ef9b8e44f781393278972a08f20f62166814146853ff11016725b34510f5755eee2c9293ec50b203f016
Traceback (most recent call last):
File “/opt/smartmeter/AusleseSkript.py”, line 75, in
WirkenergieN = int(str(results_32)[52:52+8],16)
ValueError: invalid literal for int() with base 16: ‘”02″>\n ‘
https://www.michaelreitbauer.at/kaifa-ma309-auslesen-smart-meter-evn/#comment-1076
Hallo Michael,
ich hab das jetzt mit einem Rasp4 und einen Rasp5 versucht. Alles wie nach deiner Anleitung hier installiert, aber wenn ich meinen KAIFA MA309M H4LAT1 von der EVN NÖ via Script auslesen möchte, kommt immer folgender Fehler:
68fafa6853ff000167db084b464d65509c9e3d81f820000188ce05d0c6887d7193f6b32e47265a9fbdddc55a36479ce2335e3559fa8a127a39fd8c20e48810a129125bd521809db34d0373137906e4bef6ee9aacca3ad7f67d9cc6b4e109264afeb3574056c63ff01c35fa7f8ff3c4900c77a83b4ea97445ef9023d70919dbeaa2cf8252009e61b74cedeca02d8309788810f782ceed0d1f432dc33741dc72718723502e4ceb0f534af37de4877a0bf9153c6fb4726592e03c61c79d3543ef75045dae18b44cb05dc503d65d0529a34daa4c3371ac9d32ee970d17d478558ccba132d35c10781340879d28dfe08c8b749bae015fd98ec6c992870680855820166814146853ff110167adf38e5645dce68d0f6b7002159778f316
Traceback (most recent call last):
File “/home/tomsn/SmartMeterEVNKaifaMA309/EVN.py”, line 75, in
WirkenergieN = int(str(results_32)[52:52+8],16)
ValueError: invalid literal for int() with base 16: ‘”02″>\n ‘
Irgendwie schaut es so aus, als ob er zwar die Daten vom SmartMeter ausliest, aber bei der Verarbeitung der Daten via Script Probleme hat.
Hast du da vielleicht eine Lösung dazu?
Wäre dir echt dankbar wenn das funktionieren würde 😉
Ansonsten Respekt – tolle Arbeit^^
https://www.michaelreitbauer.at/kaifa-ma309-auslesen-smart-meter-evn/#comment-1076
Gibt es eine Möglichkeit das man es mit NodeRed auch auslesen kann?
Würde es zeitgleich und mit nur einem Raspi mit meiner Heizung zusammen auslesen.
Hallo,
Frage in die Runde hat schon jemand bei der VKW die
1.8.1 Stromverbrauch Hochtarif
1.8.2 Stromverbrauch Niedertarif
eingebunden ?
Brauchst Code dazu?
Oder wg. Berechnung im MQTT?
Grüß Euch!
Also Netz-Nö hat eine Antwort gegeben, die wiederum auf eine alte Datenbeschreibung verlinkt 🙁 – aber ja die sollte ja passen.
Bin ja nur froh, dass es in AT so um die 7 unterschiedlichen Kommunikationsmöglichkeiten mit den Smartmetern gibt, aber soll so sein …
Der “Hack” bei der ganzen Geschichte ist nun, dass man die ser Daten nach den “OBIS-Kennziffer” abfragen muss 🙁 dann kommt was “Plausibles” raus, Leistungsfaktor, ev. nicht …
Zählernummer dzt. auch noch nicht, obwohl in den Daten enthalten
Datum Zeit: 11.03.2024 22:22:10
1.0.32.7.0.255 Spannung L1: 233.1
1.0.52.7.0.255 Spannung L2: 233.6
1.0.72.7.0.255 Spannung L3: 233.2
1.0.31.7.0.255 L1: 1.42
1.0.51.7.0.255 L2: 0.26
1.0.71.7.0.255 L3: 0.14
1.0.1.7.0.255 WBezug : 0.29
1.0.2.7.0.255 WLieferung: 0.0
1.0.1.8.0.255 WeBezug: 7213.187
1.0.2.8.0.255 WeLieferung: 0.0
1.0.13.7.0.255 LF: 0.855
Ok, schauen wir mal weiter – es geht ja “Bergauf” 😉
Hier noch ein Auszug auf der Antwort
“vielen Dank für Ihre Anfrage.
Auf unserer Homepage finden Sie die Anleitung zum Smart Meter. Dabei handelt es sich um die 2.Auflage vom Oktober 2021.
Bei dem Folder für die Kundenschnittstelle handelt es sich um die 4.Auflage vom April 2023.
Änderungen in den Foldern sind uns nicht bekannt.
Bitte geben Sie uns bekannt, welche Werte nicht korrekt sind oder nicht angezeigt werden.
Senden Sie uns bitte gegebenenfalls einen Screenshot Ihrer Ansicht im Webportal und/oder Ihres Zählerdisplays.
Gerne klären wir Ihr Anliegen anschließend mit der zuständigen Stelle ab.
Freundliche Grüße”
Hi, ich krieg denselben Fehler:
Traceback (most recent call last):
File “/home/madmax-raspnovo/Downloads/SmartMeterEVNKaifaMA309-main/EvnSmartmeterMQTTKaifaMA309.py”, line 75, in
WirkenergieN = int(str(results_32)[52:52+8],16)
ValueError: invalid literal for int() with base 16: ‘”02″>\n ‘
Steig aber irgendwie nicht durch was die Lösung ist/war?`
Könnten sie mir hier evtl. nochmal evtl. die Codesegmente zukommen lassen, wie man den Fehler im script fixen kann?
Vielen Dank schon mal!
Mit freundlichen Grüßen
Markus Ebertz
https://www.michaelreitbauer.at/kaifa-ma309-auslesen-smart-meter-evn/#comment-1076
Grüß Euch!
Hab jetzt einiges geprüft, ich kann es nicht Bestätigen, ich gehe davon aus, dass Netz-Nö am Protokoll eine Änderung vorgenommen hat, oder an den OBIS Kennziffern was verändert.
Jetzt Start ich mal einen Versuch die Entschlüsselten Daten zu Fuß zu Zerlegen.
Anfrage an Netz-Nö hab ich schon mal abgesetzt.
Halt euch am laufenden!
Für die Logdatei, wg IOBRKER/MQTT ist auch eine “neue” Lösung in Sichtweite, dann nur mehr die Problemfälle im Log – ist aber noch zu dem anderen wie oben, noch in Testphase – wenn läuft kann ich gerne bereitstellen.
Grüß euch!
Hab auf einmal, ohne Änderung (ausser IOBROKER IP) keine weiteren Änderungen am Code vorgenommen.
plötzlich kommt folgende Fehler
Traceback (most recent call last):
File “/home/pi/my_project/smartmeter.py”, line 62, in
WirkenergieN = int(str(results_32)[52:52 + 8], 16)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 16: ‘”02″>\n ‘
Hab mich im WWW umgesehen, nur werd ich nun nicht ganz schlau daraus, wo denn der Fehler liegt, vor allem ja nichts geändert am restlichen Code 🙁
Auch wenn man die Versuche (sorry kenn mich in python nicht wirklich aus) probiert, mit den halbherzigen infos zu python zu dem fehler dann
59bb248b13c65b94ae3d1f07a2b7bb1e52d0f43bdeb25a9b597c776899847f86a77a15fdd8787ea059f2e0a9386747aff0f1bc07c7c973afa0578181965db1166814146853ff11016721f3e1f9bf3aaff34eded18b12764baf1668fafa6853ff000167db084b464d65509bf70d81f82000d4108c8ddc54c209d332e072499f41e92ee2e96b5239594ed90eee1b9ac8dcdf5a9efd5b9a35a5929e73d525860906fea6ea7e0850503f87a5fd6cc06765db49212b7a2733604e2b84cc5f30bf1caa3286d996ce8aaef74257411556618bd19cedf9d8974119ecdcdbe746362cb428c17bc05e2d234a146aa492464dfacb81523941606042e3c7b2de2abbf0db843d5c4d4665ed132169041cfd10794f435b95151d5b70bbcef83a70
Traceback (most recent call last):
File “/home/pi/my_project/smartmeter.py”, line 61, in
WirkenergieP = int(str(results_32)[16:16 + 8], 32)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 32: ”
Es Spricht ja noch, liefert den output, aber kann es nicht mehr in die Einzelinfos Aufteilen.
Wenn jemand Hilfe dazu hat, wär ich sehr sehr Dankbar!
Zusatzinfo, das SmartMeter wird ja ausgelesen …
Ich habe exakt das selbe Problem. Konnte das bereits jemand lösen?
Ich hab den gleichen Fehler – gibt es vielleicht dazu schon eine Lösung?
Hallo,
ich arbeite gerade daran.
Hi
Welchen PI Zero habt ihr genommen und wie habt ihr die Verkabelung gemacht.
Möchte auch auf einen Zero umstellen habe bis jetzt einen pi 3 am laufen.
Nur hab ich keine Ahnung wie ich die Verkabelung mit dem mbus usb mache.
Servus!
Hab es auf einem PI ZERO WH und einem Ethernet/USB HUB HAT auf dem der mbus via USB angeschlossen ist am Laufen, funktioniert bestens.
Wenn du noch Fragen dazu hast, bitte gerne!
Danke . Leider geht nertwerk nicht muss alles per wlan machen . Werde es jedoch probieren nur eben mit wlan .
Servus!
Na der HAT hat nur eben ausser USB auch noch LAN drauf, läuft eh mit WLAN!
Nur mit dem USB Anschluss ist das viel einfacher 😉
Den Key fordert man inzwischen über ein Formular auf https://www.netz-noe.at/Netz-Niederosterreich/Smart-Meter/Kundenschnittstelle-aktivieren.aspx an. Die Nomentklatur ist etwas seltsam:
“Vertragskontonummer” scheint der Zählerpunkt zu sein (also AT…ewig lang)
“Zählernummer” ist die Seriennummer, die am Zähler eingelasert ist.
Die “Kundennummer” ist eine gewisse Herausforderung, wenn man die Energie nicht von der EVN bezieht, weil die auf Rechnungen von Drittanbietern meist nicht angedruckt ist. Erfragen…
Vielen Dank für die Arbeit. Eine kurze Anmerkung, die EVN bzw. Netz NÖ hat anstatt der E-Mail jetzt ein Online-Formular um den Kundenschlüssel zu bekommen, falls du die Dokumentation anpassen möchtest:
https://www.netz-noe.at/Netz-Niederosterreich/Smart-Meter/Kundenschnittstelle-aktivieren.aspx
Hallo an Alle!
Wer einen Raspi Zero W verwenden möchte hier noch ein paar Tipps dazu
https://www.raspberrypi.com/documentation/computers/os.html#python-on-raspberry-pi
Gerne helfe ich auch diesbezüglich weiter, ist für “Neulinge” am Pi nicht so einfach 😉 Aber wenn man sich an alle Anleitung hält geht es auch ohne murren & Probleme.
Und ja, der Pi Zero reicht vollkommen für die Aufgabe, sofern wie Michael bereits gesagt die Daten per MQTT einfach weitergibt.
Nochmals Danke an Michael für das große Werk!
Hallo, Danke für deine Arbeit!
bei mir bleibt er bei der VKW Vorarlberg leider auch hier hängen
root@mbus:/home/prox/SmartMeterEVNKaifaMA309# python3 EvnSmartmeterMQTTKaifaMA309.py
DATEN:
68fafa6853ff000167db084b464d10200027098201552100114956dd611ffc460781c6369b3ac1eb41d338d616f29ae9b557baf5ad4c1def0a02e34f1b354c48404a9b7af7313150a410e4c2b8443f6f894d5be533b848248465dc70f78c9f75941a86f55b889c3a87dee12aa32032f937350e06fbd099cd21c87bd4ce94a1ff98ba9ad806a28c33b9e7acef42838d28aa973af34de32096e31a763369e7df8d3cfd04057129cad2e9e02f8be9b745f5d9bfa823518392e5e0ae185a9b687dc96ed181bd5c51d1c2528a31d3c98e6a3fc2485d92df655176a239b7b02d0598c2aa76757d22f27aba8f1790c2bb41d55d4e62d7000a4cfde7be8a60a6a58efa166872726853ff11016754b364450cb4e3255986c47d9a5bee3173
Traceback (most recent call last):
File “/home/prox/SmartMeterEVNKaifaMA309/EvnSmartmeterMQTTKaifaMA309.py”, line 75, in
WirkenergieP = int(str(results_32)[16:16+8],16)
ValueError: invalid literal for int() with base 16: ”
jemand eine Idee?
VKW Vorarlberg hat anderes Protokoll
schau mal bei
http://www.cbyte.at
vorbei.
dort gibt es fertige Module
Hallo,
ich habe eine Frage zu Deiner großartigen Lösung.
Ich habe allerding zwei Kaifa MA309 (EVN )installiert, die ich auslesen möchte um mittels mqtt eine OpenWB mit Daten zu versorgen.
Kann ich dafür einen Raspberry mit einem zweiten USB-zu-MBUS-Slave-Modul auszustatten und das Script 2x parallel laufen zu lassen?
Vielen Dank im voraus.
lg Gregor
Hallo,
in der Theorie sollte das möglich sein es müssen die COM Port´s, Key´s und die Servicedatei angepasst werden. Bitte halte uns am Laufenden bzw wenn du Hilfe brauchst gib bescheid.
LG Michael
Hallo Michael,
vielen Dank für deine Anleitung.
Ich freue mich schon drauf es zu testen.
Eine Frage habe ich noch, wenn ich die Opt-Out Variante gewählt habe wird auf dem Gerät nichts gespeichert, die Live Daten werden aber dennoch über tragen, oder?
Diese speichere ich und bereite Sie danach auf. Oder liege ich da falsch?
Vielen Dank für die Antwort und deine Mühe.
LG
Anoni
Hallo,
ich denke du denkst richtig aber bestätigen kann ich das nicht ich hebe die Opt-Out Variante nicht.
Am besten Antwortest du auf dieses Kommentar wenn du nähre Infos hast.
LG Michael
Also nochmals Hut ab, das läuft wirklich super! Danke!
hat wer von euch schon mal das script auf einem RASPBERRY PI-ZERO W am laufen?
Hallo,
ich habe die es selber auf einem RASPBERRY PI-ZERO laufen aber nur die Entschlüsselung und sende die Daten mit MQTT weiter.
Die Datenbank und Grafana laufen auf einem vollwertigen Raspberry Pi 4. Ich denke der RASPBERRY PI-ZERO hat einfach zu wenig Leistung das der alles schafft.
LG Michael
Servus Michael,
danke für deine Antwort, somit geht das auf dem PI-ZERO, oder?
Möchte die Hardware im Schaltkasten verkleinern, daher die Frage 😉
Vor ca. 2 Monaten war Netz-NÖ bei mir wegen einer Änderung, die nicht mal mich betroffen hat, wie die gesehen haben das, dass smartmeter “angezapft” ist, habens gleich gefragt ob das eh was bringt/geht *HAHAHAHA*
na klar, den das “blöde” KAIFA kann dir nicht mal die laufenden kosten anzeigen 😉 jetzt im iobroker sehr wohl – danke michael!
Als diesbezüglicher kompletter Laie weiß ich nicht einmal, wovon ihr redet. Wozu bräuchte ich das alles?
1) die EVN hat mir heute beim Zählertausch einen smart Meter untergejubelt/montiert, wo ich jetzt draufkommen, dass es einer sein muss, obwohl ich diesen schriftlich abgelehnt hatte.
2) kommt da jetzt am Jahresende noch jemand ablesen, oder nicht mehr?
3) sonst ist ja nichts weiter von mir zu tun?
Danke.
Hallo,
von dir ist eigentlich nichts zu tun. Außer du willst die aktuellen Verbrauchswerte in dein Smarthome einbinden.
LG Michael
Mein Problem:
Es lief bis jetzt alles 1A. Nur hab ich heute meine Sachen bekommen ( Gehäuse und Netzteil für den Verteilerschrank). Also raspi neu aufgesetzt und wieder alles installiert. Ich will diesesmal über WLAN alles machen ( dieses funktioniert auch). Nur diesesmal läuft die Abfrage nur solange ich per SSH verbunden bin , wen ich die SSH Verbindung Trenne stopt das phython Programm auch. Per Crontab startet es auch nicht . Momentan weiß ich nicht mehr weiter. Eventuell hat von euch jemand einen Tipp.
( mqtt, Rod Nedund Ingluxdb laufen auf einem anderen Rechner also läuft das py Script alleine suf dem Pi -> es ist ein pi2 mit der Buster OS Version).
Hab einfach nohup davor gesetzt und nun läuft es. ( sollte jemand anderes auch das Problem haben).
Hallo greenMike,
ich habe dein Script seit mehreren Monaten in Verwendung und funktioniert super👍
Das einzige was mich nervt und ich nicht warum das so ist bzw. ob das so normal ist, dass ich im fast Sekunden Takt auf meinem ioBroker die MQTT Info Meldung bekomme:
”’
mqtt.0
2023-07-18 06:32:15.256 info Client [SmartMeter] connected with secret 1689654735255_8543
mqtt.0
2023-07-18 06:32:15.194 info Client [SmartMeter] connection closed: Error: read ECONNRESET
mqtt.0
2023-07-18 06:32:10.149 info Client [SmartMeter] connected with secret 1689654730148_2170
mqtt.0
2023-07-18 06:32:10.145 info Client [SmartMeter] connection closed: Error: read ECONNRESET
mqtt.0
2023-07-18 06:32:05.220 info Client [SmartMeter] connected with secret 1689654725219_229
mqtt.0
2023-07-18 06:32:05.135 info Client [SmartMeter] connection closed: Error: read ECONNRESET
mqtt.0
2023-07-18 06:32:00.233 info Client [SmartMeter] connected with secret 1689654720232_8913
mqtt.0
2023-07-18 06:32:00.227 info Client [SmartMeter] connection closed: Error: read ECONNRESET
mqtt.0
2023-07-18 06:31:55.157 info Client [SmartMeter] connected with secret 1689654715155_2899
mqtt.0
2023-07-18 06:31:55.151 info Client [SmartMeter] connection closed: Error: read ECONNRESET
mqtt.0
2023-07-18 06:31:50.167 info Client [SmartMeter] connected with secret 1689654710166_5055
mqtt.0
2023-07-18 06:31:50.161 info Client [SmartMeter] connection closed: Error: read ECONNRESET
mqtt.0
2023-07-18 06:31:45.198 info Client [SmartMeter] connected with secret 1689654705197_3410
”’
Muss er bei jedem Wert den er versendet danach die MQTT Verbindung schließen/beenden?
Meine Log Datei wächst und wächst😅
Guten Morgen, kann mir keiner helfen bei dem Problem?
Hallo Thomas,
ich habe selber eine stark modifizierte Version im Gebrauch, verwende aber immer noch MQTT.
connected = False
while not connected:
try:
client.reconnect()
connected = True
except:
print(“Lost Connection to MQTT…Trying to reconnect in 2 Seconds”)
time.sleep(2)
Bei jedem Aufruf wird reconnected.
Diesen Code-Abschnitt oben habe ich einfach durch die client.loop_start() oder client.loop_forever() function ersetzt.
Diese startet einen neuen Thread und regelt reconnects von alleine.
War die Lösung für meinen Memory Leak und verbraucht nurmehr ein Viertel des RAMs!
Vielleicht hilft dir das weiter, viel Erfolg!
Hallo Michael,
danke vielmals! Das hat mein Problem gelöst! *juuhuuuu*
Ich habe “client.loop_start()” statt:
connected = False
while not connected:
try:
client.reconnect()
connected = True
except:
print(“Lost Connection to MQTT…Trying to reconnect in 2 Seconds”)
time.sleep(2)
eingesetzt!
Nochmals vielen dank für den Tipp!
fg Thomas
Great project! Unfortunately, the script does not run very stable.
It often crashes with this error:
Jun 17 09:12:08 raspberrypi python3[857]: Lost Connection to MQTT…Trying to reconnect in 20 Seconds
Jun 17 09:12:08 raspberrypi python3[857]: Lost Connection to MQTT…Trying to reconnect in 20 Seconds
Jun 17 09:12:08 raspberrypi python3[857]: Lost Connection to MQTT…Trying to reconnect in 20 Seconds
Jun 17 09:12:08 raspberrypi python3[857]: 68fafa6853ff000167db084b464d65509be61581f820000bc116903316d78539145345c3afc725a40f7874c4c45af1919427ab6f753b787e0c62bc8755a4960d38739ca8fefffe3f5f3aa792e6d241d46c4d>
Jun 17 09:12:08 raspberrypi python3[857]: 68fafa6853ff000167db084b464d65509be61581f820000bc117ae670196f21e8435fdf9da755f512fef634a334f7e000378279316bb6c34e46e35aa21ea5dca4181056df7fa17a3517ceca2e8fd6ce2fb4a>
Jun 17 09:12:08 raspberrypi python3[857]: 68fafa6853ff000167db084b464d65509be61581f820000bc11876e3e536fe9256208bace25fc31d7015ebb252a8f61e6516f22efc6a503b85195bf7e3c04fadd29c5cd1dcd376bca769b5854517eb2cbbb2>
Jun
(…)
Jun 17 09:14:44 raspberrypi python3[857]: 68fafa6853ff000167db084b464d65509be61581f820000bc7475c91badda55043090b2df81d8406ca7a235a6e62efb3a28f5d806742f4d277899d1420695708d80c119de8402a9b7169fca7bdcd808fa667>
Jun 17 09:14:44 raspberrypi python3[857]: Traceback (most recent call last):
Jun 17 09:14:44 raspberrypi python3[857]: File “/home/edwinb/fbs3/smartmeter/SmartMeterEVNKaifaMA309/EvnSmartmeterMQTTKaifaMA309.py”, line 61, in
Jun 17 09:14:44 raspberrypi python3[857]: while tr.findNextFrame(msg, pdu):
Jun 17 09:14:44 raspberrypi python3[857]: File “/usr/local/lib/python3.9/dist-packages/gurux_dlms/GXDLMSTranslator.py”, line 195, in findNextFrame
Jun 17 09:14:44 raspberrypi python3[857]: found = GXDLMS.getData(settings, data, reply, None)
Jun 17 09:14:44 raspberrypi python3[857]: File “/usr/local/lib/python3.9/dist-packages/gurux_dlms/GXDLMS.py”, line 2262, in getData
Jun 17 09:14:44 raspberrypi python3[857]: GXDLMS.__getWirelessMBusData(settings, reply, target)
Jun 17 09:14:44 raspberrypi python3[857]: File “/usr/local/lib/python3.9/dist-packages/gurux_dlms/GXDLMS.py”, line 1119, in __getWirelessMBusData
Jun 17 09:14:44 raspberrypi python3[857]: data.xml.appendComment(“Command: ” + cmd)
Jun 17 09:14:44 raspberrypi python3[857]: TypeError: can only concatenate str (not “int”) to str
Jun 17 09:14:45 raspberrypi systemd[1]: smartmeter.service: Main process exited, code=exited, status=1/FAILURE
Jun 17 09:14:45 raspberrypi systemd[1]: smartmeter.service: Failed with result ‘exit-code’.
Jun 17 09:14:45 raspberrypi systemd[1]: smartmeter.service: Consumed 10min 55.494s CPU time.
lines 6075-6115/6115 (END)
Hatt es jemand in Home Assistant eingebunden?
Wie habt ihr das gemacht?
Hallo,
die Daten einfach per MQTT gesendet und dann hat man diese im Home Assistant
Ganz blöde Frage. Wie genau, genau an dem scheitere ich nämlich, der Rest war easy.
Das Topic Smartmeter wird von mosquitto zwar gesehen, also richtig gebroadcastet (ich sehs ja am MQTT Explorer), ich kann aber weder händisch einen Sensor in der configuratiob.yaml erstellen (können schon, bringt aber nix) noch wird irgendwas automatisch erkannt. Bin was MQTT anbelangt , aber ein DAU, wäre toll wenn jemand helfen könnte
Hallo,
ich habe noch wenig mit HA gemacht aber ich denke man muss einen Sensor in der yaml anlegen bzw so hab ich es gemacht.
# MQTT Sensoren
mqtt:
sensor:
# Smartmeter
– name: “Smartmeter Wirkenergie Bezug”
state_topic: “Smartmeter/WirkenergieBezug”
unit_of_measurement: “kWh”
device_class: energy
state_class: total
Die Einrückungen sind vermutlich falsch kann das in den Kommentaren nicht besser machen.
LG Michael
Hey Danke!
Mein state_topic war einfach falsch, war bei mir nur Smartmeter (hab einfach nicht nachgedacht). Danke nochmals für den input
ich hab’s gemacht.
Es ist einfacher du bindest die Grafana Dashboards im HomeAssistant ein. So hab ich es jedenfalls gemacht.
Servus, gibt es schon eine Lösung für TINETZ?
Sieht bei mir leider so aus:
6872726853ff110167ae63dff09939cf8cfd02593d3cf767622839af633 799f484f42f67592f605832399b5a0e02e008d3cc0f3e99212e62d2ff3e4a34f76dc897005f412cd febc4cdfd4458e237119ccd1123780a9370c2c1245ae9a693d092cad493490ca8131d32d32e65cb4 bd5b725235e5515faff1668fafa6853ff000167db084b464d1020016c1082015521007e7af3aa119 5b493fc9a42327fab1fd1321a9a642c8dab35948e356cf894ba983876d3e47b294eeabd4c0d0bf04 c66302a4e4d5eff0e641dc4f8746b6102de8c51aa57c5f3db3413d972d5bbc36dbf1f138eada5105 2ce74609162e7b14c8c0aeb8393eb2222ddaae6fc611f37cd57b9c0cb722c4dd3dc24ff97c3158a2 0cab6423ae072689d18e732bc
Traceback (most recent call last):
File “/home/role/EvnSmartmeterMQTTKaifaMA309.py”, line 72, in
WirkenergieP = int(str(results_32)[16:16+8],16)
ValueError: invalid literal for int() with base 16: ”
Hallo,
ja gibt es schon melde dich bei mir Support@michaelreitbauer.at
LG Michael
das war bei mir auch , hab es nur öfter gestartet . ( jedoch bei EVN ).
ja ist bei mir auch so! hat wer rausgefunden warum das so ist?
was mach ich falsch habe die Platine von greenMike ( Raspi 2 ) :
die dmesg | grep tty eingabe gibt mir
[ 0.000000] Kernel command line: coherent_pool=1M snd_bcm2835.enable_compat_a lsa=0 snd_bcm2835.enable_hdmi=1 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=416 b cm2708_fb.fbswap=1 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 consol e=tty1 root=PARTUUID=b5c54c71-02 rootfstype=ext4 fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
[ 0.000477] printk: console [tty1] enabled
[ 3.013419] 3f201000.serial: ttyAMA0 at MMIO 0x3f201000 (irq = 114, base_baud = 0) is a PL011 rev2
Das zurück also is ja meine Schnittstelle ttyAMAO ?
Traceback (most recent call last):
File “AusleseSkript.py”, line 33, in
config = json.load(open(configFile))
File “/usr/lib/python3.7/json/__init__.py”, line 296, in load
parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
File “/usr/lib/python3.7/json/__init__.py”, line 348, in loads
return _default_decoder.decode(s)
File “/usr/lib/python3.7/json/decoder.py”, line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File “/usr/lib/python3.7/json/decoder.py”, line 355, in raw_decode
raise JSONDecodeError(“Expecting value”, s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 8 column 23 (char 196)
Ich Antwort mir selber . Die ” kleine”Platine hat für den Kaifa MA309 noch einen kleinen Fehler . Sie funktioniert nicht so wie sie soll, daher kann es auch sein das sie der Raspi nicht erkennt. Mike hat heute mit mir Telefoniert und wenn er Zeit hat will er das eventuell fixen. Echt Tolles Projekt. Für KaifaMA309 momentan zur Sichetheit die USB Variante nehmen die er Verlinkt hat.
Hallo,
vielen Dank für diesen informativen Beitrag. Ich habe versucht, das ganze mit dem von dir verlinkten M-Bus Adapter auszulesen und dann mit einem Dragino LA66 über LoRaWAN zu versenden. Dabei habe ich aber einige Probleme, da ich nicht sehr viel Erfahrung mit LoRaWAN habe. Deshalb wollte ich fragen ob du dafür vielleicht eine Lösung hast?
Ich wäre sehr dankbar, wenn du mir weiterhelfen könnten.
Beste Grüße,
Niklas
Hallo,
ich habe leider keine Erfahrung mit LoRaWAN.
LG Michael
Vielen Dank für das perfekte Setup :D. Habe es endlich bei mir aufgesetzt und in Home Assistant integriert!!! Anfangs habe ich etwas gebraucht um das zu verstehen aber im Endeffekt war es kinderleicht!
Danke dir für die Mühe und das Bereitstellen 🙂
Hallo, funktioniert der P1 Ausgang auch bei einem anderem Stromanbieter als die EVN? Ich stehe nämlich kurz vor einem Wechsel. Vielen Dank!
Hallo,
der Anbieter wo man Strom kauft müsste dafür egal sein. Aber bitte um Rückmeldung wenn du gewuschelt hast.
LG Michael
Hallo Michael,
das Skript läuft ja zyklisch. Liefert das Skript Tagesweise die Daten mit Werten oder rechnest du die Gesamtdaten nochmals auf den Tag herunter?
Vielleicht kannst du das kurz aufklären, wie du den Tagesverbrauch rauskriegst (Berechnung oder automatisch durch Kaifa).
LG
Hallo,
nein ich berechne den Wert.
Die Rohdaten steigen stetig an also das sind die gesamten kWh was über den Zähler gelaufen sind. Also eine steigende Zahl.
Den Datenpunkt errechne ich mit der Differenz zwischen Aktullen Wert und dem ersten Datenpunkt des Tages.
Als Bsp. Aktueller Zählerstand 120 kWh und heute um 00:00 war der Zählerstand noch bei 100 kWh.
Um den Datenpunkt zu erhalten rechne man, 120 kWh – 100 kWh = 20 kWh also hat man 20 kWh heute verbraucht.
Hoffe ich habe es verständlich erklärt.
Sonst einfach eine Mail an Support@michaelreitbauer.at
LG Michael
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,
am besten meldest du dich per Mail bei mir und wir sehen uns das gemeinsam an.
support@michaelreitbauer.at
Hallo Mike,
habe genau das selbe Probelm wie Stefan S.
Habt ihr dazu schon eine Lösung gefunden?
SG
Jürgen
Hallo,
melde dich per Mail bei mir
support@michaelreitbauer.at
LG Michael
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!
Hallo,
ja müsste man sich ansehen bitte schreib mir eine Mail
support@michaelreitbauer.at
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, leider habe ich auch das selbe festgestellt ich hatte aber nur einen Datensatz zum testen. Und bin kein Kunde der Salzburg AG daher habe ich keine weiteren Versuche mehr vorgenommen oder beim Kundensupport nachgefragt.
Wenn du es weiter verfolgt kannst du mich bitte auf dem laufenden halten.
support@michaelretbauer.at
LG Michael
mit dem script von micronano0 bekommt man alle Daten
https://github.com/micronano0/RaspberryPi-Kaifa-SmartMeter-Reader
Funktioniert das für die Salzburg AG ?
Ja damit bekomme ich alle Daten
Können Sie sich bitte bei mir melden habe noch eine Frage
support@michaelreitbauer.at
LG Michael
Dieses Script funktioniert auch für VorarlbergNetz.
Soeben erfolgreich getestet.
Hallo Adrian, wie bist du zu den Zugangsdaten 32 Bit Schlüssel bei der VKW gekommen? Kein einziger kann mir das helfen.
@micronano0 schönes script! danke!
Ich schaffe es aber leider einfach nicht das python script im hintergrund laufen zu lassen. bekomme auch alle daten und schreibe sie dann alle 5 sekunden in eine influx db. aber wenn ich das script bspw. in rc.local einbinde läuft es nicht.
kann mir jemand hier helfen? wäre sehr dankbar!
Hallo
hat jemand eine Ahnung bzw. eine Plan ob und wie man bei dem EVN Smartmeter den Kaifa MA309 mittels ESP Modul (8266 oder 32) auslesen und Auswerten kann. Hab schon ein Projekt dafür entdeckt … https://github.com/micronano0/ESP8266-NodeMCU-KAIFA-SmartMeter-Reader-STV-
schaut für mich aber so aus, als ob das bei EVN nicht klappt (ich bekomm keine Zählerwerte im WEB-GUI).
Lg
Martin
[…] anleitung EVN schnittstelle ( Michael Reitbauer ) […]
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,
in der Theorie schon da jeder seinen eigenen COM Port bekommt aber habe das noch nicht testen können.
Schreiben Sie mir einfach eine Mail an support@michaelretibauer.at
LG Michael
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
Servus,
gelöst, war mein Fehler, hab den MQTT Adapter nicht gestartet gehabt 😉
Also da hast du wirklich eine extrem gute Arbeit geleistet – hut ab!
LG
Toni
Danke wenn dir die Arbeit gefällt einfach über den Paypal Spenden link eine Kleinlichkeit da lassen oder vor jedem Einkauf auf einen Amazonlink klicken ich wäre dir sehr dankbar.
LG Michael
Servus Michael,
ja die Spende kommt, das muss unterstützt werden!
Danke ich versuche noch weiteres Hilfreiches zu machen aber derzeit fehlt leider die Zeit.
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
Hallo
ja dafür gibt es eine einfache Lösung. Am besten schreiben sie mir eine Mail mir ihrer Nummer dann kann ich ihnen telefonisch schnell weiterhelfen.
support@michaelretibauer.at
LG Michael
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,
wenn du eine Oberfläche auf dem Raspberry installiert hast kann man die Datei einfach darüber herunterladen. Wenn du mir eine Mail schreibst kann ich dir auch gerne weiterhelfen.
support@michaelretibauer.at
LG Michael
git installieren wen du es noch nicht hast ( einfach googeln ” raspi git installieren “).
Danach dan
sudo git clone https://github.com/greenMikeEU/SmartMeterEVNKaifaMA309
Ausführen .
Hi
Ab welchem raspberry pi ist das script verwndbar?
Hab hier noch einen raspberry pi 1 rumliegen. Ist der zu schwach für das dekodieren der Daten?
Da die rapberrys momentan übelst teuer geworden sind kann ich zb. auch einen orange pi zero 2 mit armbian, ubuntu oder debian server verwenden?
http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-Zero-2.html
Oder muss das unbedingt raspian drauf laufen?
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
Es ist ein Kostal piko 5.5 mit kommunikationsboard 1
Webansicht. https://images.app.goo.gl/kFJwQjQdFwg2AyMn7
Möchte über das Netzwerk auslesen
Mit freundlichen Grüßen Andi
Hallo,
genau so einen hab ich auch hab diesen auch über das Netzwerkausgelesen.
Wenn Sie das Skript brauchen melden Sie sich einfach. support@michaelretibauer.at
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
Ohjeh, in der Vorschau hat es super ausgesehen
und den schlüssel muss ich auch neu machen 🙂
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,
sind das Adapter die ich verlinkt habe oder andere ?
LG Michael
https://www.amazon.de/gp/product/B078X5H8H7/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1
https://www.amazon.de/-/en/gp/product/B089LWCR4G/
Die zwei habe ich ausprobiert, keine von Ihnen.
Ja dann ist das der Grund dafür warum es nicht funktioniert. Ich habe extra spezielle Adapter verlinkt da nur diese bis jetzt funktioniert haben. Leider haben diese Adapter lange Lieferzeiten. Wenn Sie kurzfristig einen zum Testen benötigen schreiben Sie mit eine Mail (mreitbauer@gmx.net) mit ihrer Telefonnummer dann melde ich mich und ich kann meinen zum Testen zur Verfügung stellen.
Um das Problem langfristig zu lösen entwickle ich derzeit selber einen Adapter. Der Prototyp funktioniert schon mehr oder weniger aber es wird sicher noch ein paar Wochen dauern bis er fertig ist.
LG Michael
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,
probier das mal
sudo pip3 install cryptography
Wenn du weitere Fragen hast kannst du dich gerne per Mail melden mit deiner Telefonnummer dann melde ich mich dann können wir das Problem schneller lösen.
support@michaelretibauer.at
LG Michael
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?
Hallo,
die Werte kommen meines Wissens schon falsch vom Smart Meter raus.
LG Michael
Funktioniert auch mit einem simplen Pegelwandler.
Hier : https://inator.at/?p=1492
Hallo,
ich habe ihnen eine Mail geschrieben da ich noch eine Frage zu dem Pegelwandler habe.
LG Michael
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
kannst du dich bitte per Mail bei mir melden ? Hätte da noch eine Frage.
mreitbauer@gmx.net
LG Michael
Sorry, aber ich erhalte gleich am Anfang in Zeile 8
“line 8
^
SyntaxError: invalid syntax
Hallo,
das kann nicht sein haben Sie etwas verändert?`
Am besten melden Sie sich bei mir per Mail mit ihrer Telefonnummer dann können wir das Problem schneller lösen.
support@michaelretibauer.at
LG Michael
Vergiss es bitte wieder, läuft bereits.
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, hab ihnen eine Mail geschrieben.
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,
Vielen Dank für das Projekt!
Habe es nun auch am Laufen, mit einem Rpi Zero und einem M-Bus to UART board von https://www.mikroe.com/m-bus-slave-click
Wäre es auch möglich, mit dieser Hardware zwei Smartmeter auszulesen? Wir haben nämlich zwei davon im Schaltschrank.
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,
ich habe ihnen eine Mail geschrieben.
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
Hallo,
von welchem Netzbetreiber ist der Smartmeter?
LG Michael
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,
leider funktioniert nur der Smartmeter in Niederösterreich. Ich müsst mir mit dir die Daten genauer ansehen und dann kann ich eine eventuell eine Version für die Salzburger Netzte auch machen.
Hallo, ja, das wäre super! Jederzeit.
Hallo greenMike,
hast Du den Plan, eine neue Version für das Smartmeter der Salzburg Netze (Modell KAIFA MA309M H4LAT1) zu erstellen, weiter verfolgt?
Wenn ich richtig recherchiert habe gibt es keine andere Möglichkeit Daten auszuwerten wie von Dir hier beschrieben.
https://www.salzburgnetz.at/content/dam/salzburgnetz/dokumente/stromnetz/Technische-Beschreibung-Kundenschnittstelle.pdf
https://www.salzburgnetz.at/content/dam/salzburgnetz/dokumente/stromnetz/Smart%20Meter%20Detailbeschreibung.pdf
LG Jürgen
Hallo,
nein habe ich noch nicht da ich leider keine Testdaten bekommen habe. Aber wenn Sie mit welche zur Verfügung stellen kann ich es mit ansehen.
LG Michael
Hallo Michael,
heißt ich muss mir zuerst gemäß Blog Hard und Software organisieren, aufbauen und erst dann komme ich zu den Daten, richtig?
Oder soll/kann ich die Daten (welche auch immer) vom Betreiber selber organisieren?
Wie Du siehst – brauche da bitte ein wenig Input.
LG J
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!
Hallo,
ja das habe ich auch so gelöst mit diesem Shelly https://amzn.to/3yGs6rC
Es kann auch sein das dein Wechselrichter eine Schnittstelle hat mit der man den Wert auslesen kann. Das hab ich auch mal versuchet.
LG Michael
Hast du das dann auch in Grafana Visualisiert?
Kannst du hierzu vielleicht eine Anleitung machen wie das mit der Shelly funktioniert!?
Besten dank!!
Hallo, wenn ich Zeit habe kann ich einen Beitrag dazu machen.
LG Michael
Kennst du https://solaranzeige.de/phpBB3/solaranzeige.php ??
Nein kenne ich nicht, aber sieht interessant aus.
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,
grundsätzlich ist das möglich.
LG Michael
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()
schau mal etwas weiter runter ich schick’ per UDP an Loxone:)
Geile Projekt!
bei mir läufts jetzt über einer Woche und hab die von: https://at.rs-online.com/web/p/entwicklungstools-kommunikation-und-drahtlos/2167484 in Verwendung und sende die Daten per UDP an meinen Miniserver.
Danke für deine Denkanstöße!
Hi, eine Frage, wie schickst du mit dem M-Bus Slave Click Modul per UDP die Daten? Ist ein Raspberry zwischengeschalten?
Ja Click Modul am Rpi. Dein Script angepasst.
Hallo Werner
Können sie den Code Posten wie Sie den Zeitstempel auslesen?
LG Oli
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 welchen MBus Adappter verwenden Sie?
LG Michael
Hallo Mike,
den von ihnen empfohlenen Adapter / Aliexpress verwendet.
https://a.aliexpress.com/_mMpAwfy
Kann es sein, dass bei der SalzburgNetz eine andere Firmware / Software verwendet wird?
LG,
MrSaibot
Hallo,
ja bei den Salzburger Netzen funktioniert das vermutlich anders.
LG Michael
Hallo, hattest du schon Erfolg mit SalzburgNetz?
Hallo,
ja ich bin gerade am Testen aber eine Vorabversion gibt es schon.
Wenn Sie die Version haben wollen einfach melden support@michaelreitbauer.at
LG Michael
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
Hi SKutti,
wie sieht der Schaltplan dabei aus?
Vielen Dank,
Michael
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,
Es gibt ganz unten beim Artikel ein Bauteilliste mit meinen Bauteilen die ich verwendet habe. Beim Adapter ist es wichtig den gleichen zu verwenden ist schon öfters zu Problem mit den falschen Adaptern gekommen
RJ-12 Kabel https://amzn.to/3EPZvQs
USB-zu-MBUS-Slave-Modul https://amzn.to/3zk9KeS
LG Michael
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,
ich habe gerade wenig zeit um das zu Testen.
LG Michael
Hallo Michael,
würde gerne selbst probieren, aber habe leider kein MBus Modul. Warte mit der Bestellung des Moduls auch noch auf den/das EVN Key/Passwort. 😉
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.
Hallo,
in diesem Video wird es sehr gut erklärt.
Bei fragen einfach eine Mail schreiben support@michaelretibauer.at
https://youtu.be/BpLTo7ohqEU
LG Michael
OK danke – ich habs nun mit einem anderem Script geschafft.
Könntest du dein Grafana Dashboard teilen oder die queries? Sieht sehr gut aus!
Hallo ja kann ich morgen machen.
In diesem Video wir viel erklärt.
https://www.youtube.com/watch?v=BpLTo7ohqEU
Hallo Alex,
ich habe das gleiche Problem. Könntest du mir verraten wie du es gelöst hast bzw welches script du verwendet hast?
Hallo Alex,
welches Script hast du verwendet, mein Anbieter ist auch Tinetz.
Köntest du es mir zukommen lassen.
Vielen Dnk
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:
Oder ist das script für TINETZ nicht geeignet?
Hallo,
leider ist es nur für die EVN. Da jeder Netzbetreiber eine andere Schnittstelle/Kommunikation/Verschlüsselung verwendet
LG Michael
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
Hallo,
Sie machen nichts falsch leider ist da noch ein Bug aber es gibt eine Workaround um das Problem zu lösen.
Sie müssen das Programm als Service einrichten. Wenn es abstürzt wird es automatisch neu gestartet.
https://medium.com/codex/setup-a-python-script-as-a-service-through-systemctl-systemd-f0cc55a42267
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.
Ich habe ihnen ein Mail geschrieben
Hallo, Ich habe genau den selben Fehler (Pi3b), haben Sie da eine Lösung gefunden?
Hallo,
Sie können sich per mail bei mir melden.
support@michaelretibauer.at Hab einen Lösungsvorschlag aber der gehört geteste bevor er veröffentlicht wird.
Lg Michael
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.
Oke super wenn du dein Geld zurück bekommen hast. Ja es kostet natürlich auch etwas mehr.
Hi Benedikt wie hast du das mit dem Seriellen Consolen gelöst . Bei mir ist nur /dev/ttyAMA0 aktiv /dev/ttyS1 oder der gleichen hab ich nicht .
Hast du einen TIP. ( in der config.txt enable_uart und in der cmdline.txt console=serial0 eingetragen . )
Hallo, Ist es möglich das Prog. für weitere M-Bus Zähler (Wasserzähler u. Warmwasserzähler) zu erweitern?
Hallo, ich denke nicht. Kommt immer auf den Zähler an. Eventuell kann das Programm als gedankenanstoß gesehen werden.
LG Michael
Ja die Werte sind realistisch. Zählerstand passt auch mit dem ausgelesenen Wert zusammen.
Läuft das Skript auf einen Pi4? bzw sind noch andere Sachen auf den Pi installiert dann hätte ich eine vermutung
Es ist ein PI3+. Ich kann jetzt nicht genau sagen, ob ich ein frisches Image genommen habe oder ein bestehendes. Glaub aber mich zu erinnern, dass ich kein neues Image genommen habe.
Beim Image genügt doch das OS-lite ohne Desktop, oder?
Ich habe eine Vermutung ich melde mich bei ihnen per Mail
Hi, ich hab auch so einen Fehler – was istn das?
können sie mir eine Email schreiben ? support@michaelretibauer.at
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,
beckommst du in den ersten 2 Minuten realistische Werte ?
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!
Hast du schon mal versucht dies auf Windows zum Laufen zu bringen? Hättest du eine Idee wie und ob das funktionieren könnte?
Sollte auch auf Windows laufen müsst ich aber nochmal probieren.
Habe am Anfang unter Windows programmiert und getestet.
So habe es gerade unter Windows versucht und es läuft bei mir. Ich konnte nur die Sagencom T120 Version testen da ich nur diesen Zuhause habe.
Hello
Hast du zufällig noch so einen Adapter herumliegen?
Hallo,
einen hab ich schon noch rumliegen aber brauche den immer wider mal zum Testen.
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, habe die selbe Fehlermeldung – gurux_dlms ist version 1.0.119.
Danke
lg
hab jetzt alles neu gemacht funkt aber trotzdem nicht
gurux-dlms 1.0.119
aktuell installiert
Genau so wie serial
version 3.5 ist drauf
pip module werden nicht gefunden??
Hallo,
versucht das noch einmal eventuell ist das Paket nur für Python 2 verfügbar und nicht für Python3
sudo pip3 list
sudo pip3 install gurux-dlms
ich bin leider auch noch nicht so fit unter Linux und Python.
LG Michael
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?
Normalerweise läuft es auch auf einen Pi3 ich habe selber keinen Kaifa darum kann ich das nicht Testen. Aber das Skript für meinen Sagemcom T210-D läuft auch auf einen Pi3b+.
In welcher Version ist das installiert?
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)
Hallo habe das Skript gerade geupdatet da war noch ein Syntax Fehler meinerseits dabei. Einfach neu herunterladen von Github. Wenn es funktioniert hat bitte bescheid geben.
Grandios – Klappt wunderbar! Ich bin begeistert!