Auslesen der Easymeter Q3M D0-Schnittstelle

  • Hallo zusammen,


    aktuell bin ich dabei den Stromzähler (Easymeter Q3M v1.02 (v6.03)) des Hauses in dem ich wohne auszulesen.
    Hierfür möchte ich die D0-Schnittstelle mittels eines Phototransistors auslesen.
    Die Schaltung habe ich von der Volkszähler.org Seite übernommen (https://wiki.volkszaehler.org/…reib-lesekopf-ttl-ausgang). Ich verwende einen Phototransistor und einen Transistor als Treiber. Ich greife dann das empfangene Signal am Collector des Treiber-Transistors ab.
    Bei Bedarf kann ich auch gerne die Schaltung auf meinem Steckbrett fotografieren und hier anhängen.
    Das empfangene Signal gebe ich dann direkt auf den RX Pin meines Arduino Unos.


    Der Sketch für meinen Arduino sieht wie folgt aus:


    Das Ganze ist nur sehr simpel gehalten und soll eigentlich erstmal nur die empfangenen Zeichen in einem String puffern und sobald nichts mehr kommt, die Zeichen seriell ausgeben, damit ich sie mir in dem seriellen Monitor anschauen kann. Dies ist nur eine Testapplikation, um überhaupt einen Start zu haben und die richtigen Stellen zu finden, welche ich später auswerten möchte.
    Nachdem ich mehrere Tage eine fehlerhafte oder gar keine Nachricht empfangen habe, habe ich es endlich geschafft, den richtigen Start der Nachricht zu empfangen.
    Die Nachrichten sollen laut dem SML-Protokoll immer mit "1b 1b 1b 1b 01 01 01 01" anfangen, dies ist auch der Fall, siehe folgende Nachricht die ich erhalte:


    Code
    1. 1b 1b 1b 1b 01 01 01 01 76 0b 45 53 59 4d d9 ce 00 68 d8 08 62 00 62 00 72 63 01 01 76 01 04 45 53 59 08 45 53 59 f4 1c d8 08 0b 09 01 45 53 59 11 03 a1 d9 ce 01 01 63 f1 32 00 76 0b 45 53 59 4d d9 ce 00 68 d8 09 62 00 62 00 72 63 07 01
    2. 77 01 0b 09 01 45 53 59 11 03 a1 d9 ce 07 01 00 62 0a ff ff 72 62 01 65 00 22 f4 1c f1 01
    3. 77 07 81 81 c7 82 03 ff 01 01 01 01 04 00 00 00 00 74 a9 39 6d 01
    4. 77 07 01 00 02 08 00 ff 64 01 01 80 01 62 1e 52 fc 59 00 00 00 00 e9 13 d2 3c 01
    5. 77 07 01 00 01 08 01 ff 01 01 62 1e 52 fc 59 00 00 00 00 74 a9 39 6d 01
    6. 77 07 01 00 02 08 01 ff 4c 07 00 ff 01 01 62 1b 52 fe 59 00 00 00 00 00 00 60 5d 01
    7. 77 07 81 81 c7 82 05 ff 01 01 01 01 83 02 66 b7 60 bd ec 9f 88 0b 2c 31 ae ac
    8. 76 29 72 52 36 7f 9d 41 29 38 e6 7c a1 49 4c c8 5a 4a 57 f0 5b 25


    Die Zeilenumbrüche, um die Nachricht besser lesen zu können, habe ich so gesetzt, da ich gelesen habe, eine Zeile startet immer mit 77 07 laut SML Protokoll.


    Nun meine Frage. Wie kann ich meine oben stehende Nachricht auswerten?
    Denn die Nachricht sollte ja ungefähr so aussehen (das folgende habe ich auch von der Volkszählerseite kopiert):

    Code
    1. /ESY5Q3DA1004 V3.04
    2. 1-0:0.0.0*255(1ESY1160007140)
    3. 1-0:1.8.0*255(00000001.4000401*kWh)
    4. 1-0:21.7.0*255(000000.00*W)
    5. 1-0:41.7.0*255(000000.00*W)
    6. 1-0:61.7.0*255(000000.00*W)
    7. 1-0:1.7.0*255(000000.00*W)
    8. 1-0:96.5.5*255(30)
    9. 0-0:96.1.255*255(1ESY1160007140)


    Eigentlich dachte ich die ganze Zeit, ich müsste nach "01 08 00" suchen um den Zählerstand des Wirkleistungsbezugs Gesamt zu erhalten. Leider könnt ihr in meiner Nachricht oben sehen, dass ich nur "01 08 01", "02 08 00" und "02 08 01" empfange.
    Zudem standen gestern die Zahlen "196kWh" und "364kWh" (bin mir nicht mehr 100% sicher mit der letzten Stelle) auf dem Zähler. Diese beiden Werte waren laut Display für "1.8.0" und "2.8.0", weshalb es mich wundert, dass ich keine "01 08 00" empfange. Zudem sind die Werte für die kWh in der Nachricht deutlich größer als die eben genannten 196kWh und 364kWh vom Display (Nachricht wurde ca. zeitgleich mit dem Ablesen empfangen).


    Ich glaube ich empfange mittlerweile die richtigen Zeichen von der D0 Schnittstelle des Easymeters Q3M.
    Jetzt hoffe ich, dass mir jemand dabei helfen kann zu verstehen was ich empfange.
    Wie genau kann ich die einzelnen Zeichen für mich übersetzen, sodass ich zu Testzwecken mir die Nachricht im "Klartext" anzeigen lassen kann?
    Muss ich am Easymeter noch etwas einstellen um die "01 08 00" zu empfangen oder wieso empfange ich diese nicht?


    Bei fehlenden Informationen gerne melden.
    Vielen Dank im Voraus.


    Viele Grüße
    Heenne

  • Dein erster Fehler ist das du D0 erwartest, aber SML erhältst. Das Codebeispiel das du da hast ist von einem Q3D, nicht von einem Q3M.


    Eine grobe Übersicht über SML: https://wiki.volkszaehler.org/software/sml
    Im vzlogger nutzen wir eine C-Library fürs dekodieren der Nachrichten: https://github.com/volkszaehler/libsml


    Zweiter Punkt ist das du den gelieferten OBIS-Code 1.8.1 nicht als solchen erkannt hast.
    Wobei Teil des Problems ist das du bestimmt mehr Daten bekommst wenn du die oberen Schnittstelle des Zählers anzapfst (siehe Link oben).



    mfg JAU

    No Shift - No Service

  • Vielen Dank für deine Antwort JAU.


    Das ist wirklich ein Fehler, ich habe immer D0 im Zusammenhang mit SML gesehen und nicht als zwei getrennte Dinge, danke für die Klarstellung.
    Wie kommst du drauf, dass mein Codebeispiel für das Q3D ist und nicht Q3M? Ich habe eine Serielle-Verbindung mit 9600 Baud und beim Arduino ist standardmäßig "SERIAL_8N1" für 8N1 eingestellt.


    Wie genau meinst du, dass ich den gelieferten OBIS-Code 1.8.1 nicht als solchen erkenne?
    Ich verwende bereits die Schnittstelle, welche sich oben auf dem Easymeter befindet. Von dort aus habe ich die Nachricht, welche ich in meinem ursprünglichen Post eingefügt habe, empfangen.


    Grüße
    Heenne

  • Zitat von Heenne

    Wie kommst du drauf, dass mein Codebeispiel für das Q3D ist und nicht Q3M?


    Weil es drin steht:

    Zitat

    /ESY5Q3DA1004 V3.04


    Außerdem ist das D0, kein SML. :wink:



    Zitat von Heenne

    Wie genau meinst du, dass ich den gelieferten OBIS-Code 1.8.1 nicht als solchen erkenne?


    Hier ist er versteckt:

    Zitat

    77 07 01 00 01 08 01 ff 01 01 62 1e 52 fc 59 00 00 00 00 74 a9 39 6d 01


    In der Regel wird nur ein Tarif erfasst, dann ist das Ergebnis von 1.8.0 und 1.8.1 identisch.



    mfg JAU

    No Shift - No Service

  • Ach, auf das Codebeispiel beziehst du dich. Ja, das habe ich nur von dort kopiert, weil ich solch eine Nachricht nicht vom Q3M im Internet gefunden habe.


    Alles klar, das erklärt es mit 1.8.1 und 1.8.0. Danke.


    Ich habe jetzt auch verstanden, wie man die kWh Werte ausrechnet. Eine Frage dazu, bei uns ist die 2.8.1 die Menge, die wir gerade beziehen oder verkaufen (falls die Solaranlage mehr Strom produziert als wir hier im Haus verbrauchen.). Also falls wir beziehen, ist der Wert positiv, falls wir verkaufen negativ. Soll dies so sein? Weil laut dem OBIS Code würde ich bei 2.8.1 nicht sowas erwarten.

  • Ja, das dachte ich auch. Aber folgende hex Zeichen habe ich ausgelesen.


    Zuerst von gestern Abend, wo keine Sonne mehr geschienen hat:

    Code
    1. 1b 1b 1b 1b 01 01 01 01 76 0b 45 53 59 4d d9 ce 00 68 d8 08 62 00 62 00 72 63 01 01 76 01 04 45 53 59 08 45 53 59 f4 1c d8 08 0b 09 01 45 53 59 11 03 a1 d9 ce 01 01 63 f1 32 00 76 0b 45 53 59 4d d9 ce 00 68 d8 09 62 00 62 00 72 63 07 01
    2. 77 01 0b 09 01 45 53 59 11 03 a1 d9 ce 07 01 00 62 0a ff ff 72 62 01 65 00 22 f4 1c f1 01
    3. 77 07 81 81 c7 82 03 ff 01 01 01 01 04 00 00 00 00 74 a9 39 6d 01
    4. 77 07 01 00 02 08 00 ff 64 01 01 80 01 62 1e 52 fc 59 00 00 00 00 e9 13 d2 3c 01
    5. 77 07 01 00 01 08 01 ff 01 01 62 1e 52 fc 59 00 00 00 00 74 a9 39 6d 01
    6. 77 07 01 00 02 08 01 ff 4c 07 00 ff 01 01 62 1b 52 fe 59 00 00 00 00 00 00 60 5d 01
    7. 77 07 81 81 c7 82 05 ff 01 01 01 01 83 02 66 b7 60 bd ec 9f 88 0b 2c 31 ae ac
    8. 76 29 72 52 36 7f 9d 41 29 38 e6 7c a1 49 4c c8 5a 4a 57 f0 5b 25


    Hier steht folgendes zur 2.8.1:

    Zitat

    77 07 01 00 02 08 01 ff 4c 07 00 ff 01 01 62 1b 52 fe 59 00 00 00 00 00 00 60 5d 01


    Dieser Wert hat sich mit jedem Mal auslesen verändert.


    Heute Morgen habe ich das ganze dann nochmal bei Sonne ausprobiert und bin auf folgendes Ergebnis gekommen:


    Code
    1. 1b 1b 1b 1b 01 01 01 01 76 0b 45 53 59 4d d9 ce 00 6e db ef 62 00 62 00 72 63 01 01 76 01 04 45 53 59 08 45 53 59 f5 69 db ef 0b 09 01 45 53 59 11 03 a1 d9 ce 01 01 63 26 ae 00 76 0b 45 53 59 4d d9 ce 00 6e db f0 62 00 62 00 72 63 07 01 77 01 0b 09 01 45 53 59 11 03 a1 d9 ce 07 01 00 62 0a ff ff 72 62 01 65 00 24 f5 69 f1 01 77 07 81 81 c7 82 03 ff 01 01 01 01 04 00 00 00 00 7b bf 6d 54 01 77 07 01 00 02 08 00 ff 64 01 01 a0 01 62 1e 52 fc 59 00 00 00 00 f4 e5 5d 78 01 77 07 01 00 01 08 01 ff 01 01 62 1e 52 fc 59 00 00 00 00 7b bf 6d 54 01 77 07 01 00 02 08 01 ff 4c 07 00 ff 01 01 62 1b 52 fe 59 ff ff ff ff ff ff 0d df 01 77 07 81 81 c7 82 05 ff 01 01 01 01 83 02 66 b7 60 bd ec 9f 88 0b 2c 31 ae ac 76 29 72 52 36 7f 9d 41 29 38 e6 7c a1 49 4c c8 5a 4a 57 f0 5b 25


    Und hier steht folgendes in 2.8.1:

    Zitat

    77 07 01 00 02 08 01 ff 4c 07 00 ff 01 01 62 1b 52 fe 59 ff ff ff ff ff ff 0d df 01


    Als Nebenfrage: Das ist die vollständige Nachricht die ich auslese. Fehlt da nicht "1b 1b 1b 1b" am Ende? Oder ist das schon das richtige Ende der Nachricht, nicht das ich hier einen Informationsverlust habe...

  • Zitat von Heenne


    Als Nebenfrage: Das ist die vollständige Nachricht die ich auslese. Fehlt da nicht "1b 1b 1b 1b" am Ende? Oder ist das schon das richtige Ende der Nachricht, nicht das ich hier einen Informationsverlust habe...


    Moin,
    da fehlt was. Sollte am Ende so aussehen:




    Aber Gott und Easymeter machen es evtl. anders.


    Gruß
    Udo

  • Hast du zufällig auch eine Idee wieso die Nachricht bei mir dort endet?
    Sie endet nämlich jedes Mal an der Stelle.
    Ich hatte auch gelesen, dass das Easymeter normalerweise nur alle 2 Sekunden was schickt, bei mir würde ich sagen ist das deutlich häufiger. Kann das etwas damit zu tun haben? Und was kann der Grund dafür sein?

  • Puffer im Arduino voll?


    Ich spreche normal von einer Nachricht alle 1-2 Sekunden.
    Manche Zähler geben die Daten auch Lastabhängig aus. Hohe Last - kürzere Abstände.



    mfg JAU

    No Shift - No Service