Wieso, weshalb, warum?
Wer kennt es nicht? Die Frau hat an ihrem freien Tag mal wieder gekonnt die Hinweise zum niedrigen Batteriestand der Magic Mouse ignoriert, als sie im Internet nach den schönsten Babynamen recherchiert hat. Man kommt nach Hause, möchte ein Homebridge-Plugin installieren aber die Maus ist tot.
Das Szenario ist natürlich völlig aus der Luft gegriffen!
Trotzdem wollte ich für den Fall der Fälle den Batteriestatus von Magic Mouse und Magic Keyboard in Homebridge einbinden. Nach einiger Bastelei in einer sehr kurzen Nacht habe ich es dann auch tatsächlich hinbekommen.
Wie funktioniert das?
- Auf dem Mac wird mittels crontab ein Bash-Script ausgeführt, das den aktuellen Batteriestand ausliest
- Die Ausgabe wird hübsch formatiert in eine .json-Datei auf dem Raspberry Pi geschrieben
- Auf dem Raspberry Pi läuft das Plugin homebridge-http-humidity, das die Informationen in HomeKit einfügt
- In der Home App sieht man dann zwei Sensoren, die (natürlich nicht die Luftfeuchte, sondern) den Batteriestand anzeigen
Achtung!
Vorweg: das hier ist wirklich nur eine Bastelanleitung. Es gibt mit Sicherheit elegantere Wege, zum gleichen Ziel zu kommen. Für mich und meine Zwecke ist es so aber ausreichend. Lest die Anleitung bitte bis zum Ende durch. Wenn ihr euch irgendwo unsicher seid, dann lasst es lieber oder fragt einfach nach. Falls ihr Verbesserungsvorschläge habt - immer her damit!
Vorraussetzungen
Damit alles reibungslos funktioniert, solltet ihr wie in der Homebridge Installations-Anleitung im Abschnitt SSH-Schlüsselerstellung und -installation beschrieben über ssh (ohne die Eingabe eines Kennworts) auf euren Raspberry Pi zugreifen können. Außerdem solltet ihr natürlich einen Mac, eine Magic Mouse und ein Magic Keyboard besitzen.
Los geht's
1. btBattery.sh auf dem Mac erstellen
Erstellt auf eurem Mac in einem beliebigen Verzeichnis eine Datei die ihr zum Beispiel btBattery.sh nennt.
Bei mir liegt die Datei in einem Unterordner innerhalb meines Benutzerordners: /Users/gerrit/Bash/btBattery.sh
Der Inhalt der Datei sollte wie folgt aussehen:
#! /bin/bash
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
BATTLVL=$(/usr/sbin/ioreg -r -l -n AppleHSBluetoothDevice | egrep '"BatteryPercent" = |^ \| "Bluetooth Product Name" = '| sed 's/ | "Bluetooth Product Name" = "Magic Mouse 2"/ \{ \"mouse\":/' | sed 's/ | "Bluetooth Product Name" = "Magic Keyboard"/ \, \"keyboard\":/'| sed 's/ | | "BatteryPercent" = / /')
BATTJSON=${BATTLVL//[$'\t\r\n']}
BATTJSON+=" }"
echo $BATTJSON | ssh [email protected] "cat > /var/www/html/json/btBattery.json"
Die Stelle, an der "Bluetooth Product Name" = "Magic Mouse 2" und "Bluetooth Product Name" = "Magic Keyboard" steht, müsst ihr entsprechend der Bezeichnung eurer Bluetooth-Geräte anpassen. Den Namen eurer verbundenen Geräte seht ihr, wenn ihr auf dem Mac oben in der Statuszeile auf das Bluetooth-Symbol klickt.
In der letzten Zeile muss die IP über die euer Raspberry Pi erreichbar ist eingetragen werden. Außerdem wird hier das Verzeichnis und der Dateiname für die .json-Datei in der wir den Batteriestand speichern wollen angegeben. Diese Datei erstellen etwas später.
2. apache2 auf dem Raspberry Pi installieren
Nun kommt der Teil, mit dem ich nicht sehr zufrieden bin. Das Plugin homebridge-http-humidity verlangt als Quelle eine URL. Lokale Pfade werden nicht akzeptiert. Und ein passenderes Plugin habe ich leider nicht finden können. So kam ich zu dem Entschluss, dass es am einfachsten ist, auf dem Raspberry Pi einen Apache Webserver zu installieren. Hier der Link dazu aus der offiziellen Dokumentation.
Führt mit sudo apt-get update ein Update der Pakete durch und installiert mit sudo apt-get apache2 -y den Apache Webserver auf dem Raspberry Pi.
Nach der Installation wechselt ihr mit cd /var/www/html/ in das Hauptverzeichnis des Webservers. Dort erstellt ihr mit sudo nano /json/btBattery.json die Datei, die wir im btBattery.sh Script angegeben haben. Zu Testzwecken füllen wir diese Datei mit einer Zeile Inhalt:
Speichert die Datei und ändert den Benutzer von root auf pi sudo chown pi: /json/btBattery.json
Wenn ihr jetzt am Mac im Browser http://192.168.178.xx/json/btBattery.json eingebt, solltet ihr die Ausgabe der Datei sehen. Natürlich müsst ihr hier die IP entsprechend anpassen. Auf dem Raspberry Pi könnt ihr die Datei auch über http://localhost/json/btBattery.json erreichen.
Alternative mit Node Red
Eine Alternative zum Apache Server mit Node Red hat sschuste in seinem lesenswerten Kommentar aufgezeigt.
3. homebridge-http-humidity Plugin installieren
Installiert das Plugin homebridge-http-humidity und fügt in eurer config.json folgende Accessories hinzu:
{
"accessory": "HttpHumidity",
"name": "Magic Mouse 2",
"url": "http://localhost/json/btBattery.json?type=mouse",
"http_method": "GET",
"field_name": "mouse"
},
{
"accessory": "HttpHumidity",
"name": "Magic Keyboard",
"url": "http://localhost/json/btBattery.json?type=keyboard",
"http_method": "GET",
"field_name": "keyboard"
}
Alles anzeigen
Hier muss theoretisch nichts weiter angepasst werden, sei denn eure Geräte haben eine andere Bezeichnung oder ihr wollte sie anders benennen.
Die Pseudo-Variablen ?type=mouse und ?type=keyboard musste ich hinzufügen, weil das Plugin sonst unzufrieden damit war, zweimal die gleiche URL aufrufen zu müssen.
Startet Homebridge neu!
Wenn alles richtig lief, habt ihr jetzt zwei neue Sensoren, die jeweils den von uns eingetragenen Fake-Wert 69 % anzeigen. Im nächsten Schritt versorgen wir sie dann mit den tatsächlichen Werten.
4. btBattery.sh auf dem Mac regelmäßig ausführen
Jetzt fehlt nur noch die Aktualisierung der Batteriewerte. Das Script btBattery.sh muss dazu ausführbar sein und regelmäßig aufgerufen werden.
Ausführbar machen wir das Script über Terminal mit chmod +x /Users/gerrit/Bash/btBattery.sh - ihr gebt hier natürlich euren eigenen Pfad ein!
Jetzt soll das Script noch regelmäßig aufgerufen werden. Dazu nutzen wir crontab. Startet crontab mit nano als Editor in einem Terminal-Fenster: env EDITOR=nano crontab -e
Fügt die folgenden Zeilen ein und speichert die Datei.
Die erste Zeile sorgt dafür, dass crontab die korrekten Pfade benutzt.
In der zweiten Zeile geben wir mit den Sternchen an, wie oft das Script ausgeführt werden soll und wo es zu finden ist.
Zunächst starten wir das Script jede Minute. Auf der Seite crontab.guru könnt ihr später relativ einfach eure eigenen Werte für die Aktualisierung erstellen.
In der Home App sollten jetzt nach ca. einer Minute die tatsächlichen Werte des Batteriestatus auftauchen.
Wenn dem so ist könnt ihr crontab beispielsweise wie folgt anpassen:
MAILTO=""
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
*/30 * * * * /Users/gerrit/Bash/btBattery.sh
Der Status der Batterien wird dann nur alle 30 Minuten übertragen. Außerdem sorgt das MAILTO="" dafür, dass euer Terminal bei Fehlermeldungen (die es jetzt nicht mehr geben sollte) nicht zugemüllt wird.
Fertig!
Abschließende Worte
Ich hoffe die Umsetzung lief für euch ohne große Probleme und ich habe beim verfassen der Anleitung nichts vergessen. Ich bin mir fast sicher, dass es noch ein Homebridge-Plugin geben muss, das besser geeignet ist und keinen Webserver benötigt. Die Anleitung werde ich dann (gerne mit eurer Hilfe) entsprechend anpassen.
Ich bin mehr Bastler als Programmierer. Wenn hier irgendwo grober Unfug steht, freue ich mich über konstruktive Kritik.