Lampen aan- en uitschakelen met je telefoon

Doel 

Een webserver draaien op de RPi die via PHP-commando's stopcontacten draadloos aan en uit schakelt

Tutorial 

Voor je begint: De tutorial hieronder richt zich op Arch Linux, deze tutorial: "Lampen schakelen met zonsondergang en zonsopgang" richt zich op Raspbian en is daardoor makkelijker, het eerste deel (tot aan de eerste keer dat je de lampen schakelt met je RPi) bereikt hetzelfde als hier. Het doel van de hele tutorial is iets anders, we maken in de zonsopgang-tutorial geen website om de lampen te schakelen maar dat deel kun je wel weer hier volgen. In dat geval is het wel het makkelijker om eerst een webserver met PHP te instaleren op Raspbian: "Een webserver met PHP (Raspbian)". Excuses voor de onduidelijkheid, vragen zijn altijd welkom. Succes!

Kijk, nu gaat het leuk worden. In deze tutorial gaan we niet alleen de RPi gebruiken om via een RF transmitter draadloos schakelbare stopcontacten aan en uit te zetten via de command line, maar we gaan nog een stapje verder. We gaan ook een webinterface bouwen zodat we met onze laptops en telefoons lampen en andere apparatuur met een mooie interface kunnen aansturen. Om deze webinterface te kunnen maken moeten we wel eerst een webserver met PHP mogelijkheden maken op de RPi, zie "De RPi als webserver". Voor het eerste deel van deze tutorial is de webserver nog niet nodig, pas als we de interface gaan bouwen.

Zelf heb ik dit aan de praat gekregen met behulp van het tweakblog van WeeJeWel. Op dit blog maar ook in de reacties staan veel nuttige dingen, tips en achtergronden. Ik raad het zeker aan het blog te lezen.

Er is een image beschikbaar waarbij je RPi meteen een website serveert met twee links die je draadloos schakelbare stopcontacten aan- en uitschakelen (zie de Images pagina). Je moet nog wel de kanalen goed instellen in de PHP files, zoals hieronder beschreven.

De Hardware

We sluiten eerst de rf-transmitter aan op de juiste poorten van de RPi op de volgende manier:
  • Vcc van de transmitter op pin 4 van je Pi (VCC 5V)
  • GND van de transmitter op pin 6 van je Pi (GND)
  • Data in van de transmitter op pin 8 van je Pi (TX)
Wat de VCC, GND (ground) en ATAD pinnen op de rf transmitter precies zijn vind je in een PDF op de informatie pagina van de RF transmitter op de iPrototype website. Het plaatjes hieronder komt uit die PDF.

rf-transmitter
Figuur 1: De pinnen van de RF transmitter.

Welke pinnen je op RPi moet gebruiken vind je op "De Raspberry Pi GPIO pinnen". Voor de duidelijkheid, de orientatie van dat plaatje klopt met de RPi als je de pinnen links boven houdt. Uiteindelijk sluit je dus de tweede, derde en vierde pin van links boven aan.

De Software

Als eerste installeren we de WiringPi library uit de Arch User Repository (AUR) (Hiervoor moet je dus Yaourt aan de praat hebben):
yaourt -S wiringpi
Daarna ga we een pakket met C-programma's downloaden wat WeeJeWel van het hierboven genoemde tweakblog heeft gemaakt, maar daarvoor moeten we eerst het programma wget installeren:
yaourt -S wget
(Het kan zijn dat wget al is geinstalleerd met het installeren van Yaourt)
We zorgen dat we in de map /root zitten met cd en we downloaden de code van WeeJeWel (inmiddels gefixt door mouse86 voor de RPi2)
wget -O lights.zip https://dl.dropboxusercontent.com/u/7522515/tweakers/rpi-kaku/20150702V1-lights.zip?dl=1
Om het bestand te unzippen hebben we unzip nodig:
pacman -S unzip
Unzip het bestand:
unzip lights.zip
En ga de map in
cd lights
In deze map staan verschillende versies van het programma voor verschillende draadloos te schakelen stopcontacten, ik heb die van de Action dus compileer ik het C-programma genaamd "action"
g++ -o action action.cpp -I/usr/local/include -L/usr/local/lib -lwiringPi
Dit maakt een executable "action" welke we kunnen gebruiken om lampen te schakelen. Om het programma "action" uit te kunnen voeren vanuit welke map dan ook verplaatsen we het naar de map /usr/bin/:
mv action /usr/bin/
Het programma "action" vraagt om wat parameters die overeenstemmen met hoe je afstandsbediening staat ingesteld. Voor mij is het commando:
action 63 A on
"63" staat voor hoe de pinnen in de afstandsbediening staan en de "A" staat voor het stopcontact in de set (ik heb er 3, de ene reageert op A, de andere op B en de derde op C). Om het stopcontact weer uit te schakelen geef je het commando:
action 63 A off

