OpenHAB vs Xiaomi Sensoren
Vor einiger Zeit habe ich angefangen, mit OpenHAB das Monitoring von meinen Servern auf die ganze Wohnung auszuweiten. U.a. wäre es schön zu wissen, ob ich den Tiefkühler im Keller wieder geschlossen oder doch die Tür aus lauter Senilität offen gelassen habe. Entsprechende Sensoren gibt es schon für relativ wenig Geld z.B. von Xiaomi (oder für massiv mehr Geld auch von anderen Herstellern, ob die dann einfacher einzubinden sind, ist die grosse Frage). Allerdings ist die Einbindung der Xiaomi-Sensoren in OpenHAB eine chinesische Oper in mehreren Akten:
Dann wäre alles ganz einfach mit einem Datenfluss Sensor -> Xiaomi-Hub -> OpenHAB.
Ja, aber...
Genau, denn das ganze geht nur mit der Basisstation "Mainland China Edition", welche in Europa nicht erhältlich ist. Vermutlich kann man sie über einen chinesischen Grosshändler von Übersee liefern lassen (Reisestromadapter nicht vergessen, chinesische Stecker passen nicht in europäische Steckdosen). Aber die EU-Edition ist unbrauchbar:
- wählt man in der App Serverstandort "Mainland China", so lässt sich die Basisstation nicht finden und somit auch nicht verbinden
- wählt man Serverstandort "Europa", so fehlt das versteckte Menü, um den Developer-Mode zu aktivieren.
Nun gäbe es noch zwei weitere Optionen: Eine modifizierte Mihome-App von einer russischen Website, die komplett in kyrillisch gehalten ist. Nun äääh... Njet! Oder aber den Lötkolben auspacken, den seriellen Port abgreifen, sich damit Terminal-Zugang verschaffen und darüber den Telnet-Server aktivieren. Nun, da dies mit guter Wahrscheinlichkeit das Gerät schrotten kann, lasse ich das auch (vorerst) lieber. Immerhin könnte ich es noch weiterverkaufen, solange es noch funktioniert.
Es handelt sich um einen simplen USB-Stick mit CC2531-Chip und zigbee2mqtt-kompatibler Firmware vorinstalliert. Sehr genial!
Grundsätzlich würde OpenHAB zwar den Zigbee-Stick direkt über das Zigbee-Binding ansprechen können. Der Datenfluss wäre dann Sensor -> USB-Stick -> OpenHAB. Aber da war doch bei Xiaomi was mit Protokollstandard und sich daran halten. So lassen sich die Sensoren zwar einbinden, werden aber als "offline" angezeigt und es lässt sich kein Status abfragen. Es gilt also wie üblich: wieso einfach, wenn es auch kompliziert geht?
Nun beginnt die von-hinten-durch-die-Brust-ins-Auge-Installation für den Datenfluss Sensor -> USB-Stick -> zigbee2mqtt -> mqtt-broker -> OpenHAB.
Als erstes wird der Stick angeschlossen, dieser wird als USB-Serial-Gerät /dev/ttyACM0 erkannt.
Nun muss ein MQTT-Broker installiert werden, z.B. mosquitto aus den Debian-Paketquellen. Dieser wird ohne weitere Konfiguration gestartet.
Als nächstes wird zigbee2mqtt mit gefühlt zweitausend Node.JS-Abhängigkeiten installiert (u.a. npm aus den Debian Backports, wenn man Debian Stable als Basis nutzt). Dies ist, im Gegensatz zum später folgenden OpenHAB-Teil, hervorragend dokumentiert, so dass sich dieser Teil eher als Malen-nach-Zahlen denn Systemadministration anfühlt.
Nun können die Geräte im Prinzip schon eingebunden werden. Dazu einfach den Sensor mit der in der Packung beiliegenden SIM-Pin resetten, und gut. Gemäss Anleitung kann es sein, dass man den Vorgang mehrmals wiederholen muss, bei den ersten beiden Sensoren hat es aber jeweils auf anhieb geklappt. Ein Blick in journalctl -u zigbee2mqtt -f zeigt denn auch gleich Aktivität an.
Jetzt kommt der harte Teil: OpenHAB mit MQTT verbinden. Das ist sehr oberflächlich und abstrakt dokumentiert. Dazu kommt beim Googeln nach Lösungen das Chaos mit Anleitungen für MQTT1- und MQTT2-Binding hinzu. Welche nun bei meiner Installation gilt? Böh? Letztendlich habe ich die Anleitungen für MQTT2 befolgt, das hat irgendwann auch funktioniert. Vermutlich: MQTT1==OpenHAB1, MQTT2==OpenHAB2 (und bei mir läuft 2.5).
Wie also vorgehen:
In der zigbee2mqtt-Konfigurationsdatei /opt/zigbee2mqtt/data/configuration.yaml den Output nicht als JSON sondern Attribut ausgeben lassen. Dazu folgende Zeilen einfügen, speichern, zigbee2mqtt neu starten:
Zuerst das MQTT-Binding in OpenHAB installieren.
Dann in /etc/openhab2/things/ eine .things-Datei mit den nötigen Einträgen erstellen. Irgendwann habe ich im Forum halbwegs taugliche Anleitungen gefunden...
Und sich nun wundern, dass die Things zwar im GUI auftauchen, aber keinerlei Daten gelesen werden... Signalstärke? NaN. Batterielevel? NaN. Zustand? Off. grrrmpf. Nach langem Debuggen (ja, zigbee2mqtt schreibt in mosquitto, mittels mosquitto_sub -v -t '#' kann man da schön mitlesen) irgendwann einfach mal den spontanen Windows-Reflex ausgelöst und OpenHAB selbst neugestartet. Uuund! Bingo! Alles tut. So einfach! Der Neustart ist übrigens für jedes neu hinzugefügte (oder umbenannte) Gerät nötig.
Weitere Sensoren lassen sich nun einfach dem Bridge-Block hinzufügen. Mit etwas mehr Tippaufwand lassen sich auch Sensoren ausserhalb des Bridge-Blocks definieren:
Wenn weitere Zigbee-Sensoren/Aktuatoren etwas weiter weg aufgestellt werden sollen, nimmt man einfach einen Raspberry Pi, schliesst daran einen weiteren USB-Stick an, installiert zigbee2mqtt und lässt damit die Sensordaten übers Netzwerk an den MQTT-Broker auf der OpenHAB-Maschine senden.
Akt 1: Das Starterset
Das Starterset gibt's für rund 80.- und es kommt mit einem Druckschalter, zwei Türsensoren und zwei Bewegungsmeldern sowie der Basisstation. Gemäss Beschreibung ist alles ganz einfach: Die Basisstation starten, auf einem Android-Telefon die Mihome-App installieren, als Serverstandort "Mainland China" wählen, App mit der Basisstation verbinden, über ein verstecktes Menü den Developer-Mode aktivieren, den Key auslesen und damit die Basisstation in OpenHAB integrieren.Dann wäre alles ganz einfach mit einem Datenfluss Sensor -> Xiaomi-Hub -> OpenHAB.
Ja, aber...
Genau, denn das ganze geht nur mit der Basisstation "Mainland China Edition", welche in Europa nicht erhältlich ist. Vermutlich kann man sie über einen chinesischen Grosshändler von Übersee liefern lassen (Reisestromadapter nicht vergessen, chinesische Stecker passen nicht in europäische Steckdosen). Aber die EU-Edition ist unbrauchbar:
- wählt man in der App Serverstandort "Mainland China", so lässt sich die Basisstation nicht finden und somit auch nicht verbinden
- wählt man Serverstandort "Europa", so fehlt das versteckte Menü, um den Developer-Mode zu aktivieren.
Akt 2: Veraltete App
Mit etwas Recherche ergab sich, dass auf dubiosen Seiten eine veraltete Version der Mihome-App zu finden ist, welche einen Fehler enthält: Sie schreibt ein Debug-Log. Worin der Zugriffskey zu finden ist. Leider hilft der alleine nicht weiter. Damit kann man zwar über die Xiaomi Mi IO Erweiterung von OpenHAB den Hub einbinden. Aber das war auch schon alles. Auf die Sensoren hat man deswegen noch keinen Zugriff. Dafür müsste weiterhin der Developer-Mode aktiviert werden, welcher auch einen Telnet-Zugang auf dem Gerät öffnet.Nun gäbe es noch zwei weitere Optionen: Eine modifizierte Mihome-App von einer russischen Website, die komplett in kyrillisch gehalten ist. Nun äääh... Njet! Oder aber den Lötkolben auspacken, den seriellen Port abgreifen, sich damit Terminal-Zugang verschaffen und darüber den Telnet-Server aktivieren. Nun, da dies mit guter Wahrscheinlichkeit das Gerät schrotten kann, lasse ich das auch (vorerst) lieber. Immerhin könnte ich es noch weiterverkaufen, solange es noch funktioniert.
Akt 3: Der Aqara-Hub
Ein erneuter Blick in die Dokumentation des Mihome-Bindings zeigt: Der Hub in Version 3 (welcher als Aqara Hub für Apple Homekit im Handel ist), soll etwas zugänglicher sein. Der kostet leider alleine schon fast so viel wie das ganze Set. Und kann dann genau so wenig. Entsprechend habe ich den umgehend wieder zurückgesendet...Akt 4: Billiger Zigbee-Stick
Die Xiaomi-Geräte halten sich, wie aller proprietärer Müll, natürlich nie ganz genau an die Standards. Aber immerhin genug, dass das Protokoll noch knapp als Zigbee durchgeht. Also habe ich für 9€+3.50€ Versand beim reichsten Mann der Welt einen USB-Zigbee-Stick gekauft. Zu meiner grossen Überraschung wurde dieser, obwohl Elektrogerät, vom reichsten Mann der Welt seinem Marktplatz aus Deutschland über den Rhein versendet. Sehr unüblich. Und kam auch superschnell an. Ebenfalls unüblich.Es handelt sich um einen simplen USB-Stick mit CC2531-Chip und zigbee2mqtt-kompatibler Firmware vorinstalliert. Sehr genial!
Grundsätzlich würde OpenHAB zwar den Zigbee-Stick direkt über das Zigbee-Binding ansprechen können. Der Datenfluss wäre dann Sensor -> USB-Stick -> OpenHAB. Aber da war doch bei Xiaomi was mit Protokollstandard und sich daran halten. So lassen sich die Sensoren zwar einbinden, werden aber als "offline" angezeigt und es lässt sich kein Status abfragen. Es gilt also wie üblich: wieso einfach, wenn es auch kompliziert geht?
Nun beginnt die von-hinten-durch-die-Brust-ins-Auge-Installation für den Datenfluss Sensor -> USB-Stick -> zigbee2mqtt -> mqtt-broker -> OpenHAB.
Als erstes wird der Stick angeschlossen, dieser wird als USB-Serial-Gerät /dev/ttyACM0 erkannt.
Nun muss ein MQTT-Broker installiert werden, z.B. mosquitto aus den Debian-Paketquellen. Dieser wird ohne weitere Konfiguration gestartet.
Als nächstes wird zigbee2mqtt mit gefühlt zweitausend Node.JS-Abhängigkeiten installiert (u.a. npm aus den Debian Backports, wenn man Debian Stable als Basis nutzt). Dies ist, im Gegensatz zum später folgenden OpenHAB-Teil, hervorragend dokumentiert, so dass sich dieser Teil eher als Malen-nach-Zahlen denn Systemadministration anfühlt.
Nun können die Geräte im Prinzip schon eingebunden werden. Dazu einfach den Sensor mit der in der Packung beiliegenden SIM-Pin resetten, und gut. Gemäss Anleitung kann es sein, dass man den Vorgang mehrmals wiederholen muss, bei den ersten beiden Sensoren hat es aber jeweils auf anhieb geklappt. Ein Blick in journalctl -u zigbee2mqtt -f zeigt denn auch gleich Aktivität an.
Jetzt kommt der harte Teil: OpenHAB mit MQTT verbinden. Das ist sehr oberflächlich und abstrakt dokumentiert. Dazu kommt beim Googeln nach Lösungen das Chaos mit Anleitungen für MQTT1- und MQTT2-Binding hinzu. Welche nun bei meiner Installation gilt? Böh? Letztendlich habe ich die Anleitungen für MQTT2 befolgt, das hat irgendwann auch funktioniert. Vermutlich: MQTT1==OpenHAB1, MQTT2==OpenHAB2 (und bei mir läuft 2.5).
Wie also vorgehen:
In der zigbee2mqtt-Konfigurationsdatei /opt/zigbee2mqtt/data/configuration.yaml den Output nicht als JSON sondern Attribut ausgeben lassen. Dazu folgende Zeilen einfügen, speichern, zigbee2mqtt neu starten:
experimental:Und wenn wir schon in der Konfiguration herumfummelt, sollte man auch gleich den Sensoren vernünftige friendly_name vergeben.
output: attribute
Zuerst das MQTT-Binding in OpenHAB installieren.
Dann in /etc/openhab2/things/ eine .things-Datei mit den nötigen Einträgen erstellen. Irgendwann habe ich im Forum halbwegs taugliche Anleitungen gefunden...
Und sich nun wundern, dass die Things zwar im GUI auftauchen, aber keinerlei Daten gelesen werden... Signalstärke? NaN. Batterielevel? NaN. Zustand? Off. grrrmpf. Nach langem Debuggen (ja, zigbee2mqtt schreibt in mosquitto, mittels mosquitto_sub -v -t '#' kann man da schön mitlesen) irgendwann einfach mal den spontanen Windows-Reflex ausgelöst und OpenHAB selbst neugestartet. Uuund! Bingo! Alles tut. So einfach! Der Neustart ist übrigens für jedes neu hinzugefügte (oder umbenannte) Gerät nötig.
Das Finale: die OpenHAB-Things-Datei
Bridge mqtt:broker:MosquittoMqttBroker "Mosquitto MQTT Broker" [ host="127.0.0.1", secure=false] {
Thing topic xdoor1 "Xiaomi Door Sensor" @ "Location" {
Channels:
Type switch : contact "contact" [ stateTopic = "zigbee2mqtt/xdoor1/contact", on="true", off="false" ]
Type number : voltage "voltage" [ stateTopic = "zigbee2mqtt/xdoor1/voltage" ]
Type number : battery "battery" [ stateTopic = "zigbee2mqtt/xdoor1/battery" ]
Type number : linkquality "linkquality" [ stateTopic = "zigbee2mqtt/xdoor1/linkquality" ]
}
}
Weitere Sensoren lassen sich nun einfach dem Bridge-Block hinzufügen. Mit etwas mehr Tippaufwand lassen sich auch Sensoren ausserhalb des Bridge-Blocks definieren:
Thing mqtt:topic:MosquittoMqttBroker:BodySensor "Xiaomi Body Sensor" (mqtt:broker:MosquittoMqttBroker) @ "Location" {Die vorhandenen Channels lassen sich per mosquitto_sub oder journalctl herausfinden. Sobald man einen Sensor stimuliert, sendet er alle diese Angaben an den Zigbee-Controller.
Channels:
Type switch : occupancy "occupancy" [ stateTopic = "zigbee2mqtt/xbody1/occupancy", on="true", off="false" ]
Type number : voltage "voltage" [ stateTopic = "zigbee2mqtt/xbody1/voltage" ]
Type number : battery "battery" [ stateTopic = "zigbee2mqtt/xbody1/battery" ]
Type number : linkquality "linkquality" [ stateTopic = "zigbee2mqtt/xbody1/linkquality" ]
}
Applaus
Natürlich is OpenHAB gerade in Kombination mit Zigbee (oder Z-Wave) bezüglich Möglichkeiten ein Fass ohne Boden. Schon ohne Funkanbindung lässt sich einiges an Technik anbinden: Drucker, Mail- und XMPP-Konten, WLAN (bzw dazu verbundene Endgeräte), Telefonanlagen, mpd (Music Player Daemon), Videokameras (z.B. via Zoneminder - aber das wäre ein Blogeintrag für sich). Mit Zigbee wird alles noch viel wilder. Nach den Sensoren kann das ganze restliche Haus eingebunden werden, von Lampen, Heizung und Rolladensteuerung über die Waschmaschine zum Rasenmäher bis zur Wallbox des Elektrofahrzeugs.Wenn weitere Zigbee-Sensoren/Aktuatoren etwas weiter weg aufgestellt werden sollen, nimmt man einfach einen Raspberry Pi, schliesst daran einen weiteren USB-Stick an, installiert zigbee2mqtt und lässt damit die Sensordaten übers Netzwerk an den MQTT-Broker auf der OpenHAB-Maschine senden.
Trackbacks
The author does not allow comments to this entry
Comments
Display comments as Linear | Threaded