Het Internet of Things is een verzameling van verbonden dingen, veel dingen. Maar hoe verbind je die allemaal met elkaar en hoe laat je ze met elkaar praten? Node-RED biedt daar een oplossing voor. Het biedt een visuele manier om via een flowchart apparaten, API’s en online diensten te koppelen en zo je eigen IoT-toepassing te implementeren.

Node-RED (www.nodered.org) is door IBM ontwikkeld en open source gemaakt. Het is een browsergebaseerde flow editor, waarmee je JavaScript-functies maakt, die op Node.js (www.nodejs.org) draaien. Het beste van dit alles is dat je voor veel taken niet eens hoeft te programmeren: je sleept componenten (“nodes”) naar het canvas en verbindt ze.

 

Pc, Raspberry Pi en cloud

De Node-RED runtime draait op allerlei apparaten, want het ondersteunt Linux, macOS en Windows. Met een terminalemulator met ingebouwde Linux-omgeving, zoals Termux (https://termux.com) draai je Node-RED zelfs op een Android-apparaat. Maar ook in de cloud draait het, zoals op Amazon Web Services (AWS), Microsoft Azure, IBM Bluemix of FRED (Front End For Node-RED).

Een ander interessant apparaat type dat Node-RED ondersteunt, zijn de minicomputers, zoals de Raspberry Pi en de BeagleBone Black. De meest recente 4 Gb images voor de BeagleBone-images hebben Node-RED al voorgeïnstalleerd. Ook de full images van Raspbian bevatten al sinds november 2015 Node-RED. We tonen in dit artikel hoe je op een Raspberry Pi met het IoT-platform werkt.

 

Raspberry Pi prepareren

Download het image van Raspbian Stretch Lite (www.raspberrypi.org/downloads/raspbian/). Dit bevat geen desktopomgeving, die we toch niet nodig hebben voor een IoT-apparaat. Dit image bevat ook geen Node-RED, maar Node-RED op het desktopimage is een verouderde versie, dus we gaan toch zelf een recentere versie installeren.

Steek een microSD-kaartje in de kaartlezer van je computer. Bekijk met dmesg | tail welke apparaatnaam het kaartje krijgt van Linux. Meestal is dat mmcblk0 of sdb.

Pak daarna het zip-bestand uit en schrijf het image van Raspbian dat daarin zit naar het microSD-kaartje. Dat is mogelijk met één lange opdracht:

unzip -p 2017-09-07-raspbian-stretch-lite.zip | sudo dd of=/dev/sdX bs=4M conv=fsync status=progress

 

Verwijder nu het microSD-kaartje en stop het daarna terug in je pc. Bekijk met de opdracht mount op welke mountpoints de partities van het kaartje zijn aangekoppeld. De eerste partitie is de bootpartitie met de opstartbestanden, de tweede is de rootpartitie met de rest van de bestanden van Raspbian.

Creëer nu een bestand ssh in de bootpartitie:

touch PADNAARBOOTPARTITIE/ssh

 

Als je van WiFi gebruik wilt maken, maak dan ook een bestand wpa_supplicant.conf aan in de bootpartitie met de volgende inhoud:

network={

  ssid=”JouwESSID”

  psk=”JouwWifiWachtwoord”

}

 

Ontkoppel daarna de microSD-kaart. Steek het in je Pi en sluit de voedingskabel aan om je RPi op te starten. Kijk in de beheerpagina van je router welk IP-adres je Pi toegekend heeft gekregen en log erop in via ssh met de gebruikersnaam pi en het wachtwoord raspberry. Werk allereerst de pakketlijsten bij met sudo apt update en upgrade daarna alle geïnstalleerde programma’s met sudo apt upgrade.

Voer daarna het configuratieprogramma uit: sudo raspi-config. Wijzig je wachtwoord, zodat je Pi niet ongewild onderdeel gaat uitmaken van een botnet. En zet je tijdzone correct, zodat de timestamps in de logbestanden kloppen. Sluit het configuratieprogramma af (‘Finish’) en reboot.

 

Node-RED installeren

Installeer de nieuwste versie van Node.js en Node-RED:

bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)

 

