LinuxLinus

Mac, Linux, Windows – und Gadgets

Raspberry Wetterstation mit DS18B20 Temperatursensoren und RRD Graph

| 8 Kommentare

Wer Temperaturen mit seinem Raspberry überwachen möchte kann das sehr günstig mit DS18B20 Temperatursensoren machen. Die Ergebnisse lassen sich zudem schön als RRD-Graphen anzeigen. Später kann das ganze dann auf einfach auf einem Webserver auf dem Raspberry angezeigt werden.

So soll es später aussehen

So soll es später aussehen

Im folgenden eine kurze Anleitung dazu.

Die Schaltung

Die Schaltung

Benötigt werden:

Eine Lötstation, ein Steckbrett, etwas Schrumpfschlauch, Lötzinn und Drahtbrücken erleichtern die Arbeit.

Temperatursensoren anschließen:

Schaltung Raspberry ds18b20

Schaltung Raspberry ds18b20

(Wird nicht das Modell B+ verwendet werden von links gesehen die gleichen GIPOs benutzt)

Ansonsten können viele Sensoren hintereinander angeschlossen werden. Bei uns habe ich ein Telefonkabel von Raum zu Raum gelegt und erfasse so mit 8 Sensoren alle für mich spannenden Temperaturen.

Wenn die Temperatursensoren angeschlossen sind und vorzugsweise Raspbian auf dem Pi läuft geht die Installation los:

modprobe w1-gpio
modprobe w1-therm
vim /etc/modules
# einfuegen
w1-gpio
w1-therm

Unter /sys/bus/w1/devices sollten nur die Sensoren mit ihren IDs angezeigt werden. Jede ID in der Form von 28-XXXXXXX ist ein Sensor. w1_slave zeigt die Temperatur an (t=25562), welche noch durch 1000 dividiert werden muss:

root@iBastel ~ # cat /sys/bus/w1/devices/28-000005111e90/w1_slave
99 01 4b 46 7f ff 07 10 79 : crc=79 YES
99 01 4b 46 7f ff 07 10 79 t=25562

root@iBastel ~ # cat /sys/bus/w1/devices/28-0000059633af/w1_slave
79 01 4b 46 7f ff 07 10 0a : crc=0a YES
79 01 4b 46 7f ff 07 10 0a t=23562

Um das ganze regelmäßig auszulesen und in eine RRD-Datenbank zu schreiben nutze ich PHP und RRDtool. Als Webserver dient der schlanke lighttpd. Vim ist mein Lieblingseditor.

apt-get install php5-cli rrdtool lighttpd vim php5-cgi
mkdir /root/rrd
cd /root/rrd
ls /sys/bus/w1/devices
# bei mir
#28-000005111e90
#28-0000051166bf
#28-0000059633af

Mit folgenden Befehl werden die Datenbanken erzeugt. Pro Sensor verwende ich eine Datenbank und ich habe die Datenbanken wie meine Sensoren genannt, ihr müsst das Script also entsprechend eurer Sensor-IDs anpassen.

rrdtool \
create /root/rrd/28-000005111e90.rrd --step 60 \
DS:28-000005111e90:GAUGE:120:U:U \
RRA:AVERAGE:0.5:1:2160 \
RRA:AVERAGE:0.5:5:2016 \
RRA:AVERAGE:0.5:15:2880 \
RRA:AVERAGE:0.5:60:8760 \
RRA:MIN:0.5:1:2160 \
RRA:MIN:0.5:5:2016 \
RRA:MIN:0.5:15:2880 \
RRA:MIN:0.5:60:8760 \
RRA:MAX:0.5:1:2160 \
RRA:MAX:0.5:5:2016 \
RRA:MAX:0.5:15:2880 \
RRA:MAX:0.5:60:8760

rrdtool \
create /root/rrd/28-0000051166bf.rrd --step 60 \
DS:28-0000051166bf:GAUGE:120:U:U \
RRA:AVERAGE:0.5:1:2160 \
RRA:AVERAGE:0.5:5:2016 \
RRA:AVERAGE:0.5:15:2880 \
RRA:AVERAGE:0.5:60:8760 \
RRA:MIN:0.5:1:2160 \
RRA:MIN:0.5:5:2016 \
RRA:MIN:0.5:15:2880 \
RRA:MIN:0.5:60:8760 \
RRA:MAX:0.5:1:2160 \
RRA:MAX:0.5:5:2016 \
RRA:MAX:0.5:15:2880 \
RRA:MAX:0.5:60:8760

