SML Protokoll Hilfe gesucht (SML -> ESP8266 -> MQTT)

  • Moin,


    ich arbeite gerade an einem WLAN Sender, der am Ende SML ablesen soll, die Nachricht dekodiert und dann die einzelnen Werte an einen MQTT Boker schickt. Mein Zähler ist ein EMH ED300S. Das ist ein Zähler, der im Push Betrieb vorne seine Daten rauspustet.


    Dazu habe ich mir einen TTL Lesekopf von volkszaeher.org bestellt und an die serielle Schnittstelle eines ESP8266 angeschlossen.
    Das Programm sucht erst nach der Startsequenz der SML Nachricht und danach nach der Endsequenz. Das geht auch schon fast. Und da kommt ihr ins Spiel... :-)


    Als Startsequenz benutze ich:

    Code
    const byte startSequence[] = { 0x1B, 0x1B, 0x1B, 0x1B, 0x01, 0x01, 0x01, 0x01 };


    Die Suche danach sieht so aus:


    doch bei der Endsequenz bin ich mir nicht sicher. Das müßte eigentlich eine Escape Sequenz sein, gefolgt von 1A, dann der Anzahl der Füllbytes und der CRC Prüfsumme. Stimmt das so? Denn leider finde ich kein

    Code
    const byte stopSequence[]  = { 0x1B, 0x1B, 0x1B, 0x1B, 0x1A };


    und nur nach der Escapesequenz zu suchen mach ja keinen Sinn. (Die kann auch so in den Nutzdaten auftreten und wird dann zweimal übertragen. (so wie bei einem "\\".)
    Quelle:
    BSI TR-03109-1 Anforderungen an die Interoperabilität der Kommunikationseinheit eines intelligenten Messsystems
    Seite 68
    https://www.bsi.bund.de/DE/Pub…en/tr03109/index_htm.html

  • Zitat von rollercontainer

    doch bei der Endsequenz bin ich mir nicht sicher. Das müßte eigentlich eine Escape Sequenz sein, gefolgt von 1A, dann der Anzahl der Füllbytes und der CRC Prüfsumme. Stimmt das so? Denn leider finde ich kein

    Code
    const byte stopSequence[]  = { 0x1B, 0x1B, 0x1B, 0x1B, 0x1A };


    Im Wiki steht nur der EMH ED300L, der hat jedenfalls ein andere Endsequenz.



    mfg JAU

    No Shift - No Service

  • JAU: Das Telegramm sieht nicht komplett aus.


    netadair: Auch wenns lua ist, die Sequenzen sind ja die gleichen. Nach welcher Endsequenz suchst du denn?


    Udo: Wie stelle ich das am geschicktesten an? Meine Idee wäre: TTL-Kopf -> FTDI USB -> Laptop -> HTerm. Justin hat mir schon einen Raspberry mit VZ Image vorgeschlagen, aber die Einrichtung mit WLAN etc ist für einmal mitschneiden nur die zweite Wahl.


    Das doofe an dem ESP8266 ist, das ich die Debug Schnittstelle für den Lesekopf brauche und das alles im Keller hängt. Ich helfe mir, indem ich debug Meldung per MQTT schicke. (Das Programm kommt auch OTA auf den Huzzah.)

  • Zitat von rollercontainer

    netadair: Auch wenns lua ist, die Sequenzen sind ja die gleichen. Nach welcher Endsequenz suchst du denn?




  • Ok Udo, das probiere ich heute Abend mal aus.


    netadair: Danke, dann scheine ich ja die richtige Sequenz zu nehmen. Funktioniert das so bei dir? Denn die 00 nach dem 1b1b1b1b1a in der Stopsequenz ist variabel. (Anzahl der Füllbytes: 0x00, 0x01, 0x02 oder 0x03)

  • Ich habe nur einen einzigen SML-Zähler (EHZ363ZA), bei dem funktioniert es. Aber ich werde es mal sicherheitshalber anpassen...


    Mir ist noch etwas eingefallen: als ich damals mit einem günstigen Nur-Lesekopf (Allnet D0) gearbeitet hatte, klappte es erst auch überhaupt nicht (es kamen aber Daten an), bis ich merkte, dass der Kopf die Signale invertiert ausgibt. Aber wenn du schon Daten lesen kannst, wird das wohl nicht die Erklärung für das Fehlen der Stopsequenz sein.

  • Servus
    ich bastle auch gerne mit dem ESP8266.
    Debug mache ich meist erst mal mit einem Arduino und erst wenn alles läuft adaptiere ich den Code für den ESP8266.
    Der Arduino Micro hat zwei UART da kannst dann deinen Zähler und den Notebook zugleich dranhaben


    gruß
    bb.

    Wechselrichter: PIP5048MK
    PV: 4.0kWp
    Akku: 4*Pylontech US2000B 2x US2000C
    Auslastungsoptimierung und wetterabhängiges Akkumanagement
    Logging und Steuerung über IPSymcon

    16m2 therm. Solar für Brauchwasser und Heizungsunterstützung