Zu dem Zweck habe ich mir eine Hardware gebastelt die die Daten auslesen kann. Dazu später mehr, in einem anderen Beitrag. Mein Zähler überträgt etwa alle zwei Sekunden einen Datensatz. Automatisch, ohne dass ich ihn darum bitten müsste. Wenn ich den auslese erhalte ich einen formschönen Haufen Hex-Code, ähnlich diesem:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
1B 1B 1B 1B 01 01 01 01 76 05 01 D3 D7 BA 62 00 62 00 72 63 01 01 76 01 01 05 00 9B F2 94 0B xx xx xx xx xx xx xx xx xx xx 01 01 63 B3 78 00 76 05 01 D3 D7 BB 62 00 62 00 72 63 07 01 77 01 0B xx xx xx xx xx xx xx xx xx xx 07 01 00 62 0A FF FF 72 62 01 65 01 8A 4D 15 77 77 07 81 81 C7 82 03 FF 01 01 01 01 04 49 53 4B 01 77 07 01 00 00 00 09 FF 01 01 01 01 0B xx xx xx xx xx xx xx xx xx xx 01 77 07 01 00 01 08 00 FF 65 00 00 01 82 01 62 1E 52 FF 59 xx xx xx xx xx xx xx xx 01 77 07 01 00 01 08 01 FF 01 01 62 1E 52 FF 59 xx xx xx xx xx xx xx xx 01 77 07 01 00 01 08 02 FF 01 01 62 1E 52 FF 59 xx xx xx xx xx xx xx xx 01 77 07 01 00 10 07 00 FF 01 01 62 1B 52 00 55 xx xx xx xx 01 77 07 81 81 C7 82 05 FF 01 01 01 01 83 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 01 01 01 63 C6 12 00 76 05 01 D3 D7 BC 62 00 62 00 72 63 02 01 71 01 63 EE 1A 00 1B 1B 1B 1B 1A 00 F3 C7 |
Wie man unschwer erkennt habe ich private Daten anonymisiert. Lacht nicht!
Nachdem ich da längere Zeit mit verbracht habe weiß ich mittlerweile ziemlich genau was da steht. Und damit andere einen besseren Einstieg finden schreibe ich das mal hier auf.
Die Sprache nennt sich Smart Message Language (SML). Es gibt auch Zähler die die Daten in anderen Formaten, oder direkt im ASCII-Format ausgeben. SML ist aber ein Standard, und wird von vielen Herstellern genutzt. Wie das funktioniert kann man zum Beispiel in der Technischen Richtlinie BSI TR-03109-1 beim Bundesamt für Sicherheit in der Informationstechnik nachlesen. Wenn man das tut kann man den Datensatz da oben tatsächlich lesbar machen:
1 2 |
1B 1B 1B 1B -- Start Escape 01 01 01 01 -- Start Übertragung Version 1 |
Die ersten vier Bytes sind einfach eine Markierung für den Anfang der Übertragung, in der zweiten Zeile steht dass wir Version 1 des Protokolls lesen.
Als nächstes müssen wir ein wichtiges Konzept verstehen. Das erste Byte der folgenden Nachricht lautet ’76‘. Man muss das als Nibbles sehen, und bei Hex-Zahlen bedeutet das Ziffer für Ziffer. Das erste Nibble ‚7‘ können wir auf Seite 42 (natürlich ) des oben verlinkten Dokumentes nachschlagen. Da steht eine Tabelle mit einer Zeile ‚X111LLLL‘. Jetzt matcht das binäre ‚X111‘ auf das erste Nibble, also haben wir es hier mit einer Liste zu tun. Das zweite Nibble gibt die Länge an, wir erwarten also eine Liste mit 6 Elementen.
Das erste Byte der folgenden Zeilen ist jeweils nach dem gleichen Schema aufgebaut. In der Regel steht das erste Nibble für den Datentypen, das zweite für die Länge — merkwürdigerweise bei einfachen Datentypen die Länge inclusive dieses Längen-Bytes. Datentyp 0 in Zeile 4 ist laut Seite 42 ein Octet String. Die 5 sagt dass dieser Teil einschliesslich der Längenangabe 5 Bytes umfasst, wir erwarten nach der Länge also noch vier Bytes. Auf Seite 17 des Dokumentes steht dass hier eine Transaktions-ID kommen muss.
Nachdem das Prinzip klar sein sollte werde ich nicht mehr alles haarklein entschlüsseln. Das heisst: ich habe schon. Aber an dieser Stelle überlasse ich das mal dem geneigten Leser.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
76 -- SML Message mit 6 Elementen 05 01 D3 D7 BA -- transactionId 62 00 -- groupNo 62 00 -- abortOnError 72 -- messageBody 63 01 01 -- getOpenResponse 76 -- Liste mit 6 Elementen 01 -- codepage / optional 01 -- client id / optional 05 00 9B F2 94 -- reqFileId 0B xx xx xx xx xx xx xx xx xx xx -- server Id 01 -- refTime / optional 01 -- smlVersion / optional 63 B3 78 -- CRC 00 -- End of SML message |
Man sieht durch die Einrückung ziemlich deutlich dass man sich den Datensatz gut als Liste von Listen vorstellen kann. Außen wird eine Liste mit sechs Elementen angekündigt (76), darin stehen ein Octet String (beginnt mit 0, Zeile 4), zwei Unsigned Integer (6, Zeilen 5 und 6), eine weitere Liste mit zwei Elementen (72, Zeile 7), ein weiterer Unsigned Integer (6, Zeile 16) mit der Prüfsumme und eine Markierung für das Ende der Nachricht (00, Zeile 17). Die Liste mit den zwei Elementen enthält wiederum einen Unsigned Integer (6, Zeile 8 ) und eine Liste mit sechs Elementen (76, Zeile 9). Die meisten dieser sechs Elemente sind Octet Strings die samt des Längen-Bytes eine Länge von 1 haben (01), also leere Strings. Ein String (Zeile 12) enthält eine File-ID, einer (Zeile 13) die Server-ID. Letztere kann man auch direkt auf dem Gerät lesen, die ist aufgedruckt. Beruhigend.
Jetzt wird es ernst: eine weitere Liste mit sechs Elementen (76), die ersten Zeilen entsprechen dem Block oben:
18 19 20 21 22 23 24 25 26 27 28 29 30 |
76 05 01 D3 D7 BB 62 00 62 00 72 63 07 01 -- getListResponse 77 01 -- clientId / optional 0B xx xx xx xx xx xx xx xx xx xx -- serverId 07 01 00 62 0A FF FF -- listName / optional 72 -- actSensorTime / optional 62 01 -- choice: secIndex 65 01 8A 4D 15 -- secIndex (uptime) |
Enthalten ist eine Liste mit zwei Elementen (72, Zeile 22). Der erste Octet String (Zeile 23) gibt den Typ der Nachricht an, es ist ein getListResponse. Der wiederum besteht auf sieben Elementen (77, Zeile 24). Interessant ist hier vielleicht das vierte Element (72, Zeile 28. An dieser Stelle soll die aktuelle Zeit stehen, und die kann auf verschiedene Weise angegeben werden. Erklärt ist das auf Seite 22 des BSI-Dokumentes, dementsprechend haben wir es hier durch die 01 in Zeile 29 mit einem secIndex zu tun. In Zeile 30 folgt dann der Wert. Die Zahl 0x018A4D15 entspricht in etwa der Zeit die das Gerät hier eingebaut ist, das wird also eine Art Betriebsstundenzähler sein.
Die Liste die in Zeile 31 startet ist das fünfte Element der Liste aus Zeile 24. Und hier kommt der wirklich spannende Teil: die Messdaten. Naja, und ein paar Meta-Daten. Erst das Kürzel des Herstellers Iskra (ASCII-Codes in Zeile 38), dann nochmal die bereits bekannte Server ID. Die nächsten drei Elemente enthalten die verbrauchte Energie (die Kilowattstunden), sowohl als Summe als auch aufgesplittet in zwei Tarife — wenn man denn zwei Tarife hat.
Hier kommen wir übrigens zu einem Teil den ich noch nicht verstanden habe: in Zeile 50 wird ein Status angegeben. Wenn mir jemand sagen kann was der bedeutet: immer her damit! 0x0182 ist dezimal 386, darauf kann ich mir keinen Reim machen.
Die Energiewerte muss man übrigens durch 10.000 teilen um auf die kWh zu kommen die am Gerät angezeigt werden.
In Zeile 78 steht die aktuelle Leistung, also wie viel Watt tatsächlich in diesem Moment verbraucht werden. In Zeile 86 folgt ein ‚public key‘. Der steht auch auf dem Gerät, ich nehme an der ist relevant wenn der Zähler wirklich ’nach Hause telefoniert‘. Die SML-Kommunikation funktioniert nämlich nicht nur über die Infrarot-Schnittstelle, sondern bei Bedarf auch über die Stromleitung. So kann der Anbieter Verbrauchswerte ablesen ohne dass dafür jemand zu Besuch kommen muss.
Die beiden Werte in Zeile 88 und 89 sind optional und vervollständigen so die Liste die in Zeile 24 begonnen wurde.
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
77 -- valList 77 -- SML_ListEntry 07 81 81 C7 82 03 FF -- objName 01 -- status / optional 01 -- valTime / optional 01 -- unit / optional 01 -- scaler / optional 04 49 53 4B -- value -- Herstelleridentifikation (ISK) 01 -- valueSignature / optional 77 07 01 00 00 00 09 FF 01 01 01 01 0B xx xx xx xx xx xx xx xx xx xx -- Server ID 01 77 07 01 00 01 08 00 FF 65 00 00 01 82 01 62 1E 52 FF 59 xx xx xx xx xx xx xx xx -- Gesamtverbrauch 01 77 07 01 00 01 08 01 FF 01 01 62 1E 52 FF 59 xx xx xx xx xx xx xx xx -- Verbrauch Tarif 1 01 77 07 01 00 01 08 02 FF 01 01 62 1E 52 FF 59 xx xx xx xx xx xx xx xx -- Verbrauch Tarif 2 01 77 07 01 00 10 07 00 FF 01 01 62 1B 52 00 55 xx xx xx xx -- Wirkleistung total 01 77 07 81 81 C7 82 05 FF 01 01 01 01 83 02 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx -- public key 01 01 -- listSignature / optional 01 -- actGatewayTime / optional |
Oh, noch ein interessanter Punkt zu Zeile 86: das Nibble ‚8‘ ist eigenlich eine 0, also wieder ein Octet String. Da aber das Most Significant Bit gesetzt ist wird daraus eine 8, und das bedeutet dass die Länge der folgenden Daten nicht nur durch das zweite Nibble — die 3 — angegeben wird, sondern zusätzlich durch das folgende Byte. Nützlich, denn mit nur einem Nibble könnte man maximal 15 Bytes ankündigen (nachdem eines für die Länge draufgegangen ist). So kommen wir auf 0x32 == 50 Bytes. Ausreichend also für 48 Bytes Public Key und zwei Bytes Längenangabe.
Es folgen noch eine Prüfsumme und das förmliche Ende der zweiten Nachricht:
90 91 |
63 C6 12 -- crc 00 -- end of message |
Die dritte Nachricht ist einfach nur da um das Ende der Übertragung anzukündigen.
92 93 94 95 96 97 98 99 100 101 102 103 |
76 05 01 D3 D7 BC 62 00 62 00 72 63 02 01 -- getCloseResponse 71 01 63 EE 1A -- crc 00 -- end of message 1B 1B 1B 1B -- end escape 1A 00 F3 C7 |
Zu guter Letzt folgt in Zeile 102 nochmal die vom Anfang bekannte Escape-Sequenz, dann 1A um wirklich die Nachricht abzuschließen und nochmal drei Bytes für eine Prüfsumme.
Jetzt noch was in eigener Sache: viele Blogs schließen ihre Artikel grundsätzlich mit einer Frage an die Leser, um Kommentare zu fischen. Ich finde das penetrant, und mache das in der Regel nicht. Aber nach diesem furztrockenen (!) Artikel erlaube ich mir das ausnahmsweise mal: bitte ein Handzeichen von allen die bis hier durchgehalten haben! Muss kein Lob sein, ein Hallo Welt genügt.
Bis zum Ende ja, aber ein bisschen übersprungen, als es an die Nibble-Sektion ging. ;)
Mir geht sogar schon passender JavaCode durch den Kopf! :-))
Wenn der auf Mikrocontrollern liefe wuerde ich den gerne sehen. Hab aber schon was fertig, in C.
Also ich find’s total geil dass es Leute gibt, die sich tatsächlich durch sowas durch häcken, aber ich hab den Artikel nicht bis zum Ende gelesen
Hallo Ronald! =:^)
Mir ging’s wie Marcus, aber weiter so!
Wir brauchen Leute, die das für uns ausfuchsen!!
War durchaus verständlich, wenn ich mir auch die Nibble mit Nippelnimaginiert habe, was den Grad an Aufmerksamkeit bis zum Schluss auf einem hohen Level hielt.
Frage: was folgt aus all dem? Insbesondere der Kanal direkt über die Stromleitung hat mich beeindruckt. Kann das Teil darüber auch in irgendeiner Weise „geupdated“ werden?
Soweit ich weiss kann darueber auch geupdated werden. Allerdings habe ich keine Ahnung inwieweit das tatsaechlich gemacht wird.
Zur Zeit haben wir hier noch einen zweiten (aelteren) Zaehler haengen, deshalb war tatsaechlich kuerzlich noch eine Dame zum Ablesen da. Wo sie schon da war hat sie direkt beide Werte abgelesen, also auch vom neuen Zaehler. Keine Ahnung ob am anderen Ende die Infrastruktur vorhanden ist um das remote zu machen.
Als misstrauischer alter IT-User aus Vorwebzeiten bin ich mir scher, dass die nötige Infrastruktur, wenn schon nicht aktuell so doch in Kürze vorhanden sein wird.
Ich glaube nicht, dass ich „Black Out“ von Marc Elsberg noch extra empfehlen muss.
Das Buch habe ich auch und es viel mir auich gleich in den Sinn, als ich den Brief von Westnetz über den Zählertausch erhalten habe. Soweit ich es verstanden habe, wird zur Fernsteuerung und -abfrage aber noch ein weiteres Gerät benötigt. Ich hoffe, dass einige findige Ingenieure den Zähler mal auseinandernehmen und prüfen, ob man ohne weitere Geräte _wirklich_ keinen Fernzugriff hat (sieh Blackout)!
Fin
Ach, _das_ war also dieses „furztrocken“, von dem immer alle reden. Also ich fand das eigentlich ganz lustig (wenn’s nicht so traurig wäre, aber das ist ja schon das ganze Leben)!
Hallo Welt!
Die wichtigste Frage ist doch aber ob man dem Ding über die Schnittstelle auch commands reinwürgen kann.
Auf jeden Fall ist die Schnittstelle prinzipiell bidirektional. Ob ich als Endkunde da auch was reinschreiben kann weiss ich nicht. Ich koennte mir vorstellen dass man da weitere Datensaetze abrufen kann. Der Zaehler kumuliert die Messwerte, ueber das Display kann ich auch abfragen wie hoch der Verbrauch in den letzten sieben Tagen war und sowas. Vielleicht kann man das anfordern.
Der Schreib-Lesekopf den ich habe unterstuetzt das prinzipiell, der kann auch senden.
Dass man Zaehlerstaende manipulieren kann will ich nicht hoffen.
Hallo Welt :) – danke für den ausführlichen Input. Ich werde mich die Tage „nun hochmotiviert“ an meinen pafal 20ec3gr ransetzen, das steht schon lange auf meiner Liste.
Viel Erfolg dabei, der hat glaube ich die gleiche Schnittstelle.
Bin auch durch und fand es gar nicht trocken. Ohne die verlinkte PDF zu lesen – was hast du als Hardware verwendet und wirst du den uC-Code veröffentlichen?
Viele Grüße und weiter so!
Einen Arduino Nano und ein ENC28J60 Modul. Leider ist auf dem Nano verflucht wenig Platz, deshalb kann ich die Daten nicht wirklich vollstaendig parsen. Es reicht nicht mal dafuer die Pruefsumme zu berechnen. Daher bekomme ich noch einige falsche Werte. Sobald das gefixt ist wird veroeffentlicht.
bis zum Ende durchgehalten, aber wie man sieht erst spät aus dem RSS Feeder gefischt :)
Meines Wissens bedarf es noch eines „Smart Meter Gateways“ damit dieses Gerät über die Stromleitung zum Anbieter „online“ ist.
Hier mein „Hallo Welt“ Kommentar.
Der Artikel ist super, leider fehlt mir ein Zähler welcher SML spricht…
Hallo Roland,
welche Hardware hat du benutzt um die Daten auszulesen?
Gruß Christian
Wow, ich war mir sicher dass ich das Projekt schon vorgestellt haette in dem ich das alles gebraucht habe. Muss ich wohl noch machen, Schande ueber mich.
Ich habe einen Bausatz bestellt, das Ding nennt sich Volkszaehler. Gibt es mit USB oder einfach mit TTL-Ausgang. Bei mir haengt der an einem Arduino, also habe ich den mit TTL.
http://wiki.volkszaehler.org/hardware/controllers/ir-schreib-lesekopf-ttl-ausgang
Vielen Dank für die Infos!
Ich habe heute endlich die ersten Pakete meines Zählers aufzeichnen können und war froh, diese Beschreibung gefunden zu haben. Und die Werte stimmen auch noch! Als Hardware tut es z.Zt. ein Arduino mit nem Phototransistor und ein Widerstand ;)
Freut mich, dass der Artikel tatsaechlich auf Interesse stoesst. Und was mich noch mehr freut ist, dass er Leute beim Basteln unterstuetzt. So war der Plan.
Hallo Ronald, Hallo Michael,
ich habe seit gestern so einen Zähler im Haus und – es juckt in den Fingern:-)
Der Plan ist die Daten mit einem Arduino abzugreifen und per Modbus an die Haussteuerung zu schicken.
Habt ihr da ggf. schon was fertiges für den Arduino? – zumindest was die Datenerfassung angeht?
Grüße
Edgar
Ich habe was gebaut, das ist aber nicht sehr universell. Zum Veroeffentlichen muesste ich da noch Zeit reinstecken — die ich nicht habe…
Hi,
Thank you VERY MUCH for the detailed explanation of the SML protocol! The original document was quite cumbersome to read for me and did not easily explain the message structure (although after your explanation, you can actually understand it) – also the examples on the site http://wiki.volkszaehler.org/software/sml only help in partial.
For someone else stumbling across this site: It may help you to know all the different OBIS codes being used (for example, that 01 00 01 08 00 FF should mean „Gesamtverbrauch“). For this, please check out the site: https://www.dlms.com/documentation/listofstandardobiscodesandmaintenanceproces/index.html . At the bottom, there is an Excel file (Object_defs_v3.0_170127) containing all possible OBIS codes being used.
–> I couldn’t find out either what the status is by the way, but it might just be a system-specific status code (for which you would need the specification of the manufacturer).
Glad that this was useful for somebody. Thanks for the comment!
Habe vorgestern den neuen Stromzähler bekommen und bin jetzt auf der Suche nach Informationen dazu, wie ich an die Infos komme. Dein Artikel ist sehr umfangreich. Vielen Dank dafür. Ich hoffe, dass die Daten bei mir auch so raus kommen. Habe mir bei Volkszaehler.org schon den Lesekopf bestellt. RaspberryPi habe ich schon zwei. Werde davon also gleich mal einen benutzen, um alles zu testen.
Vielen Dank für deine Arbeit und die Veröffentlichung.
Ich freue mich wirklich darueber wie viele Leute etwas mit dem (trockenen!) Text anfangen koennen. Danke fuer die Rueckmeldung!
Hallo Ronald.
zur Zeile 50. Ich kann mir gut vorstellen das darin der Status übertragen wird ob der Zähler im Eintarif oder Doppeltarifmodus läuft.
Grüße Konrad
Hallo Ronald,
zur Zeile 50 hätte ich eine Info.
65 00 00 01 82
| | |
| | Status des Zählers (Bitweise) (Bit 8 = Anlaufschwelle überschritten=Zähler misst)
| Bezug Tarif 1 (0x01) oder 2 (0x02)aktiv.
Lieferung Tarif 1 (0x01) oder 2 (0x02)aktiv. (Du hast keine Einspeisezählwerke)
Mein Zähler zeigt an dieser Stelle ohne Last.
64 00 01 00 (Tarif 1)
bzw
64 00 02 00 (Tarif 2)
Top Erklärung über das SML-Transportprotokoll!
Hallo Roland,
bei mir wurde neulich der ‚alte‘ Landys+Gyr ZMD 120 durch einen Iskra MT176 ersetzt.
Leider gibt der MT176 nur Daten mit einer Auflösung von 1 kWh aus; der ZMD hatte eine Auflösung von 0,1 kWh.
Ich habe eine SW-Erweiterung im Sun-Watch, um auch den Eigenverbrauch meiner PV-Anlage im Sun-Watch anzuzeigen. Bei der Ausgabe in 1 kWh-Schritten wir daraus leider keine Kutve, sondern ein „Nadelkissen“.
Kennst Du oder ein Anderer eine Möglichkeit, dem Zähler eine Ausgabe in z.B. 1 Wh-Schritten (3 Stellen nach dem Komma) zu ermöglichen? Ich möchte nicht zu früh die hiesigen Stadtwerke um Rat fragen; die sind sehr ‚konservativ‘.
Ich lese auch mit dem Lesekopf von Volkszaehler.org über USB aus.
Tut mir leid, da kann ich nichts zu sagen. Vielleicht findest Du irgendwo Unterlagen von Iskra? Ansonsten schreib die einfach mal an…
Hi Vowie, wahrscheinlich musst du den Kunden PIN eingeben. Dann hast du auf dem Zähler die erweiterte Anzeige. Erst dann überträgt er im SML Protokoll auch die Kommastelle. So war es bei meinem Zähler auch. (Easy Meter Typ Q3MA)
Frag bei deinem Messstellenbetreiber nach. (i.d.R dein Stadtwerk) Die geben dir den PIN. Lass dich am besten mit der Zählerabteilung verbinden .
Grüße Konrad
Hallo Roland,
jetzt habe ich von den Stadtwerken endlich die PINs für meine 3 Zähler bekommen! Beim MT175 (2-Richtungszähler für meine PV-Anlage) ging das PIN-Eingeben problemlos, da er eine „richtige“ Taste hat. Nach Eingabe zeigt er jetzt die Nachkommastellen an und ich kann auch die „erweiterte Anzeige“ nutzen.
Bei der optischen Auslesung sind jetzt auch 3 Nachkommastellen vorhanden. Genau das, was ich wollte!
Nun habe ich noch 2 weitere Zähler (PV-Erzeugung und Nachtstrom-Heizung) und möchte dort auch die erweiterte Anzeige nutzen; aber — diese beiden MT176 haben keine Taste!
Laut Bedienungsanleitung soll man mit einer Taschenlampe bzw. LED-Lampe durch „Blinken“ auf den Lesekopf-Platz auch die Tastendrücke simulieren können. Leider habe ich das noch nicht hin bekommen!
Hat Jemand das schon mal gemacht und kann mir einen Tipp geben???
Vielleicht geht es ja auch über einen Lesekopf, wenn man weiß, wie das Kommando heißt.
Gruß
vowie
Ja, wir haben das bei zwei MT176 der Bonner Stadtwerke gemacht, aber die Dinger sind zickig. Ausserdem haben wir (natuerlich) unsere Smartphones als Taschenlampe genommen – mit lustigem Effekt:
Beim Smartphone X eines Freundes ging naemlich gar nichts – anscheinend sind die LEDs da so schoen IR-gefiltert, dass der MT176 sich auf der IR-Empfangsseite nicht angesprochen fuehlte.
Mit meinem Nokia 6 ging es dann – allerdings musste man SEHR nah rangehen. Ich vermute ohne Beweis, dass es mit einer Taschenlampe mit Gluehbirne am Besten funktioniert.
Die Anleitung findest Du zum Beispiel hier:
http://lackmann.de/fileadmin/downloads/produktblaetter/MT176_Kurzanleitung_V2.00.pdf
Allerdings klappt die Erkennung der OBIS Eintraege irgendwie noch nicht. Ich baue gerade einen zweiten RasPi zum HEX-Basteln am Protokoll um. Kann eigentlich nur ein Detail sein – es kommen alle 5 Sekunden zwei String-Objekte, die in der Doku zu OBIS nicht auftauchen.
Gruss Stephan
Hallo Stephan,
danke für den Hinweis; da hätte ich eigentlich selbst drauf kommen können (müssen!!!).
Sowohl mir einer Glühfadenlampe als auch mit einer IR-LED konnte ich die PIN problemlos eintragen und es erschien die momentane Leistung in der 2. Zeile des Zählers; die erste (obere ) blieb aber leer! Auch die weiteren Angaben konnte ich durch Anblinken aufrufen.
Leider gibt es bei meinen MT176… kein 11. Mal, um die PIN dauerhaft gespeichert zu bekommen.
Ich versuchte dann, nach dem 10. Mal (Anzeige Pin on) die Lampe mehr als 5 sek. anzulassen und danach brauchte ich die PIN nicht mehr einzugeben.
Leider wechselt nach ca. 2 Minuten die Anzeige wieder in den „Normalzustand“ –> d.h. in der ersten Zeile steht der Zählerstand und die 2. Zeile ist leer. Durch 2 x Anblinken habe ich dann (ohne PIN-Eingabe) wieder die 1. Zeile leer und in der 2. die momentane Leistung.
Schön wäre es, wenn wie bei meinem MT175… in der oberen Zeile der Zählerstand und in der 2. Zeile dauerhaft die momentane Leistung angezeigt würde!
Vielleicht hat Jemand einen Tipp für mich?
Gruß vowie.
Das ist aus Datenschutzgründen leider nicht möglich.
Hallo Ronald,
prima Artikel! Danke dafür. Ein Fehler ist mir noch aufgefallen: Nach dem ersten 0x83 Tag steht im obersten Fenster nicht 02 sondern XX. Wenn man das ändert, funktioniert alles.
Walter
Hi – guter Artikel.
ich währe sehr an Arduino-Code interessiert – da ich nach Zählertausch jetzt auch einen MT175 habe.
Mein altes IR-Kopf-zu-KNX interface muss neu Programmiert werden…
Wie steuerst du den Zähler an? 9600 Baud, 8N1?
Gruß
Thorsten
9600 Baud, die anderen Parameter muesste ich nachsehen…
Hi,
Wirklich sehr ausführlich beschrieben, hat mir sehr weiter geholfen.
Leider ist es mir nicht möglich für meinen Iskra MT 175 den CRC zu berechnen. Es kommt immer etwas anderes raus als der Zähler sendet. Obwohl die empfangenen Daten zumindest soweit ich das beurteilen kann I.O sind.
Ich fuerchte dass ich Dir da nicht helfen kann. Ich mache auch nur einen Plausibilitaetscheck, mit Pruefsummenberechnung waere das wohl zu gross fuer den Controller geworden.
Hallo,
nachdem ich den PIN am Zähler eingegeben habe kommen dort auch schöne Werte.
Allerdings kommt per SML nur ein „very basic“ Satz an Daten
Ich kann deine Auswertung genau bis zu Zeile 30 Nachvollziehen – ab 31 nicht mehr.
Ich kriege NICHT die liste mit 7 weiteren Elementen die die ORBIS Daten enthält
28” 72 — actSensorTime / optional
29” 00:7A — choice: secIndex
30” 81:03:01:4B:01 — secIndex (uptime)
Der rest meines Datensatzes geht so weiter:
09:01:01:04:77:00:FF:01:12:00:43:07:08:01:59:00:01:01:FF:52:00:00:07:07:01:55:00:00:01:52:00:07:07:62:55:00:00:FF:62:55:00:81:FF:01:3C:5E:17:CA:40:D1:3D:B6:C9:F1:6F:5F:01:2C:00:62:72:71:00:1B:F8:
Eine ORBIS 01:08:00 o.ä. gibt es nicht… auch ein Ende der Übertragung finde ich nicht
Irgendeine Idee – muss ich noch irgendwas machen damit der MT175 gesprächig per SML wird?
Gruß
Thorsten
Hallo Thorsten, das sieht so aus als ob du die falsche Geschwindigkeit eingestellt hast . Es muss 9600 8N1 eingestellt sein. Und dein secIndex hast du falsch gelesen. Zeile „29“ steht bie dirHex 00 das muss aber eine 62 stehen. 6 Steht für den Datentyp und 2 für die Länge. 6.1 Type-Length-Field Seite 42 TR-03109-1
Daran sieht man das was nicht stimmt.
Der Rest von deinem Datensatz macht wirklich keinen Sinn.
Hallo Konrad,
tatsächlich war meine Arudino-Leseroutine irgendwie fehlerhaft. Ein Teil der Daten ist sauber angekommen … dann kommt Müll. Mit einer neuen Ausleseroutine funktioniert es jetzt
Danke
Gruß
Thorsten
Bor super, auch 2021 noch prima!! Versuche ebenfalls gerade durchzusteigen und hab meinen Raspberry und Hex Werte war aber noch nicht weiter. Vom Energieerzeuger kahm noch keine Info, jetzt bin ich sehr viel weiter, vielen Dank!! Werde dich dankend in meinem Blog verlinken.
Hallo Ronald,
super Artikel. Tolle Leistung, dieses BSI-Mammutdokument wirklich so zu interpretieren, wie es dir gelungen ist.
Ich habe seit kurzem ein Smartmeter DWS7412.2 der Fa. DZG von EWE eingebaut bekommen.
Natürlich auch mit optischer Schnittstelle…..
Habe sofort mit einem Bastelsensor (Fotodiode und Transistor zur Impedanzwandlung) und einem Arduino Uno die Auslesung der D0-Schnittstelle begonnen.
Habe jetzt das komplette HEX-Telegramm vorliegen, welches vom Zähler im Sekundentakt abgegeben wird.
Nun bin ich dank deines Artikels in der Lage, etwas mehr zu entschlüsseln, aber das braucht Zeit…
Wenn ich weiter gekommen bin, melde ich mich wieder.
Übrigens: die käuflichen Interface für D0 sind alle viel zu teuer, eine IR- Fotodiode, 2 Widerstände und ein Transistor reichen völlig aus, um ein RS232-kompatibles TTL-Signal zu generieren. Wenn es interessiert, kann ich gerne die Schaltung beisteuern.
Grüße
Rainer
Hallo Rainer,
Ich habe leider denselben Stromzähler bekommen.
Kannst Du mir vielleicht helfen, wie ich den Zählerstand erreichne?
Meter Type: DVS7420.1.G2 Serial: 1 DZG00 6013 0510
# complete Message: 1b1b1b1b010101017605067dfa00620062007263010176010102310b0a01445a4700039584ce72620164537fea620263ae79007605077dfa00620062007263070177010b0a01445a4700039584ce070100620affff72620164537fea7477070100603201010172620162006200520004445a470177070100600100ff017262016200620052000b0a01445a4700039584ce0177070100010800ff641c01047262016200621e52ff6440cf7b0177070100100700ff017262016200621b52fe54008d67010101638b53007605087dfa006200620072630201710163b78a000000001b1b1b1b1a‘ # langer Datensatz
# Part: 0177 070100010800ff 641c01047262016200 621e 52ff 6440cf7b 01 77 070100100700ff 017262016200621b52fe54008d67010101638b53007605087dfa006200620072630201710163b78a000000001b1b1b1b1a
#https: // forum.fhem.de / index.php?topic = 51948.570
# anderer Nutzer gleicher Zähler: 1B1B1B1B01010101760587C61200620062007263010176010102310B0A01445A4700028275D772620164065A55620263724300760588C61200620062007263070177010B0A01445A4700028275D7070100620AFFFF72620164065A557477070100603201010172620162006200520004445A470177070100600100FF017262016200620052000B0A01445A4700028275D70177070100010800FF641C01047262016200621E52FF6405893F0177070100100700FF017262016200621B52FE539456010101634BA000760589C61200620062007263020171016332A000000000001B1B1B1B1A04518A
#Part: 070100010800FF 641C01047262016200 621E 52FF 6405893F 01 77 070100100700FF017262016200621B52FE539456010101634BA000760589C61200620062007263020171016332A000000000001B1B1B1B1A04518A
################################## Analyse
################################## Analyse
# 77
# 07 01 00 01 08 00 FF #identifier counter
# other 65 00 00 01 82
# my 64 1c 01 04 72 62 01 62
# other 01
# my 00
# other 62 1E unit (unsigned8) 1E = Wh
# my 62 1e
# other 52 FF scaler (int8) -1 = *10^-1 = /10
# my 52 ff
# other 59 xx xx xx xx xx xx xx xx — counter value
# my 64 40 cf 7b
# other 01
# 01
# 77
################################## Analyse
Hier ein Link für Fehler beim aktuellen Verbrauch:
https://github.com/jmberg/libsml/commit/81c4026e3d94f7a384cdd89f62a727b83269cdec
Wäre sehr erfreut bei Unterstützung.
Grüße Thomas
Hallo Ronald, bin inzwischen ein ganzes Stück weiter.
Habe nun einen ESP8266 (Wemos D1 mini) zusammen mit meinem Bastelsensor am Smartmeter installiert und sende das HEX-Telegramm per UDP-Protokoll an meinen PC oder an einen Arduino mit ETH-Shield und kann damit nun die Auswertung machen. Diese Lösung ist sehr bequem, da ich so von meinem Schreibtisch aus den Arduino-Sketch zur Auswertung weiterentwickeln kann.
Der DWS7412 sendet alle Sekunde ein HEX-Telegramm von 252 Byte, die Listen enthalten Obis 1.08 (Wirkarbeit total), 2.08(eingespeiste Wirkarbeit total, bei mir 0) und 16.07(momentane Leistung).
Ich habe das Telegramm nach deiner Anleitung einmal komplett aufgelöst und hole mir jetzt einfach über die Position im Telegramm die Werte heraus und forme sie entsprechend um(HEX-Byte in Integer_long bzw. unsigned_integer_long.
Danke nochmal für deine Anleitung, das hat mir sehr geholfen.
Rainer
Hallo Rainer Matri, genau das versuche ich auch schon seit Wochen, komme aber mit UDP nicht weiter. Hättest Du mir hilfereiche Codeteile dafür? Danke Ulrich
Hallo Ulrich,
für das UDP-Protokoll habe ich die Codeschnipsel aus dem Beispiel (ESP8266WiFi/UDP) verwendet. Als Empfänger zum ersten Testen fürs UDP habe ich das Tool „PacketSender“ auf meinem WinPC genutzt, dieses gibt es als Download im Netz. Das UDP lief auf Anhieb, da gab es keine Probleme, falls du mehr Hilfe brauchst, eröffne einen Thread im Mikrocontroller.net – Forum, dort ist die geeignete Umgebung, um Code auszutauschen. Diese Seite ist dafür weniger geeignet und sicher vom Owner nicht so gedacht. Dort im Forum kannst du deine Schaltung, deinen Prozessor etc. darstellen und dein Problem beschreiben. Wenn du kurz auf dieser Seite deinen Thread nennst, melde ich mich bei dir dann im Forum mit dem User rainer_1. Ich hoffe, der Owner hat nichts gegen diese Art der Kontaktaufnahme. Bis denne und LG Rainer
Wirklich ein toller Artikel, sehr spannend und sehr gut erklärt!
Kann ich gut bei http://www.freesol.de nutzen, danke nochmal, hab dich dort verlinkt!
Sorry, Dein Kommentar ist im Spam gelandet.
Sehr schöner Artikel.
Benutze inzwischen den IR Lesekopf von Weidmann
https://www.amazon.de/gp/product/B01B8N0ASY/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1
zusammen mit der App „EnergymeterConnect“ https://play.google.com/store/apps/details?id=com.energymeterconnect&gl=DE zum Auslesen der SML messages am Tablet und Smartphone.
Hi Ronald,
super Artikel, hat mir sehr geholfen, das BSI Dokument schneller zu verstehen und „meine“ Werte auseinanderzunehmen!
Hast Du herausbekommen, was der listName „07 01 00 62 0A FF FF“ in der GetListResponse Nachricht eigentlich zu bedeuten hat und welche anderen Namen es noch geben könnte? Im BSI Dokument finde ich dazu nichts.
Interessant bei dem EMH Zähler, der bei mit im Keller hängt, ist übrigens noch folgender Unterschied zu Deinem Zähler:
– Der Status, der bei Dir 0x0182 ist, ist bei mir 0x010182. Der Wert ist also wahrscheinlich nicht als Dezimalzahl zu interpretieren.
– Bei meinem EMH gibt es offensichtlich 40 Bit (!) Integer, denn der Zählwerksstand wird mit „56“ beginnend übertragen, also:
77
07 01 00 02 08 00 ff Zählwerk negative Wirkenergie, tariflos (OBIS 2.8.0)
64 01 01 82
01
62 1e Unit Code 30 -> Wh
52 ff
56 00 00 2b ce b0 => 287.0960 kWh
01
Dass 1e für „Wh“ (und 1b für W) steht, konnte ich übrigens in dem Dokument IEC 62056-62 auf Seite 24 hier finden:
http://read.pudn.com/downloads519/sourcecode/embedded/2155723/DLMS_shi/DLMS-Spec/IEC%2062056-62-2006.pdf
Nicht dass es ohnehin klar war, aber man will ja möglichst jedes Bit verstehen
Ist eigentlich bekannt, was für ein Verfahren bei der Public-Private-Key Kommunikation zur Verwendung kommt? Bei nur 240 Bit wahrscheinlich kein RSA…
Viele Grüße
Alex
Hallo Alex… Tut mir leid, Dein Kommentar ist bei mir untergegangen. Nein, ich kann Dir auch leider nicht bei Deinen Fragen weiterhelfen. Ich habe das damals so weit verstanden wie ich es fuer die Loesung meines Problems brauchte. Seitdem habe ich mich ehrlich gesagt nicht mehr viel damit beschaeftigt, ich bin alles andere als ein Fachmann.
Ich hoffe dass Du irgendwie anders an eine Loesung kommst. Viel Erfolg!
Hi Roland,
Zeile 50 wurde von Rad am 22.05.2017 erläutert. Könntest du das in deiner Doku oben noch aktualisieren?
Auch ich habe einen Zwei – Richtungszähler EMH ED300 L (wie Rad).
Da bedeutet (Zeile 50) 64 01 01 82 das die beiden Zähler pos. Wirkenergie 01 00 01 08 00 FF und 01 00 01 08 01 FF laufen (also Bezug).
Bei Einspeisung ändert sich der Status von (Zeile 50) 64 01 01 82 auf 64 01 01 a2, dann laufen die beiden Zähler 01 00 02 08 00 FF und 01 00 02 08 01 FF (jeweils negative Wirkenergie, tariflos und Tarif 1).
Ansonsten vielen Dank für deine Übersicht! Klasse.
Sorry …. mach auch dem Roland bitte ein Ronald !!
Hallo,
Bei mir ist ein Zweirichtungszähler ED300L eingebaut. Ich möchte meine von der Solaranlage erzeugte Energie nicht unbedingt einspeisen sondern das Brauchwasser erwärmen. Dazu habe ich eine Elektrische Heizpatrone 1500 W eingebaut.
Ich lese die D0 Schnittstelle mit NodeMCUESP8266 aus. Heraus gefunden habe ich das der Momentanverbrauch mach 10 07 00 steht
(ausschnitt)
77 07 01 00 10 07 00 ff 01 01 62 1b 52 ff 55 00 00 00 c5 01 → 19,7 Watt Bezug
77 07 01 00 10 07 00 ff 01 01 62 1b 52 ff 55 ff ff fd f6 01 → 357,4 Watt Eingespeist
das zeigt auch der Zähler an. Beziehen oder einspeisen unterscheiden durch 00 oder ff und am Zähler A+ A-.
Da ich den Einspeisewert kenne habe ich eine PWM auf einen Optokoppler ausgegeben der meine Heizpatrone auf den Einspeisewert regelt. Mein Serieller Monitor gibt Nachfolgendes aller 1.8 Sekunden aus.
Datagram received. Total Bytes:388
Pattern found at position: 000000010D
Momentanverbrauchswert: 2729 273 W Bezug
Datagram received. Total Bytes:388
Pattern found at position: 000000010D
Einspeisewert: 2434 243 W Eingespeist
Pulsweitenmodulation:138 = 202 W 202 W Zusatz Heizung ein nach 1,8 Sekunden dann
202 W Bezug
Datagram received. Total Bytes:388 |
Pattern found at position: 000000010D |
Momentanverbrauchswert: 2026 202 W Bezug
Zusatz Heizung aus
Datagram received. Total Bytes:388
Pattern found at position: 000000010D
Einspeisewert: 1944 194 W Eingespeist
Pulsweitenmodulation:110 161 W Zusatz Heizung ein
Datagram received. Total Bytes:388
Pattern found at position: 000000010D
Momentanverbrauchswert: 1908 190 W Bezug
Ich kann nicht verstehen das der Zähler jetzt zwischen einspeisen und beziehen hin und her springt.
Die Solarleistung ist annähernd gleich
Die PWM Frequenz ist 1 kHz. Ich wandle die Netzspannung in Gleichstrom um und schalte über einen Optokoppler einen IGBT auf die Heizpatrone.
Kann mir da Jemand weiter helfen stimmt die Anzeige am Zähler oder ist die PWM Frequenz zu hoch,
Hallo H Bauer. Dein Regelkreis ist viel zu schnell. Der Display und die IR Schnittstelle geben die aktuellen Werte verzögert aus. Das ist auch so gewollt. Diese Aufgaben sind zweitrangig. Das Messen und Summieren der Energie hat Vorrang. Daher musst du deine Regelung so umsetzen das sie nur z.B. alle 10 Sekunden einen neuen Sollwert setzt.
Alternativ den IR Impuls nehmen. Der ist synchron zur aktuellen Leistung. Aber ab einer gewissen geringen Last kommt der allerdings auch immer seltener. Ich empfehle die immer eine Restentnahme zuzulassen statt um Null Watt zu regeln.
Das habe ich so gemacht. Mein Aufbau ist mit ESP aber mit DMX Dimmer. Hat auch erst geschwungen ;)
Danke für den Tip ich werde versuchen Durchschnittswerte für PWM zu nutzen. Die Restentnahme rechne ich bei der Umrechnung der Leistung in PWM mit ein.
H Bauer
@H Bauer: Korrigiere mich, wenn ich mich irren sollte, aber ich nehme sehr stark an, daß es sich bei der Angabe der eingespeisten Leistung um ein Zweierkomplement handelt: 0xFFFFFDF6 = -522 —> 52,2 Watt.
Ansonsten: Vielen Dank an Ronald für das Aufdröseln des Übertragungsprotokolls. Ich habe seit 3 Tagen einen MT 176 bei mir hängen und werde mal versuchen, das Teil per PC auszulesen.
Danke für den Tip mit „Punkt zu Zeile 86“, ich konnte jetzt emdlich mit einem ESP8266 die Daten von dem Zähler mit einem billigen leser von: https://wiki.volkszaehler.org/howto/simpler_ir_leser alle daten auslesen und direkt auswerten und als MQTT an OpenHUB2 weiterleiten.
Werde das Programm mal auf Git Hub legen
@J. Arnold
Super Arbeit! Kannst du den Code zufällig veröffentlichen. Z.b. auf PAstebin oder so? Ich habe genau das gleiche vor, möchte die Daten an mein Home Assistant System senden.
Hallo Ronald, habe Deinen Interessanten Beitrag leider erst vor kurzem gelesen, aber er hat mir sehr weiter geholfen – ich nutze mehrere Easymeter
Hallo J. Arnold, das könnte mir sehr weiterhelfen – hast Du mir den Link zu Git Hub?
Hallo,
mir ist noch nicht klar, welche Werte, die der Stromzähler im Bauch hat, auch über die Schnittstelle ausgelesen werden können.
Ich vermisse die im Zähler gespeicherten Werte wie Tageswerte, Wochen und Monatswerte.
Diese haben ja die Zähler aller Hersteller an Board.
Werden diese nicht über die optische Schnittstelle weitergeleitet? Das wäre ja sehr schade!
Um die Daten nach Tagen, Wochen oder sonstigen Zeiträumen aufschlüsseln zu können, bräuchte der Zähler die Information über das aktuelle Datum und die aktuelle Uhrzeit. Ich sehe nichts, wo er das herbekommen könnte.
Man kann DIESE historischen Werte ja auch über das Display abfragen. (Ich glaube der Zähler hat keine richtige Uhr, zählt aber approximativ die Sekunden). Die Zähler sind vom Output und Bedienung scheinbar alle nahzu 100% gleich (Herstellerübergreifend).
Ich kann an meinem Zähler 730 Tage zurück manuell die Tageswerte z.B. abfragen. Und anscheinend, wenn man einen Parameter richtig gesetzt hat, werden diese auch über die optische Schnittstelle ausgegeben. Genau das möchte ich genauer wissen.
Paramter : „InF-Aktivierungsbetrieb der Herstellerdaten im Telegramm am INFO-Port. Es wird das ON-Symbol angezeigt, wenn die Funktion ON ist (erweiterte Daten) oder OFF-Symbol, wenn die Funktion aus ist (Daten in der grundsätzlichen Version). Änderung des ON/OFF-Parameters durch langes Lichtsignal.“
Eins vorweg: Ich habe mich bis jetzt nur theoretisch mit der Schnittstelle und dem Übertragungsprotokoll befasst, das aber ziemlich gründlich.
Das ON/OFF im Display bezieht sich -zumindest bei meinem Zähler- auf den PIN – Schutz.
Über die Schnittstelle sendet der Zähler periodisch jede Sekunde die Werte, die Ronald eingangs beschrieben hat, das ist schon mal eine ganze Menge. Um etwas anderes abzufragen oder zu setzen, mußt du einen entsprechenden SML – Request an den Zähler senden. Einzelheiten dazu findest du in der o.g. “ Richtlinie BSI TR-03109-1″. Eine vollständige Liste der OBIS – Codes gibt es hier: https://www.promotic.eu/en/pmdoc/Subsystems/Comm/PmDrivers/IEC62056_OBIS.htm
Höchstwahrscheinlich sind nicht alle Codes implementiert, insbesondere glaube ich nicht, daß sich die Energieregister so einfach „tampern“ lassen. Immerhin gibt es einige Codes, die sich auf Datum und Uhrzeit beziehen, es besteht also zumindest die theoretische Möglichkeit, daß der Zähler über eine eingebaute Uhr (RTC) verfügt.
Danke Schleifstein für den guten Austausch!
Das hilft mir schon mal weiter!
Die Dialog der Hersteller, die ich bisher gegooglet und in Handbüchern nachgelesen habe, sind nahezu identisch.
Bei meinem Zähler (Norax 3D) ist der Paramter direkt nach dem Wert „365d“ und vor dem Paramter für die Pin (on/off)
Diesen Meine ich:
InF – Aktivierungsbetrieb der Herstellerdaten im Telegramm am INFO-Port. Es wird das ON-Symbol
angezeigt, wenn die Funktion ON ist (erweiterte Daten) oder OFF-Symbol, wenn die Funktion aus ist (Daten in der grundsätzlichen Version). Änderung des ON/OFF-Parameters durch langes Lichtsignal.
Bei mir steht er bereits auf „on“.
Hallo Zusammen,
welche Möglichkeiten gibt es den obigen Zähler iskra TYP b1t+e1t +g über IR Schnittstelle o.Ä. aus zu lesen.
Danke für Ihre Info.
Mit freundlichen Grüßen
Andreas Wentz
Das kann ich leider nicht beantworten, ich habe mich nur vor einigen Jahren mal in das Thema reingefuchst. Bin da kein Experte.
Hi. Ich habe das ganze in meine Hauszentrale integriert. Anleitung: https://ottelo.jimdofree.com/iskra-mt175-und-ha/
Hallo ich habe eine Erfassung der Leistung und Energie seit Jahren am laufen. Jetzt ist aber nach einer Änderung der Gesamtleistung von 10 FF FD 60 auf 11 00 14 D0 der Fehler aufgetreten das anstatt dessen 7 4A Ca 70 ausgegeben wurde. Seit diesem Zeitpunkt wird das erste Byte der Energie nicht ausgegeben hierdurch erfolgt eine fehlerhafte Abfrage. Die anderen Daten im Telegramm werden ohne Fehler erfasst nur das erste Byte der Energie fehlt. Hat jemand eine Erklärung für dieses Verhalten?
„Hallo Welt“
Super Artikel!!!!!
Da du so freundlich um einen Kommentar gebeten hast, geb ich hier gerne meinen Senf dazu.
Bei dem Thema Smart Meter Auswertung gibt es ja viele Tutorials, aber die meisten beziehen auf einen kompletten Software + Hardware Stack, also z.B. ein IR Lesekopf mit TTL Interface der an einen Raspberry Pi angeschlossen ist und das ganze an ioBroker weitergibt. Für meinen Anwendungsfall (ESP8266, MQTT und/oder prometheus) habe ich allerdings nichts gefunden, deswegen ist dieser Beitrag sehr hilfreich um das SML Format zu verstehen so dass ich letzendlich meinen eigenen Parser schreiben kann. Tasmota hat zwar einen SML Parser schon eingebaut, bzw. untersützt diesen über Scripting, allerdings nützt mir das wenig weil das ganze nur mit einem TTL Interface funktioniert, ich aber die den IR Phototransistor direkt an den Seriellen Eingang des Pis angeschlossen habe (der soll später noch durch einen ESP ersetzt werden, zum testen ist ein Pi aber erstmal einfacher).
Mit deiner Erklärung kann ich aber nun endlich auch aus der offiziellen Dokumentation sinnvolle Informationen ziehen.
Zu guter letzt noch etwas Werbung in eigener Sache, während ich diesen Kommentar schreibe entwickele ich den Parser, zu find wird das ganze unter https://github.com/danielr1996/smlparser sein, wer da also Interesse hat kann gerne rein schauen.
Hi Daniel,
ich bin zwar nicht Ronald, möchte aber dennoch kurz kommentieren – was meinst Du mit Tasmotas „TTL Interface“? Ich habe bei mir auf einem Wemos D1 mini (ebenfalls ESP8266) Tasmota mit eincompilierter SML Unterstützung laufen und lese darüber einen IR-Smartmeter per Widerstand + Phototransistor aus (Gesamtkosten keine 15 Euro). Die Werte frage ich per Telegraf im 2-Sekundentakt ab (*), schreibe sie in eine InfluxDB und visualisiere per Grafana. Das klingt für mich sehr ähnlich zu Deinem Usecase. Und wie gesagt, Tasmota läuft bestens und alles ohne zusätzliche Programmierung.
Grüße
Alex
(*) url ist http://IP/cm?cmnd=status%208 und json_query = „StatusSNS.SML“
Hi Alex,
mit TTL Interface meine ich sowas hier: https://wiki.volkszaehler.org/hardware/controllers/ir-schreib-lesekopf-ttl-ausgang, wobei mir das wie es scheint auch nur eine serielle Schnittstelle ist. Der Unterschied scheint wohl zu sein dass bei unserer Lösung (Phototransistor mit Widerstand) die Kabellänge zwischen Diode und ESP begrenzt ist, da es ein analoges Signal ist, beim TTL Interface müsste es sich demnach um eine digitale Schnittstelle handeln bei der die mögliche Kabellänge deutlich höher ist. Da ich die Diode aber direkt auf den D1 mini gelötet habe und somit das ganze Package im Lesekopf direkt integriert ist stellt das kein Problem dar. Letztendlich habe ich es mit https://github.com/mruettgers/SMLReader umgesetzt, mit Tasmota lief es bei mir aus irgendwelchen Gründen nicht.
Das schöne am SMLReader ist dass er die LED des D1 blinken lässt wenn er Daten empfängt, so ist die Ausrichtung des Lesekopfs ein Kinderspiel.
Oh MANN… Dein Beitrag hat mich echt gerettet. Ich aber ewig versucht aus den anderen Quellen herauszufinden, wie ich bei mein ED300L den momentanen Verbrauch raus lesen kann. Erst durch Deine ausführliche Beschreibung konnte ich das Protokollpaket komplett dekodieren und den Stelle, die ich auslesen muss, identifizieren!
@danielr1996: falls du noch mit liest: hab nach deiner SML-Dekoder Bibliothek gesucht, aber nicht (mehr) gefunden. Bist du da noch dran?
BTW: ich benutze den Hichi Lesekopf aus dem Photovoltaik-Forum den’s auf Ebay mit USB Anschluss für 21 Ökken gibt.
Vielen Dank für die tolle Beschreibung, hab alles gelesen und konnte auf der Basis meinen ISKRA MT631-632 auslesen. Funktioniert suuuuuuupiii. Allerdings hab ich es nicht geschafft den signed Integer (zB. 0x52 oder 0x53) mit variabler Anzahl von Bytes zu wandeln bzw. ich hab ne einfacher Lösung gefunden. Ich berechne einfach die Ableitung der SummenLeistung (Bezug und Einspeisung) und ziehe die Ergebnisse voneinander ab. Dadurch bekomme ich auch automatisch von Messung zu Messung den Mittelwert und nicht den gerade aktuellen Messwert.
Bei dem IR-Lesekopf (Volkszähler) am Arduino noch ein Tip an alle Bastler: den Sendepin nicht offen lassen, sondern einen 10 kOhm Pull-up (kann auch Pull down gewesen sein). Andernfalls hat sich der selbstständig gemacht und mir immer wieder ins Protokoll gefunkt. Dann wird es nochmal schwerer mit dem Entschlüsseln (Hat mich ganze Nächte gekostet, bis ich den Fehler gefunden hab :))
Schlussendlich funktioniert der gebastelte Energiemanager super gut.
Vielen Dank und schöne Feiertage
Hat jemand einen Code in Pascal, um das zu dekodieren?
Wer weiß wann ich das mal gebacken bekomme…
Pascal? In 2022?!? Wow…
Nach Basic war das fuer mich die zweite Sprache die ich gelernt habe… vor etwas mehr als 30 Jahren (Turbo Pascal). Zuletzt was darin geschrieben habe ich vor etwa 25 Jahren (Delphi).
Code habe ich leider nicht fuer Dich, aber ich bin neugierig: warum Pascal? Einfach weil Du die Sprache bevorzugst? Oder hast Du eine Umgebung die das vorgibt? Was mag das sein?
Ich bin restlos begeistert. Genau das habe ich seit Tagen gesucht.
Hallo,
auch von mir ein Dankeschön für den Artikel!
Mir wurde nämlich heute mein alter EMZ eHz Einrichtungszähler gegen einen Itron e.HZ-B Zweirichtungszähler getauscht. Und wie soll es anders sein, die Skripte waren nicht kompatibel.
Dank ihrer „Anleitung“ und dem Original Dokument habe ich den Code dann erneut entschlüsselt und die auszuwertenden Stellen angepasst.
Der neue Zähler hat deutlich längere Strings für Bezug und Lieferung und diese Werte müssen auch nicht mehr geteilt werden.
Also danke nochmal, dass war genau der Anstoß der gefehlt hatte das SML Dokument zu entschlüsseln.
Gruß
Maze
Ich habe jetzt auch den ltron e.HZB bekommen und brauche das Script für den Hichi, das ist doch genau das, was Du jetzt gemacht hast ? Ich baue das zum ersten mal zusammen.
Kannst Du mir das Script bitte schicken ?
Vielen Dank!
Tipps wie von Dir sind des Bastlers Rettung.
Offizielle Normungsdokumente zu lesen und dann auch noch zu verstehen ist nervtötend.
Andreas
Hallo Ronald,
auch ich bin begeistert von Deiner, gar nicht trockenen, Anleitung. Da könnte sich das BSI eine Scheibe abschneiden. Ein Beispiel ist hilfreicher als Tausend Worte.
Ich habe zwar selber kein Smart Meter, aber bei einem ehemaligen Kollegen konnte ich einen Mitschnitt mit dem Laptop machen. Dazu hebe ich kleines Programm in (nicht lachen) ‚FreeBasic‘ geschrieben, welches die SML- Dateien an Hand der ESC- Sequenzen identifiziert. FreeBasic ist nicht mit Uralt- BASIC zu verwechseln. Die Programme sind ähnlich wie ‚C‘ aufgebaut und erlaubt solche Projekte sehr schnell zu realisieren. Mir ging es erst einmal nur darum das Protokoll zu verstehen.
Zur Zerlegung der Nachrichten war Deine Anleitung sehr hilfreich!
Wenn man die CRC- Summen auswertet, muss beachtet werden, dass bei der SML- Message das Byte ’63‘ nicht zur Summe gehört, bei der SML- Datei geht sie bis zu dem Byte vor den CRC- Bytes.
Der Kollege möchte auch möglichst wenig, nicht vergüteten, Energie- Einspeisung machen. Das geht natürlich am einfachsten mit so einem intelligenten Zähler.
Als Pfennigfuchser könnte ich noch anmerken, dass es, laut BSI, nicht ‚getOpenResponse‘ und ‚getCloseResponse‘ heißt, sondern nur ‚OpenResponse‘ und ‚CloseResponse‘.
Grüße Matz
Ich habe auf der Suche nach dem Status, da meiner da noch etwas wilder ist, einiges an Zeit verloren aber da ich in einem Dokument (Handbuch eines Zähler) auch zu weiteren OBIS Kennzahlen fündig geworden bin die das BSI selber nicht aufschlüssel, die aber jeder Zähler hergibt (01 00 60 32 01 01 oder 01 00 60 01 00 ff) die als ObjName jeweils HerstellerID und GeräteID bennene habe ich etwas weiter geschaut und dieses Gerät gibt direkt unter den OBIS Kennzahlen auch Status Kennzahlen aus. Vermutlich sind die auch irgendwo genormt und immer gleich. Leider bin ich in der IT nicht so ganz fix mit den ganzen Kodierungen. Der status scheint ja unsigned32 Kodiert zu sein. Was das jetzt für mich heißt weiß ich aber nicht. Jedenfalls gibts hier ne liste mit Stati für einen Zähler und ggf wird man daraus ja schlau https://www.heider-energie.de/attachments/article/165/Handbuch_Norax3D.pdf
Klasse Zusammenfassung! Vielen Dank!
Wie komme ich denn an die Leistung der einzelnen Phasen? Bei mir zeigt Tasmota dort stets 0W an, während Zählerstände und Gesamtleistung passen. der Hängt bei mir an einem MT681.
Der Iskra MT681 gibt keine Werte je Phasen aus. Die EMH eHZ auch nicht. Ich habe das bis jetzt nur bei einem EasyMeter Q3B gesehen. Das ist aber ein Dreipunktzähler.
Hallo ich vermute, dass das daran liegen kann, dass der Zähler noch nicht freigeschalten ist. Erst wenn der Zähler über seinen PIN freigeschalten wird gibt er dir vermutlich die Info über deinen momentan Verbrauch aus. Es sind hier jedoch nicht die einzelnen Phasen sondern die momentane Gesamtleistung, die sein Zähler anzeigt.
Ein auslesen des Zähler ist ja schön und gut aber das dein iskra Zähler völlig falsch zählt zumal zu deinem Ungunsten würde mich viel mehr beschäftigen!
https://www.elektropraktiker.de/nachricht/verlorenes-vertrauen-digitale-stromzaehler-weiterhin-in-der-kritik/
Ob der falsch zaehlt ist erstmal dahingestellt. Wenn ich das richtig lese bedeutet das, dass der unter Umstaenden (!) falsch zaehlen kann. Die ausgelesenen Werte sehen aber fuer mich erstmal plausibel aus.
Hallo,
ich finde das ja echt spannend und Cool. leider bekomme ich bin ich ergebnislos mit meinen versuchen.
Ich versuche mit einem (Mikrocontroller) ESP32 DEVKIT V1 und einem (IR Sensor) TCRT5000 meinen Stromzähler ISKRA-MT681 auszulesen.
Gerne würde ich mir das übertragene Protokoll im Seriellen Monitor anzeigen lassen, doch das bekomme ich nicht hin
Mit was hast du die Daten genau ausgelesen und mit was angezeigt?
Hast du eventuell einen Code um die empfangenen Daten auf dem Seriellen Monitor anzuzeigen?
VG Mücke
Puh, das ist lange her. Bei mir laeuft da ein Arduino mit einem Volkszaehler-Adapter und einem Netzwerk-Modul. Welches Modell das ist und wo ich den genau her hatte weiss ich ehrlich gesagt nicht mehr.