Hiermit begann die Reise:
Wie man den Raspi aufsetzt, kann man am besten bei https://www.raspberrypi.org nachlesen. Am Mac kann man die SD Karten schnell mit dem Festplatten-Dienstprogramm formatieren und installieren. Rasperian ist dann schnell aufgesetzt. Andere Distributionen habe ich nicht verwendet. Wichtig ist den Raspi als Server aufzusetzen, d. h. dass er per Terminal / putty o.ä. erreicht werden kann. Andere wichtige Dinge sind unter “Projekte” – “Tricks und Tipps” gelistet.
Benötigte Hardware:
- Raspberry Pi 3 Model B ARM-Cortex-A53 4x 1,2GHz, 1GB RAM, WLAN, Bluetooth, LAN, 4x USB
- Demiawaking 1Stück /5Stück /10Stück x 3M Wasserdichte Digitale Temperatur Sensoren Temperaturfühler DS18b20 (5Stück)
- 4,7k Ω Widerstand
- Luftsensor (USB)
- Luftfeuchtigkeitssensor
Aufbau der Lüftungsanlage
Die Lüftungsanlage hat 4 Rohre, aber 5 Temperaturen die gemessen werden sollen:
- Frischluft
- Zuluft für die Räume
- Abluft der Räume
- Fortluft
- Die Lufttemperatur außen. (Die Zuleitung der Außenluft geht ca. 20 m durch die Erde um die Erdwärme zu nutzen!)
Für die ersten 4 Temperaturen müssen Löcher in die Rohre gebohrt werden. Da diese bei der Einmessung der Anlage schon erstellt worden sind, kein Aufwand. Anmerkung: Ich hätte, wenn ich diese Zeilen lese, doch schon einige Bedenken, die Löcher zu erstellen. Aber bei uns waren sie schon vorhanden und mit einfachem Profi-Panzerband abgeklebt. Es gab keine Probleme – weder mit den Löchern, noch mit den Sensoren darin.
Die 5. Temperatur wird über das Internet ermittelt.
Aufbau der Sensoren
Der Aufbau sollte selbstredend sein und ist im Netz vielfach und ausführlich beschrieben! Das schöne an diesen Sensoren ist, dass man sehr viele parallel schalten kann. D.h. wenn ich 4 anschließen will, muss ich später nur alle gelben Kabel zusammenführen, wie auch alle blauen und schwarzen und in die 3 Löcher der Platine stecken. Ausgelesen werden dann aber 4 Werte!
Hier die knappe Beschreibung:
- 1-Wire Protokoll aktivieren und konfigurieren
- Testen ok die Aktivierung funktioniert hat
- Werte auslesen: cat /sys/bus/w1/devices/###DeviceID###/w1_slave
- Den ausgegebenen Wert “zurechtschneiden” und durch 1000 dividieren!
Unter https://tutorials-raspberrypi.de/raspberry-pi-temperatur-mittels-sensor-messen/ gibt es eine gute Anleitung!
Für die Feuchtigkeitswerte nimmt man die Adafruit_Python_DHT Library, wie in meinem Script unten beschrieben.
Installation des RRD Tools
Es soll alle 5 min laufen und in eine Datenbank die Werte schreiben. Ganz einfach! Um den Schwierigkeitsgrad zu erhöhen, habe ich noch einen USB Luft-Qualitätssensor eingebaut und einen Luftfeuchtigkeitssensor. Letzterer funktioniert zwar, liefert aber Werte die nicht plausibel sind! Bei Gelegenheit muss ich mir diesbezüglich was überlegen. Aber das nur am Rande. Gestartet wird mit der Datenbank. Ich habe mich für RRD entschieden. Sie ist Ressourcen-schonend und kann nicht wachsen! Ich habe meine Lösung in 4 einzelnen DBen realisiert. Installieren über:
sudo apt-get install rrdtool
Initialisiert werden die Datenbanken über
“sudo rrdtool create NAME.rrd –step 300”, d.h. die DB NAME.rrd bekommt alle 5 min (300 s) einen Wert zugewiesen.
Aufbau:
sudo rrdtool create temp.rrd --step 300 \ DS:aussenluft:GAUGE:600:U:U \ DS:zuluft:GAUGE:600:U:U \ DS:fortluft:GAUGE:600:U:U \ DS:abluft:GAUGE:600:U:U \ RRA:AVERAGE:0.5:1:432 \ RRA:AVERAGE:0.5:5:404 \ RRA:AVERAGE:0.5:15:576 \ RRA:AVERAGE:0.5:60:1752 \ RRA:MIN:0.5:1:432 \ RRA:MIN:0.5:5:404 \ RRA:MIN:0.5:15:576 \ RRA:MIN:0.5:60:1752 \ RRA:MAX:0.5:1:432 \ RRA:MAX:0.5:5:404 \ RRA:MAX:0.5:15:576 \ RRA:MAX:0.5:60:1752
Für die anderen Datenbanken geht es analog, nur dass sie anders heißen: humidity.rrd , air.rrd und die aussenwerte.rrd. Ich habe sie unter /nas/data auf den NAS gelegt.
Skript zur Messung der Temperaturen
Nun zum eigentlichen Script, mit dem die DBen gefüllt werden: Im ersten Teil werden die Werte ermittelt (Temp. 4x + 1x), Feuchtigkeit und Luftqualität. Im 2. Teil werden diese in die rrd geschrieben und im 3. Teil das ganze visualisiert und auf meinem Web-Server (Synology Diskstation) gehostet! Alle Scripte liegen auf dem Raspi und werden als root ausgeführt. D.h.
“sudo su” um in den Root zu wechseln. Standardmäßig ist für root KEIN Passwort gesetzt! Das sollte allerdings geändert werden. Die Scripte liegen dann unter “/root/scripts”. Dieses Script heißt “measure.sh”. Es läuft alle 5 min und ist unter /etc/crontab eingetragen. Das script USB Reset findet Ihr weiter unten!
*/5 * * * * root /root/scripts/measure.sh > /dev/null 2>&1 3 5 * * * root /root/scripts/usbreset > /dev/null 2>&1
############################################ # Variablendefinition # # Hier werden alle Variablen definiert, # # die für Sensoren, das Befuellen der rrd- # # Datenbank und des html benötigt werden. # ############################################ TEMP=0 TEMPm=0 LUFT=0 LUFTm=0 z=0 datum=$(date '+%d.%m.%y %H:%M') AIRWERT=0 HOMEPATH=/root/scripts STATUS=OK mount -a ############################################ # Sensor 1 Werte werden ermittelt # # Hier ermittelt der USB-AIR-Sensor die # # Luftqualität! Parallel dazu werden die # # anderen Sensoren angesprochen, die die # # anderen Werte ermitteln. Das > & < ist # # wichtig, damit die beiden Prozesse # # parallel ablaufen! # ############################################ cd $HOMEPATH/airsensor ./airsensor -o | awk '{print $4}' | sed -e 's/,$//g' | tr -s [:blank:] | cut -f7 -d" " | sed 's/[a-z,A-Z]//g' > ./air.tmp & ############################################ # Sensor 2 (Luftfeuchtigkeitssensor!) # # Werte werden parallel zu Sensor 1 # # ermittelt. Am Ende wartet die 'wait' Anw.# # auf den letzten Unterprozess. # # Die Werte werden über eine Messreihe # # ermittelt und ein Durchschnittswert er- # # rechnet. Variable ist 'z' # ############################################ cd $HOMEPATH/Adafruit_Python_DHT/examples for ((z=0;z<=6;z++)) do WERTE=$(sudo python ./AdafruitDHT.py 11 4) TEMP=( $(echo $WERTE | awk '{print $1}' | cut -c 6,7,8,9)) LUFT=( $(echo $WERTE | awk '{print $2}'| cut -c 10,11,12,13,14)) TEMPm=`echo "$TEMP+$TEMPm" | bc` LUFTm=`echo "scale=1 ; $LUFT+$LUFTm" | bc` sleep 1 done ########################################## #Zuweisung der Werte zu den Variablen # #Errechnen der Durchschnittswerte. # ########################################## TEMPm=`echo "scale=1 ; $TEMPm/$z" | bc | tr -s [:blank:] | cut -f7 -d" "` LUFTm=`echo "scale=1 ; $LUFTm/$z" | bc | tr -s [:blank:] | cut -f7 -d" "` ########################################### # Warten auf Child Prozess! # ########################################### wait cat /root/scripts/airsensor/air.tmp >> air.temp ############################## # Ermittlung der Aussenwerte # ############################## cd $HOMEPATH ./aussenwerte.sh ########################################### #Zuweisen des Werts von Sensor 1 zur Var. # ########################################### cd $HOMEPATH/airsensor AIR=($(cat air.tmp | tr -s [:blank:] | cut -f7 -d" ")) echo $AIR $datum >> /nas/data/AIR-Werte.csv ########################################### # Check der Variablen Werte und ggf. # # übernahme der vorherigen Werte aus der # # rrd Datenbank. Hintergrund: der Luft- # # Sensor liefert machmal keine Werte, des-# # halb dieses Vorgehen. # ########################################### if [ $AIR -le 449 ] || [ -z $AIR ] then AIR=`rrdtool lastupdate /nas/data/air.rrd | tail -1 | awk '{print $2}'| tr -s [:blank:]` STATUS=AIR_NOK fi if [ -z $LUFTm ] then LUFTm=`rrdtool lastupdate /nas/data/humidity.rrd | tail -1 | awk '{print $2}'| tr -s [:blank:]` fi if [ $AIR -gt 2700 ] then cd $HOMEPATH/airsensor ./airsensor -o | awk '{print $4}' | sed -e 's/,$//g' | tr -s [:blank:] | cut -f7 -d" " | sed 's/[a-z,A-Z]//g' > ./air.tmp AIR=($(cat air.tmp | tr -s [:blank:] | cut -f7 -d" ")) STATUS=AIR2.run fi TEMP1=($(cat /sys/bus/w1/devices/28-0000074fc213/w1_slave | tail -1 | awk '{print $10}' | cut -c 3,4,5,6,7)) TEMP2=($(cat /sys/bus/w1/devices/28-0000074fc4e0/w1_slave | tail -1 | awk '{print $10}' | cut -c 3,4,5,6,7)) TEMP4=($(cat /sys/bus/w1/devices/28-0000074fc60e/w1_slave | tail -1 | awk '{print $10}' | cut -c 3,4,5,6,7)) TEMP3=($(cat /sys/bus/w1/devices/28-0000075202c3/w1_slave | tail -1 | awk '{print $10}' | cut -c 3,4,5,6,7)) AUSSENLUFT=`echo "scale= 2; $TEMP1/1000" | bc | tr -s [:blank:] | cut -f7 -d" "` FRISCHLUFT=`echo "scale= 2; $TEMP2/1000" | bc | tr -s [:blank:] | cut -f7 -d" "` ABLUFT=`echo "scale= 2; $TEMP3/1000" | bc | tr -s [:blank:] | cut -f7 -d" "` FORTLUFT=`echo "scale= 2; $TEMP4/1000" | bc | tr -s [:blank:] | cut -f7 -d" "` rrdtool update /nas/data/temp.rrd N:$AUSSENLUFT:$FRISCHLUFT:$ABLUFT:$FORTLUFT ############################ # Ausgabe nur für HOMEKIT! # ############################ echo $AUSSENLUFT > /nas/data/AUSSENLUFT.txt echo $FRISCHLUFT > /nas/data/FRISCHLUFT.txt echo $ABLUFT > /nas/data/ABLUFT.txt echo $FORTLUFT > /nas/data/FORTLUFT.txt echo $LUFTm > /nas/data/LUFTm.txt ########################################### # Ausgabe der Variablen in eine csv um die# # Ergebnisse analysieren zu können. Debug # ########################################### echo -e $datum"," $TEMPm"," $LUFTm"," $AIR"," $STATUS >> /nas/data/measure_output.csv ########################################### # Daten in rrd ausgeben # # Die rrd DBen wurden separat angelegt. # # Hier wird auf den Pfad verwiesen und die# # Variablen eingeschrieben. # ########################################### rrdtool update /nas/data/temperatur.rrd N:$TEMPm rrdtool update /nas/data/air.rrd N:$AIR rrdtool update /nas/data/humidity.rrd N:$LUFTm ########################################### # Aufruf PNG zu generieren # # Die Generatoren wurden separat erstellt # ########################################### cd $HOMEPATH ./tempgenerator.sh ./humigeneratur.sh ./airgenerator.sh ########################################## # Löschen der AIR.tmp Datei # ########################################## cd $HOMEPATH/airsensor rm -rf air.tmp ############################################ #Generieren den html Codes für die Homepage# #Dazu wird der html-Generator aufgrufen, # #der den html Code erzeugt und direkt auf # #den Web-Server legt. # ############################################ cd $HOMEPATH ./html_generator.sh > $HOMEPATH/Diagramme.ende cat Diagramme.start Diagramme.ende > /web/Diagramme
Soviel zu dem Script.
Ein Punkt war noch wichtig. Ich wollte die Außentemperaturen erfassen, wollte aber keinen Außensensor extra verlegen. Deshalb hatte ich mich dazu entschieden, die Werte aus dem “Wetterbericht” zu ziehen. Das habe ich mittels dieses keinen Scripts “aussenwerte.sh” realisiert:
#!/bin/bash cd /nas/data sudo wget -q http://weather.tuxnet24.de/?id=642146 TEMP=( $(cat index.html* | grep "current_temp =" | awk '{print $3}' | tr -s [:blank:] | cut -f7 -d" ")) HUMI=( $(cat index.html* | grep humid | awk '{print $3}' | tr -s [:blank:] | cut -f7 -d" " | tr -d "%")) PRESSURE=( $(cat index.html* | grep press | awk '{print $3}' | tr -s [:blank:] | cut -f7 -d" ")) SPEED=( $(cat index.html* | grep speed | awk '{print $3}' | tr -s [:blank:] | cut -f7 -d" ")) echo $TEMP > /nas/data/WETTER.txt #echo $TEMP $HUMI $PRESSURE $SPEED rm -rf index.* rrdtool update /nas/data/aussenwerte.rrd N:$TEMP:$HUMI:$PRESSURE:$SPEED
Auswertung der RRD Datenbank / Visualisierung der Werte
Um die Datenbanken nun auswerten zu können, werden weitere Skripte benötig. Diese erzeugen Graphen über dien Befehl: rrdtool graph. Hier mein Script “tempgenerator.sh”, mit dem ich den Tagesverlauf erzeuge:
#!/bin/sh rrdtool graph /web/temperatur.png -v "Grad Celsius" --start "now-24h" --end "now" -w 800 -h 300 \ --title "Lüftungsanlage-Messwerte - `date`" \ --slope-mode \ DEF:temperatur=/nas/data/aussenwerte.rrd:temperatur:AVERAGE \ DEF:aussenluft=/nas/data/temp.rrd:aussenluft:AVERAGE \ DEF:zuluft=/nas/data/temp.rrd:zuluft:AVERAGE \ DEF:fortluft=/nas/data/temp.rrd:fortluft:AVERAGE \ DEF:abluft=/nas/data/temp.rrd:abluft:AVERAGE \ VDEF:temperatura=temperatur,LAST \ VDEF:aussenlufta=aussenluft,LAST \ VDEF:zulufta=zuluft,LAST \ VDEF:fortlufta=fortluft,LAST \ VDEF:ablufta=abluft,LAST \ LINE2:temperatur#000000:"Aussentemperatur " \ LINE2:aussenluft#0000FF:"Aussenluft " \ LINE2:zuluft#8BBFFF:"Zuluft " \ LINE2:fortluft#B54FC6:"Fortluft " \ LINE2:abluft#ff0000:"Abluft" \ GPRINT:temperatura:"aktuell\:%5.1lf°C " \ GPRINT:aussenlufta:" %5.1lf °C " \ GPRINT:zulufta:" %5.1lf °C " \ GPRINT:fortlufta:" %5.1lf °C " \ GPRINT:ablufta:" %5.1lf °C"
Mit einen weiteren Script erzeuge ich html Code, den ich direkt auf den Web-Server lege. Dieser ist aber so individuell und an meine Bedürfnisse angepasst, sodass ich ihn erstmal nicht veröffentliche. Aber so aktualisiere ich meine Daten alle 5 min. Die Bilder werden dann nur noch in dem entsprechenden Verzeichnis auf dem Web-Server abgelegt.
Ich habe festgestellt, dass mein USB-Luftqualitätssensor etwas unsauber arbeitet, d.h. die Werte addieren sich irgendwie auf und nach 2 Tage kommen nur noch Fantasiewerte raus. Deshalb habe ich mir einen USB-Reset gebaut. Dieses Skript läuft einmal pro Tag:
echo 0 > /sys/devices/platform/soc/3f980000.usb/buspower sleep 2 echo 1 > /sys/devices/platform/soc/3f980000.usb/buspower sleep 3 echo "USB Reset durchgeführt!" >> /home/pi/measure_output.csv
Unten ein kleiner Abzug meiner Homepage. Ein interessantes Detail noch: mit dem rrdtool kann man auch Graphen direkt berechnen. Ich habe es in dem unteren Diagramm gemacht. Darin wurden Wärmekennzahlen aus den gemessenen Werten berechnet.
Das Ergebnis
Der erste Versuch die Lüftungsanlage zu steuern, war gescheitert, aber ich konnte nun zumindest meine Kennwerte erfassen. Im nächsten Schritt kam dann aber die Steuerung der Lüftungsanlage.
Hier noch einige Bilder:
Versuchsaufbau
Das fertige Produkt: Die Sensoren habe ich in Alu-Hülsen eingeschoben, damit sie ein wenig geschützter sind.