Installatie: Toegelicht

Het installeren duurt naar verwachting zo’n 15 a 30 minuten (op een RaspberryPi 3), maar hangt vooral af van je eigen vaardigheid op de command line.

1. Databaseopslag (PostgreSQL)

De applicatie slaat de P1-metingen standaard op.

  • Installeer database:

    sudo apt-get install -y postgresql
    

Notitie

Start PostgreSQL niet wegens een fout in ‘locales’? Bijvoorbeeld:

Error: The locale requested by the environment is invalid.
Error: could not create default cluster. Please create it manually with

pg_createcluster 9.4 main --start

Probeer: dpkg-reconfigure locales.

Werkt het nog steeds niet? Open dan dit bestand /etc/environment, voeg onderaan de regel LC_ALL="en_US.utf-8" toe en herstart het systeem. Probeer daarna pg_createcluster 9.4 main --start (of welke versie je ook gebruikt).

(!) Negeer voor de volgende drie commando’s de foutmelding: ‘could not change directory to “/root”: Permission denied’.

  • Creëer databasegebruiker:

    sudo -u postgres createuser -DSR dsmrreader
    
  • Creëer database, met als eigenaar de databasegebruiker die we net hebben aangemaakt:

    sudo -u postgres createdb -O dsmrreader dsmrreader
    
  • Stel wachtwoord in voor databasegebruiker:

    sudo -u postgres psql -c "alter user dsmrreader with password 'dsmrreader';"
    

Optioneel: Database back-up terugzetten

Let op

Indien je een back-up van de database wilt terugzetten met je oude gegevens, nu is het moment om dat te doen.

Database back-up terugzetten? Zie hier voor instructies.

2. Afhankelijkheden

Tijd om diverse tools te installeren. Deze zijn nodig voor de Nginx webserver, de Gunicorn applicatieserver en voor het binnenhalen van de code van de applicatie vanaf Github:

sudo apt-get install -y nginx supervisor git python3 python3-psycopg2 python3-pip python3-virtualenv virtualenvwrapper

Installeer cu. Met dit programmaatje kunnen kun je vrij gemakkelijk de DSMR-verbinding testen naar je slimme meter toe. Erg handig om te kijken of dat überhaupt al lekker werkt:

sudo apt-get install -y cu

3. Applicatiegebruiker

De applicatie draait standaard onder de gebruiker dsmr. Hierdoor heeft het geen root-rechten (nodig), wat over het algemeen zeer afgeraden wordt.

Maak een aparte gebruiker aan met eigen homedir. De code voor de applicatie en VirtualEnv zetten we later hier in:

sudo useradd dsmr --home-dir /home/dsmr --create-home --shell /bin/bash

De gebruiker heeft ook toegang nodig om de kabel te kunnen uitlezen. Hiervoor voegen de we gebruiker toe aan de groep dialout:

sudo usermod -a -G dialout dsmr

Ga ofwel door naar het volgende hoofdstuk voor een testmeting of ga direct door naar stap 4.

Je allereerste (optionele) meting

Notitie

OPTIONEEL: Je kunt deze stap overslaan wanneer je al eerder een (test)meting hebt gedaan met je slimme meter. Ik raad het dus vooral aan als je nog nooit eerder je P1-poort hebt uitgelezen. Hiermee verzeker je jezelf ook dat de applicatie straks dezelfde (werkende) toegang heeft voor de metingen.

  • Log nu in als de gebruiker die we zojuist hebben aangemaakt voor de eerste testmeting!

    sudo su - dsmr
    
  • Test met cu voor DSMR 4+:

    cu -l /dev/ttyUSB0 -s 115200 --parity=none -E q
    
  • Of test met cu voor DSMR 2.2 (ongetest):

    cu -l /dev/ttyUSB0 -s 9600 --parity=none
    

Je zou nu iets moeten zien als Connected.. Vervolgens krijg je, als het goed is, binnen tien seconden een hele lap tekst te zijn met een hoop cijfers. Werkt het niet? Probeer dan een andere BAUD-waarde, zoals hierboven beschreven. Of kijk op een nuttig weblog.

  • Om cu af te sluiten, typ “q.”, druk op Enter en wacht voor een paar seconden. Het programma sluit af met de melding Disconnected..

4. Webserver/Nginx (deel 1)

