

In meinem Haus kam recht früh das Bedürfnis auf, die Luftfeuchtigkeit und Temperatur an vielen Stellen zu messen und grafisch darzustellen. Da ein Raspberry PI bereits als Kamera Überwachung zum Einsatz kam, musste etwas her, dass einfach an dem Raspberry PI zu betreiben ist. Die Batterielaufzeit der Sensoren sollte hoch sein und eine hohe Reichweite ermöglichen, da auch die Garage ca 35m vom Haus entfernt, gemessen werden sollte. Nach einiger Suche bin ich auf den ELV USB-Wetterdaten-Empfänger USB-WDE1-2 gestoßen. Dazu der Temperatur und Luftfeuchtigkeitssensor ASH 2200.
Der USB Wetterempfänger wird einfach per USB an den Raspberry Pi angeschlossen. Der ASH 2200 Sensor funkt mit 868,35 MHz und funktioniert mit 2 x LR6 Batterien. Dieser ist wetterfest und kann innen wie außen verwenden werden. Für drinnen nehme ich die Kappe ab, weil einen Regenschutz braucht man dort nicht und der Sensor reagiert noch etwas schneller. Ich habe den Sensor testweise aus einem warmen Raum mit 23 Grad in den Kühlschrank mit 5 Grad gelegt. Die Temperatur fiel dann ziemlich gleichmäßig und es hat ca 30 Minuten gedauert bis die Temperatur erreicht war. Die Batterien halten in dem Sensor mehrere Jahre. Sind wirklich sehr zuverlässig und jetzt schon seit 2014 im Einsatz.

