Beiträge von Gerrit

    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! :P


    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:

    Code
    #! /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:

    Code
    { "mouse": 69, "keyboard": 69 }

    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:

    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.

    Code
    PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
    * * * * * /Users/gerrit/Bash/btBattery.sh

    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:

    Code
    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.

    Ich gehe mal davon aus, dass du das homebridge-shelly Plugin benutzt? Dort ist der Stop-Befehl (noch?) nicht möglich. Siehe Issue #23 auf GitHub.


    Eine Möglichkeit, das ganze trotzdem nach deinen Wünschen zu gestalten, wäre das http-switch Plugin. Dort müsstest du dann allerdings zwei Schalter erstellen. Einen Für Rollo runter -> Stop und einen für Rollo hoch -> Stop.


    Code
    "onUrl": "http://192.168.178.xxx/roller/0?go=close"
    "offUrl": "http://192.168.178.xxx/roller/0?go=stop"
    
    "onUrl": "http://192.168.178.xxx/roller/0?go=open"
    "offUrl": "http://192.168.178.xxx/roller/0?go=stop"


    Alternativ könntest du mit dem Plugin das Rollo natürlich auch auf eine festgelegt Wunschposition fahren lassen. In der Shelly-API findest du dazu die nötigen Befehle.


    Bei den ganzen klugen Köpfen hier besteht aber noch die Möglichkeit, dass es eine andere Lösung gibt. ;)

    Ich habe die Befürchtung, daß die Fritzbox einzelne Geräte aus dem 2,4GHz kickt, weil die Empfangsleistung zu schwach ist und sie ins 5GHz Netz zwingen möchte, was eben nicht geht. Oder passiert so etwas nicht?

    Bei mir werden eigentlich nur der iMac und die iPhones zu einer Verbindung mit dem 5-GHz-Netz "gezwungen". Das sind jedenfalls die einzigen Geräte, die Dauerhaft mit dem 5 GHz verbunden sind. Habe dadurch bisher keine Nachteile erlebt. Ich bin aber auch kein Fachmann und das sind nur persönliche Erfahrungen. Hängt beim WLAN ja (leider) auch vieles von der baulichen Beschaffenheit des Hauses bzw. der Wohnung ab und da ist meines Wissens nach manchmal eine Verbindung über 2,4 GHz besser und manchmal 5 GHz. Korrigiert mich, wenn ich falsch liege!

    Haben hier auch gleiche SSID und gleiches Passwort für beide Netze im Einsatz - und bisher keine Probleme. Die Geräte, die 5 GHz können verbinden sich mit dem entsprechenden WLAN, die anderen mit dem 2,4-GHz-Netz. Kommunikation untereinander funktioniert einwandfrei.


    Wenn ich mir jedoch die Netzwerke in meiner Umgebung ansehe, sehe ich dort einige die es getrennt haben. Mit den richtigen Einstellungen im Router sollte die Kommunikation untereinander auch kein Problem sein, aber ich habe den Mehrwert dahinter (auch nach Recherche im Internet) bisher nicht verstanden. :/

    Mal ein kleines Update meinerseits. Vielleicht hilft es ja dem ein oder anderen weiter.


    Ich habe mir einen weiteren Raspberry Pi 3B und eine HifiBerry DAC+ Soundkarte zugelegt.

    Bei "normaler" Musik (ich höre nicht nur Punk-Rock;)) war der Onboard-Sound nämlich wirklich grottig.


    Anders als bei der Amazon-Beschreibung und im mitgelieferten Beipackzettel angegeben, war für die Installation der HifiBerry Soundkarte doch noch etwas Handarbeit notwendig, um sie zu aktiveren. Unter Raspbian 9 lief das versprochene Plug&Play jedenfalls nicht. Ich habe mich an diese Anleitung gehalten und danach funktionierte die Soundkarte wie sie sollte. Jetzt habe ich wunderbar klaren Sound!


    Was ich bei meiner Recherche im Internet nicht herausfinden konnte, war, ob die HifiBerry in das Standard Raspi-Gehäuse passt. Kurz: Sie passt! Aber man muss hier und da ein bisschen feilen und ein zusätzliches Loch in die seitliche Verkleidung bohren. Zu Testzwecken hatte ich das von mir beschrieben Setup für mehrere Stunden im Dienst und der Kern des Raspberry Pi wurde nie wärmer als 51°C. Ganz normale Temperatur also.


    Als nächstes landet der Pi dann mitsamt aktivem Lautsprecher und ein paar anderen Spielereien in einem alten Grundig RF 620 das ich von meiner Oma geerbt habe. Bei Interesse gibt es dazu später noch mehr Bilder/Infos.


    Sorry, da hätte ich etwas genauer sein können. Das müsste die siebte Zeile sein. Ursprünglich steht dort:

    Code
    //      name = "%H"; // This means "Hostname" -- see below. This is the name the service will advertise to iTunes.

    Die Zeile ist durch die beiden Schrägstriche auskommentiert. Die ersten beiden Schrägstriche müssen entfernt werden und zwischen die Anführungszeichen kommt dann der gewünschte Name. Zum Beispiel:

    Code
            name = "Mein Shairport"; // This means "Hostname" -- see below. This is the name the service will advertise to iTunes.

    Vielleicht hat der ein oder andere von euch ja seinen Raspberry Pi auch in der Nähe einer "dummen" Stereoanlage stehen. Man kann den Raspberry Pi in sehr wenigen Schritten zu einem voll funktionsfähigen AirPlay-Empfänger (und die alte Stereoanlage somit etwas zeitgemäßer) machen. Dazu benötigt man nicht viel:


    1. Einen Raspberry Pi mit 3,5mm Audio-Ausgang
    2. Eine Stereoanlage mit Audio-Eingang
    3. Ein passendes Audiokabel um Pi und Stereoanlage zu verbinden
    4. Das Programm shairport-sync
    5. Grob geschätzt 7 Minuten Zeit

    Vorbereitung

    Wenn ihr euren Raspberry immer auf dem aktuellen Stand haltet, könnt ihr sofort mit der Installation beginnen. Ansonsten empfiehlt es sich, vorab mit

    sudo apt-get update

    und

    sudo apt-get upgrade

    die neuesten Pakete zu installieren.

    Installation

    Die Installation von shairport-sync startet ihr mit

    sudo apt-get install shairport-sync


    Es dauert einen kleinen Augenblick, aber im Grunde müsst ihr anschließend nichts weiter tun.

    Die benötigten Bibliotheken werden runtergeladen und während der Installation wird der Benutzer shairport-sync angelegt und zur Gruppe audio hinzugefügt. Außerdem kümmert sich die Installation eigenständig um das anlegen des Autostart mittels systemd.


    In der sehr gut dokumentierten Konfigurationsdatei können noch weitere Anpassungen vorgenommen werden. Beispielsweise kann hier der Name des Lautsprechers geändert werden.

    sudo nano /etc/shairport-sync.conf


    Sobald ihr euren Raspberry neu startet und mittels Audiokabel mit der Stereoanlage verbunden habt, könnt ihr loslegen.

    Troubleshooting

    Sollte die Lautstärke des Raspberry Pi nicht ausreichen, kann diese mit

    sudo amixer cset numid=1 100%

    voll aufgedreht werden.


    Außerdem empfiehlt es sich, das WLAN Power Management des Raspberry Pi dauerhaft zu deaktivieren.

    sudo iwconfig wlan0 power off


    Edit: Seit Raspbian Stretch ist das WLAN Power Management standardmäßig deaktiviert. Anderslautende Ausgaben sind wohl lediglich ein Bug in den betreffenden Kommandos.

    Zitat

    For the RPF built-in Broadcom (aka Cypress) WiFi/BT there's no control for power management. It's disabled by the kernel and the only thing you're seeing is a bug in the iw / iwlist / iwconfig commands.

    Quelle: https://www.raspberrypi.org/fo…pic.php?t=194619#p1239465


    Abschließende Worte

    Bisher konnte ich das Programm nur an einer Stereoanlage/einem Lautsprecher testen, da ich nur einen Raspberry Pi habe. Mich würde sehr interessieren, wie sich das Programm beim verwenden von mehreren Lautsprechern (in verschiedenen Räumen) macht. Feedback erwünscht.


    Ich bin mehr Bastler als Programmierer. Wenn hier irgendwo grober Unfug steht, freue ich mich über konstruktive Kritik.


    Eine Lösung ohne Jailbreak wäre, die Funktion des Smart Cover zu kopieren. Dieses kann den Ruhezustand des iPad aktivieren/deaktivieren.

    In der Wandhalterung müsste ein Bewegungssensor verbaut werden, der bei erkannter Bewegung einen Magnet an die entsprechende Position des iPad bewegt. Dazu könnte man einen kleinen Servomotor einsetzen. Alternativ könnte man natürlich auch einen Elektromagneten benutzen, aber der wird unter Umständen ziemlich heiß. Und außer Wasser-, Ofen- und Heizungsrohre sollte man nach Möglichkeit nichts in der Wand verbauen, was heiß werden kann.

    Ich hab auf meinem RasPi neben homebridge noch shairport-sync laufen.

    Damit wird mir meine alte, nicht so smarte Teufel-Anlage als AirPlay-Lautsprecher angezeigt.


    Ich hatte auf einer vorherigen Installation auch mal CUPS (Druckerserver) laufen.

    Aber wir drucken hier so selten dass wir es zur Zeit (noch) nicht vermissen.


    Ich bin mal gespannt, was der ein oder andere noch so auf seinem Raspberry laufen hat.

    Inspiration ist immer gut :):thumbup:

    Klick mal bitte in der App auf den kleinen Pfeil und dann auf das Zahnrad.



    Es sollte sich ein neuer Screen öffnen, der aussieht wie der aus dem Bildschirmfoto von meinem ersten Beitrag.


    Allerdings steht ja schon in der Übersicht aus deinem Screenshot, dass etwas mit der Installation (gemeint ist die die physische Installation des Thermostat an die Heizung) nicht stimmt. Also abschrauben und wieder dran.

    Hast du einen Soft-Reset (Batterie für 15 Sek. entfernen) oder einen Hard-Reset (Reset-Knopf 15 Sekunden drücken, bis die rote LED anfängt zu blinken) gemacht?


    Was zeigt die Eve-App für das Thermostat an? Installation OK?


    Ansonsten vielleicht mal abschrauben und neu anbringen.