Raspberry PI voor de Nodo webapp

Nodo-Domotica is, volgens eigen zegge, een initiatief van hobbyisten voor hobbyisten met als doel om rond een Arduino board hard- en software te ontwikkelen waarmee Domotica (Home Automation?) kan worden gerealiseerd. Ze doen dit door Klik-Aan-Klik-Uit schakelaars aan te sturen (maar daarnaast ook nog heel veel andere devices). Kijk vooral op hun website als je hier ook interesse in hebt (maar let op, de structuur van de websites (forum, wiki) is soms ondoorgrondelijk. Een beet onderzoek-drang helpt)!

MyNodo1 Ik kwam in augustus 2012 per ongeluk op hun website en werd meteen gegrepen door de eenvoud van de hardware en de kwaliteit van de software. Ik had al wat ervaring met het werken met Arduino boardjes maar dit is voor de thuis knutselaar echt een hard- en software-project(je) om je handen bij af te likken.



MyNodo2Het duurde dan ook niet lang voordat ik alle onderdelen die nodig zijn om de Nodo controller te maken, had besteld en aan elkaar geplakt.


In de tussentijd hebben de ontwikkelaars van de Nodo ook een webserver applicatie gemaakt waarmee je Nodo’s kunt besturen. Hartstikke mooi, maar niet iedereen wil de besturing van zijn huis buiten de deur hosten. Gelukkig is ondertussen (begin 2013) ook de NoDoWeb applicatie als open-source vrijgegeven en kan iedereen deze software dus thuis op zijn eigen server ‘draaien’. Moet de server wel dag-en-nacht aan staan en dat is niet altijd handig/mogelijk/gewenst. Het zou dan ook fantastisch zijn om de NoDoWeb applicatie op een kleine, goedkope, weinig geluid producerende en energie zuinige server te kunnen draaien.

Nou, dat kan!


RPi_Logo Deze post beschrijft hoe je de NoDoWeb applicatie kunt installeren en laten draaien op een Raspberry PI creditcard computer!


De raspberry pi moet dan eerst als webserver ingericht worden. Hoe dat moet kun je hier lezen. Omdat de NoDoWeb applicatie een eMail bericht moet kunnen versturen moet ook deze handleiding worden gevolgd.


De raspberry pi gebruikt Raspbian (een afgeleide van Debian) als besturingssysteem. Machtelt Garrels heeft een aantal boeken geschreven over Linux die zeer (online) leesbaar zijn. Als Linux nieuw voor je is (of als je kennis wat roestig is) dan raad ik je “Introduction to Linux” en “Bash Guide for Beginners van harte aan!


De rest van deze handleiding gaat ervan uit dat de eerste twee stappen zijn gevolgd en dat is vastgesteld dat de webserver correct werkt!

De, in deze handleiding gebruikte, conventie is dat alle tekst die op je computerscherm verschijnt in het groen wordt weer gegeven. Alles wat je moet intoetsen is in het zwart weergegeven. Ieder commando moet worden afgesloten door op <Enter> te drukken!
commando’s die niet op één passen worden over meerdere regels weergegeven gescheiden door een backslash (“\“). Deze backslash dient alleen om aan te geven waar, voor de leesbaarheid, het commando is opgesplitst en moet dus niet worden ingetoetst!
——————-
Nodo Versie: Nodo V3.0.1 Mega, Product=SWACNC-MEGA-R491
NoDoWeb van googlecode afgehaald: (zie verderop in deze post)


Je begint met het ophalen van de meest recente versie van de NoDoWeb software uit de googlecode repository. Dit doe je met het commando svn.

We willen de software in de root directory van de webserver neerzetten dus gaan we daar eerst heen.
Let op: het hele svn checkout commando moet op een (1) regel worden ingevoerd (de backslash (“\“) geeft aan waar de regel is afgebroken. De backslash moet natuurlijk niet worden overgetikt ;-)

pi@raspberrypi ~ $ cd /var/www
pi@raspberrypi ../www $ sudo svn checkout  \
        http://arduino-nodo.googlecode.com\
        /svn/Webserver/NoDoWeb