Unter Linux meldet sich der Empfänger im dmesg Ouput wie folgt:
[17592970.864446] usbcore: registered new interface driver cp210x
[17592970.869275] usbserial: USB Serial support registered for cp210x
[17592970.874246] cp210x 1-1.5:1.0: cp210x converter detected
[17592970.884531] usb 1-1.5: cp210x converter now attached to ttyUSB0
Wie wird der Empfänger nun ausgelesen?
Dazu verwende ich die usb-wde-tools von Christian Weiske.
https://github.com/cweiske/usb-wde1-tools
Dabei nehme ich das Script usb-wde1-log-last.sh, welches ich etwas bezüglich USB Device angepasst habe. Dieses lässt man einfach im Hintergrund laufen.
pi@raspberrypi /usr/local/bin $ cat usb-wde1-log-last.sh
#!/bin/sh
# logs the last line. usable via nohup on the server
#
# run this script as follows:
# $ nohup ./usb-wde1-log-last.sh &
#
# Use --dummy-data as parameter to log dummy data only
#
# License: http://www.gnu.org/licenses/agpl.html AGPL
# Author: Christian Weiske <cweiske@cweiske.de>
#
# FIXME: send RESET or INIT and M2
DEVUSB="/dev/ttyUSB_cp210x"
stty < $DEVUSB 9600 -brkint -opost -onlcr -echo
curdir="$(dirname "$0")"
if [ "$1" = "--dummy-data" ]; then
$curdir/../dummy-data-generator.php\
| $curdir/log-single-line.sh /tmp/usb-wde1-last
else
if [ ! -r $DEVUSB ]; then
echo "Device $DEVUSB is not readable"
exit 1
fi
#socat breaks something that leads to
# WRONG VAL, WRONG CMD and FullBuff->Reset
# errors
socat $DEVUSB,b9600,min=1,time=1,brkint=0,icrnl=0,ixoff=1,imaxbel=0,opost=0,isig=0,icanon=0,iexten=0,echo=0,echoe=0,echok=0 STDOUT\
| $curdir/log-single-line.sh /tmp/usb-wde1-last
fi
Ich hab für das Device auch gleich eine UDEV Rule geschrieben, damit findet man das Gerät immer unter dem festen Namen /dev/ttyUSB_cp210x. Die sieht wie folgt aus:
pi@raspberrypi /etc/udev/rules.d $ cat 77-cp210x.rules
ACTION=="add", ATTRS{serial}=="XVSEF80M6D3DGCJX", SYMLINK+="ttyUSB_cp210x"
Die Seriennummer wurde mit folgendem Befehl ermittelt.
udevadm info --attribute-walk -n /dev/ttyUSB0
Aktivieren lässt sich die Rule dann wie immer mit:
pi@raspberrypi:~ $ sudo udevadm control --reload
Danach ist der Sensor immer unter /dev/ttyUSB_cp210x zu finden. Nach einiger Zeit kann man sich nun die Datei /tmp/usb-wde1-last anschauen. Diese sieht wie folgt aus.
pi@raspberrypi ~ $ cat /tmp/usb-wde1-last
$1;1;1642979529;22,4;16,8;23,0;14,0;22,1;24,1;15,7;5,2;49;54;48;67;49;49;60;96;;;;;;0
Hier sind nun mit ; von einander getrennt, die verschiedenen Sensoren im Haus und außerhalb zu finden. Die Codierung der Sensoren geschieht über ein paar kleine Dipschalter, dafür muss der Sensor auseinander geschraubt werden. Somit sind max 8 Sensoren gleichzeitig verwendbar.
Hier mal die Werte auseinander genommen zum besseren Verständnis.
22,4; = Sensor 1 = 22,4 Grad Temperatur
16,8; = Sensor 2 = 16,8 Grad Temperatur
23,0; = Sensor 3 = 23,0 Grad Temperatur
14,0; = Sensor 4 = 14,0 Grad Temperatur
22,1; = Sensor 5 = 22,1 Grad Temperatur
24,1; = Sensor 6 = 24,1 Grad Temperatur
15,7; = Sensor 7 = 15,7 Grad Temperatur
5,2; = Sensor 8 = 5,2 Grad Temperatur
49; = Sensor 1 = 49% Luftfeuchtigkeit
54; = Sensor 2 = 54% Luftfeuchtigkeit
48; = Sensor 3 = 48% Luftfeuchtigkeit
67; = Sensor 4 = 67% Luftfeuchtigkeit
49; = Sensor 5 = 49% Luftfeuchtigkeit
49; = Sensor 6 = 49% Luftfeuchtigkeit
60; = Sensor 7 = 60% Luftfeuchtigkeit
96; = Sensor 8 = 96% Luftfeuchtigkeit
Um die Werte auch für andere Programme und auch Zabbix zu verwenden, habe ich dazu ein Script zum splitten der Werte geschrieben. Dieses Script kann einfach mit einem Parameter aufgerufen werden und man bekommt immer den entsprechenden Wert zurückgeliefert.
pi@raspberrypi ~ $ cat /usr/local/bin/split_usb_wde2.sh
#!/bin/bash
#Beispielwerte
#18,4;15,6;18,7;15,6;13,9;18,8;15,8;9,1;48;71;48;68;54;47;53;77
#Temperatur
#1 - 18,4 - Küche (4)
#2 - 15,6 - Keller (5)
#3 - 18,7 - Obergeschoss (6)
#4 - 15,6 - Anbau (7)
#5 - 13,9 - Bad oben (8)
#6 - 18,8 - Bad unten (9)
#7 - 15,8 - Garage (10)
#8 - 9,1 - Außen (11)
#
#Luftfeuchtigkeit
#9 - 48 - Küche (12)
#10 - 71 - Keller (13)
#11 - 48 - Obergeschoss (14)
#12 - 68 - Anbau (15)
#13 - 54 - Bad oben (16)
#14 - 47 - Bad unten (17)
#15 - 53 - Garage (18)
#16 - 77 - Außen (19)
werte=$(cat /tmp/usb-wde1-last | tr "," ".")
case $1 in
kueche_temp)
echo $werte | cut -f 4 -d ";"
;;
keller_temp)
echo $werte | cut -f 5 -d ";"
;;
obergeschoss_temp)
echo $werte | cut -f 6 -d ";"
;;
anbau_temp)
echo $werte | cut -f 7 -d ";"
;;
bad_oben_temp)
echo $werte | cut -f 8 -d ";"
;;
bad_unten_temp)
echo $werte | cut -f 9 -d ";"
;;
garage_temp)
echo $werte | cut -f 10 -d ";"
;;
aussen_temp)
echo $werte | cut -f 11 -d ";"
;;
kueche_lf)
echo $werte | cut -f 12 -d ";"
;;
keller_lf)
echo $werte | cut -f 13 -d ";"
;;
obergeschoss_lf)
echo $werte | cut -f 14 -d ";"
;;
anbau_lf)
echo $werte | cut -f 15 -d ";"
;;
bad_oben_lf)
echo $werte | cut -f 16 -d ";"
;;
bad_unten_lf)
echo $werte | cut -f 17 -d ";"
;;
garage_lf)
echo $werte | cut -f 18 -d ";"
;;
aussen_lf)
echo $werte | cut -f 19 -d ";"
;;
*)
echo 0
;;
esac
Hier ein Beispiel: z.B. Luftfeuchtigkeit der Küche anzeigen.
pi@raspberrypi ~ $ split_usb_wde2.sh kueche_lf
49
Die Zabbix Config sieht dann z.B. so aus

