Temperaturmessung Lüftungsanlage

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:

Aufbau der Lüftungsanlage

Die Lüftungsanlage hat 4 Rohre, aber 5 Temperaturen die gemessen werden sollen:

  1. Frischluft
  2. Zuluft für die Räume
  3. Abluft der Räume
  4. Fortluft
  5. 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. 1-Wire Protokoll aktivieren und konfigurieren
  2. Testen ok die Aktivierung funktioniert hat
  3. Werte auslesen: cat /sys/bus/w1/devices/###DeviceID###/w1_slave
  4. 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.