Temperatur Monitoring mit dem Raspberry PI

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
Die resultierende Grafik der Temperaturstatistik
Die resultierende Grafik der Temperaturstatistik

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)

Published by

Steven Varco

Steven ist ein Redhat RHCE- und Kubernetes CKA Zertifizierter Linux-Crack und ist seit über 20 Jahren sowohl beruflich wie auch privat auf Linux spezialisiert. In seinem Keller steht ein Server Rack mit diversen ESX und Linux Servern.

Schreibe einen Kommentar

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