in Antima for IoT, Tutorial

Raccolta e visualizzazione dati: connettere dispositivi ed applicazioni tramite Nodered

Ho parlato spesso su antima di raccolta ed analisi di dati, partendo dagli articoli su come creare dei nodi MQTT in Python, a quelli sull’uso della libreria antimait o sulle applicazioni basate su ESP8266. Oggi e nei prossimi articoli, voglio partire da tutti questi concetti di base esposti negli articoli linkati, per creare un’applicazione che gestisca i flussi di dati in arrivo dai sensori. Il tutto verrà implementato utilizzando Nodered, un visual tool per la creazione di applicazioni basate su flussi.

Nodered – Web of Things

Nodered è un’applicazione basata su Node.js ed utilizzabile tramite un’interfaccia grafica via browser, che possiamo usare per creare dei collegamenti tra flussi di informazioni. Questo ci permette di creare programmi che gestiscono questi flussi per offrire servizi più complessi.

L’applicazione è pensata in maniera specifica per essere eseguita su dispositivi come i Raspberry Pi, anche se può girare su qualsiasi macchina con un’installazione di Node.js.

Possiamo pensare a Nodered come una specie di maniera di creare dei routing applicativi per dispositivi IoT, per semplificare il lavoro di implementazione quando non è necessario ricorrere a programmare ogni aspetto di un’app.

Installazione

Nodered può essere installato tramite npm, il gestore di pacchetti di Node.js, o tramite Docker. Avendo parlato ampiamente dell’utilizzo di questa piattaforma su Raspberry Pi, vi rimando all’articolo sull’installazione di Docker, ricordandovi che probabilmente il vostro Raspberry Pi OS potrebbe già averlo in dotazione.

Su Raspberry Pi, inoltre, è possibile installare il tutto direttamente tramite il gestore pacchetti apt (solo se si sta usando la versione stabile a 32-bit del sistema operativo).

Per installare Nodered tramite apt ed avviarlo:

sudo apt install nodered
node-red

Una volta premuto invio, aprendo un qualsiasi browser all’indirizzo http://localhost:1880, potremo visualizzare la pagina di gestione di Nodered.

Finestra iniziale di nodered

Nel caso in cui voleste usare docker:

docker run -it -p 1880:1880 -v node_red_data:/data --name mynodered nodered/node-red

Da ora in poi supporrò che abbiate usato apt, per poi andare a parlare di quali possibilità ci offre la possibilità di utilizzare il tutto tramite docker.

Un primo esempio – Un semplice flow

Utilizzare Nodered è piuttosto intuitivo: nel menù a sinistra possiamo trovare diversi nodi che offrono varie funzionalità. Ogni nodo ha una o più porta d’ingresso e di uscita: queste porte vengono utilizzate per interconnettere i nodi fra di loro. I nodi vengono organizzati nello spazio di lavoro predisposto al centro della finestra, chiamato flow.

Per capire come potere utilizzare questi componenti, procediamo con l’esempio più semplice possibile: selezioniamo e trasciniamo all’interno della schermata centrale un nodo inject ed un nodo debug. Il nodo inject permette di inoltrare un messaggio ogni volta che si preme sul pulsante alla sua sinistra (di base il messaggio è un timestamp). Il nodo debug permette di ricevere messaggi e stamparli nella finestra di debug a destra, visualizzabile cliccando l’icona con l’insetto. Colleghiamo i nodi trascinando un arco dalla porta del nodo inject verso quella di ingresso del nodo debug e clicchiamo deploy, per mandare il tutto in funzione.

A questo punto, cliccando sul pulsante del nodo inject, visualizzeremo qualcosa del genere:

Primo esempio con i nodi inject e debug

Visualizzare pacchetti MQTT

Ora che abbiamo delle basi con i flussi, chiudiamo momentaneamente Nodered e creiamo un’applicazione che riceva messaggi MQTT da un topic. Utilizzeremo mosquitto come broker (ne avevo parlato in questo articolo) assieme ai suoi client per testare l’app. Per installare il tutto sul rasp:

