Beiträge von sschuste

    1. Benötige ich in Homebridge noch dieses Plugin?

    homebridge-hue-utils

    Nein.

    2. Wird bei Abfrage der Hue-Bridge User ID über den „Clip API Debugger“ und dem Drücken auf den Hue Bridge Button möglicherweise jedesmal eine neue User ID ausgegeben?

    Ja.

    3. Mit dem Befehl ph -H <IP.HueBridge> -u <USER-ID> outlet -V

    Kommt folgende Info raus. ph outlet: /resourcelinks/34879: 1 outlets

    Was stelle ich mit der der Info an?

    Das weiß ich nicht. Ich habe die Shell-Befehle nie benutzt.

    4. Die Nr. 34879. Was ist das? Die ID eines HUE-Divice?

    Das weiß ich auch nicht, aber die Hue-Device-Id sind normalerweise sehr klein und fangen bei 1 an.

    5. Bisher habe ich meine „config.json“ noch nicht für die HUE Bridge erweitert. Muss ich das noch? Deswegen blöd gefragt, weil ja alle HUE-Lampen bei mir in HomeKit auftauchen und natürlich somit bedienbar sind – bis auf die Osram Smart+ Steckdose.

    Du musst homebridge-hue installieren und konfigurieren. Bei mir hat das Folgende gereicht:

    Code
            {
                "platform": "Hue",
                "host": "192.168.1.23",
                "lights": true,
                "users": {
                    "001788XXXX216401": "woDE2lQYLP1mfUGji674vergiss-es8UK0mbuqWs"
                }
            },

    lights:true unterdrückt, dass die Hue-Lichts erneut und damit doppelt angezeigt würden. Ich habe übrigens nur zwei Fremdlampen in Betrieb und keine Steckdose.


    Den Usernamen erhält man beim ersten Start von homebridge-hue, indem man homebridge neu startet und sich das Log anzeigen lässt:


    sudo systemctl homebridge restart; sudo journalctl -fau homebridge


    Finger bereit halten zum Knopf drücken.


    Stefan

    Der Shell-Befehl lautet bei mir für mein externes Trackpad:

    ioreg -c BNBTrackpadDevice | grep '"BatteryPercent" =' | sed "s/[^0-9]//g"


    und für die Tastatur:

    ioreg -c AppleBluetoothHIDKeyboard | grep '"BatteryPercent" =' | sed "s/[^0-9]//g"


    und für die Maus:

    ich habe keine.


    Dabei kommt dann einfach eine Zahl heraus, die die Batteriekapazität angibt. Aber wie geht's weiter? Der Ansatz von Gerrit, einen Apache-Webserver dafür laufen zu lassen, war mir persönlich zu fett für die eine kleine Aufgabe. Ich habe erst mit dem Gedanken gespielt, mir einen eigenen Server in Javascript zu programmieren, aber habe dann Node Red verwendet.


    Node Red ist ein Tool, das sehr leicht zu installieren ist (sowohl auf einem Mac als auch auf einem Raspi) und das es einem erlaubt, auf grafische Art und Weise zu programmieren. Meine Javascript-Kenntnisse sind sehr, sehr mager, aber ich bin in der Lage, mir was zurecht zu fummeln. Und es ist sehr einfach, die eigenen Ergüsse mit anderen Node Red-Benutzern zu teilen. Es ist tatsächlich fast ein Klacks, einen Webserver in Javascript zu programmieren (ich glaube, das sind nur drei oder vier Zeilen Code, die man aus dem Internet kopiert), aber noch viel einfacher ist es, Node Red zu verwenden.


    Programmiert wird im Browser. Das einzig Ärgerliche ist, das mit der letzten Version auf einmal alles in deutscher Sprache angezeigt wird, was nicht so schlimm wäre, wenn die Übersetzung aus dem Englischen nicht so schauerlich wäre. Daher nehme ich als Browser Chrome, den ich so eingestellt habe, dass er alles in Englisch macht. Ich bin das so gewöhnt, ich kann auch keine deutsche Shell im Terminal ertragen.



    So sieht das bei mir aus, ich hab mal einen Screenshot gemacht und mit Sprechblasen kommentiert. So etwas nennt man in Node Red-Sprache einen Flow, und den kann man mit anderen teilen. Hier ist er:

    Code
    [{"id":"883badb.f65bc5","type":"exec","z":"369d80e.2abcb","command":"ssh [email protected] /usr/sbin/ioreg -c AppleBluetoothHIDKeyboard | grep '\"BatteryPercent\" =' | sed \"s/[^0-9]//g\"","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"Get keyboard battery value","x":780,"y":1640,"wires":[["bc29640b.85a9c8"],[],[]]},{"id":"b9c4c636.4773b8","type":"inject","z":"369d80e.2abcb","name":"Every hour","topic":"","payload":"","payloadType":"date","repeat":"3600","crontab":"","once":false,"onceDelay":0.1,"x":530,"y":1640,"wires":[["883badb.f65bc5"]]},{"id":"4d1763.1418e89c","type":"homekit-service","z":"369d80e.2abcb","bridge":"7524e8b8.7da908","name":"Keyboard","serviceName":"HumiditySensor","manufacturer":"Stefan Schustereit","model":"Node-Red","serialNo":"1","characteristicProperties":"{}","x":1240,"y":1640,"wires":[[]]},{"id":"bc29640b.85a9c8","type":"function","z":"369d80e.2abcb","name":"Prepare value","func":"msg.payload = { \"CurrentRelativeHumidity\": msg.payload.trim() };\nreturn msg;","outputs":1,"noerr":0,"x":1040,"y":1640,"wires":[["4d1763.1418e89c"]]},{"id":"62188cbb.f4c9d4","type":"exec","z":"369d80e.2abcb","command":"ssh [email protected] /usr/sbin/ioreg -c BNBTrackpadDevice | grep '\"BatteryPercent\" =' | sed \"s/[^0-9]//g\"","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"Get trackpad battery value","x":780,"y":1700,"wires":[["acb4e69d.be23f8"],[],[]]},{"id":"980f76f3.820a58","type":"inject","z":"369d80e.2abcb","name":"Every hour","topic":"","payload":"","payloadType":"date","repeat":"3600","crontab":"","once":false,"onceDelay":0.1,"x":530,"y":1700,"wires":[["62188cbb.f4c9d4"]]},{"id":"7a0e8d00.b80634","type":"homekit-service","z":"369d80e.2abcb","bridge":"7524e8b8.7da908","name":"Trackpad","serviceName":"HumiditySensor","manufacturer":"Stefan Schustereit","model":"Node-Red","serialNo":"1","characteristicProperties":"{}","x":1240,"y":1700,"wires":[[]]},{"id":"acb4e69d.be23f8","type":"function","z":"369d80e.2abcb","name":"Prepare value","func":"msg.payload = { \"CurrentRelativeHumidity\": msg.payload.trim() };\nreturn msg;","outputs":1,"noerr":0,"x":1040,"y":1700,"wires":[["7a0e8d00.b80634"]]},{"id":"7524e8b8.7da908","type":"homekit-bridge","z":"","bridgeName":"Node-RED","pinCode":"030-45-111","port":"","manufacturer":"Stefan Schustereit","model":"Node-RED","serialNo":"1.0"}]

    Sieht hässlich aus, aber egal. Das kopiert man einfach und fügt es in Node Red wieder ein, macht noch ein paar Anpassungen für das eigene Netz und das war's dann auch schon. In diesem Fall muss Node Red vorher durch HomeKit-Fähigkeiten erweitert werden, indem man über das Menü über Manage Palette - Install das Modul @plasma2450/node-red-contrib-homekit-bridged nachinstalliert. Ist so wie Homebridge-Plugins zu installieren.


    Gerrit, ich weiß genau, dass dir Node Red eine Menge Spaß machen würde. Es verbraucht auch nicht mehr Power als ein Apache Webserver, wahrscheinlich sogar weniger.


    Stefan

    Sieht so aus, als hättest du erst deinen Raspi ausgeschaltet und dann den Befehl ph -H auf einem anderen Rechner eingegeben.


    Ich weiß nicht, wie du deinen Raspi installiert hast, aber wenn du die Forenanleitung genutzt hast, dann steht da drin, dass man die Homebridge mit sudo systemctl stop homebridge anhält und mit sudo systemctl start homebridge wieder startet.


    Stefan

    Ich habe jetzt auch nach mehrmaligen Lesen nicht verstanden, was wer wo mit welchem Ergebnis eingibt. Auf einem Raspi ohne Docker:

    sudo npm install -g --unsafe-perm homebridge-lib


    So wie bei allen Plugins.


    Stefan

    weiß man wodurch das genau getriggered wird? Also wo genau der bug vom Plugin mit der Anleitung zusammen liegt?

    Ja. Der Programmierer von homebridge-config-ui-x startet den Prozess sudo -n journalctl -o cat -n 500 -f -u homebridge -u homebridge-config-ui-x, um die Ausgabe davon im Webinterface anzuzeigen. Klickt man dann auf einen anderen Bereich im Webinterface wie zum Beispiel den Config-Editor oder die Status-Seite, dann wird der Prozess journalctl mit sudo -n kill -9 wieder gestoppt.


    Die Konfiguration der Forenanleitung lässt aber den Befehl kill mit root-Rechten (also per sudo) nicht zu. Er wird zwar ausgeführt, aber er schlägt fehl, was das System verschweigt, weil sudo mit dem Parameter -n aufgerufen wurde. Der Parameter steht für "keine Ausgabe, auch wenn etwas schief geht". Man bekommt also nicht mit, dass journalctl nicht beendet werden konnte.


    So läuft journalctl also weiter, und wenn man wieder auf die Loganzeige klickt, wird ein weiteres Mal journalctl gestartet. Das passiert jedes Mal, und so nach ungefähr 125 Mal ist dann Feierabend: journalctl beschwert sich über fehlende file descriptors und anstatt des Logs wird eine Fehlermeldung angezeigt:

    Code
    Loading logs using "systemd" method...
    CMD: sudo -n journalctl -o cat -n 500 -f -u homebridge
    
    Failed to get journal fd: Too many files open
    
    The log tail command "-n journalctl -o cat -n 500 -f -u homebridge" exited with code 1.
    Please check the command in your config.json is correct.

    Wenn man dann die Prozessliste aufruft, sieht man die Bescherung:

    Ein Neustart von homebridge-config-ui-x beendet alle Prozesse und das Spiel beginnt von vorn.


    Hier kannst du die ganze Diskussion nachlesen:

    https://github.com/oznu/homebridge-config-ui-x/issues/321


    Stefan

    Nein, es würde keinen Sinn machen, das in die Anleitung aufzunehmen. Weil:


    Homebridge-lib ist ein Plugin von Erik Baauw, der auch homebridge-hue und homebridge-zp programmiert hat. Das Plugin war zunächst ein Bestandteil der letztgenannten, aber Erik hat das da herausgenommen und verteilt es nun einzeln. Homebridge-lib beinhaltet Funktionen, die beim Programmieren von Homebridge-Plugins immer wieder verwendet werden. Zur Zeit wird es nur für den Betrieb von Eriks Plugins benötigt, aber ich schätze, dass bald mehrere Programmierer das auch nutzen werden, weil es Funktionen bietet, die sie sonst selber coden müssten.


    Die Foren-Anleitung kümmert sich eher um die Installation von Homebridge und nicht um die spezifischen Probleme bei der Installation diverser Plugins. Natürlich könnte man, sobald viele Programmierer homebridge-lib nutzen, es in die Anleitung aufnehmen. Zum jetzigen Zeitpunkt halte ich das noch für verfrüht.


    Neue homebridge-hue-Anwender werden das aufgetretene Problem eh nicht haben, weil die Installationsanleitung von homebridge-hue nun so lautet:

    sudo npm -g i homebridge-lib homebridge-hue


    Diejenigen, die ihre Plugins mit homebridge-config-ui-x updaten (ich) und dabei die dargebotenen Informationen lesen (ich), haben gesehen, dass sie homebridge-lib nachinstallieren müssen, weil's da stand, und haben entsprechend gehandelt. Bleibt nur noch der Rest, der mal wieder nix mitbekommen hat: nun ja, das werden wohl die meisten sein :D. Macht nix, dafür haben wir ja das Forum.


    Gruß

    So, ich habe jetzt Lösungen für homebridge-config-ui-x (Webinterface für Homebridge) (nach einer Weile kann homebridge-config-ui-x die Logs nicht mehr anzeigen).


    Ich weiß nicht, ob mir diese Lösung gefällt. Unsinn: ich weiß, dass mir diese Lösung nicht gefällt. Das Problem wird erzeugt durch das Zusammenspiel von homebridge-config-ui-x und der Forenanleitung zur Installation von homebridge.


    Die Lösungen sind:

    • nix weiter unternehmen und wenn der Fehler wieder auftritt, homebridge neu starten. Gleichzeitig darauf warten, dass der Entwickler von homebridge-config-ui-x den Fehler in den Griff bekommt.
    • Die Rechte des Users homebridge erweitern. Das gefällt mir gar nicht. Wer es aber unbedingt machen will, der gehe so vor:


    sudo visudo -f /etc/sudoers/homebridge


    Ganz hinten anhängen: , /bin/kill


    So dass das Ganze so aussieht:

    Code
    homebridge ALL=(root) SETENV:NOPASSWD: /usr/local/bin/npm, /bin/systemctl restart homebridge, /bin/journalctl, /usr/local/bin/node, /bin/kill


    Das macht mich sehr unglücklich. Ich bin mir noch nicht sicher, ob ich dass in die Forenleitung einbauen werde. Ich glaube nicht.


    Ok, diesen Schnellschuss streiche ich wieder grußlos, aber nicht ohne Ersatz. Auf der Shell eingeben:

    sudo usermod -a -G systemd-journal homebridge


    Dann muss die config.json bearbeitet werden. In der Konfiguration für homebridge-config-ui-x muss der Teil, der sich um das Log kümmert, verändert werden. Jetzt steht dort:


    "log": {

    "method": "systemd",

    "service": "homebridge"

    },


    Das wird ersetzt durch:

    Code
                "log": {
                    "method": "custom",
                    "command": "journalctl -o cat -n 500 -f -u homebridge -u homebridge-config-ui-x"
                },


    Dann homebridge neu starten. Ich werde die Anleitung entsprechend anpassen.


    Stefan

    Ich mache das mit homebridge und dem Plugin homebridge-delay-switch. Wenn ich hier weggehe ("Hey Siri, ich verlasse das Haus"), dann wird in meinem Flur eine Lampe eingeschaltet und gleichzeitig mein "Flurtimer".


    Code
            {
                "accessory": "DelaySwitch",
                "name": "Flurtimer",
                "delay": 180000,
                "disableSensor": true
            },


    Nach drei Minuten schaltet sich der "Flurtimer" automatisch wieder aus. Eine Automation überwacht das, und wenn der Timer ausgeht, wird auch die Lampe im Flur wieder ausgeschaltet.


    Stefan

    Ich werde das weiter beobachten. Mal sehen, ob das erneut passiert.

    Es passiert. Immer, wenn das Log über homebridge-config-ui-x aufgerufen wird, wird der Prozess gestartet, der das Log liest (journalctl -o cat -n 500 -f -u homebridge) und nicht wieder beendet. Irgendwann laufen dann soviel Prozesse, dass sie die obige Fehlermeldung auslösen.


    Der Neustart von homebridge-config-ui-x beendet die Prozesse wieder.


    Ich werd mal den Entwickler fragen.


    Stefan