====== SML (Smart Message Language) ====== Hier können wir mal alle Infos sammeln, die wir zu [[http://de.wikipedia.org/wiki/Smart_Message_Language|SML]] finden. Als da wären: ====== Hardware ====== * [[hardware:controllers:ir-schreib-lesekopf-usb-ausgang|USB-IR-Schreib-Lesekopf]] * [[hardware:controllers:ir-schreib-lesekopf-rs232-ausgang|RS232-IR-Schreib-Lesekopf]] * [[hardware:controllers:ir-schreib-lesekopf-ttl-ausgang|TTL-IR-Schreib-Lesekopf]] * [[hardware:controllers:ir-schreib-lesekopf_easymeter-adapter|Adapterplatte für Easymeter]] * [[http://gonium.net/blog/2010/10/24/smart-meter-datenkabel-selbst-gemacht--libehz/|goniums optischer Tastkopf nebst Beschaltung]] * [[http://www.sysgotec.de/shop/advanced_search_result.php?keywords=ehz001|BKE-Datenschnittstelle EHZ001 für den Hager eHZ - lässt sich wohl auch für die Easymeter passend machen]] * [[http://www.edvogts.de|Auslesekopf]] * [[http://cgi.ebay.de/RS232-Infrarot-Optokopf-passend-EASYMETER-Q3D-/250806689677|com.et-shop]] * [[http://kamstrup.de/4740/Optischer-Auslesekopf|Kamstrup Optischer Auslesekopf]] * [[http://www.optical-probe.de/Optical%20probes/product.html|Verschiedene Leseköpfe von German Metering]] * [[http://propertools.org/index.php/de/shop/category/view/1|Verschiedene Leseköpfe von Propertools]] * [[http://www.eco-data.de/produkte/zaehler-sensorik/optischer-sensor-fuer-elektronische-zaehler-optokoppler-usb-detail.html|weiterer Anbieter]] ====== Software ====== * [[software:controller:vzlogger]] - "Is a tool to read and log measurements of a wide variety of smartmeters and sensors to the volkszaehler.org middleware" * [[https://github.com/sunny5/nodeehz|nodeehz]] - "Small node.js EHZ tool to read power values from your smart meter (e.g. Hager EHZ) with SML protocol and OBIS values" * [[https://github.com/Apollon77/smartmeter-obis|smartmeter-obis]] - "This library supports the reading and parsing of smartmeter protocols that follow the OBIS number logic to make their data available" * [[https://github.com/volkszaehler/libsml|libsml]] - This is the actively maintend fork of original dailab libsml * [[https://github.com/tobiasjeske/SMLlib|SMLlib]] - cross-platform SML library * [[https://github.com/olliiiver/sml_parser|SML Parser]] / [[https://registry.platformio.org/libraries/olliiiver/SML%20Parser|SML Parser on Platformio]] - Easy to use library with a low memory footprint for all platforms, especially Arduino, esp32, etc * [[https://www.openmuc.org/sml/|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 [[http://developer.mysmartgrid.de/doku.php?id=fluksousbboard|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 [[https://github.com/devZer0/libsml-testing|libsml-testing]] findet sich eine Sammlung von SML Beispiel-Telegrammen in Binärform ====== Spezifikation ====== * [[https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR03109/TR-03109-1_Anlage_Feinspezifikation_Drahtgebundene_LMN-Schnittstelle_Teilb.pdf?__blob=publicationFile&v=2|BSI TR-03109-1 Anlage IVb: Feinspezifikation "Drahtgebundene LMN-Schnittstelle" Teil b: "SML – Smart Message Language"]] * [[http://www.edi-energy.de/files2%5CObis-Kennzahlen_2_0_20090202.pdf|EDI@Energy OBIS-Kennzahlen-System Version 2 - Stand 2. Februar 2009]] * [[http://www.mscons.net/obis_kennzahlen.pdf|OBIS Kennzahlenlogik - Stand Okt 2010]] * [[http://itrona.ch/stuff/F2-2_PJM_5_Beschreibung%20SML%20Datenprotokoll%20V1.0_28.02.2011.pdf|Beschreibung SML Datenprotokoll für SMART METER von iTrona GmbH]] * [[http://www.mikrocontroller.net/topic/190517|Easymeter Spezifikation der D0 Schnittstelle - Q3Dx_D0 Spezifikation_v11]] ====== 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 [[software:obis|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 [[http://www.ewh.de/fileadmin/user_upload/Stromnetz/Zaehlerstaende/Produktbeschreibung_EMH_ED300L_.pdf|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, ...) * [[https://wiki.volkszaehler.org/hardware/channels/meters/power/edl-ehz|eHZ]] * [[hardware:channels:meters:power:edl-ehz:dzg_dvs74|DZG DVS74]] * [[hardware:channels:meters:power:edl-ehz:easymeter_q3b|Easymeter Q3B]] * [[hardware:channels:meters:power:edl-ehz:easymeter_q3c|Easymeter Q3C]] * [[hardware:channels:meters:power:edl-ehz:easymeter_q3m|Easymeter Q3M]] * [[hardware:channels:meters:power:edl-ehz:edl21-ehz|EDL21 eHZ]] * [[hardware:channels:meters:power:edl-ehz:ehz-iw8e2a5|eHZ-IW8E2A5]] * [[hardware:channels:meters:power:edl-ehz:emh-ed300l|EMH ED300L]] * [[hardware:channels:meters:power:edl-ehz:emh-ehz-h1|EMH eHZ-H]] * [[hardware:channels:meters:power:edl-ehz:emh-ehz-k|EMH eHZ-K]] * [[hardware:channels:meters:power:edl-ehz:iskraemeco_mt175|Iskraemeco MT175]] * [[hardware:channels:meters:power:edl-ehz:iskraemeco_mt631|Iskraemeco MT631]] * [[hardware:channels:meters:power:edl-ehz:itron_openway_3_hz|Itron OpenWay® 3.HZ]] * 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: -