De repository wordt standaard in een sub-directory NoDoWeb gezet. Helaas zorgt dit voor problemen voor de thuis gebruiker, omdat de programma-code overal naar webapp verwijst.
We hernoemen (mv) de directory NoDoWeb daarom in webapp ..

pi@raspberrypi ../www $ sudo mv NoDoWeb/ webapp/

pi@raspberrypi ../www $ cd webapp/
pi@raspberrypi ../webapp $ ls -l

total 172
drwxr-xr-x 3 root root  4096 Apr 21 17:40 admin
-rw-r--r-- 1 root root  2593 Apr 21 17:40 confirmation.php
drwxr-xr-x 2 root root  4096 Apr 21 17:40 connections
drwxr-xr-x 2 root root  4096 Apr 21 17:40 css
-rw-r--r-- 1 root root 35042 Apr 21 17:40 gpl.html
drwxr-xr-x 2 root root  4096 Apr 21 17:40 include
-rw-r--r-- 1 root root  1276 Apr 21 17:40 index.html
drwxr-xr-x 3 root root  4096 Apr 21 17:40 js
-rw-r--r-- 1 root root 35171 Apr 21 17:40 license.txt
-rw-r--r-- 1 root root  2737 Apr 21 17:40 login.php
-rw-r--r-- 1 root root  1393 Apr 21 17:40 logout.php
-rw-r--r-- 1 root root  1704 Apr 21 17:40 lost_password_ok.php
-rw-r--r-- 1 root root  4611 Apr 21 17:40 lost_password.php
drwxr-xr-x 2 root root  4096 Apr 21 17:40 media
drwxr-xr-x 2 root root  4096 Apr 21 17:40 MYSQL
-rw-r--r-- 1 root root 10851 Apr 21 17:40 nodo.php
-rw-r--r-- 1 root root  1764 Apr 21 17:40 signup_ok.php
-rw-r--r-- 1 root root  9258 Apr 21 17:40 signup.php
-rw-r--r-- 1 root root 10784 Apr 21 17:40 webapp.html
drwxr-xr-x 3 root root  4096 Apr 21 17:40 webservice


De NoDoWeb applicatie maakt uitvoerig gebruik van de MySQL database dus deze moet worden aangemaakt. Gelukkig hebben de ontwikkelaars van de NoDoWeb applicatie hier een script voor gemaakt dat (na een kleine aanpassing) eenvoudig kan worden uitgevoerd..

pi@raspberrypi ../webapp $ cd MYSQL
pi@raspberrypi ../MYSQL $ ls -l

total 32
-rw-r--r-- 1 root root 28845 Apr 21 17:40 nodo_db.txt


Het file nodo_db.txt bevat alle instructies om een standaard, lege, database voor de Nodo WebApp aan te maken. Helaas staan er ook een hoop instructies in die niet nodig zijn (en veelal ook foutmeldingen veroorzaken).
Maak daarom een kopie (cp) van nodo_db.txt en noem deze myNodo_db.txt.
Verwijder vervolgens de onnodige instructies. Open het gekopieerde bestand met je favoriete editor (vi of nano) en verwijder alle regels vanaf het begin tot

CREATE DATABASE "nododom_webappdb"

(de CREATE DATABASE regel moet dus de eerste regel van het aangepaste bestand worden!).


De die hards die vi gebruiken zullen weten hoe ze daar mee om moeten gaan. Voor de minder ervaren gebruikers raad ik nano aan. Om te zien op welk regelnummer de cursor staat moet nano opgestart worden met de optie “-c“. Om aanpassingen op te slaan druk je achtereenvolgend op <Ctrl>+X, Y, <Enter>

pi@raspberrypi ../MYSQL $ sudo cp nodo_db.txt myNodo_db.txt
pi@raspberrypi ../MYSQL $ sudo nano -c myNodo_db.txt


Maak nu de database aan en vul deze met de (lege) tabellen ..

pi@raspberrypi ../MYSQL $ mysql -u root -p < myNodo_db.txt 
Enter password: <mysql-server password>