rrdtool \
create /root/rrd/28-0000059633af.rrd --step 60 \
DS:28-0000059633af:GAUGE:120:U:U \
RRA:AVERAGE:0.5:1:2160 \
RRA:AVERAGE:0.5:5:2016 \
RRA:AVERAGE:0.5:15:2880 \
RRA:AVERAGE:0.5:60:8760 \
RRA:MIN:0.5:1:2160 \
RRA:MIN:0.5:5:2016 \
RRA:MIN:0.5:15:2880 \
RRA:MIN:0.5:60:8760 \
RRA:MAX:0.5:1:2160 \
RRA:MAX:0.5:5:2016 \
RRA:MAX:0.5:15:2880 \
RRA:MAX:0.5:60:8760
mkdir /root/sh
cd /root/sh
#!/usr/bin/php
<?php
$teilen = '1000';

// 000005111e90
$temp01 = exec('cat /sys/bus/w1/devices/28-000005111e90/w1_slave |grep t=');
$temp01 = explode('t=',$temp01);
$temp01 = $temp01[1] / 1000;
$temp01 = round($temp01,2);
//print $temp01 . PHP_EOL;
exec("/usr/bin/rrdtool update /root/rrd/28-000005111e90.rrd N:$temp01");

// 0000051166bf
$temp02 = exec('cat /sys/bus/w1/devices/28-0000051166bf/w1_slave |grep t=');
$temp02 = explode('t=',$temp02);
$temp02 = $temp02[1] / 1000;
$temp02 = round($temp02,2);
//print $temp02 . PHP_EOL;
exec("/usr/bin/rrdtool update /root/rrd/28-0000051166bf.rrd N:$temp02");

// 0000059633af
$temp03 = exec('cat /sys/bus/w1/devices/28-0000059633af/w1_slave |grep t=');
$temp03 = explode('t=',$temp03);
$temp03 = $temp03[1] / 1000;
$temp03 = round($temp03,2);
//print $temp03 . PHP_EOL;
exec("/usr/bin/rrdtool update /root/rrd/28-0000059633af.rrd N:$temp03");

?>

Damit das PHP-Script später ausgeführt werden kann.

chmod +x w1_to_rrd.php

Die Sensoren sollen natürlich automatisch jede abgefragt werden, hierzu wird ein Cronjob angelegt:

crontab -e

# einfügen
* * * * * php5 /root/sh/w1_to_rrd.php > /dev/null 2>&1

Um die RRD-Graphen später anschauen zu können, legen wir die Bilder auf dem Webserver ab:

mkdir /var/www/rrd

Folgendes Script erzeugt aus den RRD-Datenbanken PNG-Dateien, welche später auf dem Webserver abgelegt werden.

#!/bin/sh

# 000005111e90
nice -n 19 /usr/bin/rrdtool graph /var/www/rrd/000005111e90.png -a PNG -b 1024 --start -86400 -A \
-t "000005111e90 24H" --vertical-label "Grad Celsius" -w 600 -h 150 \
DEF:g1=/root/rrd/28-000005111e90.rrd:28-000005111e90:AVERAGE \
DEF:gmin=/root/rrd/28-000005111e90.rrd:28-000005111e90:MIN \
DEF:gmax=/root/rrd/28-000005111e90.rrd:28-000005111e90:MAX \
VDEF:g1a=g1,LAST \
VDEF:gmina=gmin,MINIMUM \
VDEF:gdurch=gmin,AVERAGE \
VDEF:gmaxa=gmax,MAXIMUM \
LINE1:g1#ff0000:"000005111e90\n" \
GPRINT:g1a:"aktuell\: %10.2lf °C\n" \
GPRINT:gdurch:"schnitt\: %10.2lf °C\n" \
GPRINT:gmina:"min\: %10.2lf °C\n" \
GPRINT:gmaxa:"max\: %10.2lf °C\n" > /dev/null

# 0000051166bf
nice -n 19 /usr/bin/rrdtool graph /var/www/rrd/0000051166bf.png -a PNG -b 1024 --start -86400 -A \
-t "0000051166bf 24H" --vertical-label "Grad Celsius" -w 600 -h 150 \
DEF:g1=/root/rrd/28-0000051166bf.rrd:28-0000051166bf:AVERAGE \
DEF:gmin=/root/rrd/28-0000051166bf.rrd:28-0000051166bf:MIN \
DEF:gmax=/root/rrd/28-0000051166bf.rrd:28-0000051166bf:MAX \
VDEF:g1a=g1,LAST \
VDEF:gmina=gmin,MINIMUM \
VDEF:gdurch=gmin,AVERAGE \
VDEF:gmaxa=gmax,MAXIMUM \
LINE1:g1#ff0000:"0000051166bf\n" \
GPRINT:g1a:"aktuell\: %10.2lf °C\n" \
GPRINT:gdurch:"schnitt\: %10.2lf °C\n" \
GPRINT:gmina:"min\: %10.2lf °C\n" \
GPRINT:gmaxa:"max\: %10.2lf °C\n" > /dev/null

