Benutzer-Werkzeuge

Webseiten-Werkzeuge


software:sml

SML (Smart Message Language)

Hier können wir mal alle Infos sammeln, die wir zu SML finden.

Als da wären:

Hardware

Software

  • vzlogger - „Is a tool to read and log measurements of a wide variety of smartmeters and sensors to the volkszaehler.org middleware“
  • nodeehz - „Small node.js EHZ tool to read power values from your smart meter (e.g. Hager EHZ) with SML protocol and OBIS values“
  • smartmeter-obis - „This library supports the reading and parsing of smartmeter protocols that follow the OBIS number logic to make their data available“
  • libsml - This is the actively maintend fork of original dailab libsml
  • SMLlib - cross-platform SML library
  • SML Parser / SML Parser on Platformio - Easy to use library with a low memory footprint for all platforms, especially Arduino, esp32, etc
  • jSML - jSML is a Java library implementing the Smart Message Language (SML)

Implementierungsansätze

Anschluss

  • Tastkopf hängt am fluksoUSB; dort läuft der SML-Parser; der fluksoUSB hängt direkt am LAMP-System
  • Tastkopf hängt direkt am LAMP-System; dort läuft der SML-Parser

Verarbeitung

  • direkt: Durchreichen der Werte
  • konsolidierend: Werte werden über die Zeit konsolidiert (z.B. die Werte werden alle 2 Sekunden angeliefert; alle 60 Sekunden wird ein Wert weiter geleitet)
  • Architektur
  • stand-alone Binary oder
    • erfordert ein (weiteres) Programm, in welches die Bibliothek eingebunden wird
  • Bibliothek
    • universeller
  • Umsetzung
  • die einfachste Variante:
    • Definieren einer passenden struct pro unterstütztem Modell; Auswahl des passenden Modells z. B. per Kommandozeilenparameter
    • Einlesen der kompletten SML-Datei
    • Plausibilisieren der wesentlichen Eckdaten
    • die relevanten Werte rausnehmen und weiterverarbeiten (z. B.: senden an volkszaehler Middleware via http POST)
  • etwas aufwändiger:
    • Einlesen des Headers
    • Verarbeiten (z. B. Hersteller und Modell) → Auswahl der passenden struct
    • Einlesen der verbleibenden Daten
  • Komfortvariante:
    • komplett dynamisches Parsen der einzelnen SML-Nachrichten
    • Vorteil: es werden gleich alle (SML-konformen) Zähler unterstützt…

Ideen

  • Implementierung am Besten in C - läuft so auf dem LAMP-System und auf dem ATmega
  • Unter libsml-testing findet sich eine Sammlung von SML Beispiel-Telegrammen in Binärform

Spezifikation

Sonstige Erkenntnisse

  • es gibt verschiedene Protokolle, die bei EDL-21-Zählern üblich sind:
    • SML in der Binär-Variante (Easymeter Q3B, EMH ED300L, EMH eHZ FW8E2A50BAK2, …) (O-Ton SML-Spec.: „SML Binary Encoding definiert eine gepackte binäre Kodierung der SML.“); Schnittstellenparameter: 9600/8N1
    • OBIS (Easymeter Q3D, Hager eHZ, EMH eHZ EMH eHZ FW8E2A500AK2, …); Schnittstellenparameter: 9600/7E1
    • außerdem:
      • in der SML-Spezifikation ist eine XML-Variante vorgesehen - diese ist aber in der aktuellen Version 1.03 noch nicht definiert
      • es existieren weitere Standards, die nur gegen Bezahlung erhältlich sind - die lassen wir mal außen vor:
        • ANSI C12.18-2006/ANSI C12.19-2008 (Echelon, …)
  • in regelmäßigen Abständen (2 s) sendet der Smart Meter eine sogenannte SML-Datei

