Temperaturmessung mit einem 10€ Eigenbau-Sensor

Temperaturkurve mit gnuplotZurzeit befasse ich mich in der Firma intensiv mit dem Thema “Systemüberwachung mit Nagios” und habe inzwischen eigentlich alles in die Überwachung aufgenommen, was man überwachen kann: Services auf Windows-Servern, die Server selbst, den Betriebszustand, Toner- und Papierfüllstand von Druckern usw. Und außerdem auch die Temperatur in unserem Serverraum ‘zwischen den Servern‘ (in diesem Moment 28.5° [viel zu warm!]) und ‘an der Klimanlage‘ (in diesem Moment 11.0° [kalt genug]). Tolle Sache! Sowas wollte ich für zu Hause auch! Die Preise für diese Netzwerk-Remotesensoren liegen schnell bei >200€ – ganz klar zuviel. Auch lokal an den Rechner anschließbare Temperaturfühler schlagen mit mindestens 50€ zu Buche. Alles viel zu viel Geld für etwas, was man eigentlich gar nicht braucht und trotzdem haben will. Und dann fand ich durch Zufall im Netz eine Eigenbauanleitung für das 1-Wire System!

[Reine und sachliche Bastelanleitung findet man bei google über die Suchbegriffverkettung ‘digitemp ds18 linux’ oder am Ende dieses Seite – dieser Artikel hier versteht sich mehr als eine Kombination aus Anleitung und Abenteuerbericht ;-)]

So solls später mal aussehen:
Temperaturkurve mit gnuplot

Eine wichtige Quelle war mir die Seite von Richard Lippmann, welche mich insbesondere aufgrund des dort zu findenden Platinenlayouts gerettet hat. Mein erster Bastelversuch scheiterte an meine Unfähigkeit eine Schaltskizze zu lesen. Naja, bin halt Softwareentwickler und Biker und kein Elektroingenieur. Aber fangen wir mal ganz langsam und von vorne an.

Die Grundvoraussetzung ist ein Linux-Rechner mit einer seriellen Schnittstelle. Natürlich geht es auch mit Windows und/oder USB, aber das habe ich weder getestet noch habe ich (vorerst) vor das zu tun. Bei mir ist ein Athlon 1GHz mit Ubuntu 8.10 und Nagios 3.1 im Einsatz (in der Firma; zu Hause sogar nur ein PIII mit 466MHz) – funktioniert (beides) einwandfrei. Die benötigte Software Digitemp ist im Debian-Repository und kann mit apt installiert werden. Dazu aber später. Jetzt geht’s erstmal ans Löten bzw. zu Conrad Elektronik. Mit der folgenden Einkaufsliste bekommt man dort alles, was man an Hardware und Teilen haben muss:

  • 1 x Dallas Semiconductor DS1820 Temperatursensor [176168 – 62] 5,08€
  • 2 x Schottky Diode SB130=140 (oder 1N5818) [164828-62] 1,04€
  • 1 x Zener Diode 6.2V – ZF6,2 (oder 1N5234) [180599 – 62] 0,27€
  • 1 x Zener Diode 3.9V – ZF3,9 (oder 1N5228) [180556 – 62] 0,27€
  • 1 x Metallfilm-Widerstand 1,5 kOhm, 0,25 Watt [408182 – 62] 2,15€ (100Stk)
  • 1 x SUB-D-Buchsenleiste 9 polig [742082 – 62] 0,52€
  • 1 x SUB-D Haube/Gehäuse 9 polig [711764 – 62] 1,21€
  • 1 x Universal-Streifenraster-Platine [527610 – 62] 1,17€
  • 4-adriges Kabel zur Verbindnug Platine <-> Sub-D
  • 2-adriges Kabel zur Verbindnug Platine <-> Temperatursensor

Soweit so gut. Nun muss man die Bauteile gemäß des folgenden Schaltplans bzw. des Platinenlayouts auf die Platine löten (“Nicht braten!”, wie Sven meinte…):

Schaltplan

Platinenlayout

DS1820-Beinchen
   
Bildquellen: http://lena.franken.de/hardware/temperaturmessung.html

Vereinzelt findet man den Hinweis, dass man das hier als ‘not needed’ markierte Beinchen bei parasitärer Stromversorgung (das ist das was wir hier machen) auf Masse (gnd) legen sollte. Ich hab’s bei mir so gemacht und es funktioniert. Möchte man mehr als einen Sensor anschließen (>100 sollen möglich sein), so müssen diese parallel geschaltet werden.

Ob das Ganze jetzt auch funktioniert kann man relativ einfach überprüfen. Zuerst installieren wir Digitemp aus dem Repository…

conzi@tux:~$: sudo apt-get digitemp

…und legen einen Link an, damit wir die von uns gewünschte Version mit digitemp starten können:

conzi@tux:~$: sudo ln -s /usr/bin/digitemp_DS9097 /usr/bin/digitemp

Nun kommt die Stunde der Wahrheit!

conzi@tux:~$: /usr/bin/digitemp -w -s /dev/ttyS0
DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
Turning off all DS2409 Couplers
.
Devices on the Main LAN
108A48A9010800EE : DS1820/DS18S20/DS1920 Temperature Sensor

Der Schalter -w (=walk) weist das Programm an, den kompletten 1-Wire-Bus zu durchlaufen und alle Geräte anzuzeigen, die gefunden werden. Wie man in der letzen Zeile eindrucksvoll sehen kann, hat es bei mir einen “DS1820/DS18S20/DS1920 Temperature Sensor” mit der Seriennummer/ID 108A48A9010800EE entdeckt. Unsere Schaltung funktioniert also. [Sollte er bei Dir keinen Sensor finden: Stimmt die Schnittstelle? /dev/ttyS0 = serielle 1,/dev/ttyS1 = serielle 2, usw. Alle Lötpunkte überprüfen! Stimmen die Kontakte am Sub-D? Sind die Dioden an den richtigen Stellen und richtig herum eingelötet? Ist irgendwo ein Kurzschluss/eine Lötbrücke zu sehen?]

Bisher haben wir aus unsere Schaltung nur die Erkenntnis gewonnen, dass sie funktioniert. Jetzt wäre es natürlich schön, wenn wir auch die Temperatur ermittlen könnten. Das ist schließlich die höchste Aufgabe so eines Temepratursensors. Dazu ist noch ein weiterer Zwischenschritt von Nöten:

conzi@tux:~$: /usr/bin/digitemp -i -s /dev/ttyS0
DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
Turning off all DS2409 Couplers
.
Searching the 1-Wire LAN
108A48A9010800EE : DS1820/DS18S20/DS1920 Temperature Sensor
ROM #0 : 108A48A9010800EE

Der Schalter -i (=initialize) weist das Programm an, alle gefundenen Sensoren nebst IDs, Schnittstellen usw. in der Datei .digitemprc abzuspeichern. Das hat den Vorteil, dass bei zukünftigen Messungen nicht immer der gesamte Bus durchsucht werden muss, sondern gezielt auf vorhandene Sensoren zugegriffen werden kann. Der Nachteil ist, dass für jeden neuen Sensor eine Initialisierung erforderlich ist. Nun geht’s an die Temperatur:

conzi@tux:~$: /usr/bin/digitemp -a -r750
DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
Apr 30 11:34:55 Sensor 0 C: 25.50 F: 77.90

Juchu! 25.5°C wurden gemessen! Der Aufruf mit dem Schalter -a (=all) läßt digitemp alle bekannten Sensoren abfragen und auslesen. Der Parameter -r750 übergibt eine Leseverzögerung. Ohne diese klappt’s bei mir nicht und ich erhalte immer 85°C (=Fehlermeldungstemperatur) zurück. Auch das wird im Web auf die “parasitärer Stromversorgung” zurückgeführt.

Den Befehl zum Ermitteln der Temperatur habe ich nun in ein Script (/usr/bin/testnetztemp) gepackt und rufe dieses (im Moment noch) menütlich auf. Gleichzeitig erzeuge ich mit gnuplot eine PNG-Datei, die die Temperaturkurve dar- und auf dem Webserver bereitstellt:

/usr/bin/testnetztemp:


#!/bin/bash

#Sensor auslesen und Ergebnis ins Logfile schreiben
/usr/bin/digitemp -a -r750 -l/var/log/digitemp/$(date +%Y%m%d)-temperature -o"%Y-%m-%d %H:%M:%S Sensor %s C: %.2C" > /dev/null

#gnuplot-Kommandos zusammenbasteln und absetzen
echo "set term png; set out '/var/www/testnetztemperatur.png'; set title 'Testnetztemperatur'; set xlabel 'Uhrzeit'; set ylabel 'Temperatur [Grad C]'; set xdata time; set timefmt '%Y-%m-%d %H:%M:%S'; plot '/var/log/digitemp/$(date +%Y%m%d)-temperature' using 1:6 smooth unique; " | /usr/bin/gnuplot

[Die Zeilenübrüche sind Quatsch! Das Script besteht aus zwei langen Zeilen!]

Für Nagios habe ich mir dann noch einen Sensor check_digitemp gebastelt, der die Temperatur aus der letzen Zeile des Logfiles ausliest, diese mit einem Grenzwert für WARNING und einem CRITICAL vergleicht und entsprechend einen Status zurückgibt. Daraufhin entscheidet Nagios, ob eine Alarmierung per Mail oder SMS erforderlich ist. Diesen Sensor werde ich bei Interesse oder Gelegenheit hier auch noch posten.

Viel Spass bei Nachbauen!

