Inhaltsverzeichnis
EMH eHZ-H
Der EMH eHZ-H kann nach EN 62056-21 über die IR-Schnittstelle ausgelesen werden.
Hardware
Man benötigt den IR-Schreib-Lesekopf.
Der Zähler sendet lastabhängig alle paar Sekunden unaufgefordert ein SML-Datenpaket. Die Sendediode ist oben rechts hinter dem rechten der beiden Löcher in der Metallplatte. Gesendet wird mit 9600bd, 8N1. Die Signalqualität scheint sehr gut zu sein, mit einem Steckbrett-Aufbau war der Empfang ohne Abdunkelungsmaßnahmen aus mehreren cm Abstand möglich.
Beispielkonfiguration
Eine exemplarische vzlogger.conf:
- vzlogger.conf
{ "retry" : 3, "verbosity" : 0, "log" : "/var/log/vzlogger/vzlogger.log", "local" : { "enabled" : false, "port" : 8081, "index" : true, "timeout" : 30, "buffer" : 600 }, "meters" : [{ "protocol" : "sml", "enabled" : true, "device" : "/dev/ttyUSB0", "parity" : "8N1", "baudrate" : 9600, "aggtime" : -1, "aggfixedinterval" : true, "channels": [{ "uuid" : "6836dd20-00d5-11e0-bab1-856ed5f959ae", "middleware" : "http://localhost/middleware.php", "identifier" : "1-0:1.8.0", "aggmode" : "MAX" }] } ]}
Beispieldaten
1B 1B 1B 1B Start Escape Zeichenfolge 01 01 01 01 Start Übertragung Version 1 76 Liste mit 6 Einträgen 07 00 14 04 EC 6D 20 transactionID (7 Byte) 62 00 groupNo 62 00 abortOnError 72 Liste mit 2 Einträgen 63 01 01 Nachricht 0101 = SML_PublicOpen.Res 76 Liste mit 6 Einträgen 01 codepage (leer) 01 clientID (leer) 07 00 14 01 82 24 60 reqFileID 0B 06 45 4D 48 xx xx xx xx xx xx serverID 01 username (leer) 01 password (leer) 63 B7 96 CRC 00 Ende Nachricht 76 Liste mit 6 Einträgen 07 00 14 04 EC 6D 21 transactionID 62 00 groupNo 62 00 abortOnError 72 Liste mit 2 Einträgen 63 07 01 Nachricht 0701 = SML_GetList.Res 77 Liste mit 7 Einträgen 01 clientID (leer) 0B 06 45 4D 48 xx xx xx xx xx xx serverID 01 listName (leer) 72 Liste mit 2 Einträgen = actSensorTime 62 01 Typ = secIndex 65 01 82 78 48 Sekunden-Index als unsigned 32 77 Liste mit 7 Einträgen = valList mit ValListEntries 77 (1) 07 81 81 C7 82 03 FF objName 129-129:199.130.3*255 Herstelleridentifikation 01 status (leer) 01 valTime (leer) 01 unit (leer) 01 scaler (leer) 04 45 4D 48 value 01 valueSignature (leer) 77 (2) 07 01 00 00 00 09 FF objName 1-0:0.0.9*255 Geräteidentifikation 01 status 01 valTime 01 unit 01 scaler 0B 06 45 4D 48 xx xx xx xx xx xx value 01 valueSignature 77 (3) 07 01 00 01 08 00 FF objName 1-0:1.8.0*255 Wirkarbeit Bezug total 63 01 82 status = unsigned 16 01 valTime 62 1E unit (unsigned8) 1E = Wh 52 FF scaler (int8) -1 = *10^-1 = /10 56 00 01 29 71 4F value 19493967/10 = 1949396,7 Wh = 1949,3967 kWh 01 valueSignature (leer) 77 (4) 07 01 00 01 08 01 FF objName 1-0:1.8.1*255 Wirkarbeit Bezug Tarif 1 01 status (leer) 01 valTime (leer) 62 1E unit (unsigned8) 1E = Wh 52 FF scaler (int8) -1 = *10^-1 = /10 56 00 01 29 71 4F value 19493967/10 = 1949396,7 Wh = 1949,3967 kWh 01 valueSignature (leer) 77 (5) 07 01 00 01 08 02 FF objName 1-0:1.8.2*255 Wirkarbeit Bezug Tarif 2 01 status (leer) 01 valTime (leer) 62 1E unit (unsigned8) 1E = Wh 52 FF scaler (int8) -1 = *10^-1 = /10 56 00 00 00 00 00 value 0 01 valueSignature (leer) 77 (6) 07 01 00 0F 07 00 FF objName 1-0:15.7.0*255 Wirkleistung total 01 status (leer) 01 valTime (leer) 62 1B unit (unsigned8) 1B = W 52 FF scaler (int8) -1 = *10^-1 = /10 55 00 00 11 51 value 4433/10 = 443,3 W 01 valueSignature (leer) 77 (7) 07 81 81 C7 82 05 FF objName 129-129:199.130.5*255 Public Key des Zählers 01 status (leer) 01 valTime (leer) 01 unit (leer) 01 scaler (leer) 83 xx xx xx xx xx xx xx xx xx xx value xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx 01 valueSignature (leer) 01 listSignature (leer) 01 actGatewayTime (leer) 63 C1 04 CRC 00 Ende Nachricht 76 07 00 14 04 EC 6D 24 transactionID 62 00 groupNo 62 00 abortOnError 72 63 02 01 Nachricht 0201 = SML_PublicClose.Res 71 01 Signature (leer) 63 DD 06 CRC 00 Ende 00 Ende 1B 1B 1B 1B Escape-Sequenz 1A 01 64 62 Ende Nachricht mit Füllbyte und Prüfsumme 00 Ende
Zähler mit Shell-Skripte abfragen
Um die Zähler schnell und ohne große Vorarbeit auslesen zu können, bieten sich folgende Skripte an. Für einen Dauerbetrieb sind sie jedoch weniger geeignet, da manchmal einige Zeit vergehen muss, um den Datenanfang zu erfassen.
HINWEIS: für die Ausführung werden folgende Utities benötigt
- bc
- stty
- xxd (wird mit dem vi installiert)
Zählerwerte ausgeben
Die folgenden Zeilen werden in eine Datei read.sh
gespeichert und erzeugen nach deren Ausführung folgende Ausgabe:
Meter 1.8.0 (from plant): 1488.36 kWh Meter 2.8.0 (to plant): 1591.32 kWh Total effective power (+/-): 1687.14 W
#!/bin/bash # read and evaluate SML output received from EMH eHZ # set serial device INPUT_DEV="/dev/ttyUSB0" #set $INPUT_DEV to 9600 8N1 stty -F $INPUT_DEV 1:0:8bd:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 SML_START_SEQUENCE="1B1B1B1B0101010176" METER_OUTPUT__START_SEQUENCE="" while [ "$METER_OUTPUT__START_SEQUENCE" != "$SML_START_SEQUENCE" ] do METER_OUTPUT=`cat $INPUT_DEV 2>/dev/null | xxd -p -u -l 460` METER_OUTPUT__START_SEQUENCE=$(echo "${METER_OUTPUT:0:18}") if [ $METER_OUTPUT__START_SEQUENCE != $SML_START_SEQUENCE ]; then echo "missed start and trying again..." #exit 1 fi done let METER_180=0x${METER_OUTPUT:390:10} VALUE=$(echo "scale=2; $METER_180 / 10000" |bc) echo "Meter 1.8.0 (from plant): " $VALUE "kWh" let METER_180=0x${METER_OUTPUT:347:10} VALUE=$(echo "scale=2; $METER_180 / 10000" |bc) echo "Meter 2.8.0 (to plant): " $VALUE "kWh" let METER_180=0x${METER_OUTPUT:518:8} VALUE=$(echo "scale=2; $METER_180 / 10" |bc) echo "Total effective power (+/-): " $VALUE "W"
HTML-Seite erzeugen
Die folgenden Zeilen in eine Datei read2html.sh
gespeichert und als cgi-script aufgerufen, präsentieren die Zähler als HTML-Seite für einen Browser. Die Konfiguration eines http-Servers wie lighttpd muss natürlich separat erfolgen.
#!/bin/bash # read and evaluate SML output received from EMH eHZ # set serial device INPUT_DEV="/dev/ttyUSB0" #set $INPUT_DEV to 9600 8N1 stty -F $INPUT_DEV 1:0:8bd:0:3:1c:7f:15:4:5:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 SML_START_SEQUENCE="1B1B1B1B0101010176" METER_OUTPUT__START_SEQUENCE="" while [ "$METER_OUTPUT__START_SEQUENCE" != "$SML_START_SEQUENCE" ] do METER_OUTPUT=`cat $INPUT_DEV 2>/dev/null | xxd -p -u -l 365` METER_OUTPUT__START_SEQUENCE=$(echo "${METER_OUTPUT:0:18}") done echo "Content-Type: text/html; charset=utf-8" echo "" echo "" echo "<html>" echo " <head>" echo " <title>Zählerauswertung</title>" echo " <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">" echo " </head>" echo " <body>" echo " <h1> Zählerstände </h1>" let METER_180=0x${METER_OUTPUT:390:10} VALUE=$(echo "scale=2; $METER_180 / 10000" |bc) echo " <tt>Bezug.......: " $VALUE "kWh</tt><br>" let METER_180=0x${METER_OUTPUT:347:10} VALUE=$(echo "scale=2; $METER_180 / 10000" |bc) echo " <tt>Einspeisung.: " $VALUE "kWh</tt><br>" let METER_180=0x${METER_OUTPUT:518:8} VALUE=$(echo "scale=2; $METER_180 / 10" |bc) echo " <tt>Wirkleistung: " $VALUE "W</tt>" echo " </body>" echo "</html>"