Node-RED: apparaten en diensten koppelen zonder code

Door: koen-vervloesem | 19 april 2020 13:04

How To

Node-RED is een populair systeem waarmee je apparaten en diensten aan elkaar koppelt zonder code te hoeven intypen. Het programmeren verloopt immers op een grafische manier door nodes in flows met elkaar te verbinden. Er bestaat een bloeiende community rond Node-RED en naast het automatiseren van zaken, kun je er ook dashboards mee maken. Onlangs kwam versie 1.0 van Node-RED uit. De ideale gelegenheid om er eens mee aan de slag te gaan in dit artikel.

Op de website van Node-RED wordt het programma omschreven als ‘low-code programming for event-driven applications’. Dat is een hele mond vol. Low-code programming betekent gewoon dat je geen code hoeft in te typen, in tegenstelling tot bijvoorbeeld een Python-programma. In de plaats daarvan selecteer je in een webinterface componenten uit een gereedschapskist en koppel je die aan elkaar.

Met ‘event-driven applications’ wordt bedoeld dat je met Node-RED toepassingen bouwt die reageren op gebeurtenissen. Zo kan je programma reageren als je een knop indrukt die je op een Raspberry Pi aansluit, of op een bericht dat via MQTT over je thuisnetwerk wordt verstuurd, of op een sensorwaarde die verandert in je Home Assistant-installatie.

01 Systeemvereisten voor Node-RED

Node-RED kun je op Windows, macOS, Linux, op een Raspberry Pi en zelfs in de cloud installeren. Op de pagina Getting started vind je de installatie-instructies voor de verschillende mogelijkheden.

In deze basiscursus gaan we uit van een installatie via Docker op een Raspberry Pi. Maak je een andere keuze, volg dan op de website van Node-RED de specifieke instructies voor jouw systeem. Na de installatie werkt zo goed als alles hetzelfde, ongeacht het systeem waarop je Node-RED draait.

01 Je kunt Node-RED op allerlei manieren en diverse apparaten installeren.

02 Raspbian met Docker

We gaan ervan uit dat je Raspbian Buster Lite op je Raspberry Pi hebt geïnstalleerd, bijvoorbeeld met balenaEtcher. Op je Raspberry Pi inloggen doe je via de opdracht ssh in de Opdrachtprompt of door een toetsenbord en beeldscherm op je Raspberry Pi aan te sluiten.

Installeer dan Docker op de Raspberry Pi, geef de standaardgebruiker pi toegang tot Docker, installeer pip en Docker Compose, en reboot tot slot met deze commando’s:

curl -sSL https://get.docker.com | sh

sudo usermod pi -aG docker

sudo apt install python3-pip

sudo pip3 install docker-compose

sudo reboot

Zodra je weer ingelogd bent, maak je ook een directory aan waarin je de gegevensbestanden van Node-RED opslaat, zoals je flows en de uitbreidingen die je installeert:

mkdir /home/pi/node-red

03 Installeer Node-RED

We installeren Node-RED met behulp van Docker Compose. Maak daarvoor eerst een Docker Compose-bestand aan:

nano docker-compose-node-red.yml

Plaats daarin de volgende regels:

version: '3.7'

services:

node-red:

image: nodered/node-red

container_name: node-red

restart: always

volumes:

- ./node-red:/data

ports:

- "1880:1880"

environment:

- TZ=Europe/Amsterdam

Hierin definiëren we dat we het Docker-image nodered/node-red downloaden en starten, waarbij we de directory node-red in de huidige directory in de Docker-container van Node-RED aankoppelen op de directory /data. We forwarden poort 1880 van de container naar poort 1880 op de Raspberry Pi. Tot slot stellen we ook onze tijdzone in, zodat Node-RED de juiste tijd gebruikt.

Sla het bestand op met Ctrl+O en sluit nano af met Ctrl+X. Daarna starten we Node-RED eenvoudig op met de volgende opdracht:

docker-compose -f docker-compose-node-red.yml up -d

Dat duurt wel even, want Docker gaat nu het image van Node-RED eerst downloaden. Maar als je de Opdrachtprompt weer te zien krijgt, is Node-RED gestart en in je webbrowser bereikbaar op http://IPADRES:1880. Lukt het niet, bekijk dan met docker logs node-red wat er misloopt.