Het <mysql-server password> is het password dat je bij de installatie van mysql-server hebt ingevoerd.


De database is nu gemaakt maar we moeten nog een gebruiker aanmaken die alle rechten voor deze database heeft. In het voorbeeld is de gebruiker NodoUser met het wachtwoord NodoWachtwoord. Je moet zelf iets anders verzinnen omdat iedereen die bij de installatie dit blog volgt anders dezelfde combinatie gebruikt!

pi@raspberrypi ../MYSQL $ mysql -u root -p
Enter password: <mysql-server password>
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5340 to server version: 3.23.54

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> GRANT ALL PRIVILEGES ON nododom_webappdb.* 
    -> TO "NodoUser"@"localhost"
    -> IDENTIFIED BY "NodoWachtwoord";
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES; 
Query OK, 0 rows affected (0.01 sec)

mysql> EXIT
Bye
pi@raspberrypi ../MYSQL $


Nu moet in alle programma files van NoDoWeb de “harde verwijzingen” naar www.nodo-domotica.nl worden veranderd in het IPadres van de webserver (bijvoorbeeld ‘192.168.1.101’ en op sommige plaatsten ‘${WEBAPP_HOST}’).
De programma files waarin deze verwijzingen staan kun je eenvoudig vinden met het grep commando. Zoek een voor een de submappen af en verander de programma’s waarin zo’n harde verwijzing staat:

pi@raspberrypi ../MYSQL $ cd /var/www/webapp
pi@raspberrypi ../webapp $ grep nodo-domotica *
   ..
   lijst met gevonden files
   ..