Bevestig dat je de installatie wilt uitvoeren en dat je Pi-specifieke nodes wilt installeren, zodat we toegang tot de GPIO-pinnen van de Pi krijgen in Node-RED. Na de installatie schakel je Node-RED in, zodat het bij het opstarten van je Pi automatisch mee opstart:

sudo systemctl enable nodered.service

 

En start Node-RED deze keer met:

node-red-start

 

Open nu http://IP:1880 in je webbrowser, waarbij IP het IP-adres van je Pi is. Je krijgt nu de webinterface van Node-RED te zien met in het midden het canvas en links de blokjes (nodes), die je verbindt om IoT-flows te maken.

 

Je eerste flow

Node-RED dient om apparaten en diensten met elkaar te verbinden, maar voor onze eerste flow houden we het eenvoudig om de concepten te introduceren. We creëren een flow, waarbij je op een knopje in de webinterface drukt en dan een boodschap te zien krijgt.

Pak links in de categorie input een blokje inject vast en sleep het naar het canvas. Neem dan in de categorie output een blokje debug en sleep het eveneens naar het canvas. Verbind beide nodes nu door een lijn tussen het rechtervakje bij inject en het linkervakje bij debug te leggen. De vakjes lichten oranje op als je een lijn probeert te trekken.

Klik daarna op de knop Deploy bovenaan rechts, zodat de editor je flow op de Node-RED server uitrolt. Als je nu op het vierkantje vóór inject klikt, krijg je in het debug-tabblad rechts een timestamp te zien. Je eerste flow in Node-RED is een feit!

We gaan nu even ontleden wat er precies is gebeurd. Het vierkantje voor de node inject is een knopje, dat de node activeert als je erop klikt. Standaard stuurt de node inject bij activatie een timestamp naar zijn uitvoer. Dubbelklik op de node om dit na te gaan: bij de eigenschappen van de node staat timestamp ingevuld bij Payload.

Dubbelklik ook eens op de node debug. Bij de eigenschappen van de node zie je msg.payload staan bij Output en debug tab bij to. Dat betekent dat deze node standaard de payload van de binnenkomende boodschap in het debug-tabblad toont. Door beide nodes met elkaar te verbinden, toon je dus de timestamp in het debug-tabblad telkens wanneer je op de invoerknop van de node inject klikt. Uitleg over de nodes en hun eigenschappen krijg je overigens in het infotabblad als je een node hebt geselecteerd.

 

Nodes aanpassen

Met wat je in je eerste flow hebt gezien, kun je al heel wat experimenteren. Verander bij de node debug bijvoorbeeld de uitvoer eens naar complete msg object, klik op Done en dan Deploy. Je krijgt dan het volledige object te zien dat de node inject aan debug doorgeeft, in json-notatie. Door op het vierkantje rechts van de node debug te klikken, schakel je de uitvoer overigens uit. Zo kun je in een flow debugnodes opnemen tijdens het testen en hoef je ze niet te verwijderen als je je flow in productie neemt: schakel de uitvoer eenvoudigweg uit.

Bij de node inject zijn meer eigenschappen aan te passen. De payload kan een string, getal, boolean, json-object, enzovoorts zijn. Vink je Inject once at start? aan, dan stuurt de node na de start van de flow (na het deployen of het opstarten van de Node-RED-server) zijn payload naar de volgende node. En bij Repeat stel je in dat de node herhaaldelijk de payload als uitvoer geeft (bijvoorbeeld elke minuut) tijdens specifieke periodes of op een specifiek tijdstip. Merk overigens op dat de tekst binnen het kader van een node verandert als je eigenschappen verandert, zodat je ziet wat de node doet.

 

JavaScript-functies

Die timestamps stellen het aantal milliseconden sinds 1 januari 1970 voor, de zogenoemde Unix-tijd. Als je die naar een meer leesbare vorm wilt omzetten, heb je een klein stukje JavaScript-code nodig. Gelukkig bevat Node-RED een node function (in de categorie function) om een willekeurige JavaScript-functie te creëren. Sleep de node naar het canvas en dubbelklik erop. Je krijgt nu een JavaScript-editor te zien. Vul daarin de volgende code in:

