Met een Pi Zero aan de deurpost weet je altijd of de deur open staat of niet.
In onze woning is de voordeur vanuit de woonkamer niet te zien. Daarom kon het een paar keer gebeuren dat de deur spontaan opensprong omdat we, met armen vol boodschappen, de deur ‘achter onze kont’ niet goed genoeg dicht geduwd hadden. Dankzij de Raspberry Pi kunnen we nu in de woonkamer altijd zien of de voordeur open staat of niet.
Snel opgelost met een Raspberry Pi
Met de Raspberry Pi is een oplossing gelukkig snel bedacht en uitgevoerd. Het idee is om een Pi-Zero aan de deurpost te bevestigen die controleert of de deur open of dicht is. Deze stuurt dan via het wifi-netwerk een overeenkomstig signaal naar een tweede Pi met een led-licht die in de huiskamer staat. Deze zorgt dat er een rood licht gaat branden als de deur open staat. Is de deur weer dicht, dan gaat ook het licht weer uit.
Wat je hiermee leert
- hoe 2 Pi’s met elkaar kunnen communiceren via tcp-messaging.
- hoe je een bash-script start vanuit een Python-script.
- hoe je output van een bash-script in een Python-script importeert.
Wat je hiervoor nodig hebt
- 2 x Raspberry Pi. Bij voorkeur 2 Pi Zero W’s, maar elke andere Pi met wifi is ook goed.
- Reed-contact
De hardware
Voor onze oplossing hebben we dus twee Pi’s inclusief voedingsadapters nodig.
We beschikken over twee goedkope Pi Zero’s (een met en een zonder ingebouwde wifi-module). De ‘wifi-loze’ Zero voorzien we van een los wifi-stickje. Als alarmlicht gebruiken we een Sense-HAT die toch werkeloos op een plank ligt. Daarop zit een mooie 8×8 led-matrix waarmee we een perfect rood waarschuwingslicht kunnen maken. Duidelijk genoeg om op te vallen , maar niet hinderlijk. De Sense-HAT gaat op de wifi-loze Zero, waarop we eerst een GPIO-header hebben gesoldeerd.
Als sensor gebruiken we op de Pi bij de voordeur een zogenaamd reed-contact. Dat hebben we samen met het bijbehorend magneetje geroofd uit een goedkoop kastlampje van de Action. Het reed-contact solderen we rechtstreeks op de GPIO-aansluitingen. De ene kant (het maakt niet uit welke) aan pin 12=GPIO 18 en de andere aan pin 30=GND). De originele behuizing van de Pi Zero is ook prima geschikt om de Pi met dubbelzijdige tape of lijm netjes naast de voordeur te bevestigen. Met een lange usb-kabel van 2,5 of 3 meter, halen we net het dichtstbijzijnde stopcontact. Het magneetje komt op de deur zelf zó, dat het vlak naast het reed-contact zit.
De software
We gebruiken Raspbian Stretch op beide Pi’s. De Lite-versie is goed genoeg omdat we beide Pi’s ‘headless’ (dus zonder toetsenbord en monitor) gaan gebruiken. Gebruik je de volledige versie van Raspbian, wat makkelijker kan zijn voor het instellen van de wifi etc., zorg dan dat hij standaard opstart in de tekstmodus (kies in de Raspberry Pi Configuration voor ‘boot to CLI’).
Wanneer we de Pi’s via wifi op het lokale netwerk hebben aangesloten en ssh hebben ingesteld, kunnen we aan de slag.
Van Pi 1 naar Pi 2 via TCP
Op de Pi bij de deur draait een Python3-script (dooropenmessage.py) dat continu de toestand van de sensor in de gaten houdt. Als daar iets in verandert, start het een bash-script (tcp-comm-red.sh als de deur open is en tcp-comm-blank.sh als de deur weer dicht is). Deze scripts sturen op hun beurt met het programma netcat op de achtergrond het woord ‘open’ casu quo ‘dicht’ via tcp naar de Pi in de huiskamer. Vervolgens sluiten deze scripts zichzelf weer af met een kill-commando.
Op de Pi in de huiskamer draait een bash-script (listen2tcp.sh) dat met netcat continu luistert naar de ingestelde poort. Wanneer het script het woord ‘open’ of ‘dicht’ ontvangt, slaat het dat eerst op in een log-bestand (alarmlight.log) voorafgegaan door een datum-tijdstempel. Vervolgens start het een Python3-script (alarmlight.py) waar het dit woord als argument aan meegeeft. Alle scripts zijn hier te vinden.
Op zijn beurt laat alarmlight.py wanneer het ontvangen woord ‘open’ is, de led-matrix rood oplichten, en zet wanneer het ‘dicht’ is, de led-matrix weer uit.
Natuurlijk kun je deze oplossing ook voor bijvoorbeeld het controleren van de garagedeur, de deur van de koelkast of nog iets anders gebruiken. En het systeem is uitbreidbaar met meer Pi’s.
Wij hebben zelfs nog even overwogen om een extra Pi Zero met een sensor bij de wc te plaatsen, zodat we op het led-display ook kunnen zien wanneer de wc bezet is. Wellicht iets voor een vervolg project…
Volautomatisch
Als alles naar tevredenheid werkt, moeten we nog zorgen dat de betreffende programma’s bij het booten automatisch starten. Daar zijn verschillende manieren voor. Wij kozen hier voor de snelle en eenvoudig manier via de job scheduler ‘cron’.
Eerst gaan we naar de Pi bij de deur, start daar de cron-editor met
crontab -e
en voeg onderaan in het script de volgende regel toe en sla het bestand op.
@reboot python3 /home/pi/dooropenmessage.py &
Nu is de Pi in de woonkamer aan de beurt. Maak hier eerst een logdirectory aan met
mkdir /home/pi/logs
Dan kunnen we de output van netcat in het bestand cronlog bekijken voor het geval er iets misgaat.
Start vervolgens de cron-editor en voeg onderaan de volgende regel toe.
@reboot sh /home/pi/listen2tcp.sh >/home/pi/logs/cronlog 2>&1
Let op de cybersecurity
Dit alarmsysteem is als project erg leerzaam, maar in de praktijk geen veilige oplossing. Het signaal wordt via tcp namelijk in leesbare tekst over het wifi-netwerk verstuurd. Iedereen die toegang heeft tot het netwerk kan het alarmlicht met eigen tcp-commando’s beïnvloeden.
Zorg er in elk geval voor dat je het standaard wachtwoord van user Pi vervangt voor iets veiligers met het commando passwd.
Tip 1: Stel op de Pi’s een vast IP-adres in
Bij het aanmelden op je netwerk krijgen de Pi’s een ‘willekeurig’ IP-adres van de DHCP-server in de router. Het is handiger om daar een vast IP-adres van te maken, zodat elke Pi steeds hetzelfde IP-adres heeft. Bovendien kun je er dan voor zorgen dat een bij elkaar behorend groepje Pi’s aaneensluitende nummers krijgen, bijvoorbeeld 192.168.0.110 en 192.168.0.111. Hoe je een vast IP-adres instelt lees je hier.
Tip 2: Gebruik de mini-joystick om af te sluiten
Er zit op de Sense HAT behalve een led-matrix standaard ook een mini-joystick. Deze kun je heel handig gebruiken om de headless Pi (of meerdere Pi’s) op de juiste manier af te sluiten. Je hoeft dan niet eerst in te loggen via SSH om handmatig het shutdown-commando te geven. De instructies vind je hier.
Tip 3: Programmeer een “hartslag”
In dit project is de led-matrix uit wanneer de deur dicht is. Je wilt namelijk geen continu brandend groen licht als alles veilig is. Je wilt alleen een waarschuwing zien als de deur open staat. Dan kan het gebeuren dat de Pi gecrashed is of gewoon uitstaat zonder dat je het in de gaten hebt.
Om dat probleem op te lossen, kun je een van de ledjes op de hoek continu in een langzaam tempo laten knipperen als een soort hartslag. Dan weet je tenminste dat de Pi goed opgestart is en aan staat. Hoe je dat kunt doen vind je hier.