AdHoc Netzwerk AdHoc Netzwerk.................................................................................................................................................1 Einleitung.......................................................................................................................................................1 Netzwerk aus Sendern und Empfängern......................................................................................................1 Netzwerk aus (Konfligierenden) Sensoren und Relais.................................................................................4 Stabiler Hauptprozess (Hauptdämon)...........................................................................................................6 Einleitung Das vermutlich am wenigsten bekannte, aber fortschrittlichste Feature von pilight ist seine Funktionalität zum Erstellen eines AdHoc Netzwerkes aus mehreren pilight Instanzen (z. B. auf unterschiedlichen Raspberry Pis und Windows oder Linux Rechnern), die alle zusammenarbeiten. Ungefähr so wie die Borg aus Star Trek. Stellen Sie sich folgendes typische Anwendungsszenario vor: Wir haben einen Raspberry Pi, auf dem pilight installiert ist und der mit einem Sender und einem Empfänger ausgestattet ist. Diese einzelne pilight Instanz steuert unsere ferngesteuerten Lampen und kann Wetterinformationen von unseren Wetterstationen und/oder von z. B. openweathermap.org beziehen. Dieses erste System ist aufgesetzt und funktioniert. Netzwerk aus Sendern und Empfängern GPIO GPIO Raspberry Pi Model 2 v1.1 © Raspberry Pi 2014 Raspberry Pi Model 2 v1.1 © Raspberry Pi 2014 USB 2x USB 2x USB 2x USB 2x DSI (DISPLAY) DSI (DISPLAY) http://www.raspberrypi.org http://www.raspberrypi.org CSI (CAMERA) CSI (CAMERA) Audio Audio HDMI HDMI Power Bild 1: Knoten A ETHERNET Power ETHERNET Bild 2: Knoten B Eines der größten Probleme bei Domotica Lösungen ist ihre Reichweite, v.a. innerhalb von Gebäuden. Natürlich können wir mit Antennen und ähnlichem herumbasteln, aber dies löst nicht immer alle Probleme. Wie können wir also die entlegenen Ecken unseres Hauses erreichen, die eine einzelne pilight-Instanz selbst nicht per angeschlossenem Sender/Empfänger erreichen kann? Die Lösung ist es, ein Netzwerk aus mehreren Sendern und Empfängern zu etablieren, die alle zusammenarbeiten. Dies ist genau das was pilight mit seinem AdHoc Netzwerk kann. Um dieses Feature zu nutzten benötigen wir zwei pilight-fähige Computer („Hauptdämon“ und „Knoten“). In diesem Beispiel benutzten wir zwei Raspberry Pis für die unterschiedlichen Geräte; wir haben eine Lampe im Bücherregal („bookshelf“) auf der einen Seite des Hauses, und im Garten verschiedene Lampe („gardenlights“) am anderen Ende des Hauses: "devices": { 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 } "bookshelf": { "protocol": [ "kaku_switch" ], "id": [{ "id": 123456 "unit": 1 }], "state": "off" }, "gardenlights": { "protocol": [ "kaku_switch" ], "id": [{ "id": 123456 "unit": 2 }], "state": "off" } Unsere Einstellungen für Knoten A werden so aussehen: "settings": { 18 19 20 21 22 23 24 25 "log-level": 6, "log-file": "/var/log/pilight-daemon.log", "webserver-enable": 1, "webserver-cache": 1, "webserver-http-port": 5001, "webserver-root": "/usr/local/share/pilight/", "whitelist": "" } Beim Start des Prozesses (Dämons) auf Knoten A im Debugmodus passiert dann folgendes: [Jan 24 15:34:18:191682] pilight-daemon: DEBUG: ssdp sent search [Jan 24 15:34:18:292486] pilight-daemon: NOTICE: no pilight daemon found, daemonizing pilight bemerkt, dass es auf Knoten A (derzeit) die einzige Instanz im Heimnetzwerk ist und wird daher als Hauptprozess gestartet („daemonizing“). Dann bemerken wir, das nicht gleichzeitig die Lampe im Bücherregal und Gartenlampen mit einem einzelnen Raspberry Pi mit pilight steuern können, auf Grund der beschränkten Reichweite der 433 MHz Sender und Empfänger. Die Lösung ist es, einen zweiten Raspberry Pi mit pilight auf der anderen Seite des Hauses aufzustellen und über das Computernetzwerk (LAN oder WLAN) zu verbinden. Die Einstellungen von Knotenpunkt B kann so aussehen: 1 2 3 4 5 "settings": { "log-level": 6, "log-file": "/var/log/pilight-daemon.log", "whitelist": "" } Wie Sie sehen sind alle Webservereinstellungen in der Konfiguration entfernt, da der zweite und jeder weitere pilight Knotenpunkt seinen Webserver nicht starten wird. Wenn wir nun den Knoten B im Debugmodus starten sehen wir folgendes: [Jan 24 15:40:44:334028] pilight-daemon: DEBUG: ssdp sent search [Jan 24 15:40:44:434492] pilight-daemon: NOTICE: a pilight daemon was found @192.168.1.100, clientizing pilight hat den Hauptprozess auf Knoten A gefunden und sich mit ihm als untergeordneter Knoten verbunden („clientizing“): [Jan 24 15:40:44:544657] pilight-daemon: DEBUG: socket write succeeded: {"action":"identify","options":{"receiver":1,"forward":1,"config":1},"uuid":"0363-0000-63-000300"} [Jan 24 15:40:44:547148] pilight-daemon: DEBUG: socket recv: {"status":"success"} [Jan 24 15:40:44:547455] pilight-daemon: DEBUG: socket write succeeded: {"action":"request config"} Der letzte wichtige Teil ist, dass Knoten B nach der Konfiguration von Knoten A fragt, sodass alle Knoten mit derselben Konfiguration (des Hauptprozesses auf Knoten A) arbeiten. Sobald Knoten B ein Signal empfängt, wird es mit Knoten A synchronisiert, und Knoten A wird es wiederum mit Knoten C synchronisieren. Wenn Sie ein Signal (z. B. über die GUI oder eine 433 MHz Fernbedienung) senden wird es automatisch bei Knoten A ankommen, weil alle später gestarteten Knoten sich immer mit dem Hauptprozess verbinden werden. Knoten A wird dann das empfangene Signal an alle verbundenen Knoten übertragen. Daher wird auch nicht nur Knoten A ein Signal (z. B. an eine schaltbare Steckdose) senden, sondern auch alle übrigen Knoten, die am Hauptprozess angemeldet sind. Falls der Hauptprozess auf Knoten A abstürzt ist das Netzwerk aus. Die anderen Knoten laufen allerdings weiter bis der Hauptdämon wieder läuft. Natürlich werden Sie bei einem Neustart die Konfiguration neu zwischen den Knoten synchronisieren (da pilight nicht wissen kann wie die neue Konfiguration aussehen wird): [Jan [Jan lost [Jan [Jan [Jan [Jan [Jan lost [Jan 24 15:45:37:250271] pilight-daemon: DEBUG: garbage collected config library 24 15:45:37:250397] pilight-daemon: NOTICE: connection to main pilight daemon 24 24 24 24 24 15:45:37:250691] 15:45:40:250971] 15:45:40:350471] 15:45:40:350758] 15:45:40:350835] pilight-daemon: pilight-daemon: pilight-daemon: pilight-daemon: pilight-daemon: NOTICE: trying to reconnect... DEBUG: ssdp sent search ERROR: no pilight ssdp connections found DEBUG: garbage collected config library NOTICE: connection to main pilight daemon 24 15:45:40:350913] pilight-daemon: NOTICE: trying to reconnect... Sobald der Hauptprozess wieder läuft (welcher nicht unbedingt Knoten A sein muss) werden sich alle Knotenpunkte wieder mit diesem verbinden: [Jan 24 15:47:50:565899] pilight-daemon: NOTICE: trying to reconnect... [Jan 24 15:47:53:566159] pilight-daemon: DEBUG: ssdp sent search [Jan 24 15:40:44:544657] pilight-daemon: DEBUG: socket write succeeded: {"action":"identify","options":{"receiver":1,"forward":1,"config":1},"uuid":"0363-0000-63-000300"} [Jan 24 15:40:44:547148] pilight-daemon: DEBUG: socket recv: {"status":"success"} [Jan 24 15:40:44:547455] pilight-daemon: DEBUG: socket write succeeded: {"action":"request config"} Dies bedeutet, dass Sie, um eine Konfiguration (z. B. mit neuen Geräten) zu aktualisieren nur den Hauptprozess neu starten und alle Knoten werden sich automatisch Wiederverbinden und die neue Konfiguration synchronisieren. So können wir dann die Lampe im Bücherregal und die Lampe im Garten steuern. Netzwerk aus mit gleichartigen Sensoren/Relais Pilight kann auch mehrere gleichartige Geräte wie Relais oder Temperatur/Luftfeuchtigkeitssensoren im selben Netzwerk auslesen. Wir werden nun auf dem vorherigen Beispiel aufbauen und zwei weitere pilight Knoten hinzufügen. GPIO GPIO Raspberry Pi Model 2 v1.1 © Raspberry Pi 2014 Raspberry Pi Model 2 v1.1 © Raspberry Pi 2014 USB 2x USB 2x USB 2x USB 2x DSI (DISPLAY) DSI (DISPLAY) http://www.raspberrypi.org http://www.raspberrypi.org CSI (CAMERA) CSI (CAMERA) Audio Audio HDMI HDMI Power ETHERNET Bild 3: Knoten C Power ETHERNET Bild 4: Knoten D Knoten C soll den Empfang im Haus verbessern um sicherzustellen das wir alle Signale empfangen, aber er hat auch ein angeschlossenes Relais. Wir werden dieses Relais (an Pin 3 des Knoten C) benutzten, um unseren Fernseher („television“) zu schalten. Die neue Konfigurationsdatei wird so aussehen: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 "devices": { "bookshelf": { "protocol": [ "kaku_switch" ], "id": [{ "id": 123456 "unit": 1 }], "state": "off" }, "television": { "protocol": [ "relay" ], "id": [{ "gpio": 4 }], "state": "off" }, "gardenlights": { "protocol": [ "kaku_switch" ], "id": [{ "id": 123456 "unit": 2 }], "state": "off" } } Bis jetzt haben wir noch keine Probleme mit unserem pilight AdHoc Netzwerk. Aber was passierten, wenn wir nicht nur den Fernseher mit einem Relais steuern (Knoten C), sondern auch eine Heizung („heater“) mit einem weiteren Raspberry Pi und einem weiteren Relais (ebenfalls an Pin 3, allerdings von Knoten D). Unsere neue Konfigurationsdatei wird so aussehen: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 "devices": { "heater": { "protocol": [ "relay" ], "id": [{ "gpio": 4 }], "state": "off" }, "bookshelf": { "protocol": [ "kaku_switch" ], "id": [{ "id": 123456 "unit": 1 }], "state": "off" }, "television": { "protocol": [ "relay" ], "id": [{ "gpio": 4 }], "state": "off" }, "gardenlights": { "protocol": [ "kaku_switch" ], "id": [{ "id": 123456 "unit": 2 }], "state": "off" } } Wie Sie vielleicht sehen entsteht hier ein Problem. Sobald ich den Fernseher einschalte, schalte ich auch die Heizung ein, und wenn ich die Heizung ausschalte, geht der Fernseher auch aus. In diesem Falle hat pilight keine Ahnung, welches Relais es ansteuern soll, deswegen werden einfach alle geschaltet. Wenn Pin 3 auf Knoten D auf HIGH gesetzt wird, wird gleichzeitig Pin 3 auf Knoten A, B und C auf HIGH gesetzt. pilight bietet hierfür eine Lösung an, indem jeder Knoten eine eigene Kennung („UUID“) erhält. Wenn wir die UUID einer pilight Instanz in die Konfigurationsdatei eintragen, weiß pilight genau welches Relais es schalten soll. Um die UUID eines pilight Knotens herauszufinden, können wir das Programm pilight-uuid ausführen. Wir führen dieses Programm zuerst auf Knoten C aus um dessen UUID herauszufinden: pi@pilight:~# pilight-uuid 0338-00-00-38-000300 Und dann auf Knoten D um die UUID dieses Raspberry Pis herauszufinden: pi@pilight:~# pilight-uuid 0363-00-00-63-000300 Nun bearbeiten wir die Konfiguration, um die UUIDs anzuwenden: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 "devices": { "heater": { "uuid": "0338-00-00-38-000300", "protocol": [ "relay" ], "id": [{ "gpio": 4 }], "state": "off" }, "bookshelf": { "protocol": [ "kaku_switch" ], "id": [{ "id": 123456 "unit": 1 }], "state": "off" }, "television": { "uuid": "0338-00-00-68-000300", "protocol": [ "relay" ], "id": [{ "gpio": 4 }], "state": "off" }, "gardenlights": { "protocol": [ "kaku_switch" ], "id": [{ "id": 123456 "unit": 2 }], "state": "off" } } Wenn Sie nun den Fernseher einschalten, weiß pilight genau, dass es nur das Relais an Knoten C mit der UUID 0338-00-00-38-000300 schalten soll. Dasselbe gilt auch für Sensoren, die Sie an ihre Raspberry Pis anschließen. Fügen Sie einfach den richtigen UUID Wert in die Konfiguration ein, und pilight wird wissen welcher Sensor an welchen pilight Knoten angeschlossen ist. Stabiler Hauptprozess Wie Sie vielleicht gemerkt haben, ist der Hauptprozess sehr wichtig im pilight AdHoc Netzwerk. Sobald der Hauptdämon abstürzt, ist das gesamte pilight Netzwerk nicht erreichbar. Sie können das Netzwerk einfach wiederherstellen, in dem Sie den Hauptprozess neu starten. Vielleicht haben Sie bemerkt, dass ein Raspberry Pi nicht ganz so stabil wie ein „normaler“ Computer oder ein NAS ist. Wieso also den pilight Hauptprozess nicht darauf laufen lassen? Das geht! pilight ist bereits auf vielen Plattformen neben dem Raspberry Pi getestet werden. Es lief bereits auf *BSD und Debian basierten Linux-Distributionen. Das einzige Problem mit diesen Rechnern ist, dass Sie oft keine frei programmierbaren Pins („GPIOs“) haben. Dies ist aber kein Problem, weil pilight auch auf diesen Geräten laufen kann wenn Sie die Hardwaredefinition entfernen. Um pilight z. B. unter FreeBSD zu benutzten, kompilieren Sie es wie gewöhnlich, aber stellen Sie dann die “hardware“-Einstellung von pilight in der Konfiguration so ein: 1 2 3 "hardware": { "none": { } } Dies initialisiert das spezielle “none“-Hardwaremodul, das die Sende- und Empfangsfunktionen für diesen Knoten deaktiviert. Wenn Sie pilight mit dem “none“-Hardwaremodul betreiben, können Sie es einfach auf ihrem NAS installieren und die Raspberry Pi Knotenpunkte sich mit ihm verbinden lassen. Sie können ihr NAS sogar alle Protokolle bearbeiten lassen, die keine GPIO-Fähigkeiten benötigen, wie zum Beispiel die Wetter-APIs.