var date = new Date(msg.payload);

msg.payload = date.toString();

return msg;

 

De functie krijgt net zoals andere nodes een boodschap in het object msg binnen. De payload daarvan (het aantal milliseconden sinds 1 januari 1970 in ons voorbeeld) zetten we naar leesbare vorm om door er een Date-object van te maken. Dan vervangen we de payload van de boodschap door de stringversie van het Date-object. En tot slot laten we de functie het nu gewijzigde object msg teruggeven. Klik op Done om de code op te slaan. Het resultaat? Waar er een getal binnenkomt, geeft de functie een leesbare datum terug.

Het enige wat ons nu nog rest, is deze functie tussen de node inject en de node debug te plaatsen. Doe je dat, dan splitst de verbinding tussen beide nodes en wordt het met de in- en uitvoer van de functie verbonden. Als je nu op Deploy klikt, krijg je de timestamps in het debug-tabblad in leesbare vorm te zien.

 

Andere types nodes toevoegen

Node-RED bevat standaard al een heleboel types nodes, waaronder om te e-mailen, te tweeten en rss-feeds in te lezen. Maar er is ook een heel ecosysteem van uitbreidingen rond Node-RED ontstaan. Heel wat ontwikkelaars hebben zelf hun eigen types nodes gecreëerd en bieden deze online aan. Klik daarvoor in het menu van Node-RED (de drie horizontale strepen bovenaan rechts) op Manage palette. Je krijgt nu de geïnstalleerde nodes te zien. In het tabblad Install kun je zoeken naar andere nodes. Tijdens de redactiesluiting waren er meer dan 1.100 nodes beschikbaar voor installatie. Je vindt er nodes voor taalanalyse, om allerlei apparatuur zoals NeoPixel RGB-LED’s aan te sturen, voor wake-on-LAN, notificaties en zelfs voor de berekening van zonsopgang en -ondergang. Heb je het type node dat je zocht gevonden, klik daarnaast dan op install, waarna het in je flows beschikbaar is.

 

 

Webpagina inlezen

Allemaal goed en wel, maar tot nu toe hebben we alleen nog maar op een knopje gedrukt en debug uitvoer gelezen: van een Internet of Things is nog niet veel terecht gekomen! Daar gaan we nu iets aan doen. We tonen hoe je Node-RED zijn invoer van een webpagina laat halen. Als voorbeeld lezen we het weeralarm van de website van het KNMI uit.

Klik op het plusteken links naast het infotabblad om een nieuwe flow aan te maken en klik dan op de naam van de flow om die naam aan te passen. Klik op Done en sleep weer een node inject naar het canvas. Dubbelklik erop en zet Repeat op interval en dan every 5 minutes. Klik op Done. Zo bereiken we dat onze flow elke vijf minuten wordt uitgevoerd.

Haal dan in de categorie function een node http request en verbind die met je eerste node. Open de eigenschappen van http request en laat Method op GET staan en vul bij URL de url http://www.knmi.nl/nederland-nu/weer/waarschuwingen/utrecht in (of de URL van jouw regio). Laat Return op a UTF-8 string staan en klik op Done. We lezen zo de webpagina met het weeralarm voor Utrecht in.

 

Weeralarm tonen

Nu willen we afhankelijk van het voorkomen van specifieke HTML-attributen in de pagina een code groen, geel, oranje of rood uit de pagina van het KNMI uitlezen. Als je in de broncode van de webpagina kijkt, zie je dat de codes voor het weeralarm voorgesteld zijn als div-elementen met attribuut class met de waarde “warning-overview–green”, “warning-overview–yellow”, “warning-overview–orange” en “warning-overview–red”.

We kunnen de HTML-code gaan parsen, maar we houden het eenvoudig: we gaan gewoon testen of de HTML-code voor één van de kleuren in het weeralarm in de pagina aanwezig zijn. Daarvoor werken we met een node switch (in de categorie function). Creëer hierin vier regels, achtereenvolgens contains warning-overview–red, contains warning-overview–orange, contains warning-overview–yellow en contains warning-overview–green. Vink onderaan stopping after first match aan (want als er bijvoorbeeld code geel is voor slecht zicht bij mist, dan kan het tegelijkertijd ook code groen zijn voor regen, windstoten enzovoort) en klik op Done.

