Habe mich heute damit beschäftigt, den Lesekopf für meinen eHZ (NetzeBW, Hersteller ist iskra) auf den Bus zu bringen. Das Skript sollte mit den meisten anderen elektronischen Zählern auch funktionieren (wenn sie SML sprechen, was aber Standard ist), ggf. muss man in "POWER_START_SEQUENCE" das "F0 07 00" (= OBIS 15.7.0, bei meinem Zähler die aktuelle Leistung) durch etwas Passenderes ersetzen.
Zutaten:
Die Werte werden als DPT9 auf die 0/7/100 geschrieben, das lässt sich in der Zeile "GA=..." anpassen.
Dass der Code schön ist, behaupte ich nicht
Gruß,
Max
Zutaten:
- USB-IR-Lesekopf von Udo (udo.volksz@gmail.com, Kosten ca. 25 EUR und ein paar Minuten Löten - keine Sorge, das geht auch mit dem Dachrinnenkolben)
- Ein Beaglebone, der noch rumlag (ein RPi hätte es genauso getan) mit Netzverbindung
- KNX-IP-Schnittstelle (sowieso vorhanden)
Code:
#!/bin/bash # read and evaluate SML output received from EMH eHZ # set serial device INPUT_DEV="/dev/ttyUSB0" GA="0/7/100" #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" POWER_START_SEQUENCE="770701000F0700FF0101621B520065" METER_OUTPUT__START_SEQUENCE="" #while [ "$METER_OUTPUT__START_SEQUENCE" != "$SML_START_SEQUENCE" ] while true do METER_OUTPUT=`cat $INPUT_DEV 2>/dev/null | xxd -p -u -l 460|tr -d '\n'` 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 else POWER_VAL=`echo $METER_OUTPUT|awk "{ pos=match(\"$METER_OUTPUT\",\"$POWER_START_SEQUENCE\"); hex=substr(\"$METER_OUTPUT\",pos+30,8); print(strtonum(\"0x\" hex)); }"` echo $POWER_VAL groupsocketwrite ip:hausmeister $GA $(perl -e "\$val=$POWER_VAL*100; \$exp=0; while(\$val > 2047) { \$exp++; \$val=\$val/2; } \$out = \$val + (\$exp << 11); printf(\"%02x %02x\",\$out>>8,\$out&0xFF);") fi done
Dass der Code schön ist, behaupte ich nicht

Gruß,
Max
Kommentar