software:sml
Inhaltsverzeichnis
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)
- Hints für Installation auf dockstar (debian Squeeze):
- apt-get install build-essential
- git clone https://github.com/tobiasjeske/SMLlib
- cd SMLlib
- mkdir build
- cd build
- cmake ..
- make
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
- Transducer + fluksoUSB
- Hutschienenzähler + ATmega-Board (fluksoUSB, Hutschienencontroller, …)
-
- EMH eHZ FW8E2A50BAK2
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