Aufbau SML-Datei

  • die SML-Datei besteht aus
    • einem SML-Header
    • einer oder mehreren SML-Nachrichten
    • einem SML-Footer (stimmt das?)
  • in den SML-Nachrichten sind die eigentlichen Informationen durch OBIS-Kennzahlen gekennzeichnet
  • der Easymeter Q3B schickt darin u.a.
    • Wirkleistung Total: 0F 07 00 FF
    • Wirkleistung L1: 15 07 00 FF
    • Wirkleistung L2: 29 07 00 FF
    • Wirkleistung L3: 3D 07 00 FF
    • eine vollständige Sequenz für Wirkleistung L1 lautet:
      • 77 07 01 00 15 07 00 FF 01 01 62 1B 52 00*) 55 xx xx xx xx 01
      • wobei:
        • xx xx xx xx für die Wirkleistung auf L1 steht
        • in hex angegeben ist
        • *) hier manchmal auch FE an Stelle von 00 zu finden ist - Erklärung?!?
      • Beispiel:
        • 00 00 0A 8C → A8Ch → 2700 → 27,00 Watt

Beispiel 1: EMH ED300L

  • 1B 1B 1B 1B - Start Escape Zeichenfolge
  • 01 01 01 01 - Start Übertragung Version 1
  • 76 - jetzt kommt eine SML-Message
  • 02 - Länge (inkl. Längenbyte)
  • 85 - transactionId
  • 62 00 - groupNo
  • 62 00 - abortOnError
  • 72 63 01 01 - messageBody
  • 76 - jetzt kommt eine SML-Message
  • 01 - Länge (inkl. Längenbyte)
  • 01 07 00 06 00 00 yy yy - transactionId
  • 0b - Länge serverId (inkl. Längenbyte) (0b → 11 → 1 Längenbyte + 10 Byte serverId)
  • xx xx xx xx xx xx xx xx xx xx - serverId → Seriennummer
  • 01 - listName (not set)
  • 72 62 01 65 00 00 1c 94 - actSensorTime + secIndex
  • 79 - ?
  • 77 07 81 81 c7 82 03 ff 01 01 01 01 04 xx xx xx xx - Herstelleridentifikation
  • 77 07 01 00 00 00 09 ff 01 01 01 01 0b xx xx xx xx xx xx xx xx xx xx 01 - serverId
  • 77 07 01 00 01 08 00 ff 63 01 80 01 62 1e 52 ff 56 00 00 00 29 85 01 - 1.8.0 (= Wirkarbeit Bezug (+) Zählerstand Total): 10.629 kWh ?
  • 77 07 01 00 02 08 00 ff 63 01 80 01 62 1e 52 ff 56 00 00 00 11 f0 01 - 2.8.0 (= Wirkarbeit Lieferung (-) Zählerstand Total): 4.592 kWh ?
  • 77 07 01 00 01 08 01 ff 01 01 62 1e 52 ff 56 00 00 00 29 85 01 - 1.8.1 (= Wirkarbeit Bezug (+) Zählerstand Tarif 1): 10.629 kWh (?)
  • 77 07 01 00 02 08 01 ff 01 01 62 1e 52 ff 56 00 00 00 11 f0 01 - 2.8.1 (= Wirkarbeit Lieferung (-) Zählerstand Tarif 1): 4.592 kWh (?)
  • 77 07 01 00 01 08 02 ff 01 01 62 1e 52 ff 56 00 00 00 00 00 01 - 1.8.2 (= Wirkarbeit Bezug (+) Zählerstand Tarif 2): 0 kWh (?)
  • 77 07 01 00 0f 07 00 ff 01 01 62 1b 52 ff 55 00 00 01 11 01 - 15.7.0 (Wirkleistung Total) 2.73?
  • 77 07 81 81 c7 82 05 ff 01 01 01 01 83 02 b8 02 a5 - Herstelleridentifikation
  • 62 b1 c7 5d 18 20 e2 3d b8 dc 4e 43 5f ce 90 26 6d 64 4e c9 1c 12 85 6b d8 ac 42 01 bb 61 22 22 99 52 f2 f3 43 d7 63 80 5e 38 cb 11 22 01 01 01 - ?
  • 63 82 40 00 - ?
  • 76 - jetzt kommt eine SML-Message
  • 07 - Länge (inkl. Längenbyte)
  • 00 06 00 00 23 ec - transactionId
  • 62 00 - groupNo
  • 62 00 - abortOnError
  • 72 63 02 01 - ?
  • 71 01 63 ae 55 00 00 - ?

siehe Kapitel 5.3 in der Bedienungsanleitung

Bei mir wird die Momentanleistung nicht ausgegeben. Eventuell liegt das am aktiven Pin-Schutz.

