Home Automation mit OpenHAB
433 MHz Module mit Raspberry Pi auslesen
Viele, preisgünstige Wetterstationen mit Außensensor für Temperatur (und teilweise Luftfeuchte) arbeiten für die Datenübertragung mit der 433 MHz Frequenz (genau genommen 433.92 MHz). Wer im Rahmen der Home Automation die Außentemperatur der vorhandenen Wetterstationen auslesen möchte, benötigt entsprechende Hardware und Software. Angeregt von einem YouTube Video habe ich mir einen RTL-SDR USB-Stick gekauft und an einem Raspberry Pi eingerichtet. Im Video wird der USB-Stick NESDR Mini 2+ von nooelec eingesetzt (wichtig: R820T2 Unterstützung). Im Rahmen der Internet Recherche finde ich schnell heraus, dass es Nachfolgeprodukte gibt und entscheide mich für den USB-Stick Nooelec NESDR SMArt V5 als Bundle mit drei Antennen.
Auf dem Raspberry Pi ist openhabian installiert. Für den Zugriff auf den Pi nutze ich das SSH Tool PuTTY. Die Anmeldung erfolgt mit dem Standard Benutzer openhabian und dem Passwort openhabian. Nach dem Einstecken des Sticks wird dieser vom Raspberry Pi erkannt. Überprüft werden kann das mit dem Befehl lsusb
Bus 001 Device 003: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Um die Temperatorsensoren auszulesen, muss noch ein Paket installiert werden. Details dazu sind auf GitHub zu finden: github.com/merbanan/rtl_433
Sicherheitshalber sollte die Paketliste mit sudo apt update aktualisiert werden. Jetzt kann das Paket mit sudo apt install rtl-433 installiert werden (Installation mit Y bestätigen). Mit rtl_433 -h kann anschließend die Hilfe aufgerufen werden.
rtl_433 startet das Programm. In meiner Umgebung gab es eine Fehlermeldung:
usb_open error -3
Please fix the device permissions, e.g. by installing the udev rules file rtl-sdr.rules
Um diesen Fehler zu beheben, muss eine neue Datei /etc/udev/rules.d/20.rtlsdr.rules (z.B. mit dem Tool nano) und folgendem Inhalt angelegt werden:
idVendor und idProduct müssen zu dem gefundenen USB-Stick (siehe oben) passen.
Anschließend USB-Stick entfernen, USB Ports mit sudo /etc/init.d/udev restart zurücksetzen und USB-Stick wieder verbinden. Jetzt ist das Programm einsatzbereit und kann mit rtl_433 gestartet werden. Ist ein Temperatursensor auf 433 MHz Basis verfügbar, sollte dieser nach maximal 60 Sekunden angezeigt werden.
Beispiele:
model : Solight-TE44 Id : 120
Channel : 1 Temperature: 10.00 C Integrity : CRC
model : WT450-TH House Code: 1
Channel : 1 Battery : 1 Temperature: 11.00 C Humidity : 29 % Sequence : 0
Die Namen (hier: Solight-TE44 und WT450-TH) werden vom Hersteller festgelegt und finden sich eher selten auf dem Gehäuse des Sensors. Werden viele Sensoren gefunden, kann es etwas dauern den eigenen Sensor herauszufinden.
Neben Temperatursensoren können weitere Einträge auftauchen. Reifendrucksensoren von Fahrzeugen, Rauchmelder, Fernbedienungen auf 433 MHz Basis, usw.
rtl_433 läuft in einer Endlosschleife und kann mit [Strg] + C beendet werden.
Wie kann ich jetzt die Daten in openHAB integrieren?
rtl_433 kann keine Daten direkt an openHAB senden. Dafür wird ein MQTT (kurz für: Mosquitto) Server benötigt. Dieser lässt sich auf dem Pi schnell installieren:
sudo apt install mosquitto -y
Zur Nutzung des Mosquitto Servers wird empfohlen einen MQTT User einzurichten. Zuerst wird überprüft, ob die Passwort Datei bereits exisiert:
ls /etc/mosquitto
Taucht die Datei passwd nicht auf, muss diese erstellt werden:
sudo touch /etc/mosquitto/passwd
Der touch Befehl erstellt eine leere Datei
Jetzt kann ein neuer User (hier: mqttuser) angelegt werden:
sudo mosquitto_passwd -c /etc/mosquitto/passwd mqttuser
Das Passwort wird 2x verdeckt eingegeben. Mit cat /etc/mosquitto/passwd kann überprüft werden, ob der User angelegt worden ist. Natürlich wird das Passwort nur verschlüsselt angezeigt.
Im nächsten Schritt wird die Mosquitto Konfiguration angepasst.
sudo nano /etc/mosquitto/mosquitto.conf
Am Ende der Datei die folgenden drei Zeilen hinzufügen:
allow_anonymous false
listener 1883
Die erste Zeile teilt dem MQTT Server mit, wo die Passwort Datei liegt und wie sie heißt. Die zweite Zeile stellt sicher, dass ein anonymer Benutzer nicht zulässig ist und in der dritten Zeile wird der Port 1883 definiert, damit der MQTT Server auch im lokalen Netzwerk erreichbar ist.
Abschließend noch den MQTT Server starten:
sudo systemctl start mosquitto.service
Der MQTT Server läuft als Service im Hintergrund. Daher wird in der Pi Konsole nichts angezeigt.
Wenn jetzt Daten von rtl_433 an den MQTT Server geschickt werden sollen, macht es Sinn, ein Tool zu installieren, mit dem die Daten angezeigt werden können, z.B. den MQTT Explorer (Download von der Seite mqtt-explorer.com, aktuell in der Version 0.4.0 beta). Ich nutze unter Windows die portable Version, die ohne Installation benutzt werden kann.
Der Name (hier: openHAB) kann beliebig gewählt werden. Host Adresse eingeben, Port 1883 ist Standard und sollte nicht geändert werden. User und Passwort wie oben angelegt eingeben und mit SAVE speichern.
Sollte nach Klicken auf CONNECT der Fehler Disconnected from server auftauchen, dann gibt es Probleme mit dem MQTT User. Temporär Abhilfe schaffen konnte ich mit allow_anonymous true in der MQTT Konfigurationsdatei /etc/mosquitto/mosquitto.conf. Gelöst ist das Problem aber damit nicht.
Die Einbindung von MQTT in openHAB ist schnell erledigt. In openHAB im Add-on Store das MQTT Binding installieren.
Anschließend unter Settings - Things rechts unten auf das Pluszeichen klicken, MQTT Binding und MQTT Broker auswählen.
Unique ID überschreiben und Label bzw. Location nach Bedarf anpassen. In Broker Hostename/IP die IP Adresse des Servers angeben, auf dem der MQTT Service läuft. Wichtig: unter Show advanced den MQTT User mit Passwort hinterlegen. Create Thing schließt die Einrichtung ab.
rtl_433 wird jetzt mit zusätzlichen Parametern gestartet, um die Daten der Sensoren an den MQTT Server zu schicken.
rtl_433 -C si -F "mqtt://192.168.0.182:1883,user=mqttuser,pass=xxxxxx"
xxxxxx durch das vergebene Passwort ersetzen
rtl_433 wird gestartet. Die letzte Zeile sollte MQTT Connection established zeigen.
Im MQTT Explorer wird ein neuer Eintrag rtl_433 sichtbar, darunter unter devices die gefundenen Sensoren. In meiner Umgebung aktuell die beiden Außentemperatur Sensoren.
Zur Anzeige der Temperatur in openHAB wird ein Pfad benötigt, der sich über den MQTT Explorer einfach auslesen lässt:
In openHAB einen neuen Eintrag unter Things erstellen. MQTT Binding anklicken und Generic MQTT Thing auswählen:
Das neu angelegte Thing auswählen und unter Channels auf Add Channel klicken
Channel Identifier, Label und Description sind frei wählbar. Da ein Temperaturwert ausgelesen werden soll, ist als Channel type Number Value auszuwählen. Unter MQTT State Topic wird der Pfad eingegeben, der oben im MQTT Explorer angezeigt wird. Am einfachsten kann dieser im MQTT Explorer markiert, kopiert und hier eingefügt werden. Optional können noch Minimum und Maximum Werte eingetragen werden. Nach Klick auf Create steht der neue Channel zur Verfügung.
Unter Model in der bereits angelegten Location mit Add Equipment ein neues Item hinzufügen:
Wetterstation auswählen und Create Points from Thing anklicken.
Nach Auswahl der Category temperature und Klick auf Add to Model sollte der Temperaturfühler bereits einen Wert anzeigen: