Angeregt vom golem.de Projekt: Wie warm ist es in euren Büros habe ich mir erstmals einen Raspberry PI bestellt.
Mittels einiger tools lassen sich auch selbst beeindruckende Statistiken anlegen!
Inhalt
Hardware
Als minimal Anforderung braucht es folgende Komponenten
- ein Temperatursensor DS18B20
- einen 4,7-kOhm-Widerstand
- ein Set Verbindungskabel
[stextbox id=“info“]Zum schnellen Testen sollte man noch die Anschaffung eines Steckbretts und Klingeldraht (Y-Draht) in Betracht ziehen.[/stextbox]
Nun wird der 4,7-kOhm-Widerstand mit der Stromleitung des Temperatursensors verbunden und der Temperatursensor selbst mit der GPIO auf dem Raspberry PI.
Raspberry Pi konfigurieren
Der Raspberry Pi unterstützt den DS18B20 mit Hilfe zweier Kernelmodule, die wir aber erst aktivieren müssen.
Zuerst wird in der Datei /boot/config.txt folgender Aufruf eingetragen:
dtoverlay=w1-gpio,gpiopin=4,pullup=on |
Damit weiss Linux, dass der Pin GPIO04, gemeint ist hier der physische Pin 7, für die One-Wire-Kommunikation verwendet werden soll.
Als Nächstes fügen wir zwei Einträge in /etc/modules ein:
w1-gpio pullup=1 w1-therm |
Die erste Zeile lädt das One-Wire-Kernel-Modul, die zweite ein Modul, das für die Auswertung des Temperatursensors zuständig ist. Jetzt müssen wir den Raspberry Pi neu starten.
Zugriff über python
Die Daten des Temperatursensors kreigt man über die Datei: /sys/bus/w1/devices/SENSOR-ID/w1_slave (wobei SENSOR-ID die eindeutige ID des Sensors ist).
Mittels python lässt sich die Ausgabe des Sensors gut parsen, also schreiben wir ein Script welches die aktuelle Temperatur, gerundet auf eine Dezimalstelle ausgibt:
getTemp.py
#!/usr/bin/python # Returns the current temperature import re, os PATH_SENSOR = "/sys/bus/w1/devices/SENSOR-ID/w1_slave" def get_temp(sensorpath): temp = None try: sensorfile = open(sensorpath, "r") row = sensorfile.readline() if re.match(r"([0-9a-f]{2} ){9}: crc=[0-9a-f]{2} YES", row): row = sensorfile.readline() m = re.match(r"([0-9a-f]{2} ){9}t=([+-]?[0-9]+)", row) if m: temp = float(m.group(2))/1000 sensorfile.close() except IOError: print "Could not read sensor" return temp if __name__ == '__main__': temp = get_temp(PATH_SENSOR) if temp != None: print("%.1f" % temp) |
Dies dient nun als basis um die Temperatur abzurufen.
Webserver
Da der Raspberry PI nicht so viel Leitung hat, ist hier ein vollwertiger apache Server überdimensioniert und lighttpd perfekt geeignet. Diesen installieren wir als Grundlage um die Mess-Statistiken anzeigen zu können:
apt-get install lighttpd apt-get install php5-cgi php-apc |
gnuplot
Mit gnuplot lässt sich schon ein ansprechendes Diagramm erstellen.
Zuerst wird gnuplot installiert:
apt-get install gnuplot |
Dann erstellen wir eine gnuplot Konfigurationsdatei:
gnuplot-temperature.conf
set title "MyOffice Temerature" set xlabel "Minutes (mins)" set ylabel "Temperature (°C)" set terminal png size 620,360 set output "/var/www/html/gnuplot-temperature.png" set xdata time set timefmt "%s" set format x "%H:%M" set grid set key left box plot "/home/pi/gnuplot-temperature.dat" using 1:2 title "Temp" with lines |
Nun noch ein Shellscript, welches das Datenfile für gnuplot schreibt:
gnuplot-temperature.sh
#!/bin/bash PLOT_CONFFILE="/home/pi/gnuplot-temperature.conf" PLOT_DATAFILE="/home/pi/gnuplot-temperature.dat" PLOT_DATETIME=$(/bin/date +%s) PLOT_TEMP=$(/usr/bin/python /home/pi/getTemp.py) echo "$PLOT_DATETIME $PLOT_TEMP" >> $PLOT_DATAFILE cat $PLOT_CONFFILE | /usr/bin/gnuplot |
Und zum Schluss wird dieses via cron alle 30 minuten aufgerufen:
30 * * * * /home/pi/gnuplot-temperature.sh |
ganglia
Erweiterte Statistiken lassen sich mit ganglia erstellen, welches zuerst installiert werden muss:
apt-get install ganglia-monitor rrdtool gmetad ganglia-webfrontend |
Nun wird via cronjob ganglia mittels gmetic mit den aktuellen Daten gefüttert:
* * * * * /usr/bin/gmetric -n my_room_temperature -t float -v $(/home/pi/getTemp.py) |