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