03 De logs van Node-RED tonen wat het programma op de achtergrond opstart.

04 Je eerste flow

De webinterface van Node-RED bestaat uit vier onderdelen. Bovenaan heb je de header met rechts een knopje Deploy en helemaal rechts het menu dat je toegang geeft tot allerlei functionaliteit.

Links heb je het palet, waarin je allerlei ‘nodes’ vindt. Die nodes kun je naar het midden slepen, de werkruimte. Die werkruimte bevat aanvankelijk één tabblad met een ‘flow’ met de naam Flow 1. Rechts heb je dan de zijbalk, die je meer informatie geeft over het geselecteerde onderdeel. Momenteel is dat de lege flow, zodat je daar de naam van de flow te zien krijgt.

Laten we eens een eerste flow maken. Sleep een node inject en een node debug naar de werkruimte. De tekst bij die eerste verandert in timestamp en bij die tweede in msg.payload. Verbind het rechtse grijze vakje van de eerste node met het linkse grijze vakje van de tweede node. Klik dan bovenaan rechts op Deploy.

Klik dan op het omgekeerde driehoekje onder het menu en kies Debug messages. Als je daarna op het grote vierkantje links van de node timestamp klikt, verschijnt de tijd (in aantal seconden sinds 1 januari 1970) in de zijbalk.

04 Onze eerste flow in Node-RED laat de tijd in het debugvenster zien als je op de eerste node klikt.

05 Installeer extra nodes

Dat tijdstip in het debugvenster is niet heel leesbaar. Zouden we dit kunnen omzetten naar een leesbare datum en tijdstip? Uiteraard, en dat kan bijvoorbeeld met een node function waarin je javascript-code kunt opgeven die de opdracht uitvoert. Maar we zijn dit artikel begonnen met de boodschap dat je niet zou hoeven te programmeren in Node-RED (wat wel kan, zie ook het kader ‘Javascript-code in Node-RED’), dus we gaan dit op een grafische manier uitvoeren.

In het palet links zie je een heel aantal nodes die Node-RED standaard al installeert, maar er zit er geen tussen om tijdstippen in leesbaar formaat te tonen. Gelukkig heeft Node-RED een bloeiend ecosysteem van externe nodes, die eenvoudig te installeren zijn. Klik op het menu en dan op Manage palette.

In het tabblad Install zie je dat er meer dan 2400 modules beschikbaar zijn voor installatie. Typ in het zoekveld eens date in. Je krijgt dan alle mogelijke nodes te zien die iets met een datum doen. Let zeker op de datum van de laatste update, want je vindt hier ook heel wat nodes die niet meer onderhouden worden. Bij elke node kun je op het icoontje naast de naam klikken voor meer informatie.

05 Er zijn meer dan 2400 nodes beschikbaar om in Node-RED te installeren.

06 Leesbaar tijdstip

Klik op de knop install bij de node node-red-contrib-moment en bevestig met Install. Sluit daarna het venster. Als je nu in het paneel links helemaal naar onderen scrolt, zie je twee nieuwe nodes: moment en humanizer. Klik je op een ervan, dan krijg je in de zijbalk nuttige informatie over het gebruik te zien.

Verbreek de verbinding tussen timestamp en msg.payload door ze te selecteren en op de Delete-toets te drukken. Sleep dan de node moment naar de werkruimte. Ze krijgt dan de naam Date/Time Formatter. Verbind de uitvoer van timestamp met de invoer van deze node, en de invoer van msg.payload met de uitvoer.

Deploy de flow opnieuw en klik weer op de timestamp. In het debugvenster moet nu een tijdstip zoals “2020-02-11T14:15:56.321Z” verschijnen. Indien de tijd verkeerd is, dubbelklik dan op de node en kijk na of je tijdzone correct staat. Indien nodig tel je bij Adjustment een uur op. Vergeet niet na elke aanpassing op Deploy te klikken.

06 Met de node ‘moment’ zet je het aantal seconden sinds 1 januari 1970 eenvoudig om in een leesbaar tijdstip.