sudo apt install mosquitto mosquitto-clients

Una volta installato, il broker dovrebbe essere già attivo come servizio in background; potete controllare che tutto sia ok eseguendo:

sudo systemctl status mosquitto

Nel caso in cui non risultasse attivo, può essere abilitato tramite:

sudo systemctl enable mosquitto
sudo systemctl start mosquitto

Riapriamo Nodered utilizzando il seguente comando, che lascerà libero il terminale:

node-red &

Il nodo che permette di ricevere messaggi MQTT è mqtt in, al quale possiamo connetterne uno di debug nello stesso modo in cui abbiamo fatto in precedenza. Questa volta, però, una volta trascinato nel flusso, avremo bisogno di cliccare due volte sul nodo mqtt in per modificarne le impostazioni.

Nella prima schermata che apparirà, dal titolo Edit mqtt in node, è possibile specificare il topic a cui sottoscrivere (nel nostro caso, test) ed il QoS, un parametro che impostiamo a 0.

Dopodichè, dovremo cliccare sul simbolo della matita, aprendo una schermata dal nome Edit mqtt broker node, in cui è possibile specificare l’indirizzo del broker da utilizzare, inserendolo nella voce server (nel nostro caso, sarà localhost).

  • Flow con il nodo mqtt in

A questo punto, dopo aver cliccato su deploy, potremo testare il tutto eseguendo:

mosquitto_pub -t test -m prova

e, se tutto sarà andato a buon fine, riceveremo la stringa prova nella schermata di debug del flusso Nodered.

Log dei messaggi ricevuti

Ora che sappiamo come recuperare dei messaggi MQTT, possiamo realizzare una piccola applicazione che salva ogni messaggio in arrivo all’interno di un file di testo, per poi esporre i dati tramite un endpoint HTTP. In questo modo possiamo, in un secondo momento, utilizzare questi dati per operazioni di analisi, ecc.

Utilizzeremo il nodo mqtt in come per l’esempio precedente, ed in aggiunta i nodi http in, http response, file e file in.

I nodi file hanno bisogno di specificare un nome di file: ho optato per il nome mqtt_dump. Quando si specifica solo un nome file, questo verrà salvato nella home directory (/home/pi/ se state utilizzando l’utente predefinito pi). Analizziamo nel dettaglio questi quattro nodi:

  • file, viene utilizzato per salvare dati all’interno di un file; ho utilizzato l’opzione append to fileadd newline to each payload per fare sì che ogni dato in arrivo venga aggiunto a capo.
  • file in, viene utilizzato per leggere dati da un file; ho utilizzato l’opzione a single utf8 string per indicare il formato in cui organizzare i dati letti.
  • http in, permette di creare un endpoint http; ne ho creato uno con su definito il metodo get, raggiungibile via /data.
  • http response, rappresenta l’ultimo nodo nel sotto-flusso di una richiesta http in entrata; il messaggio in ingresso in questo nodo deve essere proveniente da un collegamento che inizi con un http in. In questo caso ho anche aggiunto un header http per specificare che i dati ricevuti effettuando una get su /data sono di tipo testo. 

Qui sotto, degli screen di ogni passaggio appena visto; potete testare l’applicazione utilizzando mosquitto_pub come prima, ed accedendo ai dati salvati andando all’indirizzo http://raspberrypi:1880/data, sostituendo “raspberry” con l’hostname del vostro Pi, se diverso da quello predefinito.

Conclusioni

Questo articolo introduttivo a Nodered ha come intenzione quella di presentare una veloce infarinatura pratica, che spero abbiamo messo alla luce la potenza di questo strumento: potete infatti prototipare velocemente le vostre idee usando i soliti dispositivi a cui siete abituati, con Nodered come piattaforma a fare da collante.

Nel prossimo articolo, esploreremo come gestire flussi di dati, partendo da quanto appena visto, per costruire app più complesse che possano esporre i dati in maniera più presentabile.

Per eventuali approfondimenti o richieste di chiarimenti vi invito come al solito a commentare nella sezione qui sotto!

Scrivi un commento

Commento