D0 Zähler SML auslesen mit Tasmota

  • karoCB danke für den Hinweis. Genau das versuche ich gerade umzusetzen, scheitere aber daran.

    Wie genau kann ich die Zählernummer in der >M Section weglassen?

    • Die Zahl am Anfang nach dem >M steht meines Wissens ja für die Anzahl Zähler. Die 1 dort sollte eigentlich stimmen. Ich habe sie mal weg gelassen, das scheint nichts zu ändern.
    • Dann kommt der Zähler nochmal am Anfang der Zeile vor: +1,3,o,0,300,STROM,1,600,2F3F210D0A. Funktioniert aber auch nicht, wenn ich es hier weg lasse
    • Auch hier kommt am Anfang nochmal der Zähler vor, damit Tasmota weiß, von welchem Zähler es die Werte nehmen soll 1,1.8.1(@1,Total Consumed,KWh,Total_in,3. Wenn ich das weg lasse, kommt nur noch einer der Werte und der ist dann falsch

    In allen Konstellationen habe ich mit sensor53 d1 geschaut, was der Sensor empfängt und jedes mal kommen zyklisch die über 100 Werte, die er in Summe zur Verfügung hat.

    Ich habe in der Anleitung gelesen, dass der Siemens TD 3511 im Normalmodus immer aller Datensätze schickt. Man kann ihn aber auffordern, dass er nur verschiedene verkürzte Datensätze schickt. Für mich Ideal wäre Datensatz F009, der nur etwa 10 Werte hat, bei denen meine beiden enthalten sind.

    Der Befehl dazu lautet:

    SOH R2 STX F009 (data) ETX BCC

    Ich habe es bisher nur noch nicht geschafft, diesen Befehl erfolgreich per Tasmota Skript an den Zähler zu senden.

  • +1,3,o,0,300,STROM,1,600,2F3F210D0A

    1,1.8.1(@1,Total Consumed,KWh,Total_in,3

    1,2.8.1(@1,Total Delivered,KWh,Total_out,3

    1,0.0.0(@#),Meter Number,,Meter_number,0

    1,1.7.0(@1,Strombezug,KW,Rein,3
    1,2.7.0(@1,Einspeisung,KW,Raus,3

    #

    das rote raus - schaltet die Zählernummer aus!

    SOH R2 STX F009 (data) ETX BCC - sicherlich geht das Ausschalten mit der Taschenlampe ( Abschaltung der Speicherwerte - evtl. Pin Freigabe entziehen) einmalig als Aktion

    ob das grüne Übertragen wird hängt auch von der Einstellung des Zählers vom Netzbetreiber ab. Wenn man eine PV angemeldet hat, kann die Funktion eingefordert werden ( Einbau vor 2017 Funktion ungewiss)

    siehe hier

    Smart Meter Interface - Tasmota


  • karoCB erneut Danke für die schnelle Antwort.

    Die rote Zeile kommt in meinem Skript gar nicht mehr vor. Ich hatte sie bereits entfernt. Ich verstehe die Zeile auch so, dass sie aus dem Datensatz einfach nur die ID des Zählers fischt und diese dann in das JSON schreibt. Ich habe es noch einmal mit und ohne die Zeile getestet: In beiden Fällen sendet der Zähler den vollen Datensatz in voller Länge.

    Mein Zähler ist nicht durch eine PIN geschützt. Ich kann sie daher weder eingeben noch entziehen. Mein Zähler sendet einfach immer den vollen Datensatz. Außer dem Befehl aus der Anleitung kenne ich keine Möglichkeit, auf den verkürzten Datensatz umzustellen.

    Das grüne ist im vollen Datensatz enthalten und wird damit auch übertragen. Das Skript funktioniert ja auch. Ich bekomme durchgehend Werte für die beiden grünen Zeilen. Leider aktualisieren sich diese Werte nicht in einem festen Zeitintervall, sondern stark schwankend zwischen 10s und ca 90s.

    Die Tasmota Meter Page habe ich mehrfach durchgelesen, finde aber nicht heraus, wie bzw. an welcher Stelle ich den Befehl zum Verkürzen des Datensatzes an den Zähler schicken kann. Ich vermute, dass ich den Befehl "SOH R2 STX F009 (data) ETX BCC" noch nicht ganz richtig habe. Ich verstehe z.B. noch nicht, für was das (data) steht, oder ob man das weglassen kann. BCC muss vermutlich auch noch durch irgendwelche Prüfziffern ersetzt werden. Dann muss das ganze vermutlich von ASCII nach HEX übersetzt und an den Zähler gesendet werden. Entweder über res=sml(1 1 "HEX-Befehl") oder über +1,3,o,0,300,STROM,1,600,HEX-Befehl" oder ganz anders :)

    Daran scheitere ich gerade.

  • Der Zähler ist vom Netzbetreiber. Allerdings bin ich mir nicht ganz sicher, mit welcher Begründung ich den Zähler austauschen lassen könnte. Seine eigentliche Funktion erfüllt er ja und ich kann ihn auch über IR auslesen, nur leider nicht in der Frequenz, in der ich es für meine Überschusslade-Lösung bräuchte. Ich kann ja trotzdem mal nachfragen.

    Parallel dazu versuche ich mich mal daran, den Befehl in HEX zu übersetzen. Bis auf BCC sollte das ja eigentlich recht einfach sein, (Ich habe auch gelesen, dass BCC teilweise optional ist).

    In HEX scheint SOH = 01, STX = 02 und ETX = 03

    Jetzt muss ich noch rausfinden, was die Dezimal-Adresse des Geräts ist, ob F009 schon HEX ist und wie man BCC für diese eine feste Byte-Folge berechnet.

    Falls jemand schneller ist als ich, gerne hier posten :)

  • Inzwischen habe ich noch herausgefunden, dass der Siemens TD 3511 bei einigen österreichischen Netzbetreibern jede Sekunde einen verkürzten, verschlüsselten Datensatz mit 10 Werten sendet, der dann noch entschlüsselt werden muss.

    Mein deutscher Siemens TD 3511 sendet im Normalzustand alle erhältlichen Werte unverschlüsselt. Das sind über 100.

    Wenn ich es richtig verstehe, muss ich bei den von mir eingestellten 19200 baud mit dem Befehl "ACK 061 CR LF" in den Programmiermodus wechseln:

    res=sml(1 1 "063036310D0A")

    Im Programmiermodus kann ich dann mit folgendem Befehl den Datensatz F009 anfordern:

    Code
    Befehl:    SOH    R2        STX   F009           (data)    ETX BCC   CR   LF
    HEX:       01     52 32     02    46 30 30 39              03  1E    0D  0A

    BCC habe ich dabei als XOR wie folgt berechnet:

    Code
    R	52	01010010
    2	32	00110010
    STX	02	00000010
    F	46	01000110
    0	30	00110000
    0	30	00110000
    9	39	00111001
    ETX	03	00000011
    
    BCC	1E	00011110

    Wenn ich keinen Fehler habe, sollte das dann in Tasmota wie folgt aussehen:

    res=sml(1 1 "0152320246303039031E0D0A")

    Kann gerade nicht auf meinen Tasmota zugreifen, werde es asap testen.

  • Juhu. Es klappt tatsächlich!

    Wenn man wie im letzten Post beschrieben in den Programmiermodus wechselt und dann explizit den verkürzten Datensatz F009 anfordert, sendet mein Siemens TD 3511 endlich nicht mehr die komplette Liste aller verfügbaren Werte, sondern nur noch den verkürzten Datensatz, der die aktuellen Werte 1.7.0 und 2.7.0 enthält.

    Damit erhalte ich jetzt ziemlich zuverlässig deutlich unter 10s einen aktuellen Wert.

    Hier ist das Skript, mit dem es bei mir funktioniert:

    Das Skript kann man jetzt sicher noch weiter verbessern. Ideen dazu:

    • Ich habe den Befehl jetzt oben einmal in die F-Sektion mit aufgenommen und "zur Sicherheit" noch mal unten in der >M Sektion. Vermutlich funktioniert es aufgrund des Eintrags in der F-Sektion und es wäre unten gar nicht notwendig
    • Statt des Datensatzes F009 könnte ich jetzt eigentlich auch gezielt nur die Register 1.7.0 und 2.7.0 anfragen.
    • Ich weiß auch nicht genau, für was die 10 in der ersten Zeile der >M Sektion steht.

    Vielen Dank noch mal an karoCB für die Tipps, die mich in die richtige Richtung gebracht haben :)

  • Während mit dem Skript aus meinem letzten Post zwar meistens alle 5 Sekunden ein aktueller Wert kam, habe ich gelegentlich nur alle 10 bis 30 Sekunden einen neuen Wert erhalten.

    Inzwischen habe ich den (bzw. zumindest einen :) ) Fehler gefunden und eine verbesserte Version erstellt:

    Das Problem war wie folgt:

    • Im alten Skript ist alle 5 Sekunden die gleiche Schleife abgelaufen
    • Nach 2,2 Sekunden wurde der Zähler aufgefordert, das Datenset F009 zu senden
    • Dann hat es eine Zeit t gedauert, bis der Zähler den Datensatz gesendet hat
    • Das Senden des Datensatzes hat mit 19200 baud dann 0.4s gedauert

    In Summe hat der ganze Vorgang teilweise etwas über 5 Sekunden gedauert und die Schleifen haben sich überschnitten. Bei so einer Überschneidung kam es wohl gelegentlich vor, dass Datensätze nicht ganz gesendet wurden oder nicht richtig gelesen werden konnten. Hier ein Beispiel, wie das auf der Konsole bei einem Dump aussah:

    Code
    19:11:16.089 : 81.7.26(-4.5*Deg)
    19:11:30.812 : 91.7(9.3ibsc>SR@<%oQg/.n+w^sV	LvRa\ uZ>n&Q}UsgbTF.F(00000000)
    19:11:30.837 : 0.0.0(020150833)

    Im Beispiel war das Senden des Datensatzes noch nicht zu Ende und der Zähler hat bereits mit dem Senden des nächsten Datensatzes begonnen.

    Das spannende dabei ist, dass der Gesamtvorgang pro Schleife mit 19200 baud länger dauert als mit 9600 baud. Die Ausgabe des Datensatzes selbst dauert bei19200 baud mit 0.4s nur halb so lange wie bei 9600 baud mit 0.8s. Dafür dauert es mit 19200 baud kurioserweise länger, bis der Zähler nach der Aufforderung beginnt den Datensatz zu schicken.

    Ich habe nun 3 Veränderungen am Skript vorgenommen:

    1. Ich habe die Lesegeschwindigkeit auf 9600 baud umgestellt, was in Summe schneller als mit 19200 baud ist
    2. Ich sende die Aufforderung zum Senden des Datensatzes jetzt schon nach 1,8s und nicht erst nach 2,2s
    3. Ich wiederhole die Schleife nicht alle 5s, sondern alle 8s

    Die 8s habe ich gewählt, da der Gesamtvorgang in meinen Tests bisher nie länger als 8s gedauert hat und ich die Werte in meiner Überschusslade-Lösung mit evcc nur alle 10s abrufe.

    Beim Debuggen ist mir auch noch aufgefallen, dass man die Register mit sml in Tasmota auch wie folgt auslesen kann:

    Code
    res = sml[1.7.0]
    print Rein %res%
    res = sml[2.7.0]
    print Raus %res%

    Hat zwar nur zwei statt drei Nachkomastellen, wäre für meine Zwecke aber an und für sich ausreichend.

    Falls meine aktuelle Skriptversion im Praxistest dann doch noch Probleme macht, werde ich mal versuchen, gezielt die beiden Register 1.7.0 und 2.7.0 auszulesen. Aktuell kenne ich die genaue Syntax dafür aber noch nicht. Im Elster Zähler geht das wohl mit <SOH>R5<STX>1.7.0()<ETX><BCC>

    Ich hoffe, das Skript hilft auch anderen Nutzern, die bisher das Problem hatten, dass der Siemens TD 3511 nur alle 5 Minuten die Werte aktualisiert hat (da im Standard der komplette Datensatz mit 300 baud gesendet wird)

  • Hallo, TechniX,

    falls Du den GS303 ohne "plus" hast, dann ist dieses Manual wohl richtiger:

    https://digimeto.de/wps/wcm/connec…ES&CVID=mX5YKjU

    Als erstes würde ich aber mal den Lesekopf direkt an die serielle Schnittstelle stöpseln und z.B. mit hterm (https://der-hammer.info/pages/terminal.html) gucken, ob was sinvolles rauskommt. Die Umschaltung von 300 auf 9600 Baud kann man auch manuell anschubsen. Das ist zwar etwas frickelig und zeitkritisch, aber es geht.

    Gruß Thomas.

    Grüße dich,

    habe jetzt einen neuen Zwischenstand. Also erstmal nur einen TTL - IR Lesekopf über UART an einen Windows-Laptop via USB zu TTL-Konverter mit eingebautem CP2102 angeschlossen. Die Baud-Umschaltung habe ich testweise im D0-Modus mal mit <ACK>000<CR><LF> außen vor gelassen und dann sendet er eben mit 300Baud weiter was ewig Dauert und keine aktuellen Leistungswerte in der Nachricht enthält (hat mein Anbieter im D0-Modus raus gelassen).

    Bei DSS-Infoschnittstelle mit 9600Baud 8N1 habe ich erst nur sinnlosen Müll bekommen im Sekundentakt (HEX13 überwiegend) aber nach einem kompletten Stromlos machen und erneuten Booten des Zählers hat die Schnittstelle deutlich mehr ausgegeben. Für mich sieht das aber immer noch nicht nach einem sinnvollen SML-Telegram aus :-/ keine Initiierungssequenzen etc. erkennbar. Habt ihr sowas schomal gesehen?

    Was kann ich noch machen? Der Anbieter hat inzwischen angeboten sogar beide Zähler gegen andere Modell auszutauschen und ich überlege das Angebot anzunehmen.


    Grüße TechniX

  • Hallo @all,

    kleines Update zum aktuellen Stand, denn inzwischen war unser Energieversorger Vor-Ort und hat festgestellt,

    dass tatsächlich einer unserer Zähler eine defekte optische Schnittstelle hat und er selbst mit seinem Lesekopf

    Hersteller "Elster" ? keine sinnvollen Daten ausgelesen werden können auf D0 und DSS ... Zähler wird demnächst

    ausgetauscht.

    Er hat auch gleich zwei Alternativen mitgebracht und dort konnte ich sofort mit meinem Hitchi Lesekopf ein

    valides SML-Ticket auslesen. Allerdings ist der Hitchi nicht wirklich stabil was das angeht und ich habe mich deshalb

    nochmal für einen anderen Lesekopf aus der Bucht entschieden (Model: wispr WS-IR-UART/TTL) und der läuft 1a!

    Tasmota SML Parsen war dann die leichteste Übung und jetzt gehts an die HomeAssistant Integration ^^


    Vielen Dank für eure Unterstützung!

    Grüße TechniX

  • Hallo zusammen,

    bis jetzt hat mein Sonoff basic mit tasmota mit meinem Ed300l prima funktioniert.

    jetzt mit dem DZG DWS7420.2V.G2 kann ich nur Zählerstand und Id auslesen.

    Ich habe mit der Pin freigeschaltet, Inf auf on gestellt und sehe im Zähler auch den aktuellen Verbrauch.

    Leider wird in Tasmota immer nur 0 W angezeigt.

    Hat jemand schon erfolgreich so einen Zähler ausgelesen?

    Gruss Thomas

    >D

    >B

    =>sensor53 r

    >M 1

    +1,3,s,16,9600,DWS7410

    1,77070100010800ff@1000,Energie,kWh,energy,4

    1,77070100020800ff@1000,Lieferung,kWh,en_out,4

    1,77070100100700ff@1,Leistung,W,power,2

    1,7707010060320101@#,SID,,meter_id,0

    #

  • Reden wir hier von einem Wärmezähler oder von einem Stromzähler?

  • Leider wird in Tasmota immer nur 0 W angezeigt.

    Teste mal dieses Skript

    Code
    >D
    >B
    =>sensor53 r
    >M 1
    +1,3,s,16,9600,DWS7410
    1,77070100010800ff@1000,Energie,kWh,energy,4
    1,77070100020800ff@1000,Lieferung,kWh,en_out,4
    1,77070100100700ff@1,Leistung,W,power_curr,16
    1,7707010060320101@#,SID,,meter_id,0
    #

    wer Interesse hat den aktuellen Verbrauch auszulesen, muss noch folgenden Zeile in das Skript Testweise einfügen

    Code
    1,77070100100700FF@1,Aktuell:,W,Power_act,1

    Einmal editiert, zuletzt von premo (22. August 2023 um 17:21)

  • Reden wir hier von einem Wärmezähler oder von einem Stromzähler?

    PanicMan Ich habe hier über zwei Stromzähler gesprochen ... einen zwar für die Heizung und einen fürs Haus. Der kaputte ZPA-Zähler ist jetzt durch einen Sagemcom Smarty ersetzt und seitdem laufen zwei Leseköpfe an einem ESP32 und sind erfolgreich in HomeAssistant integriert :) war ne langwierige Fehlersuche aber jetzt läuft alles ;)

  • Servus Binzi,

    vielen Dank für das Tasmotaskript. Ich habe es getestet aber leider funktioniert es irgendwie nicht bei mir. Ich habe auch Siemens TD 3511. Könntest du hierbei helfen? Ich bin noch Anfänger in diesem Bereich.

    Danke und Gruss

    Ed

  • Servus Binzi,

    vielen Dank für das Tasmotaskript. Ich habe es getestet aber leider funktioniert es irgendwie nicht bei mir. Ich habe auch Siemens TD 3511. Könntest du hierbei helfen? Ich bin noch Anfänger in diesem Bereich.

    Danke und Gruss

    Ed

    Hallo Eddy,

    Hast du überhaupt schon mal irgendeine Rückmeldung vom Zähler im Tasmota erhalten?

    Falls nicht, kann das natürlich viele Gründe haben.

    Hier ist der Link zum einfachen Standard Skript:

    Smart Meter Interface - Tasmota

    Falls das auch nicht läuft, wäre es hilfreich wenn du genauer beschreibst, was du schon alles getan hast.

    Wenn du auf dem Tasmota auf die Console gehst, kannst du mit folgendem Befehl alles auf der Console ausgeben, was der Tasmota vom Zähler empfängt:

    sensor53 d1

    (Mit sensor53 d0 kannst du es dann wieder deaktivieren :) )

    Falls der Tasmota gar nichts empfängt, kann es sein, dass er auch einfach falsch sitzt.