07 Download elke vijf minuten

Node-RED doet nu iets wanneer we op de eerste node klikken, maar we kunnen onze flow ook automatisch laten uitvoeren, bijvoorbeeld elke vijf minuten. Klik op de eerste node, kies bij Repeat voor interval en vul dan every 5 minutes in. Wijzig ook de naam van de node in Elke 5 minuten, zodat de functie duidelijker is. Sla op met Done en klik dan op Deploy. Je krijgt nu in het debugvenster elke vijf minuten de huidige tijd te zien.

Nu we Node-RED om de vijf minuten iets kunnen laten doen, gaan we daar iets nuttigers van maken: weergegevens downloaden. Verwijder de node Date/Time Formatter en zet in de plaats daarvan een node http request. Dubbelklik erop en vul bij de url http://xml.weerslag.nl/xmlfeed.xml in. Geef de node de naam Weerslag.NL.

Als je nu op het vierkantje bij de eerste node klikt (of vijf minuten wacht), wordt het xml-bestand van Weerslag.NL gedownload en de inhoud in het debugvenster getoond. Maar je bent uiteraard alleen geïnteresseerd in het weer bij jou. Open de feed in je webbrowser en zoek naar een weerstation bij je in de buurt. Noteer de stationscode.

07 Download elke vijf minuten een xml-feed in Node-RED.

08 Filter de xml-code

De xml-code van de feed van Weerslag.NL filter je eenvoudig zodat je alleen de informatie te zien krijgt van het weerstation waarin je geïnteresseerd bent. Plaats daarom een node xml tussen je node http request en de node debug. Deze node zet de xml om in een javascript-object. Bekijk het resultaat eerst maar eens in het debugvenster.

Voeg dan een node change toe tussen xml en debug, en dubbelklik daarop. Verander nu achter to het type uitvoer naar expression (getoond als een gestileerde hoofdletter J). Vul daarachter de volgende expressie in:

payload.**.weerstation[stationcode[0]='11179']

Vervang hierin 11179 door de stationscode van in je buurt. Wil je meer weten over dit soort expressies, lees dan de documentatie van JSONata. Na een deploy en een klik op de eerste node krijg je in het debugvenster alleen de informatie van het ene weerstation te zien.

08 Filter één weerstation uit de xml-code.

Javascript-code in Node-RED

Bestaat er geen node die doet wat je nodig hebt, dan kun je nog altijd gaan programmeren. Node-RED is immers in javascript geschreven en ondersteunt via de node function ook javascript-code. Zo zou je de node moment kunnen vervangen door een node function, waarin je javascript-code schrijft die een Date-object aanmaakt op basis van de payload, en de payload vervangt door de stringversie van dat object. Dit is een eenvoudig voorbeeld, maar je kunt nog veel complexere functies schrijven. Zie de online documentatiepagina Writing functions voor meer informatie.

Node-RED laat ook toe om zelf javascript-functies te schrijven.

09 Temperatuur en luchtdruk

Tot nu toe toonden we volledige javascript-objecten in het debugvenster, maar we zijn eigenlijk alleen geïnteresseerd in de temperatuur en luchtdruk. De temperatuur filteren we er eenvoudig uit met een node change na de vorige node change. We veranderen het type achter to naar msg en vullen daar in:

payload.temperatuurGC[0]

Hang achter deze node weer een debug-node. Doe nu hetzelfde om de luchtvochtigheid eruit te filteren. Bestudeer in het debugvenster de inhoud van het volledige javascript-object van het weerstation om te zien wat je in de node change dient in te typen.

Als je nu de flow uitvoert, krijgt je de waardes van de temperatuur en luchtvochtigheid in het debugvenster te zien.

09 Filter de temperatuur en luchtvochtigheid uit de gegevens van het weerstation.

10 Dashboard

Het debugvenster is handig als je in Node-RED een flow aan het opbouwen bent, maar zodra die werkt, wil je uiteraard je gegevens wat mooier weergeven. Gelukkig kent Node-RED ook een dashboard. Daarvoor dienen we eerst een extra node te installeren.

