1-wire Temperatursensoren auslesen und verarbeiten

Was wir benötigen:

 

front_of_raspberry_pi 1x Raspberry (z.B. Modell B)
ds Für unseren Beispielsaufbau 3x DS18B20 Temperaturssensor

(Amazon: LINK)

4k7 1x 4,7k (4K7) Wiederstand

 

(Amazon: LINK)

 

 

Und so wird verkabelt:

1wire

(klicken zum Vergrößern)

a3123d8a-b8d1-4421-aebc-74df90dfaa86

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:

tempday