Raspberry Pi Zero W in openHAB 5 integrieren


Bisher habe ich in openHAB 5 Produkte von Shelly, Sonoff, amazon Alexa und andere erfolgreich eingebunden. Zur Erweiterung meiner Alarmanlage habe ich mit einem Raspberry Pi Zero W eine Lösung entwickelt, die ebenfalls mit openHAB 5 kommunizieren soll. In diesem Artikel werden die Grundlagen dafür beschrieben.

Voraussetzungen:


Vorausgesetzt das Betriebssystem ist korrekt installiert und konfiguriert, erfolgt der Zugriff auf den Zero über ein SSH Tool (ich empfehle PuTTY). Dafür wird lediglich die IP Adresse vom Zero benötigt. Diese wird über DHCP vom Router vergeben und kann am Router abgefragt werden (alternativ - soweit verfügbar - über einen IP Scanner).

Nach Eingabe der IP Adresse (bei mir: 192.168.0.142) und dem Port 22 in PuTTY wird nach Klick auf Open über WLAN die Verbindung zum Zero aufgebaut:

Zugriff mit PuTTY auf den Raspberry Pi Zero

Die Anmeldung (login) erfolgt über den bei der Konfiguration definierten Namen (hier: pi) und das festgelegte Passwort:

Anmeldung mit PuTTY auf den Raspberry Pi Zero erfolgreich

Details zum Betriebssystem werden angezeigt. Bei Bedarf kann die Betriebssystem Version jederzeit mit dem Befehl hostnamectl abgefragt werden.

Die Kommunikation zwischen dem Raspberry Pi und openHAB erfolgt mit der Programmiersprache Python über REST API. Python 3 ist standardmäßig installiert und sofort einsatzbereit. Mit dem Befehl python -V wird die Python Version angezeigt (bei mir: Python 3.11.2).

Im Internet weisen einige Quellen darauf hin, dass man für die Kommunikation mit openHAB eine python-openhab Bibliothek über PIP installieren muss. Bei PIP handelt es sich um das Standard-Paketverwaltungsprogramm für Python und dieses ist in der Standardkonfiguration nicht installiert. Für meine Zwecke ist die Bibliothek python-openhab auch nicht erforderlich. Die REST API wird "out of the box" unterstützt.

Die Abfrage eines openHAB Items kann einfach in Python getestet werden. In openHAB existiert das Switch-Item Alarmanlage, das die Zustände ON und OFF annehmen kann.

Python wird mit python gestartet. Die einzelnen Python Befehle werden direkt nach dem Prompt ">>>" eingegeben und jeweils mit der [Return]-Taste bestätigt. Zuerst wird das Modul requests importiert:

>>> import requests

Für den Zugriff auf meine openHAB Instanz mit dem Item Alarmanlage wird eine Variable definiert:

openhab = "http://192.168.0.xxx:8080/rest/items/Alarmanlage"
xxx durch die IP Adresse der lokalen openHAB Installation ersetzen!

Über .../rest/items/[Name des Items] werden die Variablen des Items ausgelesen. Die Anfrage wird über requests.get() verschickt. Das Ergebnis der Variablen state (OFF oder OB) im JSON Format wird in der zweiten Zeile ausgegeben:

response = requests.get(openhab)
print(response.json()['state'])

Abhängig vom Status des Items wird in der letzten Zeile OFF oder ON ausgegeben.

In diesem Beispiel handelt es sich um einen normalen http Request, der auch direkt in einem Browser eingegeben werden kann: http://192.168.0.xxx:8080/rest/items/Alarmanlage. Abhängig vom Browser wird die Antwort unstrukturiert:

{"link":"http://192.168.0.xxx:8080/rest/items/Alarmanlage","state":"OFF","lastState":"ON","lastStateUpdate":1776595705734,"lastStateChange":1776595705734,"metadata":{"semantics":{"value":"Equipment_AlarmSystem","editable":false}},"editable":true,"type":"Switch","name":"Alarmanlage","label":"Alarmanlage","category":"alarm","tags":["AlarmSystem"],"groupNames":[]}

oder strukturiert ausgegeben:

JSON Antwort http Request

Um jetzt den Status des Items Alarmanlage zu ändern, wird folgender Python Code benötigt:

headers = {"Content-Type": "text/plain"}
openhab = "http://192.168.0.xxx:8080/rest/items/Alarmanlage/state"
response = requests.put(openhab, data="ON", headers=headers)
print(response.status_code)

Die erste Zeile legt fest, dass es sich bei den zu übermittelten Daten um Text (ASCII) handelt. In der zweiten Zeile wird im Item Alarmanlage die Variable state angesprochen, um diese dann in der dritten Zeile auf ON zu setzen. In der letzten Zeile wird dann der Status ausgelesen. Dieser sollte bei Erfolg 200 enthalten. Bei mir kommt häufig 202. Das bedeutet, dass die Anfrage akzeptiert aber noch nicht abgeschlossen ist. Sicherheitshalber kann der Status im Anschluss noch einmal abgefragt werden.