openHAB :: Einbinden von Temperatursensoren

openhab-logo-squareNachdem wir openHAB nun installiert und konfiguriert haben, möchten wir natürlich in openHAB unsere Temperatursensoren einbinden, die wir in dieser Anleitung in Form als TEMPer1 USB-Dongles oder aus dieser Anleitung als DHT22-Sensor an unsere Himbeere angeschlossen haben. Nett wäre zudem, die Betriebstemperatur des Raspberry Pi selbst in openHAB zu visualisieren.

Da unser Haushalt leider über keine Anwendungsentwicklungsfachkraft verfügt, sind sämtliche hier vorgestellten Lösungsansätze mit Bash-Scripten und SSH-Verbindungen realisiert. Dennoch ist dieser Weg sehr praktikabel, was Erfahrungen über einen längeren Zeitraum gezeigt haben. Für diese Methode ist es notwendig, den öffentlichen Schlüssel des openHAB-Servers in die Liste der autorisierten Schlüssel aller Raspberry einzufügen. Dies ist detailliert in dieser Anleitung beschrieben. Dabei nicht den letzten Schritt des erstmaligen, manuellen Anmeldens vergessen, da dort noch nach der Zulassung des öffentlichen Schlüssels der Gegenseite gefragt wird.

 

Verfügbare Artikel zu openHAB

little_blue_dot Einleitunglittle_blue_dot Einbinden der Internetgeschwindigkeitlittle_blue_dot RFID-Lesegerät einbinden
little_blue_dot Installationlittle_blue_dot Präsenzerkennung via Bluetooth und Pinglittle_blue_dot Einbinden von DS18B20-Sensoren
little_blue_dot Konfigurationlittle_blue_dot Kleines Netzwerkmonitoringlittle_blue_dot ical-Abfallkalender einbinden
little_blue_dot Reverse-Proxy für OpenHABlittle_blue_dot Einbinden von LG-Fernsehern [Update]little_blue_dot openHAB als Wecker
little_blue_dot Datenspeicherung und Statistikenlittle_blue_dot Einbinden Schaltern und Kontaktenlittle_blue_dot Einbinden von Bewegungssensoren
little_blue_dot Regeln planen und konfigurierenlittle_blue_dot Einbinden von Funksteckdosen (433 MHz)little_blue_dot Einbinden einer FritzBox
little_blue_dot Einbinden von USB-Steckdosenleisten (SIS-PMS)little_blue_dot Infrarotgesteuerte Geräte einbindenlittle_blue_dot Sprachausgabe auf einem Raspberry
little_blue_dot Einbinden von Temperatursensorenlittle_blue_dot Steuerung mit NFC-Tagslittle_blue_dot Schaltbare Steckdosenleiste mit Relais
little_blue_dot Externer Zugriff mit my.openhab

 

 

 

Temperatursensor TEMPer1

Dieser Temperatursensor ist in unserem Beispiel an einem Raspberry angeschlossen, der auf die fiktive IP-Adresse “192.168.23.236” konfiguriert wurde. Der Server, auf welchem die openHAB-Instanz installiert wurde, ist unter der IP-Adresse “192.168.23.212” erreichbar.

Zunächst stellen wir sicher, dass der Sensor an der Himbeere selbst korrekt installiert ist und ausgelesen werden kann. Dazu befolgen wir die Schritte dieser Anleitung.

Anschließend erstellen wir auf dem Server ein Script, mit welchem wir die Messwerte via SSH auf dem Raspberry auslesen können und speichern dieses in ein von uns gewähltes Verzeichnis. In unserem Beispiel wurde das Script unter “/scripts/temp.sh” gespeichert.

#!/bin/bash
/usr/bin/ssh -i /scripts/.ssh/id_rsa root@192.168.$1.$2 "/usr/local/bin/temper1.pl"

 

Wir erlauben die Ausführung des Scripts durch

chmod +x /scripts/temp.sh

und übertragen den Besitz an “openhab” durch

chown openhab: /scripts/temp.sh

 

Zur Erläuterung des Scripts:

Das Script erwartet beim Aufruf zwei Parameter: das dritte sowie das letzte Oktett der IP-Adresse des Raspberry Pi’s. Zu dieser nun vollständigen IP-Adresse wird eine SSH-Sitzung aufgebaut und der in den Anführungszeichen gesetzte Befehl ausgeführt. Die Ausgabe des Befehls (in diesem Fall die zurückgegebene Temperatur des TEMPer1-Sensors) wird anschließend auch vom Script ausgegeben. So findet der Temperaturwert den Weg in das eigentliche openHAB-Item, welches wir wie folgt in der “NAME_DER_KONFIGURATION.items” definieren:

Number TEMP_WOHNZIMMER "Temperatur Wohnzimmer [%.1f °C]" <temperature> { exec="<[/scripts/temp.sh 23 236:60000:REGEX((.*?))]" }

Zur Erläuterung der Item-Definition:

  • Der Itemtyp wird als Nummer festgelegt
  • Das Item wird als “TEMP_WOHNZIMMER” bezeichnet
  • Die Ausgabe wird auf “Temperatur Wohnzimmer XX°C” konfiguriert, wobei “%.1f” mit dem aktuellen Wert des Items ersetzt wird
  • Als Icon wird das Symbol “temperatur” gewählt, welches sich im Ordner “/usr/share/openhab/webapps/images” befinden muss
  • Das Addon “exec” wird verwendet, welches via “apt-get install openhab-addon-binding-exec” installiert wird . Zudem wird der gesamte Pfad zum oben erstellten Script angegeben sowie der Scriptname selbst. Im Anschluss werden die vom Script geforderten Parameter übergeben sowie der Aktualisierungsintervall auf 5 Minuten (60.000 Millisekunden) festgelegt. Die Ausgabe des Scripts wird 1:1 als Wert des Items übernommen.

 

Nun können wir das eben definierte Item in unsere Sitemap einbinden. Im folgenden Beispiel wird zudem eine Datenarchivierung via “RRD4J” genutzt, so dass wir als Unterseite des eigentlichen Temperatureintrags Statistiken mit wählbaren Zeiträumen darstellen können:

Text item=TEMP_WOHNZIMMER {
   Switch item=CHART_PERIOD label="Zeitspanne" mappings=[0="Stunde", 1="Tag", 2="Woche"]
   Chart item=TEMP_WOHNZIMMER period=h refresh=300 visibility=[CHART_PERIOD==0, CHART_PERIOD=="Uninitialized"]
   Chart item=TEMP_WOHNZIMMER period=D refresh=1800 visibility=[CHART_PERIOD==1]
   Chart item=TEMP_WOHNZIMMER period=W refresh=3600 visibility=[CHART_PERIOD==2]
}

 

Wenn wir die Graphen wie oben gezeigt einsetzen wollen, dann benötigen wir zudem ein weiteres Item, dass wir in einer beliebigen “.items”-Datei definieren:

Number CHART_PERIOD

 

Ohne diese Statistiken sähe die abschließende Einbindung wie folgt aus:

Text item=TEMP_WOHNZIMMER

 

Temperatursensor DHT22

Auch der Temperatur- und Luftfeuchtigkeitssensor Typ DHT22 lässt sich in openHAB einbinden. Dazu befolgen wir zunächst diese Anleitung, um den Sensor am Raspberry Pi anzuschließen und die notwendige Pakete zum Abrufen der Sensordaten zu installieren. Wurde die Anleitung erfolgreich befolgt, können wir lokal am Raspberry die Temperatur sowie die Luftfeuchtigkeit mittels

/PFAD_ZUM_SCRIPT/loldht GPIO-PORT

abrufen und diese werden uns im besten Fall auch vom Sensor mitgeteilt:

1

 

 

Nun prüfen wir, ob wir den gleichen Vorgang vom openHAB-Server aus mittels SSH durchführen können:

/usr/bin/ssh -i /scripts/.ssh/id_rsa root@192.168.23.236 "/scripts/lol_dht22/loldht 5 | grep "Temperatur""

Bei diesem Befehlsaufruf, in welchem natürlich die entsprechende IP-Adresse des eigenen Raspberry eingesetzt werden sollte, gehen wir noch einen kleinen Schritt weiter und filtern die Ausgabe nur nach der Zeile, in der “Temperatur” vorkommt.

 

2

 

 

Soweit so gut, jedoch bringt uns die Darstellung beider Werte in einer Zeile nicht all zu viel. Daher nutzen wir das Linux-Tool “cut“, um die Zeile aufzuteilen. Wir definieren als Trenner ein Leerzeichen und wählen für die Luftfeuchtigkeit die dritte Spalte und für die Temperatur die siebte Spalte. Nun erhalten wir als Ausgabe jeweils den Wert, den wir ermitteln wollten.

 