Bij de node switch zie je nu vier aanknopingspunten voor uitvoer. Verbind met elke uitvoer een node change (eveneens in de categorie function). Met deze nodes verander je de payload van een boodschap. Vul bij de regels van de eerste node Set msg.payload to rood in en bij de volgende drie hetzelfde, maar dan voor de andere kleuren: oranje, geel en groen. Verbind tot slot elke node change met een node debug. Na een klik op Deploy krijg je in het debug venster elke vijf minuten de kleur voor het huidige weeralarm te zien.

 

LED’s op je Raspberry Pi aansluiten

Tot nu toe blijven we nog altijd onze uitvoer in het debug-tabblad van de webinterface van Node-RED tonen. Met de laatste stap maken we dan ook een echte IoT-toepassing van onze flow: we tonen het weeralarm in de vorm van LED’s, die op onze Raspberry Pi zijn aangesloten. Schakel daarvoor eerst je Pi uit en verwijder de voeding uit het stopcontact.

Neem een breadboard, een rode, oranje, gele en groene LED, vier weerstanden van 220 ohm en jumperwires. Plaats nu de vier LED’s op het breadboard. Verbind voor elke LED de kathode (het korte pootje) via een weerstand van 220 ohm met GND om de stroom door de LED te begrenzen. De anode (het lange pootje) van de rode LED sluit je aan op pin BCM 6 van de Raspberry Pi, van de oranje LED op pin BCM 13, van de gele LED op pin BCM 19 en van de groene LED op BCM 26. Zoek de locaties en namen van de GPIO-pinnen van de Pi op https://pinout.xyz en bekijk het schema bij dit artikel. We hebben de pinnen zo gekozen dat je, als je de belettering op de Pi kunt lezen, van de onderste rij GPIO-pinnen de rechtse vijf aansluit: de rechtse is GND en sluit je op de weerstanden aan en de vier ernaast sluit je van rechts naar links aan op de anode van de groene, gele, oranje en respectievelijk rode LED. Controleer goed of je alles correct hebt aangesloten en zet daarna je Pi weer aan.

 

GPIO-pinnen aansturen

Om onze LED’s in te schakelen met het weeralarm, is het nu een kwestie van de juiste GPIO-pinnen aansturen. We breiden daarom onze flow uit met vier rpi gpio uitvoernodes. Kies in de eigenschappen van elke node de juiste GPIO (gelukkig krijg je de pinout te zien), houd het type op Digital output, vink Initialise pin state? aan en zet het initiële niveau op 0. Klik op Done.

Voeg ook een node change toe met als regel Set msg.payload to 1. Verbind nu de eerste uitvoer van de node switch met de invoer van change en de uitvoer van change met rpi gpio. Doe hetzelfde voor de drie andere LED’s. Klik tot slot op Deploy, waarna het juiste lampje op je Pi aangaat en zo het huidige weeralarm weergeeft. In de flow editor krijg je overigens bij de rpi gpio nodes de waardes 0 of 1 te zien, die Node-RED naar de pinnen schrijft.

 

En verder

In dit artikel hebben we nog maar een fractie van de mogelijkheden van Node-RED geïllustreerd, maar het moge duidelijk zijn dat het een flexibel framework is. Je verbindt er talloze online diensten en apparaten mee, vaak zonder dat je er een regel code voor hoeft te schrijven. Probeer voor je volgende IoT-project Node-RED eens uit!

 

Oefening voor de lezer

De flow uit ons voorbeeld van het weeralarm bevat nog een fout: als het weeralarm verandert, gaat een nieuwe LED aan, maar blijft de vorige LED nog ingeschakeld. Zoek eens als oefening uit hoe je dat oplost. Twee tips: gebruik de node delay en weet dat je een in- of uitvoervierkantje van een node met meerdere nodes kunt verbinden.