Wie man einen SwitchBot mittels CUxD steuert

Ich habe mir vor kurzem einen SwitchBot besorgt, um meinen Drucker zu steuern, denn der hat nur einen Soft Power Button. Das heißt, man kann ihn nicht einfach in eine schaltbare Steckdose stecken und ihn so steuern.

Ohne einen SwitchBot Hub könnt Ihr den Schalter jedoch nur über eine BLE-Verbindung steuern. Es ist natürlich ein netter Trick, den kleinen Arm Mittels Telefon erscheinen zu lassen, aber er ist nur bedingt nützlich. Man muss ziemlich nah an den Drucker und den Schalter herankommen, also kann man den Knopf auch einfach selbst drücken.

Glücklicherweise betreibe ich RaspberryMatic auf einem Raspberry Pi 3, der sich ganz in der Nähe des Druckers und des Schalters befindet. Noch mehr Glück hatte ich, dass der Pi Bluetooth eingebaut hat, und so machte ich mich auf die Suche nach einer Möglichkeit, den Pi über BLE mit meinem SwitchBot kommunizieren zu lassen.

Zuerst musste ich natürlich Bluetooth auf dem Pi aktivieren. Standardmäßig ist dies bei der RaspberryMatic-Installation ausgeschaltet, aber das lässt sich schnell beheben, indem man sich per SSH in das System einloggt (wie man das konfiguriert, ist an anderer Stelle dokumentiert). Dann muss man nur noch Bluetooth aktivieren und neu starten, indem man folgendes tut

touch /etc/config/enableBluetooth`
reboot

Danach sollten Sie in der Lage sein, mit eurem hci0-Gerät zu interagieren:

hciconfig hci0 down
hciconfig hci0 up
hcitool lescan

Der Befehl lescan sollte eine Liste von BLE-MAC-Adressen anzeigen, unter denen ich meinen SwitchBot gefunden habe. Der PI war also nahe genug, um zu funktionieren.

Mein erster Versuch, den Switch über eine Art NodeRed-Plugin einzubinden, scheiterte jedoch kläglich. Keines der BLE-Plugins funktioniert auf dem RaspberryMatic, weil anscheinend kein Python vorhanden ist. Also habe ich das aufgegeben und auf einen alten Freund zurückgegriffen: CUxD. Ich habe CUxD schon einmal für einen virtuellen, kommandozeilen basierten Schalter verwendet, also dachte ich mir, dass ich das wieder verwenden kann.

Nach einigem Herumspielen und weiterem Googeln fand ich schließlich einen Befehlszeilenaufruf, der funktionierte und den Switch auslöste:

gatttool -b E7:E9:62:XX:XX:XX -t random --char-write-req -a 0x0016 -n 570100

Beachtet, dass mein Schalter so konfiguriert ist, dass er wie ein Druckknopf funktioniert. Darum schicke ich den Code -n 570100. Der Arm “drückt” ein oder zwei Sekunden lang, dann zieht er sich zurück. Er behält seinen Zustand nicht bei. Wenn Ihr Euren SwitchBot anders konfiguriert habt, müsst ihr dementsprechend andere Werte senden:

570100 = Press
570101 = ON
570102 = OFF
570103 = Hold

Mit diesem Wissen habe ich dann einen CUxD-Schalter erstellt

alt-text

Die beiden wichtigsten Befehle, die gesetzt werden müssen, sind natürlich CMD_SHORT/ CMD_LONG, um gatttool auszulösen, sowie CMD_TIMER, mit dem wir den Zustand des Schalters durch Anpingen des Druckers einstellen.

CMD_SHORT/CMD_LONG = hciconfig hci0 down; hciconfig hci0 up; gatttool -b E7:E9:62:XX:XX:XX -t random --char-write-req -a 0x0016 -n 570100
CMD_TIMER = ! ping -q -c 1 Canoneb7829; wget -q -O /dev/null http://homematic-ccu2:8181/cuxd.exe?x%3Ddom.GetObject%28%22CUxD.CUX2801002%3A1.SET_STATE%22%29.State%28$?%29

Ja, der Timer-Befehl sieht kompliziert aus, aber er ist nur ein URL-kodierter Aufruf an CUxD, um den Zustand des CUxD-Geräts CUX2801002 auf das invertierte Ergebnis eines einzelnen Pings zu setzen. Eine sauberere Lösung habe ich noch nicht gefunden und sie funktioniert auch für meine anderen virtuellen Switches recht gut.

alt-text

Und das ist alles, was es braucht! Viel Spaß beim Schalten!

Update: Wie man einen Schalter mit CuxD erzeugt

Um einen Schalter mit CuxD zu erzeugen öffnet man erstmal das CUxD Control Panel über Einstellungen > Systemsteuerung > CUx-Daemon. Jetzt kann ein "Mehrfachschalter" erzeugt werden:

Erzeugen des Schalters in CUxD

Jetzt muss der Schalter noch in HomeMatic angelert werden. Dazu also zurück zur HomeMatic Startseite:

Gerät in HomeMatic anlernen

Jetzt kann das Gerät wie ein normaler Schalter konfiguriert werden.