Bekannte und inzwischen behobene Probleme:

  • CronJob funktioniert nicht:
    Ich habe festgestellt, dass sich die .digitemprc im Home-Verzeichnis des beim CronJob verwendeten Users befinden muss. Also einfach eine aktuelle Version dort hinkopieren! Beispiel: Man hat digitemp -i als Benutzer Conzi ausgeführt, will den CronJob aber als root laufen lassen, so hilft sudo cp ~/.digitemprc /root
  • CRC-Fehler:
    Ich hatte nach dem Bau meines zweiten Adapters große Probleme, den Sensor zum auszulesen. Die Erkennung und Initialisierung funktionierte reibungslos, aber das Auslesen der Temperatur gab immer nur eine CRC-Fehlermeldung (ungefähr: ...returned CRC 63, expected 0x00...) zurück. Die Lösung war, die .digitemprc zu löschen und anschließend mit digitemp -w und digitemp -i die Erkennung der Sensoren erneut durchführen zu lassen.

Und zum feierlichen Abschluss noch eine 15-minütlich aktualisierte Grafik meiner Sensoren Straße, Garten, Vorlauf und Rücklauf:
Live-Temperatur aus Euskirchen

Hier noch ein paar Quellen/Links:
http://lena.franken.de/hardware/temperaturmessung.html
http://www.digitemp.com/
http://linuxnetmag.berlios.de/de/issue8/m8temperature1.html
http://www.linuxfocus.org/English/November2003/article315.shtml
http://public.rz.fh-wolfenbuettel.de/~hamannm/general/digitempd.html
http://www.hoppie.nl/tempsens/

PS: Den ganzen Zirkus gibt’s auch in “fertig und schön”: http://www.1-wire.de/

Update 1: Zwischenzeitlich habe ich aufgerüstet und verwende den iButtonLink LinkUSB Adapter. Den gibt’s bei Fuchs Elektronik schon für ~28€. Auch die Sensoren sind dort mit ~2€ günstiger als bei Conrad Elektronik. Ich habe vier Sensoren verbaut, die die Temperatur am Vor- und Rücklauf sowie am Abgasrohr meiner Heizung messen und einen weiteren Sensor, der die Außentemperatur auf der Süd-/Straßenseite misst. Meine aktuellen Messergebnisse findet man unter http://www.conzi.com/data.

Update 2: In den letzten Tagen habe ich Uwe bei seinen ersten Gehversuchen unter Linux unterstützt und ihm letztendlich zu den ersten Messergebnissen mit dem DS18S20, digitemp und Ubuntu verholfen. Dabei habe ich mich selber wieder mit dem Thema befasst und eine ganz gute Anleitung zum Thema RRDTools gefunden. Dort wird u.a. beschrieben, wie man mit den RRDTools eine Datenbank anlegt und elegant Grafiken erzeugt: RRDTools bei Marty44
Ich habe schon mal meine in letzter Zeit gesammelten Daten in eine Round Robin Datenbank geschrieben und brassel im Moment an den Grafiken…

Update 3: Ich habe die Datenhaltung zwischenzeitlich komplett auf RRD umgestellt und musste irgendwann mal feststellen, dass es gar nicht so einfach ist, einer RRD-Datenbank eine weitere “Datasource” hinzuzufügen. Aber zum Glück habe ich hier (michael.thegrebs.com) die Lösung gefunden. Also habe ich gestern einen “Garten”-Sensor hinzugefügt und die Grafiken aufgebohrt…

Update 4: In naher Zukunft werde ich die Datensammlung auf einen 1-Watt Bifferboard umstellen. Auf M8IN.DE habe ich beschrieben, wie man auf diesem Mini-Rechner Debian zum Laufen bringen kann. Außerdem habe ich mit einem Arduino nebst Ethernet-Shield eine weitere (und relativ günstige) Methode gefunden, einen Sensor ohne PC ins Netzwerk zu hängen. Der Wert “Büro” wird im Moment vom Arduino geliefert. Noch spannender wird das Ganze, wenn der Netduino Plus marktreif und verfügbar ist. Dieser ist in C# programmierbar und hat eine Ethernet Schnittstelle on Board…

Update 5: Und wieder kommt neue/andere Hardware zum Einsatz. Nachdem ich eine zeitlang mit dem Bifferboard rumexperimentiert habe, musste ich leider feststellen, dass das alles nicht stabil genug läuft und eine andere Lösung her muss. Ich hatte meine Datenhaltung Anfang des Jahres auf eine Diskstation DS211j umgestellt und diese gerootet, so dass /optware genutzt werden kann. Digitemp gibt es erfreulicherweise via ipkg als optware-Paket, so dass es nahe lag, die DS einfach auch für die Temperatursensoren zu verwenden. Natürlich war es dann in der Praxis nicht ganz so einfach, aber nachdem ich begriffen hatte, wie man den Kernel kompiliert, klappts nun! Vielleicht schreibe ich bei Gelegenheit mal eine Anleitung oder Warte, bis das BeageBoard/Bone verfügbar ist ;-)