Open weer Manage palette in het menu en installeer daar de node node-red-dashboard. Dat voegt maar liefst zestien nieuwe types nodes toe in je palet.

Hang dan een node gauge achter de node voor de temperatuur. Dubbelklik erop en klik naast Group op het icoontje van het potlood. Geef de groep een naam (bijvoorbeeld Temperatuur) en klik naast Tab op het potloodicoontje. Geef het tabblad een naam (bijvoorbeeld Weer), klik op Add en nog eens op Add. Dan ben je weer in de eigenschappen van de node gauge. Vul bij Label een naam zoals Temperatuur in, bij Units de eenheid °C, en bij Range een minimum- en maximumtemperatuur. Klik op Done om de node op te slaan.

Nadat je op Deploy geklikt hebt, klik je op het icoontje van het grafiekje bovenaan rechts (links naast het omgekeerde driehoekje). Klik daarna op het icoontje van het vierkantje met het pijltje eruit. Je krijgt nu je eerste dashboard van Node-RED te zien. Uiteraard is dit nog maar het begin. Het toevoegen van de luchtvochtigheid en van enkele andere interfacecomponenten zoals een lijnplot laten we aan jou als lezer over.

10 In Node-RED maak je eenvoudig een dashboard om gegevens te plotten.

11 Controleer of het vriest

Node-RED kan nog veel meer. Zo kun je bijvoorbeeld waarschuwingen uitsturen als het vriest. Om te weten wanneer het vriest, voeg je een switch toe achter de node voor de temperatuur. Geef die switch de naam Test op vorst en zet de test op <= 0, waarbij je vlak voor de 0 het datatype number kiest.

De node aan de uitgang van de switch wordt nu alleen uitgevoerd wanneer de temperatuur in het weerstation lager dan 0 is. Test dat door een inject-node aan de ingang te koppelen met als waarde -15 met datatype string, en door een debug-node aan de uitgang te koppelen. Als je nu na een deploy op de inject klikt, zie je in het debugvenster de temperatuur -15 graden. En als je de -15 in de inject-node verandert naar 15 en op de inject-node klikt, gebeurt er niets.

11 We testen onze controle op vorst.

12 Vorstwaarschuwing

Dan hoeven we alleen nog maar die laatste debug-node te vervangen door een node die ons waarschuwt. We geven hier het voorbeeld van een waarschuwing met een e-mail. Installeer daarvoor de node node-red-node-email.

Voor je nu die node toevoegt, voeg je een node change toe achter de switch. Geef die de naam E-mail en zet msg.topic op Het vriest. Dit wordt het onderwerp van onze e-mail. Het bericht zelf komt in msg.payload, en dat bevat nog altijd de temperatuur, dus dat houden we.

Voeg dan de node email toe achter de node change. Vul de juiste gegevens in: het e-mailadres van de ontvanger, de smtp-server, poort, gebruikersaccount en wachtwoord. Als je een mailserver met STARTTLS gebruikt, dien je Use TLS? wel aan te vinken, maar Use secure connection niet. En als je tweefactorauthenticatie voor Gmail ingesteld hebt, dien je eerst een app-wachtwoord aan te maken. Als je daarna je flow deployt, krijg je via e-mail een melding wanneer het vriest.

Uiteraard is dit maar een eerste versie. Momenteel zou je elke vijf minuten een e-mail krijgen zolang het vriest. Dat aantal e-mails zou je zeker nog moeten beperken. Maar Node-RED biedt voldoende componenten om deze basisflow verder uit te werken. En als de standaardnodes niet volstaan, installeer je gemakkelijk extra nodes van de community of programmeer je zelf je eigen nodes in javascript.

12 Onze volledige flow die de temperatuur en luchtvochtigheid elke vijf minuten downloadt, in een dashboard toont en bij vorst een e-mail stuurt.

0 Reactie(s) op: Node-RED: apparaten en diensten koppelen zonder code

  • Om te reageren moet je ingelogd zijn. Nog geen account? Registreer je dan en praat mee!
  • Er zijn nog geen reacties op dit artikel.

Wanneer je een reactie plaatst ga je akoord
met onze voorwaarden voor reacties.