Node-Red, Raspberry Pi e Johnny Five.
In questa breve guida, prendendo spunto dalla documentazione di Johnny-five e Node-red, configuriamo un Raspberry pi per collegarlo all’internet delle cose – Internet of Things!
Cos’è Node-Red?
Node-RED è un tool open-source sviluppato da IBM, nato per collegare insieme dispositivi hardware, API e servizi web, in una maniera nuova e interessante.
Node-RED fornisce un editor di flusso sul browser che rende semplice l’unione di flussi provenienti dai nodi più disparati. Questi flussi possono essere deployati a run-time con un semplice click.
L’editor permette anche la scrittura al volo di funzoni javascript intermedie. L’engine di Node-RED è costruito interamente su Node.js. Questo lo rende ideale per funzionare ai “bordi della rete”, su dispositivi come il Raspberry Pi o in Cloud.
I Flussi creati in Node-RED sono salvati usando il formato JSON, che rende facile l’import e l’export e dunque facilita anche la condivisione dei flussi con il resto del mondo.
Qui una breve introduzione:
Cos’è Johnny-five?
Johnny-five è una piattaforma per la robotica e l’IoT attraverso Javascript. Rilasciata nel 2012 da Bocoup, Johnny-five è ormai open-source e centinaia di contributori l’han resa una piattafroam robusta, estensibile e altamente flessibile, con il supporto ad un ampio ecosistema di dispositivi.
Installare Raspbian
Per proseguire con la guida, diamo per scontato che abbiate già un raspberry pi operativo, correttamente configurato con una versione di Raspbian (superiore alla release 2015-21-11 possibilmente) e connesso a internet.
Node-Red
Ci sono due modi per iniziare a usare Node-RED su Raspberry Pi.
1) Usare la versione di Node-Red preinstallata su Raspbian Jessie, da novembre 2015.
2) Effettuare un’installazione manuale di NodeRed da npm.
Nel primo caso, viene usata la versione di node.js pre-installata che è v0.10.29. Se si opta per l’installazione manuale allora si consiglia una versione di Node.js dalla 4 in su, v4.x.
Dalla versione 0.14.x di Node-RED è presente uno script che effettua in automatico un upgrade all’ultima versione LTS di Node.js e di Node-RED.
Se si effettua l’upgrade manuale di Node.js allora sarà necessario anche ricompilare tutti i nodi installati che abbiano dipendenze binarie:
cd ~/.node-red npm rebuild |
Installazione manuale
Prima di procedere con l’installazione manuale bisogna disinstallare le versioni attualmente presenti:
node-red-stop sudo apt-get remove nodered sudo apt-get remove nodejs nodejs-legacy sudo apt-get remove npm # if you installed npm |
Questo rimuove tutti i pacchetti installati ma mantiene il workspace, di default in ~/.node-red
. Si può a questo punto procedere con l’installazione da zero.
Installare Node.js
Siccome il RPi B+ e i RPi 2/3 utilizzano un processore differente (Arm v6 e Arm v7), il metodo per l’installazione di Node è leggermente differente:
Raspberry Pi 2 e Raspberry Pi 3
Per installare Node.js su Pi 2 e Pi 3 – e altre board basate su Arm7, eseguite questi comandi:
curl -sL https://deb.nodesource.com/setup_4.x | sudo bash - sudo apt-get install -y build-essential python-rpi.gpio nodejs |
Questo installerà anche tutte le dipendenze necessarie.
Raspberry Pi B+
Il modo più semplice per installare Node.js e altre dipendenze sulla prima versione di raspberry, Pi Zero, Pi A+/B+ è:
wget http://node-arm.herokuapp.com/node_latest_armhf.deb sudo dpkg -i node_latest_armhf.deb sudo apt-get install build-essential python-rpi.gpio hash -r |
Installare Node-RED
Installiamo l’ultima versione stabile di Node-RED usando il node’s package manager, npm:
sudo npm cache clean sudo npm install -g --unsafe-perm node-red |
Nota: Durante l’installazione potrebbero esser riportati degli errori da parte di “node-gyp”. Questi solitamente sono errori non-fatali e si riferiscono alle dipendenze opzionali che di norma richiedono un compilatore per esser compilati. Node-RED funziona anche senza queste dipendenze opzionali.
Se ci sono errori npm (non warning nè errori relativi a gyp) durante l’installazione, provate a lanciare sudo npm cache clean
e rilanciate il comando d’install. NB: npm dovrebbe essere almeno alla versione 2.x. Lanciate npm -v
per accertarvene.
Nota: Il motivo che spinge all’uso dell’opzione –unsafe-perm è legato al fatto che node-gyp cerca di ricompilare le librerie native come utente “nobody” e dunque spesso fallisce nell’accesso di determinate directory. Con questo flag si concede a node-gyp di girare come root.
Accedere ai GPIO
Se pianificate di accedere ai GPIO del Raspberry da Node-RED, dovreste verificare quale versione della libreria Python RPi.GPIO è installata.
Node-RED include uno script specifico per RPi, nrgpio
per interagire con i pin GPIO hardware.
Se installato come modulo npm globale, questo script dovrebbe trovarsi in:
/usr/lib/node_modules/node-red/nodes/core/hardware/nrgpio ver oppure /usr/local/lib/node_modules/node-red/nodes/core/hardware/nrgpio ver |
Dovreste avere almeno la versione 0.5.11 per il Pi2 o la 0.5.8 per versioni più vecchie di raspberry.
Se non lo avete affatto installato, il comando per farlo è questo:
sudo apt-get update && sudo apt-get install python-rpi.gpio |
Accedere alla porta seriale
Se volete usare il nodo per l’accesso alla porta seriale, con Node.js v0.10.x o v0.12.x e avete manualmente installato Node-RED su Raspbian Wheezy, allora dovrete installare manualmente una versione specifica del nodo serial port:
sudo npm i -g --unsafe-perm [email protected] |
Avviare Node-RED
A causa dei limiti di memoria del Raspberry Pi, è necessario avviare Node-RED con il comando node-red-pi
. Questo permette l’aggiunta di un argomento che indicherà a Node.js di liberare memoria inutilizzata quando raggiunta quella soglia.
node-red-pi --max-old-space-size=128 |
Se decidete di avviare Node-RED usando il comando node direttamente, questa opzione deve apparire fra “node” e “red.js”:
node --max-old-space-size=128 red.js |
Questa opzione limita lo spazio utilizzabile a 128MB prima di ripulire la memoria. Se non state eseguendo nient’altro sul vostro raspberry, allora potete anche permettervi di aumentare questo limite a 256MB o più. Il comando htop
o free -h
vi fornirà qualche delucidazione in merito alla memoria utilizzata.
Nota: la versione pre-installata di Node-RED su Raspbian usa il comando node-red-start con 128MB di default. Se volete cambiare questo valore, il file da modificare si trova in:
/lib/systemd/system/nodered.service
Avviare Node-RED al boot
Il modo migliore per avviare Node-RED all’avvio di sistema è di usare le funzionalità di systemd.
sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/nodered.service -O /lib/systemd/system/nodered.service sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/node-red-start -O /usr/bin/node-red-start sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/node-red-stop -O /usr/bin/node-red-stop sudo chmod +x /usr/bin/node-red-st* sudo systemctl daemon-reload |
Questi comandi (eseguiti come root), scaricano i 3 file richiesti nelle locazioni esatte, rendono gli script eseguibili e riavviano il demone systemd.
Node-RED può essere eseguito e stoppato usando i comandi node-red-start
e node-red-stop
. Di default gira sulla porta 1880.
Per abilitare l’esecuzione di node-red al boot di sistema o dopo eventuali crash:
sudo systemctl enable nodered.service
Per disabilitarlo:
sudo systemctl disable nodered.service
Systemd usa come file di log: /var/log/system.log
. Per filtrare i lod relativi a node-red si può usare:
sudo journalctl -f -u nodered -o cat
Aggiungere Johnny-five a Node-RED
Avremo bisogno di aggiungere dei pacchetti su node-red per poter usare johnny-five.
sudo su cd .node-red npm i node-red-contrib-gpio |
Dopo un istante, a download e installazione completata, avremo a disposizione l’accesso ai GPIO e Johnny-five.
A questo punto possiamo collegare un Arduino alla porta USB e iniziare.
Possiamo anche aggiungere raspi-io così da usare direttamente i GPIO del RPI.
npm install raspi-io # installiamo la nuova dipendenza in .node-red reboot # riavviamo il sistema node-red-start # eseguiamo nuovamente node-red se non abbiamo già impostato una rule per l'esecuzione all'avvio. |
Facciamo lampeggiare un LED
Con le dipendenze correttamente installate e node-red in esecuzione, possiamo andare a questo indirizzo nel browser: http://INDIRIZZO-IP-RASPBERRY:1880
Trasciniamo un nodo johnny-five
nel workspace di node-red e facciamo doppio click su di esso. Dopodichè tasto edit per configurare un nuovo nodebot, selezionamo come tipologia di nodebot “Raspberry Pi” e schiacciamo Add:
Dopodichè nel blocco di codice onReady
possiamo scrivere qualcosa del tipo:
var led = new five.Led('GPIO4'); led.blink(500); |
Schiacciamo il tasto Deploy in alto a destra e se abbiamo un LED connesso al GPIO4, dovrebbe iniziare a lampeggiare!
Le potenzialità di questo workflow engine chiaramente vanno ben al di là di questo semplice esempio. Node-RED integra di base dei nodi per l’utilizzo di protocolli quali websocket, MQTT etc. E’ un pezzo fondamentale per qualunque applicazione di Internet of Things.
Possiamo connettere l’output di un nodo di johnny-five a qualunque altro tipo di nodo.
Dunque collegare un bottone fisico sulla nostra board, schiacciarlo e veder pubblicato il mex su twitter.
Commenti