3

 

 

Genau diesen Vorgang verpacken wir nun in das Bash-Script “/scripts/dht22.sh” und lassen dabei die Möglichkeit zur Wahl verschiedener Himbeeren offen:

#!/bin/bash

GPIO=$2
INPUT=$(/usr/bin/ssh -i /scripts/.ssh/id_rsa root@192.168.23.$1 "/scripts/lol_dht22/loldht $GPIO |grep "Temperature"")
HUM=$(echo $INPUT|cut -d " " -f3)
TEMP=$(echo $INPUT|cut -d " " -f7)

if [ "$3" = "HUM" ]; then
   echo $HUM
fi

if [ "$3" = "TEMP" ]; then
   echo $TEMP
fi

 

Wir erlauben die Ausführung des Scripts durch
chmod +x /scripts/dht22.sh

und übertragen den Besitz an “openhab” durch

chown openhab: /scripts/dht22.sh

 

Dieses Script benötigt folgende Parameter zur Ausführung:

  1. Letztes Oktett der IP-Adresse der Himbeere
  2. GPIO-Port
  3. Gesuchter Wert, “HUM” oder “TEMP

Zur Erklärung dieses Scripts:

Zunächst wird die gleiche Abfrage durchgeführt, wie wir sie weiter oben manuell durchgeführt haben. Jedoch wird die Ausgabe (die gesamte Zeile mit beiden Daten) in die Variable “INPUT” gelegt. Nun werden die Werte der Luftfeuchtigkeit sowie der Temperatur “ausgeschnitten” und ebenfalls in eigene Variablen gelegt. Je nach Abfrage und somit Wert des seitens openHAB übergebenen Parameters wird nun entweder die Luftfeuchtigkeit oder die Temperatur ausgegeben.

 

4

 

 

Update
Aufgrund dessen, dass es hin und wieder zu “Ausreißern” bei den Messergebnissen kommt,
habe ich ein kleines Script gebastelt, um solche fehlerhaften Messergebnisse auszusortieren.
Das Script und seine Beschreibung befindet sich am Ende dieses Beitrags.

 

Anschließend definieren wir zwei Items für die beiden möglichen Werte des DHT22-Sensors:

Number TEMP_WOHNZIMMER "Temperatur Wohnzimmer [%.1f °C]" <temperature> { exec="<[/scripts/dht22.sh 236 5 TEMP:60000:REGEX((.*?))]" }
Number LUFT_WOHNZIMMER "Luftf. Wohnzimmer [%.1f %%]" <humidity> { exec="<[/scripts/dht22.sh 236 5 HUM:60000:REGEX((.*?))]" }

In diesem Beispiel wird ein am Raspberry mit der IP-Adresse 192.168.23.236 und GPIO-Port 5 angeschlossener DHT22-Sensor abgefragt; der Temperaturwert in das Item “TEMP_WOHNZIMMER” und der Wert der Luftfeuchtigkeit in das Item “LUFT_WOHNZIMMER” gelegt. Als Symbol wird passend “temperature” bzw. “humidity” gewählt, dessen entsprechende Bilddateien ebenfalls unter “/usr/share/openhab/webapp/images” gespeichert sind.

 

Zur Visualisierung der Werte konfigurieren wir die Sitemap wie folgt:

Text item=TEMP_WOHNZIMMER
Text item=LUFT_WOHNZIMMER

Natürlich lassen sich auch hier wie im Beispiel des TEMPer1 gezeigt Unterseiten für Statistiken einfügen.

 

Als beispielhafte Darstellung hier ein Ausschnitt unserer persönlichen Sitemap, nur von einem anderen Sensor, der jedoch mit dem gleichen Prinzip eingebunden wurde:

 

23

 

 

 

Temperatursensor DHT11

Auch für diesen Sensor erstellen wir unter dem Ordner “/scripts” ein neues Bash-Script und benennen es “dht11.sh“:

#!/bin/bash

#Einstellungen
MINTEMP=0
MAXTEMP=50
MINHUM=0
MAXHUM=100


if [ ! -d /tmp/dht11vars/ ]; then
    mkdir /tmp/dht11vars/
fi

PIN=$2
INPUT=$(/usr/bin/ssh -i /scripts/.ssh/id_rsa root@192.168.1.$1 "/scripts/dht11/Adafruit_DHT 11 $PIN" |grep "Temp")
HUM=$(echo $INPUT|cut -d " " -f7)
TEMP=$(echo $INPUT|cut -d " " -f3)