Beispiel 2: Easymeter Q3B

  • 1b 1b 1b 1b - Start Escape Zeichenfolge
  • 01 01 01 01 - Start Übertragung Version 1
  • 76 - jetzt kommt eine SML-Message
  • 02 - Länge (inkl. Längenbyte)
  • 85 - transactionId
  • 62 00 - groupNo
  • 62 00 - abortOnError
  • 72 63 01 01 - messageBody
  • 76 - jetzt kommt eine SML-Message
  • 01 - Länge (inkl. Längenbyte)
  • 01 07 - transactionId
  • 45 53 59 51 33 42 0b 06 45 53 59 xx xx xx xx xx xx xx xx xx b4 ca 00
  • 76 - jetzt kommt eine SML-Message
  • 02 - Länge (inkl. Längenbyte)
  • 86 - transactionId
  • 62 00 - groupNo
  • 62 00 - abortOnError
  • 72 63 07 01 - messageBody
  • 77 01 0b 06 45 53 59 xx xx xx xx xx xx 01 - SML_GetList_Res + clientId (not set) + 01
  • 72 62 01 65 00 0b e2 0e - actSensorTime + secIndex
  • 79 - ?
  • 77 07 81 81 c7 82 03 ff 01 01 01 01 04 xx xx xx xx - Herstelleridentifikation
  • 77 07 01 00 01 08 00 ff 01 01 62 1e 52 fc 69 00 00 00 00 04 12 40 38 01 - 1.8.0 (= Wirkarbeit Bezug (+) Zählerstand Total): ?
  • 77 07 01 00 01 08 01 ff 01 01 62 1e 52 01 65 00 00 02 3f 01 - 1.8.1 (= Wirkarbeit Bezug (+) Zählerstand Tarif 1): 5.75 kWh (?)
  • 77 07 01 00 01 08 02 ff 01 01 62 1e 52 01 65 00 00 00 6c 01 - 1.8.2 (= Wirkarbeit Bezug (+) Zählerstand Tarif 2): 1.08 kWh
  • 77 07 01 00 01 07 00 ff 01 01 62 1b 52 fe 55 00 00 0a cf 01 - 1.7.0 (= Wirkleistung Bezug Total (L1+L2+L3)): 27.67 W
  • 77 07 01 00 15 07 00 ff 01 01 62 1b 52 fe 55 00 00 00 00 01 - 21.7.0 (= Wirkleistung Bezug L1): 0 W
  • 77 07 01 00 29 07 00 ff 01 01 62 1b 52 fe 55 00 00 00 00 01 - 41.7.0 (= Wirkleistung Bezug L2): 0 W
  • 77 07 01 00 3d 07 00 ff 01 01 62 1b 52 fe 55 00 00 0a cf 01 - 61.7.0 (= Wirkleistung Bezug L3): 27.67 W
  • 77 07 01 00 60 05 05 ff 01 01 - ?
  • 01 01 - listSignature (not set) + actGatewayTime (not set)
  • 63 01 10 - crc16 (Checksumme nach CCITT-CRC16)
  • 01 - ?
  • 01 01 - listSignature (not set) + actGatewayTime (not set)
  • 63 79 f7 - crc16 (Checksumme nach CCITT-CRC16)
  • 00 - ?
  • 76 - jetzt kommt eine SML-Message
  • 02 - Länge (inkl. Längenbyte)
  • 87 - transactionId
  • 62 00 - groupNo
  • 62 00 - abortOnError
  • 72 63 02 - messageBody

