lost.tk
 
03. OKTOBER 2018   |   SMARTHOME

Temperatur- und Luftfeuchtigkeitsmessung

Im Folgenden beschreibe ich eine kostengünstige Möglichkeit zur Temperatur- und Luftfeuchtigkeitsmessung auf Basis von Openhab, einem Arduino und 433-MHz-Sensoren.

Benötigte Hardware:

  1. Temperatur- und Luftfeuchtigkeitssensoren mit Frequenz 433MHz
  2. Funkempfänger 433MHz
  3. Arduino-Nano-Klon ATMEGA328P CH340G 5V 16M
  4. USB auf Mini-USB Kabel

Benötigte Software:

  1. Eine lauffähige Openhab-Installation (bspw. auf einem Raspberry Pi)
  2. Programmcode für den Bootloader des ATMEGA328P (dazu später mehr)
  3. Installation des Serial-Bindings innerhalb von Openhab

Grobbeschreibung:

Die 433-MHz-Sensoren senden Temperatur- und Luftfeuchtigkeitsdaten, welche vom 433-MHz-Funkempfänger empfangen und vom ATMEGA328P interpretiert werden. Die interpretierten Daten werden anschließend in Openhab gespeichert und im Rahmen der Smart-Home-Lösung verfügbar gemacht.


Schritt 1: Sensordaten senden

Damit der Arduino-Klon die von den Sensoren gesendeten Daten interpretieren kann, müssen diese natürlich zunächst einmal Daten senden. Das ist der einfachste Schritt, denn die Sensoren werden bereits funktionsfähig geliefert. Von den unter "Benötigte Hardware" aufgelisteten Geräten können bis zu 8 Stück gleichzeitig betrieben werden, weil 8 verschiedene Kanäle belegt werden können. Da die Sensoren jeweils auch eine Sensor-ID übermitteln, könnten theoretisch auch auf ein und demselben Kanal mehrere verschiedene Sensoren voneinander unterschieden werden. Allerdings besteht das Problem, dass sich die Sensor-ID bei jedem Batteriewechsel ändert. Ich habe dieses Szenario deshalb zunächst nicht weiter betrachtet. Der nachfolgende Arduino-Code, sowie die Openhab-Konfiguration könnte aber entsprechend angepasst werden.

Wir legen also in den ersten Sensor die beiden benötigten AAA-Batterien ein, nachdem wir die kleinen Schieberegler auf der Rückseite, die nach dem Öffnen des Batteriefachs sichtbar werden, auf Kanal 1 und die Temperatureinheit "C°" eingestellt haben. Der Sensor sendet ab sofort ca. jede Minute die gemessenen Werte über die Frequenz 433MHz.


Schritt 2: Arduino-Klon vorbereiten

Bevor der Arduino-Klon die Sensordaten empfangen und interpretieren kann, muss er mit dem Funkempfänger verbunden werden. Lediglich drei Verbindungen sind dafür nötig:

  1. Die 5-Volt-Spannung
  2. Die Erdung
  3. Die Datenverbindung


Für die Verbindung des Funkempfängers nutze ich nur die Pins auf der rechten Seite (siehe Abbildung des Receivers), wobei der Pin mit der Bezeichnung "DER" nicht gebraucht wird. Wir verbinden also den rechten Spannungs-Pin ("+5V") des Funkempfängers mit dem 5-Volt-Pin des Arduino-Klons ("5V"), den rechten Erdungs-Pin ("GND") des Funkempfängers mit einem der beiden verfügbaren "GND"-Pins des Arduino-Klons und den "DATA"-Pin des Funkempfängers mit dem Digital-Pin-8 ("D8") des Arduino-Klons. Man kann auch einen anderen Daten-Pin am Arduino verwenden, jedoch ist der nachfolgende Bootloader-Code bei mir auf Pin 8 konfiguriert, so dass man diesen bei einer anderen Verbindung zum Funkempfänger entsprechend ändern müsste. Danach ist der Funkempfänger korrekt mit dem Arduino-Klon verbunden. Ich verwende im übrigen keine externe Antenne am Funkempfänger und der Empfang ist trotzdem über zwei Stockwerke ohne Probleme möglich.


Schritt 4: Microcontroller flashen

Jetzt müssen wir dafür sorgen, dass die Funknachrichten des Sensors interpretiert werden können. Das bedeutet, dass die gesendeten Signale in vom Menschen lesbare Informationen übersetzt werden. Dafür ist ein Code erforderlich, der sowohl den angeschlossenen Funkempfänger "versteht" und die Einzelbestandteile der Funknachricht separiert. Den passenden Code habe ich nicht selbst erstellt, sondern bei Github gefunden. Allerdings musste ich für die gewünschten Ausgaben noch ein paar Anpassungen vornehmen.

