Temperaturüberwachung mit Check_MK, Raspberry Pi und 1-wire DS18B20

Ich habe eine günstige Möglichkeit gesucht viele externe Temperatursensoren in Check_MK zu implementieren, die ich auch anderweitig für Automatisierung nutzen kann. Bei mir läuft Check_MK auf einem Raspberry Pi, auf dem auch die Sensoren aufgesteckt werden. Die Sensoren können aber auch auf einem eigenen Raspberry Pi gesteckt werden, wenn der Raspberry Pi einen Check_MK Agent installiert hat.

Zuvor schrieb ich etwas über Automatisierung: Den Punkt werde ich nachgelagert ausgiebig bearbeiten. Mein Ziel ist hier, dass ich Temperatursensoren für die Poolheizung installiere und die Pumpe „intelligent“ laufen lasse. Dafür kommt ein Sensor kommt in den Pool für die Wassertemperatur, ein Sensor direkt an ein Rohr einer Solarschnecke, ein Sensor außen, irgendwo im Schatten um eine korrekte Außentemperatur zu ermitteln und ggf. noch einen Sensor im Rücklauf (dem erhitzten Wasser aus den Solarschnecken). Aus den Werten soll dann anhand eines Skriptes zyklisch ermittelt werden, ob die Pumpe eingeschaltet werden kann (z.B. Pool ist kalt, Solarschnecke ist warm) oder aber ausgeschaltet werden bzw bleiben sollte (Pool hat Zieltemperatur erreicht (ggf. abhängig von Außentemperatur) oder Pool ist kalt, Solarschnecken sind kälter oder nicht wärmer oder nur minimal wärmer). Das Ganze möchte ich perspektivisch z.B. in einem Pythonskript unterbringen, dass dann über einen Cronjob auf dem Raspberry läuft und eine Netzwerksteckdose bei Bedarf ein- / ausschaltet. Aber erstmal zu den Punkten die schon umgesetzt sind:

Hier die Liste der benötigten Hardware:
Raspberry Pi mit GPIO (ich benutze einen Raspberry PI 4)
– ein oder mehrere 1-wire Sensoren DS18B20
Adapter Board Set für die Sensoren (alternativ kann man auch einen 4.6k Ohm Widerstand zwischen VCC und Data schalten, Anleitungen dafür finden sich überall)

Das Adapter Board habe ich mit dem ersten DS18B20 verbunden:
Schwarz auf GND
Rot auf VCC
Gelb auf DATA

Das mitgelieferte Kabel habe ich wie folgt verbunden
Blau auf DAT am Adapter Board und Pin 7 (GPIO 4) auf dem Raspberry
Grün auf VCC am Adapter Board und Pin 1 (+3,3V) auf dem Raspberry
Gelb auf GND am Adapter Board und Pin 9 (GND) auf dem Raspberry

Die anti-statische Verpackung des Adapter Boards habe ich genutzt, um das Adapter Board vor Kurzschlüssen zu schützen. Die Eine Seite habe ich dafür komplett aufgeschnitten und auf der anderen ein Loch gemacht, durch die die Kabel gerade hindurch passen. Wenn alles verkabelt ist, kann man den Beutel mit Klebeband verkleben. Schöner wäre natürlich ein Gehäuse. Ich wollte aber ein schnelles Ergebnis.

Wenn man mehr als nur einen Sensor anschließen will kann man die Sensoren parallel an das Adapter Board anschließen. D.h. alle schwarzen Kabel der Sensoren auf GND, alle roten Kabel der Sensoren auf VCC und alle gelben Kabel der Sensoren auf DATA.

Damit man später nicht durcheinander kommt welcher Sensor welcher ist, sollte man die Sensoren nacheinander anschließen. Wer aufgrund von starken Temperaturunterschieden der Sensoren ohnehin weiß, was was ist, kann natürlich auch alle auf einmal anschließen.

So weit so gut. Jetzt ist die Hardware also installiert. Jetzt geht es um den Software Part. Starten wir also den Raspberry Pi wieder.

Zunächst muss 1-wire aktiviert werden. Also folgedes eingeben:

sudo raspi-config

Interface Options -> 1-Wire -> Enable

sudo vi /boot/config.txt

Hier am Ende der Datei folgedes hinzufügen:

#Enable OneWire Protocol
dtoverlay=w1-gpio
gpiopin=4

Dann den Raspberry neu starten

sudo reboot now

Wenn man alles richtig gemacht hat, sollte nach absetzen dieser Zeile die Anzahl der angeschlossenen Sensoren ausgegeben werden.

cat /sys/devices/w1_bus_master1/w1_master_slave_count

Jetzt lassen sich die Sensoren schon auslesen. Dazu ins Verzeichnis der 1-wire Sensoren wechseln

cd /sys/bus/w1/devices

Mit ls lassen sich die Sensoren anzeigen. Die DS18B20 Sensoren beginnen alle mit „28-„

Die Werte lassen sich so auslesen:

cat 28-01204e93c742/w1_slave

Wichtig ist, dass die erste Zeile mit einem YES endet (Verkabelung ist korrekt / Checksumme passt). Die Temperatur steht am Ende der zweiten Zeile. t=33812 bedeutet 33,812°C.

Jetzt muss nur noch dieser Wert in Check_MK übermittelt werden. Leider kann Check_MK den Wert nicht nativ auslesen, also schreiben wir einen eigenen Check dafür.

cd /usr/lib/check_mk_agent/local
vi Temp-NetworkRack.py

Wie die .py-Datei heißt ist unerheblich. Ich nenne die Datei immer wie den Check, dann finde ich es später besser. Jeder Sensor braucht einen eigenen Check und somit eine eigene Datei.

Inhalt von Temp-NetworkRack.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
###edit this
sensorname = „Temp-NetworkRack“
minwarn = 10.0
mincrit = 5.0
maxwarn = 38.0
maxcrit = 40.0
file = open(‚/sys/bus/w1/devices/28-01204e93c742/w1_slave‘, ‚r‘)
###stop editing here
 
fileLines = file.readlines()
file.close()
 
count = 0
crc = 0
for line in fileLines:
  count += 1
  if count == 1:
    if line.strip().endswith(„YES“):
       crc = 1
  if count == 2:
    if crc == 1:
       pos = line.strip().find(‚t=‘)
       temp1 = line.strip()[pos+2:]
       templen = 5 – len(temp1)
       temp = temp1[:2-templen] + „.“ + temp1[2-templen:]
       state = „0“
       stateext = „OK“
       if float(temp) < minwarn:
         state = „1“
         stateext = „WARN“
       if float(temp) < mincrit:
         state = „2“
         stateext = „CRIT“
       if float(temp) >= maxwarn:
         state = „1“
         stateext = „WARN“
       if float(temp) >= maxcrit:
         state = „2“
         stateext = „CRIT“
       print(„{} {} temp={};{};{};{};{} {} – Temp {} °C“.format(state,sensorname,temp,maxwarn,maxcrit,mincrit,maxcrit,stateext,temp))
    else:
       print(„3 temp=0 Unknown – Wiring problem with sensor“)

Hier die Werte am Anfang der Datei füllen:

sensorname: Name des Sensors
minwarn: Temperatur unterhalb der gewarnt werden soll
mincrit: Temperatur unterhalb der ein kritischer Alarm kommen soll
maxwarn: Temperatur oberhalb der gewarnt werden soll
maxcrit: Temperatur oberhalb der ein kritischer Alarm kommen soll
file: ‚/sys/bus/w1/devices/28-01204e93c742/w1_slave‘ durch den Pfad des eigenen Sensors ersetzen.

Nach dem Speichern der Datei nicht vergessen die Datei ausführbar zu machen.

chmod 755 Temp-NetworkRack.py

Jetzt in Check_MK WATO öffnen und die Services des Hosts (Raspberry Pi) öffnen. Sollte der Scan nicht zufällig bereits gelaufen sein einen Full Scan machen. Jetzt sollte der neue Sensor auftauchen und gemonitored werden können.

Ich versuche meine Erfahrungen und Fehler so gut es geht hier niederzuschreiben und die verwendeten Artikel mit Links zu versehen, wenn es denn welche gibt. Wenn über die Produktlinks eingekauft wird erhalte ich einen kleinen Teil davon. Für den Käufer ändert sich am Endpreis nichts. Wenn euch der Blog gefällt, würde ich mich freuen, wenn ihr mich auf diese Weise beteiligen würdet.

Schreibe einen Kommentar