1-wire Temperatursensoren auslesen und verarbeiten
Was wir benötigen:
1x Raspberry (z.B. Modell B) | |
Für unseren Beispielsaufbau 3x DS18B20 Temperaturssensor
(Amazon: LINK) |
|
1x 4,7k (4K7) Wiederstand
(Amazon: LINK) |
Und so wird verkabelt:
(klicken zum Vergrößern) |
Konfiguration auf dem Raspberry (OS Jessie):
Nachdem wir den Raspberry erst einmal grundsätzlich konfiguriert haben (Partitionsgröße, Datum, Zeit und Netzwerk etc.) aktivieren wir zuerst den Device Tree Overlay für 1-wire.
Dies geschieht mittels:
sudo echo "dtoverlay=w1-gpio,gpiopin=4,pullup=on" >> /boot/config.txt
Als nächstes muss der Rasperry neu gestartet werden.
Nach dem erfolgreichen Neustart müssen zunächst die Module für 1-wire geladen werden.
Dies machen wir mit:
sudo echo "w1-gpio pullup=1" >> /etc/modules sudo echo "w1-therm" >> /etc/modules
Nun müssen wir den Raspberry ein weiteres mal neu starten und danach sollten wir unter „/sys/bus/w1/devices“ unsere Sensoren finden können (der Sensorname könnte z.B. 28-0316729893ff heißen).
Mit folgendem Befehl können wir nun einen Sensor auslesen:
sudo cat /sys/bus/w1/devices/"SENSORNAME"/w1_slave
Als nächstes installieren wir die Software die wir brauchen um die Temperaturen zu speichern und auszuwerten:
sudo apt-get update sudo apt-get install apache2 php5 python rrdtool python-rrdtool
Aufzeichnung und Auswertung:
Zur Vorbereitung der Aufzeichnung legen wir ein Speicherverzeichnis auf dem Webserver an und löschen die Standarddateien des Webservers.
rm -R /var/www/html mkdir /var/www/html mkdir /var/www/html/back mkdir /home/pi/1-wire cd /home/pi/1-wire
Jetzt erzeugen wir die rrd Datenbank in der unsere Messergebnisse gespeichert werden (im Beispiel werden Temperaturen von -30°C bis +70°C gespeichert):
rrdtool create /home/pi/1-wire/temperature.rrd --step 300 \ DS:temp0:GAUGE:1200:-30:70 \ DS:temp1:GAUGE:1200:-30:70 \ DS:temp2:GAUGE:1200:-30:70 \ RRA:AVERAGE:0.5:1:960 \ RRA:MIN:0.5:96:3600 \ RRA:MAX:0.5:96:3600 \ RRA:AVERAGE:0.5:96:3600
Um die Sensoren nun auszulesen und besser abrufbar zu machen benutzen wir folgendes PHP-Script (/home/pi/1-wire/auswerte.php):
<?php $pw=''; //Schleife bei falschen werten while($pw < 3) { $pw = 9; //hole Sensordaten S1 $temp = exec('cat /sys/bus/w1/devices/"SENSOR1"/w1_slave |grep t='); $temp = explode('t=',$temp); $temp = $temp[1] / 1000; $temp = round($temp,2); //hole Sensordaten S1 $temp1 = exec('cat /sys/bus/w1/devices/"SENSOR2"/w1_slave |grep t='); $temp1 = explode('t=',$temp1); $temp1 = $temp1[1] / 1000; $temp1 = round($temp1,2); //hole Sensordaten S3 $temp2 = exec('cat /sys/bus/w1/devices/"SENSOR3"/w1_slave |grep t='); $temp2 = explode('t=',$temp2); $temp2 = $temp2[1] / 1000; $temp2 = round($temp2,2); //trenne dezimalstellen ab zur um falsche Werte aus zu sortieren $t = explode(" ", $temp); $t1 = explode(" ", $temp1); $t2 = explode(" ", $temp2); //wenn wert größer als 70 starte Schleife neu (um falsche Messergebnisse zu verhindern --muss bei Bedarf angepasst werden) if ($t[0] > 70) { $pw = 1; } if ($t1[0] > 70) { $pw = 1; } if ($t2[0] > 70) { $pw = 1; } } //schreibe den Wert von S1 in Txtdatei $handle = fopen ("s1.txt", w); fwrite ($handle, $temp); fclose ($handle); //schreibe den Wert von S3 in Txtdatei $handle = fopen ("s2.txt", w); fwrite ($handle, $temp1); fclose ($handle); //schreibe den Wert von S3 in Txtdatei $handle = fopen ("s3.txt", w); fwrite ($handle, $temp2); fclose ($handle); ?>
Und um das ganze dann in die rrd Datenbank zu packen benutzen wir das folgende Python-Script (/home/pi/1wire/indb.py):
#!/usr/bin/python # -*- coding: utf-8 -*- import re, os, rrdtool, time pathes = ( # "/sys/bus/w1/devices/28-0316729893ff/w1_slave", "/home/pi/1wire/s1.txt", "/home/pi/1wire/s2.txt", "/home/pi/1wire/s3.txt", ) # read sensor data data = 'N' for path in pathes: data += ':' fin = open(path,"r") dateiinhalt = fin.read() fin.close() data += dateiinhalt time.sleep(1) # insert data into round-robin-database rrdtool.update( "%s/temperature.rrd" % (os.path.dirname(os.path.abspath(__file__))), data) print data #Grafik erzeugen os.system("/home/pi/1-wire/grafik.sh")
Nun fehlen aber noch die Grafiken die wir möchten um uns die Temperaturen bequem anzeigen zu lassen.
Diese erzeugen wir mit einem Shell-Script das, wie in der „indb.py“ zu sehen ist, nach dem eintragen der Messwerte ausgeführt wird.
Das Shell-Script wird unter /home/pi/1-wire/grafik.sh erstellt (die Benennungen und Farben können hier natürlich angepasst werden) :
rrdtool graph tempweek.png \ -s 'now - 1 week' -e 'now' \ DEF:temp0=temperature.rrd:temp0:AVERAGE \ LINE2:temp0#FFFF00:Raum \ DEF:temp1=temperature.rrd:temp1:AVERAGE \ LINE2:temp1#F80404:Heizung \ DEF:temp2=temperature.rrd:temp2:AVERAGE \ LINE2:temp2#0101DF:Draussen \ rrdtool graph tempday.png \ -s 'now - 1 day' -e 'now' \ DEF:temp0=temperature.rrd:temp0:AVERAGE \ LINE2:temp0#FE9A2E:Raum \ DEF:temp1=temperature.rrd:temp1:AVERAGE \ LINE2:temp1#F80404:Heizung \ DEF:temp2=temperature.rrd:temp2:AVERAGE \ LINE2:temp2#0101DF:Draussen \ rrdtool graph temphour.png \ -s -1h -e 'now' \ DEF:temp0=temperature.rrd:temp0:AVERAGE \ LINE2:temp0#FE9A2E:Raum \ DEF:temp1=temperature.rrd:temp1:AVERAGE \ LINE2:temp1#F80404:Heizung \ DEF:temp2=temperature.rrd:temp2:AVERAGE \ LINE2:temp2#0101DF:Draussen \ rrdtool graph tempyear.png \ -s 'now - 1 year' -e 'now' \ DEF:temp0=temperature.rrd:temp0:AVERAGE \ LINE2:temp0#FE9A2E:Raum \ DEF:temp1=temperature.rrd:temp1:AVERAGE \ LINE2:temp1#F80404:Heizung \ DEF:temp2=temperature.rrd:temp2:AVERAGE \ LINE2:temp2#0101DF:Draussen \ rrdtool graph tempmonth.png \ -s 'now - 1 month' -e 'now' \ DEF:temp0=temperature.rrd:temp0:AVERAGE \ LINE2:temp0#FE9A2E:Raum \ DEF:temp1=temperature.rrd:temp1:AVERAGE \ LINE2:temp1#F80404:Heizung \ DEF:temp2=temperature.rrd:temp2:AVERAGE \ LINE2:temp2#0101DF:Draussen \ mv /home/pi/1-wire/tempweek.png /var/www/html/ mv /home/pi/1-wire/tempday.png /var/www/html/ mv /home/pi/1-wire/temphour.png /var/www/html/ mv /home/pi/1-wire/tempyear.png /var/www/html/ mv /home/pi/1-wire/tempmonth.png /var/www/html/
Was nun noch folgt sind einige Scripte die unsere erzeugten Bilder Täglich, Wöchentlich, Monatlich und Jährlich in den „back“ Ordner des Web-Servers sichern.
Alle Scripte werden im Ordner /home/pi/1-wire/ angelegt.
backday.sh:
y=$(date +%y) m=$(date +%m) d=$(date +%d) mkdir /var/www/html/back/$y mkdir /var/www/html/back/$y/$m mkdir /var/www/html/back/$y/$m/$d cp /var/www/html/tempday.png /var/www/html/back/$y/$m/$d/
backweek.sh:
y=$(date +%y) m=$(date +%m) d=$(date +%d) kw=$(date --date=-1week +%V) mkdir /var/www/html/back/$y mkdir /var/www/html/back/$y/$m mkdir /var/www/html/back/$y/$m/$d cp /var/www/html/tempweek.png /var/www/html/back/$y/$m/kw_$kw.png
backmonth.sh:
#!/bin/sh HEUTE=`date +%d` MORGEN=`date +%d -d "1 day"` if [ $MORGEN -lt $HEUTE ]; then y=$(date +%y) m=$(date +%m) d=$(date +%d) mkdir /var/www/html/back/$y mkdir /var/www/html/back/$y/$m mkdir /var/www/html/back/$y/$m/$d cp /var/www/html/tempmonth.png /var/www/html/back/$y/$m/ else echo "warte noch..." fi
backjahr.sh:
#!/bin/sh HEUTE=`date +%d` MORGEN=`date +%d -d "1 day"` if [ $MORGEN -lt $HEUTE ]; then y=$(date +%y) m=$(date +%m) d=$(date +%d) mkdir /var/www/html/back/$y mkdir /var/www/html/back/$y/$m mkdir /var/www/html/back/$y/$m/$d cp /var/www/html/tempyear.png /var/www/html/back/$y/ else echo "warte noch..." fi
Nun müssen wir sofern dies noch nicht passiert ist alle Scripte ausführbar machen:
sudo chmod 777 -R /home/pi/1-wire
Und zum guten Schluss erstellen wir die Crontabs um alle unsere Scripte zu den passenden Zeitpunkten ausführen zu lassen.
Hierbei ist zu beachten das man die Crontabs als root Benutzer erzeugen sollte (hier im Beispiel nur um es einfacher zu halten).
sudo su root //Benutzerwechsel nach root crontab -e // Editieren der Crontabs
Nun sind folgende Crontabs zu erstellen:
* * * * * php /home/pi/1-wire/auswerte.php > /dev/null 2>&1 */5 * * * * /home/pi/1-wire/indb.py > /dev/null 2>&1 55 23 * * * /home/pi/1-wire/backday.sh > /dev/null 2>&1 55 23 * * 0 /home/pi/1-wire/backweek.sh > /dev/null 2>&1 55 23 28,29,30,31 * * /home/pi/1-wire/backmonth.sh > /dev/null 2>&1 55 23 28,29,30,31 12 * /home/pi/1-wire/backjahr.sh > /dev/null 2>&1
Jetzt dürfte alles soweit fertig sein, wenn wir im Browser die IP unseres Raspberrys aufrufen, müssten wir die aktuell erstellten Bilder Sehen können.
Im Ordner „back“ werden, wie oben bereits erwähnt, unsere Grafiken zur späteren Betrachtung aufbewahrt.
Das Ergebnis sollte dann so ähnlich aussehen:
22. November 2019 at 1:01
Hallo, vielen Dank für die Anleitung.
im PHP-Script (/home/pi/1-wire/auswerte.php) bekomme ich ohne die schließende geschweifte Klammer in Zeile einen Fehler „unerwartetes Ende“.
Lasse ich die geschweifte Klammer drinm dann bekomme ich 3 Fehlermeldungen das „w“ nicht deklariert ist.