We configureren vervolgens de webserver (Nginx). Deze serveert alle statische bestanden en geeft de applicatie-verzoeken door naar de backend, waar de applicatie in Gunicorn draait onder Supervisor. Deze stellen we later in.

  • Zorg ervoor dat je hier root- of sudo-gebruiker bent. Zo niet, druk op CTRL + D om uit te loggen als dsmr gebruiker.

Django kopieert alle statische bestanden naar een aparte map, die weer door Nginx gebruikt wordt. Daarom is er tevens (schrijf)toegang voor nodig:

sudo mkdir -p /var/www/dsmrreader/static

sudo chown -R dsmr:dsmr /var/www/dsmrreader/

5. Kloon project code vanaf Github

Nu kunnen we de code van de applicatie van Github downloaden en in de homedir zetten die we net aangemaakt hebben.

  • Zorg ervoor dat je ingelogd bent als dsmr-gebruiker (zo niet, typ dan: sudo su - dsmr)

  • Kloon de repository:

    git clone https://github.com/dennissiemensma/dsmr-reader.git
    

Dit kan enkele seconden in beslag nemen. Als het goed is zie je hierna een map genaamd dsmr-reader, met daarin een kopie van de repository zoals die op Github staat.

6. VirtualEnv

Alle (externe) afhankelijkheden worden opgeslagen in een aparte omgeving, ook wel VirtualEnv genoemd.

Dit is allemaal erg handig, ondanks dat het feitelijk niets meer voorstelt dan een aparte map binnen de homedir van onze gebruiker. Hierdoor kunnen we namelijk meerdere versie van software op hetzelfde systeem installeren, zonder dat dat elkaar bijt. Meer informatie hierover kan hier gevonden worden.

  • Zorg ervoor dat je nog steeds ingelogd bent als dsmr-gebruiker (zo niet, typ dan: sudo su - dsmr)

  • Maak map aan voor de VirtualEnv van deze gebruiker:

    mkdir ~/.virtualenvs
    
  • Maak een nieuwe VirtualEnv aan. Het is gebruikelijk om hiervoor dezelfde naam te gebruiken als die van de applicatie of het project:

    virtualenv ~/.virtualenvs/dsmrreader --system-site-packages --python python3
    

Notitie

N.B.: het is belangrijk dat je voor deze VirtualEnv aangeeft dat Python 3 de gewenste standaardversie is.

  • Elke keer dat je als dsmr gebruiker werkt, zul je moeten wisselen naar de virtualenv met deze commando’s:

    source ~/.virtualenvs/dsmrreader/bin/activate
    cd ~/dsmr-reader
    
  • Laten we ervoor zorgen dat deze commando’s automatisch uitgevoerd worden, zodra we inloggen als dsmr gebruiker. Dit doen we door ze toe te voegen aan het ~/.bashrc bestand:

    sh -c 'echo "source ~/.virtualenvs/dsmrreader/bin/activate" >> ~/.bashrc'
    sh -c 'echo "cd ~/dsmr-reader" >> ~/.bashrc'
    

Hiermee wordt zowel de VirtualEnv geactiveerd en ga je direct naar de juiste map. Dit werkt de eerstvolgende keer dat je inlogt als dsmr gebruiker.

Notitie

Je kunt dit vrij gemakkelijk testen door uit te loggen als dsmr gebruiker (met CTRL + D) en vervolgens weer in te loggen met sudo su - dsmr.

Als het goed is heeft je terminal nu een (dsmrreader) prefix, bijvoorbeeld: (dsmrreader)dsmr@rasp:~/dsmr-reader $

Zorg ervoor dat je de bovenstaande notitie hebt gelezen en uitgevoerd, aangezien ze nodig zijn voor het volgende hoofdstuk.

7. Applicatieconfiguratie

De applicatie heeft een databaseconnector nodig om de gegevens te kunnen opslaan. Daarvoor heb ik een tweetal requirements-bestanden gemaakt, waar alles al in staat wat nodig is. Zoals bijvoorbeeld Django en de databaseverbinding.

Stel lokale config in:

cp dsmrreader/provisioning/django/settings.py.template dsmrreader/settings.py

cp .env.template .env
./tools/generate-secret-key.sh

Notitie

De installatie van de volgende afhankelijkheden kan enige tijd in beslag nemen. Dit varieert en is sterk afhankelijk van de snelheid van je Internet-verbinding en je RaspberryPi. Je hoeft je dus niet zorgen te maken wanneer dit lang lijkt te duren. :]