Grafisch sieht das Ganze im Zabbix dann z.B. so aus.

Im Zabbix kann man dann mehrere Werte in einem Graph zusammenbringen. So kann dass dann beispielhaft für das ganze Haus aussehen.


Wer sich jetzt hier wundert. Da sind doch mehr als 8 Werte. Ja da habe ich mit einigen zusätzlichen Shelly HT-Sensoren experimentiert, gerne dazu mehr in einem anderen Blog. 🙂
Und was ist mit Ansible zur automatischen Verteilung? 🙂
# cat /etc/ansible/usb-wde.yml
---
- name: Transfer usb-wde Scripts and execute the script with user pi
hosts: raspberrypi.home
become: yes
tasks:
- name: Transfer the usb-wde scripts
copy: src={{ item }} dest=/usr/local/bin/
with_fileglob:
- usb-wde1-tools/*
- name: Changing Permissions shell script
file: dest=/usr/local/bin/log-single-line.sh owner=root group=root mode=0755
- name: Changing Permissions shell script
file: dest=/usr/local/bin/split_usb_wde2.sh owner=root group=root mode=0755
- name: Changing Permissions shell script
file: dest=/usr/local/bin/usb-wde1-log-last.sh owner=root group=root mode=0755
- name: Transfer cron.d Entry for automatic start at reboot
copy: src=/etc/ansible/cron.d/usb-wde dest=/etc/cron.d/
- name: Transfer cp210x tty Symlink UDEV Rule in rules.d (/dev/ttyUSB_cp210x)
copy: src=/etc/ansible/udev/rules.d/77-cp210x.rules dest=/etc/udev/rules.d/
- name: reload udev
command: "udevadm control --reload-rules"
- name: kill all running usb-wde process
shell: "killall usb-wde1-log-last.sh log-single-line.sh --wait"
ignore_errors: true # In case there is no process
- name: Start usb-wde1-log-last.sh in Backgroud
become_user: pi
shell: "(/usr/local/bin/usb-wde1-log-last.sh >/dev/null 2>&1 &)"
async: 10
poll: 0
Der Cron Eintrag für das automatische Starten beim Neustart sieht dabei relativ einfach aus.
# cat /etc/ansible/cron.d/usb-wde
PATH=/bin:/usr/bin:/sbin:/usr/sbin
# at reboot start usb-wde1-log-last.sh
@reboot pi /usr/local/bin/usb-wde1-log-last.sh &
Vollständigkeitshalber hier auch noch das log-single-line.sh von Christian Weiske
pi@raspberrypi ~ $ cat /usr/local/bin/log-single-line.sh
#!/bin/sh
# Logs a single line into the log file passed as script parameter
# and adds timestamp to the logview openformat lines
#
# License: http://www.gnu.org/licenses/agpl.html AGPL
# Author: Christian Weiske <cweiske@cweiske.de>
file="$1"
if [ "x$file" = "x" ]; then
echo Please pass a file name to log the line into
exit 1
fi
# $1;1;;13,8;22,7;22,6;17,8;22,2;21,2;22,9;;59;35;38;49;38;40;35;;;;;;;0
while read -r line
do
beginning=`echo "$line"|cut -b 1-3`
if [ "$beginning" = '$1;' ]; then
timestamp=`date +%s`
echo $line|sed "s/\$1;1;;/\$1;1;$timestamp;/" > "$file"
fi
done
Das Projekt startete bei mir im Jahr 2014. Mittlerweile gibt es die Sensoren nicht mehr bei ELV direkt zu kaufen. Den USB WDE Empfänger hingegen schon noch. Die Sensoren kosteten damals 29 Euro neu. Was sicherlich kein Schnäppchen ist, jedoch für Ihre Haltbarkeit (kein einziger Ausfall bis heute) und die hohe Reichweite + Batterielaufzeit sprechen für sich. Aktuell bekommt man die Sensoren nur noch in einigen Auktionshäusern oder in Kleinanzeigen. Für innen funktioniert ebenfalls der S300TH Sensor oder S555TH. Es gibt von mir schon einige Experimente mit Shelly HT Sensoren … more soon.
Daher never touch a running system. 🙂