SmartMeter mit Tasmota auslesen
Nachdem mein alter Ferraris Stromzähler ausgetauscht wurde habe ich mir vorgenommen, alle Werte der Stromzähler zu digitalisieren und kontiniuerlich zu protokollieren.
Ziel war, hier so wenig Aufwand wie möglich zu investieren. Daher habe ich nach einer möglichst vorgefertigten Lösung für Infrarotsensoren gesucht. Der für mich passende Sensor ist die Lösung, die auch auf Volkszähler.org beschrieben ist.
Die folgende Lösung habe ich exemplarisch für folgende SmartMeter von ISKRA erstellt (eine Anpassung an andere Hersteller ist einfach möglich):
- ISKRA MT681
- ISKRA MT175
Für eine Erfassung und Weiterverarbeitung der Werte möchte ich Tasmota auf einem Wemos D1-Mini benutzen.
Es gibt viele Seiten mit verschiedenen Erläuterungen zum Anschluss der SmartMeter. Mir hat u.a. auch folgender Link geholfen:
https://hessburg.de/tasmota-wifi-smartmeter-konfigurieren/
Sensorauswahl
Die Zähler von ISKRA geben erfasste Daten über eine Infrarot-Schnittstelle aus. Um diese auszulesen ist ein Infrarotempfänger, für eine Befehlsübetragung (die ich aber nicht brauche) ein Infrarotsender erforderlich. Wer so einen Sensor selber bauen möchte findet hierzu im folgenden Video die nötigen Informationen:
Da ich keine großen Lötarbeiten durchführen wollte, habe ich mich für eine (fast) fertige Lösung entschieden, nämlich den
ttl ir lesekopf lese-schreib-K
Die 4 Adern benötigt man für
- die 3.3. Volt Spannungsversorgung
- GND (Nullleiter)
- RX (Empfangskanal)
- TX (Sendekanal)
Da ich nur Daten empfangen möchte würden auch 3 Adern ausreichen.
Den Sensor befestige ich nun auf der optischen Infrarotschnittstelle des ISKRA MT175. Dabei ist die Diode 1 der Empfänger und die Diode 2 der Sender. Dementsprechend muss der Hichi Sensor umgekehrt auf der optischen Schnittstelle angebracht werden, d.h. Sender auf Empfänger und Empfänger auf Sender . Wer hier genau hinschaut wird feststellen, dass es eine dunkle LED gibt. Dies ist der Empfänger und die helle Diode ist dementsprechend der Sender.
Der Anschluss der Adern an den D1 Mini habe ich in folgendem Schaubild dargestellt:
Freischaltung optische Schnittstelle
Die von den Energieversorgern (oder Netzbetreibern) bereitgestellten SmartMeter können häufig erst nach einer Freischaltung der optischen Schnittstelle Daten übertragen. Daher ist es notwendig, sich von seinem Energieversorger den Freischaltcode zu besorgen. Mit diesem kann man anschließend die Übertragung der Daten über die optischen Schnittstelle freischalten. Anleitungen hierzu kann man leicht im Internet finden. Der ISKRA MT175 besitzt zur Vereinfachung einen blauen Button, mit dem man den Code eingeben kann. Ansonsten verwendet man einfach eine Taschenlampe, mit der man den Code über den optischen IR-Sensor eingibt.
Vorteil der Freischaltung ist, dass damit auch weitere Werte vom SmartMeter erfasst und ausgelesen werden können. Hierzu gehören beispielsweise die aktuelle Leistung sowohl beim Verbrauch als beim Ertrag (Photovoltaik).
Tasmota konfigurieren
Um die Sensordaten auszulesen, muss der D1-Mini mit Tasmota geflasht werden. Hier ist insbesondere wichtig, dass die Scripting-Funktionalität für Tasmota freigeschaltet ist, sonst kann man die Daten nicht verarbeiten.
Wie man das macht, habe ich bereits in meinem folgenden Beitrag beschrieben:
In Tasmota müssen keine GPIOs über das Menü "Configure Module" konfiguriert werden. Stattdessen kopiert man sich von der Tasmota-Seite einfach das Script für das gewünschte Smartmeter herunter. Diese Scripte sind auf folgender Seite zu finden:
https://tasmota.github.io/docs/Smart-Meter-Interface/
Das passende Script kopiert man unter dem Menüpunkt "Console/Edit Script" einfach in den Editor. Wichtig ist, dass oben das Häkchen neben "Script enabled" aktiviert wurde!
Wenn alles richtig gelaufen ist, dann sollten auf der Tasmota Startseite, die im Script aktivierten Werte erscheinen. Das könnte z.B. wie folgt aussehen (ich habe die Bezeichnungen hier schon geändert, siehe dazu das nächste Kapitel):
Wenn das so nicht funktioniert, dann habe ich im übernächsten Kapitel ein paar Tipps, wie man den Fehler finden kann.
TASMOTA Script verstehen
Die von der Tasmota-Seite kopiertem Beispielscripte kann man modifizieren und einfach im Scirpteditor ausführen lassen.
Da es hier aber ein paar kleiner Fallstricke gibt macht es Sinn, dieses Script zumindest teilweise zu verstehen. Für den ISKRA MT175 sieht das Ganze so aus:
Die Scriptsprache ist in der Tasmota Doku in zwei Abschnitten beschrieben
- Für das Auslesen der Smart Meter findet man hier alle Infos
- Für die Verwendung der Scriptsprache sind hier die vielen Sprachdetails zu finden. Wer bisher mit Rules gearbeitet hat, kann diese Befehle mit einem kleinen Präfix "=>" weiter verwenden.
Wichtig ist, dass man sich streng an die Syntax hält. So ist z.B. bei einer IF-Abfrage unbedingt notwendig, das "then" in eine neue Zeile zu schreiben, damit die folgenden Befehle auch ausgeführt werden.
Ebenso gibt es den Hinweise, dass in dem ">M" Block Kommentare zu Fehlern führen können und am Ende vor dem Hashtag keine Leerzeichen stehen sollten.
Ausprobieren kann man alles, in dem man das Script speichert und sich die Ergebnisse dann in der Console anschaut. Ja, das ist ein wenig Hin- und Herklicken, funktioniert bei diesem Interpreter aber sehr einfach. Fehlermeldungen werden auch ausgegeben, allerdings manchmal etwas wenig aussagekräftig, so dass es sinnvoll ist, in der Doku nachzuschauen.
Der Inhalt des Scriptes lässt sich wie folgt erläutern:
">D" bedeutet, dass ab hier die Deklaration von Variabeln erfolgt. In den Smartmeter-Scripten ist dies nicht notwendig. Wer aber später Variabeln für die weitere Verarbeitung braucht, kann diese unterhalb dieses Statemenst platzieren.
">B" hier beginnt der Block, in dem der Code steht, der beim Booten ausgeführt werden soll. Dieser bleibt ebenfalls immer stehen.
"Sensor53 r" ist ein fester Befehl, der das Einlesen der SmartMeter-Beschreibungen initiiert. Hier braucht nichts geändert zu werden.
">M 1" gibt an, dass hier der Block für die SmartMeter Beschreibungen kommt. Wer hier beispielsweise zwei oder drei SmartMeter auslesen will, der gibt anstelle der "1" eine "2" oder "3" an.
"+1,14,s,16,9600,MT175". Die Zeile ist recht einfach zu verstehen, alle Werte müssen durch Kommata getrennt werden.
"+1" bedeutet, dass hier die Deklaration des ersten SmartMeters kommen (wenn da +2 drin stehen würde, dann wäre es der zweite SmartMeter, usw.).
"14" gibt die GPIO Nummer an an der der RX-Kanal aufgesteckt wurde. In diesem Beispiel ist dies Port D5. Nehmt Euch hierzu ein Bild eines D1-Mini und schaut die Nummer einfach nach. Diese Nummer muss unbedingt an Eure Lösung angepasst werden, wenn Ihr einen anderen Port verwenden wollt. Hier liegt dann auch ein häufiger Fehler, wenn´s mal nicht funktioniert.
"s" das s gibt an, dass es sich um einen SML-SmartMeter handelt. Hier würde ein "w" stehen, wenn es sich um einen OBIS-SmartMeter handelt. Damit wird also das Protokoll angegeben, um die Nachrichten des SmartMeters decodieren zu können. Normalerweise sollte das Protokoll auf dem SmartMeter stehen, alternativ könnt Ihr Euren Energiversorger fragen.
"16" Dies ist ein Flag, welches angibt, das hier ein Medianwert aus den empfangenen Daten ermittelt werden soll. Das ist sinnvoll, wenn es beispielsweise mal Unterbrechungen gibt oder sich Werte sehr schnell umfangreich ändern. I.d.R. braucht man das nicht anzupassen.
"9600" ist die Baudrate, mit der die Daten über die Infrarot-LEDs übertragen werden. Dies hängt vom SmartMeter ab, dennoch braucht dies i.d.R. nicht angepasst zu werden.
"MT175" ist der Name den dieser SmartMeter erhält. Dieser kann frei gewählt werden, sollte aber knackig kurz sein (wegen des begrenzt verfügbaren Speichers). Über diesen Namen kann man später die einzelnen Werte in einer Scriptsprache ansprechen.
Als nächstes fehlen nun noch die Definition der Werte, die empfangen, formatiert und dargestellt und wo diese in Tasmota gespeichert werden sollen.
Hierzu die folgende Beispielzeile des MT175
1,77070100100700ff@1,Leistung,W,Power_curr,1
"1" gibt an, dass es sich im den ersten Smartmeter handelt.
"77070100010800ff@1000" gibt das Datenpaket an, welches ausgelesen werden soll.
"@1000" in den Beispielscripten steht hier entweder @1000 oder @1. Ich habe bisher nicht herausfinden können, ob es sich bei dem Parameter um die Auflösung des auszulesenden Wertes oder um eine andere Form der Formatierung handelt.
"Leistung" ist ein String, der die Bezeichnung des Datenwertes darstellt und auch im MQTT verwendet wird (kann beliebig geändert werden).
"W" ist ebenfalls ein String, der die Einheit für die Konsolenausgabe darstellt (kann beliebig geändert werden).
"Power_Curr" ist ein String, der den Variablennamen angibt, in dem die Daten gespeichert werden. Wenn der Wert im Script weiter verarbeitet werden soll, dann wird der Wert über diesen Variablennamen angesprochen (kann beliebig geändert werden).
"1" gibt die Anzahl der Nachkommastellen an (kann beliebig geändert werden).
Die guten Beispielscripte auf der Tasmota-Seite beinhalten häufig eine große Anzahl von möglichen zu empfangenden Werten. Da nicht immer alle Werte gebraucht oder auch vom Smartmeter gesendet werden, löscht man einfach die Zeilen mit diesen nicht benötigten Werten.
Fehler suchen
Ja, auch mir ist es passiert, das erst einmal nichts funktioniert hat, daher anbei meine Tipps, wie man hier schnell zu einer Lösung kommt:
- Prüfen, ob die Lötstellen fest sind. Da es sich nur um 4 Adern handelt ist das relativ einfach möglich (ich habe alle Lötstellen ein zweites Mal mit dem Lötkolben erwärmt und die Kabel fixiert).
- Prüfen, ob der SmartMeter sendet. Da man so in den kleinen optischen Fenstern nichts sieht, nimmt man einfach ein Smartphone geht auf die Fotofunktion und hält die Kamera auf den Fotosensor. Da die Kameras auch UV-Licht sichtbar machen können, sollte hier ein zyklisches Blinken zu sehen sein. Wenn dem nicht so ist, dann muss der SmartMeter evtl. noch mit der PIN des Energieanbieters freigeschaltet werden.
- Prüfen, ob der Sensor richtig auf der Sendefenster sitzt. SmartMeter, wie der ISKRA MT175 besitzen 2 Dioden, die zum Senden und Empfangen gedacht sind. Der Sensor hat ebenfalls zwei Dioden, so dass Sender auf Empfänger und Empfänger auf Sender sitzen sollte. Die einfache Regel ist, dunkle/schwarze Diode des SmartMeters auf helle Diode des Sensors und umgekehrt. Manchmal ist das runde Ding auch einfach nur zu weit gedreht worden, d.h. achtet darauf, dass das Kabel möglichst senkrecht oben oder unten aus dem Sensor herauskommt.
- Prüfen, ob das RX-Singal auch an einem RX-Kanal des D1 Mini angeschlossen ist. Da die Kabel alle unterschiedliche Farben haben, kommt man hier schnell durcheinander. Deswegen empfehle ich, RX und TX Kabel entweder zu markieren oder die Farben für die Kanäle aufzuschreiben und diese dann bis zum PIN des D1-Mini korrekt zu führen.
- Prüfen, ob die Spannung und Erdung (GND) richtig geschaltet sind. Gerade, wenn man Breadboards verwendet, kann schnell ein Kabel locker sein, so dass kein Strom fließen kann. Achtet bitte auch darauf, eine Spannungsversorgung nur über die 3.3 Volt Leitung vorzunehmen.
- Testen, ob die Kommunikation funktioniert. Hierzu kann in der Tasmota Console folgender Befehl verwendet werden: "Sensor53 d1". Dies bewirkt einen Dump aller empfangenen Werte des SmartMeters und die Darstellung auf der Console. Wenn als Ergebnis eine Masse von Hexadezimal-Werten erscheinen, dann ist alles richtig (die Decodierung erfolgt durch die o.a. Scripte und Erläuterungen).
- Prüfen, ob die richtige Portnummer für den Datenempfang im Script angegeben wurde. Man vergisst leicht, dass der GPIO, an dem der RX-Kanal angeschlossen ist, auch im Script eingetragen sein muss. Die Beispielscripte nutzen teils andere Portnummern. Ich hatte das erst nicht geändert und hab daher stundenlang nach dem Fehler gesucht, bevor ich diese einfache Lösung gefunden habe.
- Prüfen, ob man das richtige Script für sein SmartMeter gewählt hat. Es gibt mittlerweile eine Vielzahl von Scripten für unterschiedliche SmartMeter. Nur wenn man das passende Script für sein SmartMeter verwendet, werden die Werte richtig ausgelesen. Eine Vielzahl von Scripten für unterschiedliche Smartmeter sind auf der Tasmota Seite unter SMartMeter Descriptors zu finden.
Weiterverarbeitung der Daten
Die Daten werden automatisch (wenn man den MQTT-Server eingestellt hat) per MQTT übermittelt, so dass man mit Drittsystemen auf die Werte zugreifen kann. Ich empfehle, diese z.B. über Openhab, NodeRed oder IOBroker in Verbindung mit eine Datenbank z.B. in influxdb zu speichern und per Grafana darzustellen, so erhält man einen super Überblick über zeitabhängige Verbräuche oder die Stromerzeugung.
Wenn man mit der Scriptsprache die Werte weiter verarbeiten möchte, dann kann man z.B. wie folgt die Werte ansprechen
tmp1=MT175#Total_in
und mit diesen Variablen und der Scriptsprache weiter arbeiten.
Ich versende z.B. die Werte zusätzlich an eine CCU3, indem ich in den Scripten die folgende Zeile aufrufe:
=>WebSend [192.162.153.17:8181]/cuxd.exe?ret=dom.GetObject("SV_Stromzaehlerstand").State(%tmp1%)
Insgesamt lässt sich mit der hier beschriebenen Lösung einfach arbeiten und auch die Einrichtung hat nicht viel Zeit in Anspruch genommen.
Hallo,
möchte gerne zwei SML-Zähler über 2xHichi IR Kopf mit einem D1 Mini auslesen.
Dies bekomme ich auch zur Funktion.
Jeder der beiden Zähler gibt 19Werte aus (Zählernummer, Zählerstand Einspeisung und Bezug, Strom, Spannung, Wirkleistung, Phasenabweichung jeweils L1, L2, L3; Frequenz, etc.). Leider bekomme ich in Tasmota nicht alle 36 Werte angezeigt und über MQTT übertragen. Genau bei 19 Werten ist Schluß. Kann man diese Grenze aufheben oder muss ich meine Werte reduzieren.
Vielen Dank für Eure Unterstützung.
Frank
Lt. Doku kann Tasmota bis zu 50 Variabeln verarbeiten (45 numerische und 5 strings). Mit MQTT kannst Du theoretisch bis zu 260MB übertragen, da wirst Du nicht dran kommen.
Bist Du sicher, dass Du diese Werte alle über die Infrarotschnittstelle erhältst? I.d.R. werden über die IR-Schnittstelle nur ein Teil der Werte übermittelt, die Du auf dem SmartMeter auf dem Display anzeigen lassen kannst. Bitte prüfe das erst einmal.
Guten Tag,
Den lesekopf habe ic hsoweit instlliert und auch fertig konfiguriert.
Das Problem ist jetzt allerdings, dass der Kopf zwar unter Objekte bei IObroker angezeigt wird aber weder den gesammt verbrsuch noch den aktuellen verbrauch an den iobroker sendet. er wird nur als online angezeigt.
auf der Webpage vom Kopf werden die aktuellen werte korrekt angezeigt
wo liegt der fehler
Hallo,
ich habe entsprechend dieser perfekten Anleitung im Februar dieses Jahres den Lesekopf installiert. Es hat alles rund 4 Monate perfekt funktioniert. Dann wurden von heute auf morgen plötzlich keine Daten mehr über Tasmota empfangen. Ich habe dann alles mögliche probiert, da ich zunächst dachte, es liegt am Lesekopf, der Verkabelung oder Tasmota.. nichts von dem war es: der Zähler (ISKRA MT175) hat sich von sich aus wieder in den „Standardmodus“ zurückgesetzt und keine Daten mehr übertragen!? Nach Eingabe der PIN ging es wieder. Leider habe ich dieses Problem jetzt „regelmäßig in unregelmäßigen Abständen“. PIN-Eingabe – geht wieder – ein paar Tage später wieder dasselbe. Hat jemand auch schon diese Erfahrung gemacht? Hat jemand schon mal den Schreibkopf im praktischen Einsatz getestet? Geht dieser mit der Tasmota-Einstellung überhaupt irgendwie anzusteuern? Könnte mir nämlich vorstellen, (falls es funktionieren sollte) die PIN Eingabe über den Schreibkopf vorzunehmen, sobald der Zähler mal wieder nicht mehr sendet. Vielleicht hat jemand ne Idee. Danke LG Marc
Das ist eine interessante Idee, aber mit Aufwand verbunden. Du kannst in der smartmeter Konfiguration (M-Section) auch den send Kanal angeben ( ). Da ich das selber noch nicht getestet habe, würde ich die Details in dem Tasmota Artikel zu den smartmetern suchen https://tasmota.github.io/docs/Smart-Meter-Interface/#meter-definition. Wenn du Stromausfälle oder das unbeabsichtigte mechanische Betätigen der blauen Taste ausschließen kannst würde ich den Netzanbieter kurz informieren und um Austausch des Gerätes bitten.
Hallo Dieter,
vielen Dank zuerst mal für das Erstellen der Seite. Ich hab mich gestern auch durch die Hichi-Einrichtung gekämpft und suche jetzt nach der Möglichkeit, die Daten zu loggen…
Da ich in den Kommentaren noch nichts dazu gelesen habe, hier die Auflösung für die @1000 oder @1: Das gibt die Fließkommastelle des ausgelesenen Wertes an. D.h. Wenn Du als Einheit kWh haben willst, stellst Du vorne ein @1000 hin. Wenn Du aber Wh sehen willst, musst Du @1 setzen. Demensprechend könntest Du nach meinem Verständnis mit @10 auch Deziwattstunden anzeigen lassen 😉
Gruß
Karsten
Danke Karsten für die zusätzlichen Informationen, die mit Sicherheit einigen helfen, ihre Daten optimaler zu formatieren. Bzgl. Logging empfehle ich den Weg über Node-Red zu nehemn und das Ganze in der InfluxDB zu speichern.
Gruß
Dieter
Ich habe den Lese Kopf mit RX TX ESP8266 nodemcu
>D
>B
->sensor53 r
>M 1
+1,3,s,16,9600,MT175
1,77070100010800ff@1000,E_in,kWh,E_in,1
1,77070100020800ff@1000,E_out,kWh,E_out,1
1,77070100100700ff@1,P,W,P,18
1,77070100240700ff@1,L1,W,L1,18
1,77070100380700ff@1,L2,W,L2,18
1,770701004C0700ff@1,L3,W,L3,18
1,77070100000009ff@#,Server_ID,,Server_ID,0
#
Das Skript eingefügt kommt aber nur
08:34:29.406 MQT: tele/tasmota_5859B7/STATE = {„Time“:“2023-09-01T08:34:29″,“Uptime“:“0T00:08:38″,“UptimeSec“:518,“Heap“:19,“SleepMode“:“Dynamic“,“Sleep“:50,“LoadAvg“:19,“MqttCount“:5,“POWER“:“ON“,“Wifi“:{„AP“:1,“SSId“:“Pyka“,“BSSId“:“CC:CE:1E:F5:A4:53″,“Channel“:6,“Mode“:“11n“,“RSSI“:92,“Signal“:-54,“LinkCount“:1,“Downtime“:“0T00:00:03″}}
08:34:29.414 MQT: tele/tasmota_5859B7/SENSOR = {„Time“:“2023-09-01T08:34:29″,“MT175″:{„E_in“:0.0,“E_out“:0.0,“P“:0.00,“L1″:0.00,“L2″:0.00,“L3″:0.00,“Server_ID“:““}}
LED sehe ich auch nicht Arbeiten mit meinem Handy vebunden schein er mit IOBrocker zu sein…..
Aus dem Consolenoutput kann man nicht wirklich viel ableiten, außer dass keine Werte ausgelesen werden. Deine MQTT-Verbindung funktioniert zumindest. Wurde die PIN richtig eingegeben, so dass die Daten vom SmartMeter gesendet werden? Hast Du einen MT175 als SMartMeter? Prüfe mal alle Schritte, die ich aufgeführt habe, wenn es nicht funktioniert Aus der Erfahrung liegt es fast immer an einem der aufgezählten Punkte. Sofern Du eine DeepSleepTime eingestellt hast, würde ich die fürs Experimentieren erst einmal deaktivieren.
Ich hab ein paar Rechtschreibfehler gefunden:
> „Leistung“ ist ein String, der die Bezeichnung des _Datenbwertes_ darstellt
> dann wird der Wert _püber_ diesen Variablennamen angesprochen
> kann beliebig _geädert_ werden
> wie man hier schnell zu einer Lösung _kommt::_
> SmartMeter _wir_ der ISKRA MT175 besitzen 2 Dioden
> Die einfache Regel hier ist dunkle/_schware_ Diode
> _wen nman_ den MQTT-Server eingestellt hat
> dann kann man _z.B.wie_ folgt
> Ich versende _z.B. _die Werte