Luftfeuchtigkeits- und Temperaturmessung

Wetter_Sensor_Bild

sensor_ash2200_temp_luftfeuchtigkeit

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.

usb_wetterdaten_empfaenger_wde1_2_elv

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

zabbix_item_kueche_luftfeuchtigkeit

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.

zabbix_graph_alle_luftfeuchtigkeit
zabbix_graph_alle_temperatur

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. 🙂