Download des angepassten Bootloader-Codes

Wir schließen den Arduino-Klon inkl. des angeschlossenen Funkempfängers per USB-Kabel an einen Computer an, auf dem eine Software zum Flashen von Arduinos installiert ist. Wir verwenden die heruntergeladene ".ino"-Datei, bzw. deren Inhalte, zum Flashen des Microcontrollers. Im Anschluss daran können wir prüfen, ob die bisherigen Schritte erfolgreich funktioniert haben. Dies kann bspw. auch mit der Flash-Software erfolgen, die in der Regel über einen seriellen Monitor verfügt (in der Arduino-Software unter "Werkzeuge" > "serieller Monitor") Dieser Monitor zeigt an, was der Arduino über die serielle Schnittstelle ausgibt/verarbeitet. Damit richtig angezigt wird, was unser Bootloader-Programm macht, muss die Baudrate auf 115200 gestellt werden.
Wenn in Abständen von ca. einer Minute jeweils Ausgaben mit dem eingestellten Sender-Kanal, der vom Sender gemessenen Temperatur und der Luftfeuchtigkeit empfangen und auf dem seriellen Monitor ausgegeben werden, waren die bisherigen Schritte erfolgreich und der Großteil der Arbeit liegt hinter uns.


Schritt 5: Openhab-Konfiguration anpassen

Wir fahren nun den Rechner herunter, auf dem Openhab installiert ist, stecken dann den geflashten Arduino per USB daran an und starten den Openhab-Rechner wieder. Wir müssen jetzt herausfinden, wie der gewählte USB-Anschluss am Gerät benannt ist. An meinem Raspberry funktioniert das bspw. in dem man einen Blick in das Verzeichnis "dev/" wirft. Im Terminal navigiere ich in das besagte Verzeichnis und lasse mir die Inhalte anzeigen.


cd /dev

ls


Unter den mit "tty" beginnenden Einträgen ist mindestens einer der auch die Buchstaben "USB" enthält. Bei mir ist es bspw. genau einer mit dem Namen "ttyUSB0". Diese Bezeichnung merken wir uns, denn wir benötigen sie beim Anlegen der Openhab-Items. Bevor wir das jedoch machen können, müssen wir das Openhab-Serial-Binding installieren. Das geht zum Beispiel sehr einfach mittels Paper UI. Dieses Binding wird benötigt, damit Openhab die Daten, die wir im vorigen Schritt selber über den seriellen Monitor ausgelesen haben, auch nach Openhab übertragen können. Darüber hinaus bietet das Binding gewisse Parsing-Möglichkeiten, die wir brauchen, um die für Openhab wesentlichen Informationen aus den vom Arduino übermittelten Daten extrahieren und weiterverwenden zu können.

Ist das Binding erfolgreich installiert, navigieren wir in das Items-Verzeichnis von Openhab und legen eine neue zusätzliche ".items"-Datei an. Im Terminal funktioniert das wie folgt:

cd /etc/openhab2/items

sudo nano sensors.items

In die Datei fügen wir folgenden Inhalt ein:

//433-F007TL-Thermostate via Arduino Nano
Number Zimmer1_Temperatur "Temperatur [%.1f °C]" { serial="/dev/ttyUSB0@115200,REGEX(Channel=1[ ]C=([-]?[0-9.]*))" }
Number Zimmer1_Feuchtigkeit "Feuchtigkeit [%.0f %%]" { serial="/dev/ttyUSB0@115200,REGEX(^.*Channel=1.*H=([0-9.]*))" }

Dabei muss beachtet werden, dass die Angabe "ttyUSB0" ggf. durch die bei euch vorliegende USB-Bezeichnung ersetzt werden muss (in beiden Items!). Zudem sind die obigen Items so konfiguriert, dass sie die Daten des Sensors auslesen, der auf Kanal 1 funkt. Wenn ihr euren Sender auf einen anderen Kanal eingestellt habt oder wenn ihr zu einem späteren Zeitpunkt weitere Items für weitere Zimmer mit zusätzlichen Sendern einrichten wollt, muss die Angabe "Channel=1", die sich im hinteren Teil der Items-Zeile im regulären Ausdruck befindet, auf den jeweiligen Kanal angepasst werden (in beiden Items!). Über

Text item=Zimmer1_Temperatur label="Temperatur"
Text item=Zimmer1_Feuchtigkeit label="Feuchtigkeit"

könnt ihr die beiden Items in einer Openhab-Sitemap platzieren und prüfen, ob die Werte des Sensors dort ankommen. Falls ja, habt ihr es geschafft. Ich wünsche viel Spaß beim Ausprobieren.