Beispiel 3: EMH eHZ FW8E2A50BAK2

  • 1b 1b 1b 1b - Start Escape Zeichenfolge
  • 01 01 01 01 - Start Übertragung Version 1
  • 76 - jetzt kommt eine SML-Message
  • 07 - Länge (inkl. Längenbyte)
  • 00 09 00 00 13 [c8|ce] - transactionId
  • 62 00 - groupNo
  • 62 00 - abortOnError
  • 72 63 01 01 - messageBody
  • 76 - jetzt kommt eine SML-Message
  • 01 - Länge (inkl. Längenbyte)
  • 01 07 - transactionId
  • 00 09 00 00 06 [98]9a] 81 02 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 01 01 - ?
  • 63 [96|3b] [80|58] 00 - ?
  • 76 - jetzt kommt eine SML-Message
  • 07 - Länge (inkl. Längenbyte)
  • 00 09 00 00 13 [c9|cf] - transactionId
  • 62 00 - groupNo
  • 62 00 - abortOnError
  • 72 63 07 01 - messageBody
  • 77 01 81 02 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 01 - SML_GetList_Res + clientId (not set) + 01
  • 72 62 01 65 00 00 38 [00|02] 75 - (actSensorTime + secIndex?)
  • 77 07 81 81 c7 82 03 ff 01 01 01 01 04 45 4d 48 01 - Herstelleridentifikation (EMH)
  • 77 07 01 00 00 00 00 ff 01 01 01 01 09 xx xx xx xx xx xx xx xx 01 - ?
  • 77 07 01 00 01 08 01 ff 62 00 01 62 1e 52 ff 56 00 00 00 4d 02 01 - 1.8.1 (= Wirkarbeit Bezug (+) Zählerstand Tarif 1): ?.?? kWh
  • 77 07 00 00 60 01 ff ff 01 01 01 01 0b xx xx xx xx xx xx xx xx xx xx 01 - 96.1 - ?
  • 77 07 01 00 01 07 00 ff 01 01 62 1b 52 ff 55 00 00 00 00 01 - 1.7.0 (= Wirkleistung Bezug Total (L1+L2+L3)): ?.?? W
  • 01 01
  • 63 [d7|2b] [23|a5] 00
  • 76 - jetzt kommt eine SML-Message
  • 07 - Länge (inkl. Längenbyte)
  • 00 09 00 00 13 [ca|d0] - ?
  • 62 00 - groupNo
  • 62 00 - abortOnError
  • 72 63 02 01 71 01 63 [8e|43] [dd|bb] 00 00 00 00 - messageBody (?)
  • 1b 1b 1b 1b 1a 03 [17|21] [23|4f] 1b 1b 1b 1b 01 01 01 01
  • 76 - jetzt kommt eine SML-Message
  • 07 - Länge (inkl. Längenbyte)
  • 00 09 00 00 13 [cb|d1] - transactionId
  • 62 00 - groupNo
  • 62 00 - abortOnError
  • 72 63 01 01 - messageBody
  • 76 01 01 07 00 09 00 00 06 [99|9b] 81 02 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 01
  • 01 63 [c8|3a] [68|5a] 00 - ?
  • 76 07 00 09 00 00 13 [cc|d2]
  • 62 00 - groupNo
  • 62 00 - abortOnError
  • 72 63 07 01 - messageBody
  • 77 01 81 02 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 01 72 62 01 65 00 00 38 [01|04] 75 - 1.8.2 (= Wirkarbeit Bezug (+) Zählerstand Tarif 2): ?.?? kWh
  • 77 07 81 81 c7 82 03 ff 01 01 01 01 04 45 4d 48 01
  • 77 07 01 00 00 00 00 ff 01 01 01 01 09 xx xx xx xx xx xx xx xx 01
  • 77 07 01 00 01 08 01 ff 62 00 01 62 1e 52 ff 56 00 00 00 4d 02 01
  • 77 07 00 00 60 01 ff ff 01 01 01 01 0b xx xx xx xx xx xx xx xx xx xx 01
  • 77 07 01 00 01 07 00 ff
  • 01 01 - listSignature (not set) + actGatewayTime (not set)
  • 62 1b 52 ff 55 00 00 00 00 01
  • 01 01 - listSignature (not set) + actGatewayTime (not set)
  • 63 7e 59 00 - crc16 (Checksumme nach CCITT-CRC16)
  • 76 - jetzt kommt eine SML-Message
  • 07 - Länge (inkl. Längenbyte)
  • 00 09 00 00 13 cd - transactionId
  • 62 00 - groupNo
  • 62 00 - abortOnError
  • 72 63 02 - messageBody
  • 01 71 01 63 68 7d 00 00 00 00
  • 1b 1b 1b 1b 1a 03 54 44

Geräte mit SML-Schnittstelle

ToDos

  • Standards einsortieren:
    • DIN EN 62056-21, Nachfolger von IEC 61107, Nachfolger von IEC 1107
    • DLMS/COSEM

People working on it

  • Justin Otherguy
    • mission statement: collecting any kind of information incl. sample data
    • git repo(s): -
    • blog/other: -
software/sml.txt · Zuletzt geändert: 2023/05/03 16:09 von kantetaete