AdHoc Netzwerk - pilight manual

Werbung
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.
Herunterladen