AdHoc Netwerk AdHoc Netwerk..................................................................................................................................................1 Introductie......................................................................................................................................................1 Netwerk van zenders en ontvangers............................................................................................................1 Netwerk van (conflicterende) sensoren en relais..........................................................................................4 Stabiele hoofd daemon.................................................................................................................................6
Introductie Waarschijnlijk is de AdHoc netwerk functionaliteit binnen pilight een van de meest geadvanceerde mogelijkheden die pilight heeft, maar ook een van de meest onbekende. Een AdHoc netwerk betekent concreet dat je een groot netwerk van pilight computers kan aanleggen die met elkaar samenwerken. Vergelijkbaar met de Borg in Star Trek. Laten we uitgaan van het volgende gebruikers scenario (waarin de meeste van ons zich kunnen herkennen). We hebben een Raspberry Pi met daaraan een zender en ontvanger. Deze enkele Raspberry Pi met pilight bedient onze lampen en ontvangt data uit onze weerstations en/of van o.a. openweathermap.org. Deze systeem heeft al bewezen goed te werken.
Netwerk van zenders en ontvangers
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
Afbeelding 1: Node A
ETHERNET
Power
ETHERNET
Afbeelding 2: Node B
De grootste limitatie van een domotica set-up is zijn bereik. We kunnen natuurlijk aan de slag gaan met antenne's en dergelijke, maar dat lost niet altijd het probleem op. Hoe lossen we het probleem op wanneer een enkele Raspberry Pi de moeilijk bereikbare plekken in ons huis niet kan bereiken.
De oplossing hiervoor is het aanleggen van een netwerk van zender en ontvangers die met elkaar samenwerken. Dat is precies wat pilight doet met zijn AdHoc netwerk functionaliteit. Om dit te laten werken hebben we twee pilight computers nodig. In dit voorbeeld gebruiken we twee Raspberry Pi's. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
"devices": { "bookshelf": { "protocol": [ "kaku_switch" ], "id": [{ "id": 123456 "unit": 1 }], "state": "off" }, "gardenlights": { "protocol": [ "kaku_switch" ], "id": [{ "id": 123456 "unit": 2 }], "state": "off" } }
We hebben hier een bookshelf lamp aan de ene kant van ons uit en een achtertuin met een aantal lampen genaamd gardenlights. Onze instellingen voor Node A zien er als volgt uit: 1 2 3 4 5 6 7 8 9
"settings": { "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": "" }
Laten we vervolgens pilight starten in debug modus om te zien wat er gebeurt: [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 weet dat het de enige is die in het netwerk actief is en zal daarom starten als hoofd daemon. We zien echter dat we inderdaad niet zowel de bookshelf als de gardenLights kunnen bedienen met een enkele Raspberry Pi met pilight. Dit kunnen we oplossen door een tweede Raspberry Pi met pilight aan de andere kant van het huis op te zetten. De instellingen van deze Raspberry Pi met pilight (Node B) ziet er als volgt uit: 1 2 3 4 5
"settings": { "log-level": 6, "log-file": "/var/log/pilight-daemon.log", "whitelist": "" }
Zoals je kunt zien hebben we de webserver instellingen weggehaald, omdat een pilight node zijn webserver zal deactiveren. Als we nu deze pilight starten dan zien we waarschijnlijk het volgende: [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
Deze pilight heeft de hoofd daemon (Node A) gevonden en zal er verbindingen mee maken als node: [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"}
Het laatste belangrijke onderdeel van de communicatie is dat Node B de configuratie van de hoofd daemon opvraagt zodat ze beide met dezelfde configuratie werken. Zodra er iets wordt ontvangen op Node B, dan zal dit gesynchroniseerd worden met Node A en vervolgens met Node C enz. Als er door een van de nodes een code wordt ontvangen dan zal dit automatisch doorgezet worden naar Node A, omdat alle nodes altijd met de hoofd daemon verbinding maken. Node A zal vervolgens de code weer doorsturen naar alle nodes die met hem verbonden zijn. Niet alleen Node A zal een commando verzenden, maar ook Node B, C, D etc. Zodra Node A crashed, dan is het netwerk inactief. Alle nodes zullen echter blijven draaien en proberen verbinding te maken met de hoofd daemon zodra deze weer actief wordt en vervolgens weer hun configuratie synchroniseren. [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...
Als de hoofd daemon weer online komt, dan zullen alle nodes er weer mee verbinden. De hoofd daemon hoeft echter niet Node A te zijn, maar kan ook een andere pilight computer zijn. [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"}
Dit betekent dat wanneer je de configuratie wil bijwerken je niet alle nodes opnieuw hoeft te starten, je hoeft alleen de hoofd daemon te herstarten en alle nodes zullen dit weer synchroniseren. Uiteindelijk kunnen we zo de bookshelf lamp aan de voorkant van ons huis bedienen en ook de lampen aan de achterkant van het huis.
Netwerk van (conflicterende) sensoren en relais pilight kan ook verschillende apparaten bedienen zoals relais en/of het uitlezen van temperatuur- en/of luchtvochtigheidssensoren. Laten we verder gaan met het volgende voorbeeld, maar nu met twee nieuwe pilight computers.
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
Image 3: Node C
Power
ETHERNET
Image 4: Node D
Node C is bedoelt om nog meer bereik toe te voegen aan ons huis, maar heeft ook een relais aan zich verbonden. We willen die relais gebruiken om onze televisie mee aan of uit te zetten. De nieuwe configuratie ziet er als volgt uit: 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" } }
Tot nu toe zijn we nog geen problemen tegengekomen met de pilight AdHoc netwerk. Maar wat gebeurt er in de volgende situatie? We willen niet alleen de televisie aan of uit zetten met een relais (Node C), maar ook onze ketel met stadswarmte bedienen met een tweede relais (Node D). De nieuwe configuratie ziet er als volgt uit: 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" } }
Zoals je kunt zien ontstaat hier een probleem. Zodra we de televisie aanzetten, dan zetten we ook de ketel aan. Als we de televisie weer uitzetten dan zetten we ook de ketel weer uit. In dit geval heeft pilight geen idee welke relais hij moet schakelen dus schakelt hij ze allemaal. Dus als ik GPIO 3 van Node D op Hoog zet, dan gaat ook de GPIO 3 van Node A, B, en C op Hoog. pilight lost dit probleem op door iedere pilight computer een specifieke UUID te geven. Door deze UUID toe te voegen aan onze configuratie weet pilight welke relais hij moet bedienen. We gebruiken het programma pilight-uuid om te achterhalen wat het UUID van onze pilight computer is. We draaien dit programma eerst op Node C zodat we weten wat het UUID dat deze Raspberry Pi is: pi@pilight:~# pilight-uuid 0338-00-00-38-000300
En volgens op Node D om te zien wat het UUID van deze Raspberry Pi is: pi@pilight:~# pilight-uuid 0363-00-00-63-000300
Laten we onze configuratie aanpassen door de UUIDs toe te voegen. 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" } }
Als we nu de televisie aanzetten, dan weet pilight dat het de relais moet bedienen aangesloten aan NODE C met UUID 0338-00-00-38-000300. Hetzelfde geldt voor de sensoren die verbonden zijn met je Raspberry Pi. Voeg de juiste UUID toe en pilight weet welke sensor verbonden is met welke pilight computer.
Stabiele hoofd daemon Zoals al duidelijk was geworden heeft de hoofd daemon een belangrijke rol in het pilight AdHoc netwerk. Als deze hoofd daemon crashed, dan is het hele netwerk inactief. Het netwerk kan weer actief gemaakt worden door de hoofd daemon opnieuw te starten. Zoals jullie wellicht weten is de Raspberry Pi minder stabiel dan allerdaagse computers en minder stabiel dan NAS systemen. Waarom draaien we pilight dan niet op deze systemen? Dat kan! pilight is getest op allerlei computers naar de Raspberry Pi. Het draait succesvol op *BSD en Debian gebaseerde systemen. Het probleem is alleen dat deze moederborden vaak geen ondersteuning hebben voor GPIO. Dat hoeft echter geen probleem te zijn want je kan pilight ook draaien zonder hardware configuratie.
Als je dus pilight wil draaien op bijvoorbeeld FreeBSD, compileer het zoals je normaal gesproken zou doen, maar stel de hardware als volgt in:: 1 2 3
"hardware": { "none": { } }
Dit zal een speciale none hardware module aanzetten die niks meer doet dan het laten slapen van de zender en ontvanger functionaliteit. Als je pilight laat draaien met de none hardware module, dan kan je de hoofd daemon op je NAS zetten en je Raspberry Pi's met deze NAS verbinding laten maken. Je NAS kan tevens alle protocollen afhandelen die geen GPIO nodig hebben zoals de weer APIs.