pi@raspberrypi ../webapp $ grep nodo-domotica */*
   ..
   lijst met gevonden files
   ..
pi@raspberrypi ../webapp $ grep nodo-domotica */*/*
   ..
   lijst met gevonden files
   ..
pi@raspberrypi ../webapp $ grep nodo-domotica */*/*/*
   ..
   lijst met gevonden files
   ..


Onderstaande files moeten worden aangepast maar let op!! Als je met svn checkout opnieuw de laatste versie ophaalt, dan moet je deze aanpassingen opnieuw aanbrengen!!!
Bij een nieuwe release van NoDoWeb zullen de regelnummers niet meer correct zijn! In dat geval met het grep commando zoeken wat waar aangepast moet worden.
Programma signup.php:

regel  moet worden:
150    .. http://${WEBAPP_HOST}/webapp ..enz..
164    $from = "Nodo@<MyDomain>";

Programma nodo.php:

regel  moet worden:
149    $from = "Nodo@<MyDomain>";

Programma lost_password.php:

regel  moet worden:
 71    $from = "Nodo@<MyDomain>";

Programma webservice/admin/json_setup_connection.php:

regel  moet worden:
153    if ($HTTPHost == "<IPadress_raspberrypi>/webapp/nodo.php" 
                                       .. enz ..

.. en tenslotte moet de volgende variabele correct worden gevuld in
Programma include/webapp_settings.php:

regel  moet worden:
 25    $WEBAPP_HOST = "<IPadres_raspberrypi>/webapp";


Nu moet je nog aan NoDoWeb aangeven hoe je database heet en welke gebruiker met welk wachtwoord de database mag benaderen.

Deze gegevens staan in /var/www/webapp/connections/db_connection.php. Open dit bestand met je favoriete editor (vi of nano) en voer de gegevens in ..

pi@raspberrypi ../webapp $ cd /var/www/webapp/connections
pi@raspberrypi ../webapp $ sudo nano -c db_connection.php


Het bestand moet er nu zo uit zien (de backslash (“\“) geeft aan dat de volgende regel eigenlijk op dezelfde regel moet staan):

<?php
$db_hostname = "localhost";
$database = "nododom_webappdb";
$db_username = "NodoUser";
$db_password = "NodoWachtwoord";
$db = mysql_pconnect($db_hostname, $db_username, $db_password) or \
                trigger_error(mysql_error(),E_USER_ERROR);
?>

Inplaats van NodoUser en NodoWachtwoord, moet je de gebruikersnaam en het wachtwoord gebruiken die je een paar stappen hiervoor met GRANT PRIVILEGES .. hebt ingevoerd.


Ga nu met een browser naar http://<IPadres_raspberrypi>/webapp/


Screen Shot 2013-04-25 at 19.02.46

Als je alle gegevens hebt ingevuld en op de knop [Signup] klikt, ontvangt je een eMail bericht met een wachtwoord en een link waarmee je de aanmelding kunt bevestigen. Klik op de link om je aanmelding te bevestigen. Daarna kun je inloggen met het eMail adres dat je hebt opgegeven en het wachtwoord dat in het eMail bericht staat.

Let op: Als je de postfix functionaliteit niet wilt installeren (om welke reden dan ook) dan kun je de bevestiging van je aanmelding rechtstreeks in de webapp database aanbrengen. Je verliest hiermee wel wat functionaliteit, maar voor thuis gebruik heb je die niet echt nodig.

Om rechtstreeks in de database aan te geven dat je geregistreerd bent moet je het volgende doen:


pi@raspberrypi ../webapp $ cd /var/www/webapp/include
pi@raspberrypi ../include $ grep salt webapp_settings.php

//$salt word gebruikt om er voor te .. zoals 1234, abc sterk worden gehashed
$salt = "MijnZout"; //aanpassen naar gewenste salt

De string die achter $salt = staat (in dit geval MijnZout) moet je straks invullen in plaats van <SaltString>. In plaats van NodoUser en NodoWachtwoord moet je weer de combinatie invullen die je met het GRANT PRIVILEGES .. hebt gebruikt.


pi@raspberrypi ../webapp $ cd 
pi@raspberrypi ~ $ mysql -u NodoUser -p nododom_webappdb 
Enter password: NodoWachtwoord

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7177
Server version: 5.5.30-1.1 (Debian)

Type 'help;' or '\h' for help. Type '\c' to clear the
current input statement.

mysql> select id, user_login_name, confirm_code
    -> from nodo_tbl_users;

+-----+------------------------+--------------+
| id  | user_login_name        | confirm_code |
+-----+------------------------+--------------+
| 123 | Jan.de.Bruin@gmail.com | <confrmcode> |
+-----+------------------------+--------------+
1 row in set (0.01 sec)

Je moet nu de rij met id=123 (in dit geval, jij kunt een heel ander id zien!) updaten.

mysql> update nodo_tbl_users
    -> set confirm_code = ""
    ->   , active = 1
    ->   , user_password = md5('<SaltString>Jan')
    -> where id = 123;

Query OK, 1 rows affected (0.20 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> exit
Bye
pi@raspberrypi ~ $

Je kunt nu inloggen met de gebruikersnaam die je in het Signup scherm hebt opgegeven met het wachtwoord Jan.


Zorg ervoor dat je op je Nodo (via telnet of de Arduino monitor) een reset commando geeft voordat je verder gaat!
Als je dat niet doet dan zal de configuratie/communicatie beslist fout gaan!!
Denk er ook aan dat alles wat je op de Nodo hebt ingesteld met het reset commando verloren gaat (dus ook je Eventlist!)!


Vervolgens op de webapp via [Setup] -> [Communication] het correctie IP-adres van je Nodo invoeren (zorg ervoor dat je DHCP-server op je router/modem altijd hetzelfde IP-adres afgeeft voor de Nodo en de raspberry pi!) en de gewenste port. Voer het wachtwoord in dat je voor deze Nodo wilt gaan gebruiken, vink “Autoconfiguration” aan en druk op [Save & Check connection].


Screen Shot 2013-04-25 at 19.11.56


Works like a charm (met de complimenten aan de Nodo en NoDoWeb applicatie ontwikkelaars)!!


Kijk af-en-toe in /var/log/lighttpd/error.log of zich vreemde zaken voordoen op je website. Eventuele php-warnings kun je uitschakelen door de instructie over php.ini in mijn post over de inrichting van de RPi als webserver te volgen.