Als het getal 63 niet werkt moet je de stopcontacten open schroeven en kijken hoe de "switches" staan. Op deze website vind je een "dip switch calculator" waarmee je kunt berekenen welk getal bij jouw switch configuratie past. Als de switches hetzelfde staan (je heb 1 switch te veel, je moet even proberen hoe dat uitpakt) dan komt het getal wat je nodig hebt te staan bij DMX Address, dit is het getal wat je moet gebruiken in plaats van "63" in de rest van deze tutorial.

De webinterface

Voor dit stuk moet je RPi een webserver met PHP draaien. Je hebt in deze tutorial een index.php file gemaakt in de map /usr/share/nginx/html/. Deze file zie je als je naar het ip adres van je RPi surft met je browser. Die file gaan we nu aanpassen om het "action" programma uit te voeren door op links te klikken. Het is het makkelijkste om de hele file eerst weg te gooien:
rm /usr/share/nginx/html/index.php
Open de file opnieuw:
nano /usr/share/nginx/html/index.php
En plak de volgende tekst in de file:
<!DOCTYPE html>
<html>
<head>
<title>Lampen aan en uit schakelen.</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Lampen schakelen via je RPi</h1>
<p>

<p>
<H2><A HREF="lampaan.php">lamp aan</A></H2>
</p>

<p>
<H2><A HREF="lampuit.php">lamp uit</A></H2>
</p>

</p>
</body>
</html>

Als je nu naar je RPi website surft zie je twee links, "lamp aan" en "lamp uit". Wat we willen is dat het klikken op deze links ons stopcontact respectievelijk aan- en uitschakelt. PHP code wordt alleen uitgevoerd als de pagina wordt geladen en dus willen we de commando's die horen bij de lamp aan en uit schakelen in aparte PHP files zetten. De PHP files moeten ons na het uitvoeren van de code weer naar de index.php pagina terug brengen. De onderstaande twee files doen precies dat. Open eerst een file "lampaan.php":
nano /usr/share/nginx/html/lampaan.php
plak de volgende code in de file

<?php
exec('action 63 A on');
?>

<?php
   header('Location: index.php');
?>
(Het laatste stuk brengt je terug naar de index.php)
Sluit nano (ctrl-x, y, enter).
Open een nieuwe file "lampuit.php"
nano /usr/share/nginx/html/lampuit.php
plak de volgende code in de file
<?php
exec('action 63 A off');
?>

<?php
   header('Location: index.php');
?>
Sluit nano (ctrl-x, y, enter).

Voordat het kan werken moet je nog 1 belangrijk ding doen: de webserver, Nginx, wordt gestart door de speciale gebruiker "http", die gebruiker mag de wiringpi library niet aanspreken en dus zal het "action" programma niet werken vanuit de webserver. Om het "action" programma altijd met root-rechten uit te voeren moet je "setuid" instellen, met het volgende commando:
chmod +s /usr/bin/action

Surf naar je RPi webpagina en schakel je lampen aan en uit met de links. De links kun je natuurlijk mooier maken met wat html/css en je kunt door de code aan te passen veel meer stopcontacten schakelen. Je kunt ook per kamer een pagina maken, laat maar weten in de comments wat je maakt, ik ben erg benieuwd.

Bronnen