# 0000059633af
nice -n 19 /usr/bin/rrdtool graph /var/www/rrd/0000059633af.png -a PNG -b 1024 --start -86400 -A \
-t "0000059633af 24H" --vertical-label "Grad Celsius" -w 600 -h 150 \
DEF:g1=/root/rrd/28-0000059633af.rrd:28-0000059633af:AVERAGE \
DEF:gmin=/root/rrd/28-0000059633af.rrd:28-0000059633af:MIN \
DEF:gmax=/root/rrd/28-0000059633af.rrd:28-0000059633af:MAX \
VDEF:g1a=g1,LAST \
VDEF:gmina=gmin,MINIMUM \
VDEF:gdurch=gmin,AVERAGE \
VDEF:gmaxa=gmax,MAXIMUM \
LINE1:g1#ff0000:"0000059633af\n" \
GPRINT:g1a:"aktuell\: %10.2lf °C\n" \
GPRINT:gdurch:"schnitt\: %10.2lf °C\n" \
GPRINT:gmina:"min\: %10.2lf °C\n" \
GPRINT:gmaxa:"max\: %10.2lf °C\n" > /dev/null

chmod +x /root/sh/create_img.sh
# testen
/root/sh/create_img.sh

Jetzt sollten die entsprechenden PNG-Dateien im Verzeichnis des Webserver erstellt worden sein. Um sich das Ergebnis anzeigen zu lassen ggf.  Directory Listing einschalten

vim /etc/lighttpd/lighttpd.conf
# einfügen
server.dir-listing = "enable"

Um nicht jedes PNG immer einzeln aufzurufen kann zudem eine PHP-Datei erzeugt werden, welche jede PNG-Datei im Verzeichnis als Webseite anzeigt:

vim /var/www/rrd/show_all.php
<?php
foreach (glob("*.png") as $file)
{
print '<img src="' . $file . '"> ' . $file . '<br/>';
};
?>

Bis jetzt spricht der Webserver noch nicht php, also fastcgi aktivieren:

lighty-enable-mod fastcgi
lighty-enable-mod fastcgi-php
/etc/init.d/lighttpd force-reload

Damit die RRD-Bilder jetzt regelmäßig erstellt werden führen wir das Script create_img.sh alle 15 Minuten aus:

crontab -e
# einfügen
*/15 * * * * /root/sh/create_img.sh > /dev/null 2>&1

Fertig!

Auf der Webseite des Raspberry Pi gibt es nun das Verzeichnis rrd, in dem sich die PNGs befinden:

Wie die RRD-Graphen aussehen sollen lässt sich sehr gut anpassen. Hier empfehle ich die offizielle RRD-Doku oder ein Kommentar hier im Blog.

Autor: Linus Stehr

Mein Name ist Linus. Im Berufsleben arbeite ich als IT-Mensch, privat zeige ich hier Outdoor-Artikel und ander Gadgets. Zu finden bin ich zudem auf Google+.

8 Kommentare

  1. Vielen Dank, hat 1 zu 1 funktioniert!

  2. Danke für die genial gute Anleitung. Da wir Winter haben, ist mir im Script w1_to_rrd.sh noch ein Schönheitsfehler aufgefallen. Negative Werte können nicht korrekt verarbeitet werden. Der tiefstmögliche Wert ist somit eine schöne glatte Null.

    Da ich leider PHP so gut wie gar nicht kenne, kann ich leider diesen Fehler nicht ausbügeln. Hast du hierzu eine Lösung?

    Danke und Gruss
    Sven

    • Ich nochmals. Nachdem ich das Script komplett von Hand neu geschrieben habe scheint es zu funktionieren. Vielleicht war irgendwo noch ein nichtsichtbares Zeichen versteckt.

      Der Test im Gefrierfach verlief positiv.

    • Hi… ich würd einfach die Temparaturwerte in Kelvin umwandeln lassen 😉 weil da gehts nicht unter 0 ^^ … und dann eben den ermittelten Wert in Celsius umrechnen und dann hast du auch relativ einfach negative Temparaturen

  3. Hi Linus,

    das ist eine klasse Beschreibung. Enthält alles, was notwendig ist und hat sofort funktioniert 🙂

  4. Hallo Linus,

    hat auch bei mir super funktioniert!
    habe nur ständig “Fehlmessungen”, die die Temperatur auf 1-2 Grad fallen lassen.
    Weißt du an was das liegen könnte?

    VG
    Karsten

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.


 

Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies zu. Weitere Informationen

Die Cookie-Einstellungen auf dieser Website sind auf "Cookies zulassen" eingestellt, um das beste Surferlebnis zu ermöglichen. Wenn du diese Website ohne Änderung der Cookie-Einstellungen verwendest oder auf "Akzeptieren" klickst, erklärst du sich damit einverstanden.

Schließen