if [ "$3" = "HUM" ]; then
    if [ $(echo "if (${HUM} >  ${MAXHUM}) 1 else 0" | bc) -eq 1 -o $(echo "if (${HUM} <  ${MINHUM}) 1 else 0" | bc) -eq 1 ]; then
        if [ -f /tmp/dht11vars/dht_$1_pin$2_hum.txt ]; then
            cat /tmp/dht11vars/dht_$1_pin$2_hum.txt
        fi
    else
        echo $HUM
        echo $HUM > /tmp/dht11vars/dht_$1_pin$2_hum.txt
    fi
fi

if [ "$3" = "TEMP" ]; then
    if [ $(echo "if (${TEMP} >  ${MAXTEMP}) 1 else 0" | bc) -eq 1 -o $(echo "if (${TEMP} <  ${MINTEMP}) 1 else 0" | bc) -eq 1 ]; then
        if [ -f /tmp/dht11vars/dht_$1_pin$2_temp.txt ]; then
            cat /tmp/dht11vars/dht_$1_pin$2_temp.txt
        fi
    else
        echo $TEMP
        echo $TEMP > /tmp/dht11vars/dht_$1_pin$2_temp.txt
    fi
fi

 

Diesem Script erlauben wir die Ausführung durch

chmod +x /scripts/dht11.sh

 

Wir definieren die DHT11-Sensoren als neue Items in OpenHAB…

Number TEMP_UG "Temp. Keller [%.1f °C]" <temperature> { exec="<[/scripts/dht11.sh 234 24 TEMP:180000:REGEX((.*?))]" }
Number HUM_UG "Luftf. Keller [%.1f %%]" <humidity> { exec="<[/scripts/dht11.sh 234 24 HUM:180000:REGEX((.*?))]" }

 

…und binden diese in die Sitemap ein:

Text item=TEMP_UG label="Temperatur UG [%.1f °C]"
Text item=HUM_UG label="Luftfeuchtigkeit UG [%.1f %%]"

 

 

Temperatursensor des Raspberry Pi

Die notwendigen Informationen über die Kerntemperatur eines Raspberry Pi bringt dieser bereits von Haus aus mit. Zumindest kann ich dies bei der Debian-basierenden Distribution “Raspbian” bestätigen.

Zur Anzeige dieser Temperatur genügt ein einfaches Auslesen der Datei “/sys/class/thermal/thermal_zone0/temp” beispielsweise mit dem Linux-Tool “cat“:

 

24

 

Dividiert man die Ausgabe nun durch 1000, erhält man die CPU-Temperatur in Grad Celsius. Dies lässt sich natürlich auch ein kleines Bash-Script “/scripts/rbptemp.sh” verpacken, welches dazu dient auf unserem openHAB-Server ausgeführt zu werden:

#!/bin/bash
INPUT=$(/usr/bin/ssh -i /scripts/.ssh/id_rsa root@192.168.23.$1 "/bin/cat /sys/class/thermal/thermal_zone0/temp")
echo $INPUT/1000 |bc -l| python -c "print round(float(raw_input()),2)"

 

Wir erlauben die Ausführung des Scripts durch

chmod +x /scripts/rbptemp.sh

und übertragen den Besitz an “openhab” durch

chown openhab: /scripts/rbptemp.sh

 

Zur Erklärung:

Zunächst wird der Wert, wie bereits weiter oben manuell, via SSH auf dem Raspberry ausgelesen und in die Variable “INPUT” geschrieben. Der Inhalt dieser Variable wird nun durch 1000 geteilt, das Ergebnis auf zwei Nachkommastellen gerundet und abschließend ausgegeben.

 

25

 

Den ausgegeben Wert legen wir nun seitens openHAB in ein neues Item:

Number TEMP_RBP236 "Temperatur rbp236 [%.1f °C]" <temperature> { exec="<[/scripts/rbptemp.sh 236:60000:REGEX((.*?))]" }

 

Anschließend stellen wir das neue Item in der Sitemap dar:

Text item=TEMP_RBP236

 

Das Ergebnis könnte nun ähnlich der folgenden Grafik aussehen:

 

26

 

Falls noch Fragen offen sind, schreibt diese einfach in einen Kommentar unter diesen Beitrag.