Installeer afhankelijkheden:

pip3 install -r dsmrreader/provisioning/requirements/base.txt

8. Initialisatie

Tijd om te kijken of alles goed is ingesteld. We gaan de applicatie proberen te initialiseren.

  • Voer dit uit om de database te initialiseren:

    ./manage.py migrate
    

Ga nu bezig met de statische bestanden voor de webinterface. Dit kopieert alle statische bestanden in de map die we eerder, vlak na de installatie voor Nginx, hebben aangemaakt. Het zorgt ervoor dat Nginx deze bestanden kan hosten buiten de code-bestanden.

  • Synchroniseer statische bestanden:

    ./manage.py collectstatic --noinput
    

Maak een applicatie superuser aan met het volgende commando. De DSMR_USER en DSMR_PASSWORD zoals ze in de Env-instellingen staan, worden daarbij gebruikt als inloggegevens.

Voer uit:

./manage.py dsmr_superuser

Je bent op dit punt bijna klaar met de installatie.

9. Webserver/Nginx (deel 2)

Notitie

Deze installatiehandleiding gaat er vanuit dat je de Nginx webserver alleen gebruikt voor deze applicatie.

Het is uiteraard mogelijk dat andere applicaties ook Nginx gebruiken, maar daarvoor zul je de wildcard moet weghalen in de dsmr-webinterface vhost, die je hieronder kopieert.

  • Zorg ervoor dat je hier root- of sudo-gebruiker bent. Zo niet, druk op CTRL + D om uit te loggen als dsmr gebruiker.

Verwijder de standaard vhost van Nginx wanneer je deze niet zelf gebruikt (zie de notitie hierboven):

sudo rm /etc/nginx/sites-enabled/default
  • Kopieer de vhost voor de applicatie. Deze luistert standaard naar elke hostname (wildcard), maar dat is natuurlijk naar eigen wens aan te passen:

    sudo cp /home/dsmr/dsmr-reader/dsmrreader/provisioning/nginx/dsmr-webinterface /etc/nginx/sites-available/
    sudo ln -s /etc/nginx/sites-available/dsmr-webinterface /etc/nginx/sites-enabled/
    
  • Laat Nginx controleren of je geen typefouten hebt gemaakt en herstart Nginx vervolgens wanneer de -t configtest lukt:

    sudo nginx -t
    
    sudo systemctl restart nginx.service
    

10. Supervisor

We gaan nu Supervisor configureren, die gebruikt wordt om de applicatie en achtergrondprocessen te draaien. Tevens zorgt Supervisor ervoor dat deze processen bij het (opnieuw) opstarten automatisch draaien.

  • Kopieer de configuratie-bestanden voor Supervisor:

    sudo cp /home/dsmr/dsmr-reader/dsmrreader/provisioning/supervisor/dsmr_datalogger.conf /etc/supervisor/conf.d/
    sudo cp /home/dsmr/dsmr-reader/dsmrreader/provisioning/supervisor/dsmr_backend.conf /etc/supervisor/conf.d/
    sudo cp /home/dsmr/dsmr-reader/dsmrreader/provisioning/supervisor/dsmr_webinterface.conf /etc/supervisor/conf.d/
    
  • Wissel naar de supervisorctl beheerconsole:

    sudo supervisorctl
    
  • Voer de volgende commando’s in (degene na de >). Dit zorgt ervoor dat Supervisor zijn eigen configuratie opnieuw controleert en toepast:

    supervisor> reread
    
    supervisor> update
    

Er draaien als het goed is altijd drie processen. Kijk goed of ze uiteindelijk niet in ERROR of BACKOFF status terecht zijn gekomen. Je kunt het overzicht verversen door status te typen.

  • Typ het volgende wanneer je nog in supervisorctl’s console bent:

    supervisor> status
    

Voorbeeld van wanneer alles naar behoren draait:

dsmr_backend                     RUNNING    pid 123, uptime 0:00:06
dsmr_datalogger                  RUNNING    pid 456, uptime 0:00:07
dsmr_webinterface                RUNNING    pid 789, uptime 0:00:07

Wil je uit supervisor? Druk dan op CTRL + D om uit supervisor te gaan.


Klaar? Ga dan naar applicatie instellen.