Node-RED. Grandi progetti IOT in pochi minuti!


Informatica / domenica, Gennaio 26th, 2020

Dopo aver comprato il tuo primo RaspberryPi, hai già mille idee, sul tavolo una montagna di sensori e resistenze, ma … come farli “comunicare” tra loro?
RaspberryPi è una base eccellente per l’IoT (Internet of Things), piccolo e pieno di porte GPIO, con la disponibilità di centinaia di sensori ed HAT già pronti e, per finire, una vastissima community mondiale.

I sensori si possono programmare con mille linguaggi differenti, in mille modi, ma questo richiede esperienza, tempo e debug… cosa che possiamo ridurre imparando ad usare gli strumenti forniti dal tool Node-RED, preinstallato nelle versioni di Raspian con Desktop, o installabile con un semplicissimo comando.

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

Per chi volesse iniziare senza installare nulla, con un account gratuito su fred.sensetecnic  potremmo provare alcuni nodi base utili per prendere dimestichezza, ovviamente mancheranno i nodi RaspberryPi.

Cos’è node-RED?

Node-RED è uno strumento nato con l’idea di gestire il mondo dell’ IoT tramite il paradigma dei flussi di dati, la sua base è JavaScript con il famosissimo Node.js il quale sfrutta tutte le sue potenzialità e la sua estesa documentazione e community. Nei flussi viaggiano pacchetti di dati, preferibilmente tramite il protocollo MQTT, ed in formato JSON, che saltano da un nodo (i singoli oggetti del menù a sinistra) eseguendo azioni, calcoli, analisi ed eventi tramite javascript verso siti web, dashboard, sensori ed ogni apparecchio o servizio che riusciamo ad interfacciare, il tutto con grande semplificazione e facilità.

La documentazione ufficiale è scritta chiaramente, anche se in modo molto stringato, ma gli oltre 1480 moduli già pronti, la vasta documentazione su node.js e JavaScript, il forum di node-red e il forum di RaspberryItaly riusciranno a colmare ogni lacuna sull’implementazione delle nostre apparecchiature.

Il messaggio che viaggia nel flusso, si chiama msg ed è un parametro fondamentale, il payload o msg.payload che contiene il messaggio, che sia esso una stringa, JSON, numerico o altro, da inviare al nodo successivo il quale userà per l’operazione per cui è stato programmato.

Un esempio è il nodo email che memorizza il contenuto dell’email, che diventa il msg.payload , il quale viene inviato al nodo audio out che legge il msg.paypload e lo legge tramite la funzione TTS integrata nel dispositivo che riceve il messaggio tramite dashboard web in tempo reale.

Nella precedente immagine si vede come il nodo “inject” che a comando (premendo il pulsante a sinistra) o temporizzando, invia un messaggio msg.payload al nodo successivo; in questo caso un nodo di debug evidenzia la caratteristica “msg.topic” tipica del protocollo MQTT e comunque opzionale, ed il suo id univoco nel flusso.

Node-RED ha a disposizione una serie di nodi e di componenti adatti per crearci una dashboard web flessibile e reattiva con veramente pochi click, basterà posizionarli su una griglia che si adatterà al browser e ci consentirà di avere a disposizione pulsanti, grafici, nonché, grazie al nodo template, codice HTML con tutto quello che ci può servire dal tag <style> per i CSS all’integrare qualsiasi codice e script.

Nodo Templeate e le informazioni
Nodi Dashboard

Interfaccia Node-RED

Node-RED possiede un interfaccia web molto chiara, sulla sinistra troviamo i nodi disponibili suddivisi per categorie, dove troveremo inizialmente le seguenti categorie e nodi; selezionandoli singolarmente, vi troveremo la descrizione sulla destra, un esempio di utilizzo e i dettagli.

Input

  1. Inject: innietta nel flusso manualmente o ad intervalli regolari un messaggio, che può essere di vario tipo
  2. Catch: cattura gli errori nel flusso in cui è inserito
  3. Status: restituisce lo stato dagli altri nodi nello stesso tab
  4. Link: crea connessioni virtuali tra i vari flussi
  5. MQTT: si connette ad un broker MQTT e si sottoscrive ai messaggi di uno specifico topic
  6. HTTP: crea un endpoint HTTP per creare servizi web
  7. WebSocket: un websocket input
  8. TCP: Fornisce una scelta di input TCP. Può connettersi a una porta TCP remota o accettare connessioni in entrata
  9. UDP: Un nodo di input UDP, che produce un msg.payload contenente una stringa codificata Buffer, string o base64. Supporta multicast
  10. Serial: Legge i dati da una porta seriale locale

Output

  1. Debug: Visualizza le proprietà del messaggio selezionate nella scheda della barra laterale di debug e facoltativamente il registro di runtime. Per impostazione predefinita visualizza msg.payload
  2. Link: Creare cavi virtuali tra i flussi.
  3. MQTT: Si collega a un broker MQTT e pubblica messaggi
  4. HTTP response: Invia le risposte alle richieste ricevute da un nodo di input HTTP
  5. WebSocket: Nodo WebSocket output
  6. TCP: Fornisce una scelta di output TCP. Può connettersi a una porta TCP remota, accettare connessioni in entrata o rispondere ai messaggi ricevuti da un nodo TCP In
  7. UDP: Questo nodo invia msg.payload all’host e alla porta UDP designati. Supporta multicast
  8. Play audio: Un nodo per riprodurre l’audio nel browser. Per funzionare la pagina web dell’editor deve essere aperta
  9. Serial: Fornisce una connessione a una porta seriale in uscita

Function

  1. Function: Un blocco funzione JavaScript da eseguire rispetto ai messaggi ricevuti dal nodo
  2. Template: Imposta una proprietà in base al modello fornito
  3. Delay: Ritarda ogni messaggio che passa attraverso il nodo o limita la velocità con cui possono passare
  4. Trigger: Quando attivato, può inviare un messaggio e quindi facoltativamente un secondo messaggio, a meno che non venga esteso o ripristinato
  5. Comment: Un nodo che puoi usare per aggiungere commenti ai tuoi flussi
  6. HTTP request: Invia richieste HTTP e restituisce la risposta
  7. TCP request: Un semplice nodo di richiesta TCP: invia msg.payload a una porta TCP del server e si aspetta una risposta
  8. Switch: Instradare i messaggi in base ai loro valori di proprietà o posizione di sequenza
  9. Change: Imposta, modifica, elimina o sposta le proprietà di un messaggio, il contesto del flusso o il contesto globale
  10. Range: Esegue il mapping di un valore numerico su un intervallo diverso
  11. Split: Divide un messaggio in una sequenza di messaggi
  12. Join: Unisce sequenze di messaggi in un singolo messaggio
  13. Sort: Una funzione che ordina la proprietà del messaggio o una sequenza di messaggi
  14. Batch: Crea sequenze di messaggi basati su varie regole
  15. CSV: Converte tra una stringa formattata CSV e la sua rappresentazione di oggetto JavaScript, in entrambe le direzioni
  16. HTML: Estrae elementi da un documento HTML contenuto in msg.payload usando un selettore CSS
  17. JSON: Unisce sequenze di messaggi in un singolo messaggio
  18. XML: Converte tra una stringa XML e la sua rappresentazione di oggetto JavaScript, in entrambe le direzioni
  19. YAML: Converte tra una stringa formattata YAML e la sua rappresentazione di oggetto JavaScript, in entrambe le direzioni
  20. Random: Genera un numero casuale tra un valore basso e alto
  21. Smooth: Un nodo semplice per fornire varie funzioni su diversi valori precedenti, inclusi i filtri max, min, media, alta e bassa
  22. Rbe: Segnala per nodo Eccezione – trasmette solo i dati se il carico utile è cambiato

Social

  1. Email input: Recupera ripetutamente una singola email da un server IMAP e inoltra come msg se non è già stata vista
  2. Email output: Invia msg.payload come email, con oggetto di msg.topic
  3. Twitter input:  Nodo di input di Twitter. Può essere utilizzato per effettuare una ricerca
  4. Twitter output: Nodo out di Twitter. Tweetta il msg.payload

Storage

  1. Tail: Tails (cerca le cose da aggiungere) al file configurato. (SOLO Linux / Mac)
  2. File input: Legge il contenuto di un file come una stringa o un buffer binario
  3. File output:  Scrive msg.payload in un file, aggiungendo alla fine o sostituendo il contenuto esistente. In alternativa, può cancellare il file

Analysis

  1. Sentiment: Analizza la proprietà scelta, di default msg.payload ed aggiunge un oggetto sentiment

Advanced

  1. Watch: Controlla una directory o un file per le modifiche
  2. FeedParse: Monitora un feed RSS / atom per le nuove voci
  3. Exec: Esegue un comando di sistema e restituisce il suo output

Raspberry Pi

  1. Rpi GPIO input: Genera un msg.payload con uno 0 o 1 a seconda dello stato del pin di input
  2. Rpi GPIO output: Raspberry Pi nodo di uscita. Può essere utilizzato in modalità digitale o PWM
  3. Rpi mouse: Nodo del pulsante del mouse Raspberry Pi. Richiede un mouse USB
  4. Rpi keyboard: Nodo di gestione della tastiera Raspberry Pi. Richiede una tastiera USB

Dashboard

  1. Button: Aggiunge un pulsante all’interfaccia utente
  2. Dropdown: Aggiunge una casella di selezione a discesa all’interfaccia utente
  3. Switch: Aggiunge un interruttore on/off all’interfaccia utente
  4. Slider: Aggiunge un widget di scorrimento all’interfaccia utente
  5. Numeric: Aggiunge un widget di input numerico all’interfaccia utente
  6. Text input: Aggiunge un campo di immissione del testo all’interfaccia utente. La modalità può essere testo normale, email o selettore colori
  7. Date picker: Aggiunge un widget di selezione data all’interfaccia utente
  8. Colour picker: Aggiunge un selettore di colori alla dashboard
  9. Form: Aggiunge un modulo all’interfaccia utente
  10. Text: Visualizzerà un campo di testo non modificabile sull’interfaccia utente
  11. Gauge: Aggiunge un widget di tipo indicatore all’interfaccia utente
  12. Chart: Traccia i valori di input su un grafico. Questo può essere un grafico a linee basato sul tempo, un grafico a barre (verticale o orizzontale) o un grafico a torta
  13. Audio out: Riproduce audio o sintesi vocale (TTS) nella dashboard
  14. Notification: Mostra msg.payload come notifica popup o la richiesta OK / Annulla  sull’interfaccia utente
  15. UI Control: Consente il controllo dinamico della Dashboard
  16. Template: Il widgetTemplate può contenere qualsiasi direttiva valida in html e Angular / Angular-Material

Network

  1. Ping: Effettua il ping su una macchina e restituisce la latenza in millisecondi come msg.payload

Gestione dei nodi

Nella barra superiore troviamo il filtro dei nodi, utile quando ne avremo installati molti.

Mentre in basso a sinistra trovano posto i pulsanti per contrarre od espandere la lista dei nodi.

Gestione dei flussi

Nella sezione centrale troviamo i tab con tutti i flussi, che si avvieranno una volta premuto Deploy, se non verranno disabilitati tramite il menu di configurazione del flusso, apribile col doppio click.

Gestione dei dati

Selezionando un nodo, avremo sulla destra l’utile pannello info e Node Help dove spiega come usare il nodo, di norma con relativo esempio.

Nel fondo invece uno speciale riquadro illustra ad intervalli regolari validi suggerimenti su Node-RED.

 Il tab debug sarà a mio parere il più usato, scrive tutto cio che i vari nodi debug raccolgono nel flusso corrente o in tutti, potendo anche copiare il percorso esatto di un dato all’interno di un oggetto; immaginiamo ad esempio un complesso file JSON.

Grafica, la dashboard

L’ultima parte racchiude la Dashboard dove possiamo organizzare tutti i nodi della categoria dashboard in una griglia web responsive, aggiornata in tempo reale, semplicemente in pochi click.
Sulla destra il quadratino con freccia, porterà alla dashboard raggiungibile da ogni dispositivo in rete, che altro non sarà che i link http://ipRaspberryPi:1880/ui . La parte fantastica è l’adattabilità ai vari schermi e l’aggiornamento in tempo reale. Ricordo che si potrà inserire qualsiasi CSS o script tramite il node template.

Infine il pulsante deploy, che salva ed esegue le modifiche che verranno applicate all’istante nella dashboard.

Il menù

Il Menù

Il menù contiene la fondamentale sezione manage palette, che altro non è che la raccolta di tutti i nodi disponibili ed installabili con un banale click. I nodi attualmente sono 1488 in continuo aumento. Spaziano da fitbit ai servizi google all’utile simulatore di sensori e valori casuali.

Import invece sarà utilissima per imparare, perchè spesso in rete troverete post in cui ci sarà una serie di codici javascript, sarà sufficiente importarli per vedere comparire un flusso completo creato dall’autore!

Con questa piccola presentazione vi lascio fare i primi esperimenti, ed il presto pubblicherò altre guide su qualche esperimento da fare insieme, vi aspetto sul forum e facebook.
Aspetta! Un tutorial senza la parte più importante! No, non il classico Hello World, ma il più brutale copia/incolla!

Primo flusso

Copia ed importa questo codice

&#91;{"id":"c25cc62b.1ee028","type":"debug","z":"39aca26d.29ddee","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":550,"y":200,"wires":&#91;]},{"id":"b01145bf.a35b08","type":"ui_button","z":"39aca26d.29ddee","name":"","group":"2ff73ece.8889a2","order":1,"width":0,"height":0,"passthru":false,"label":"Proviamo...","color":"","bgcolor":"","icon":"fa-beer","payload":"Benvenuto su Raspberry Italy da Enrico Sartori ci vediamo su Facebook e sul forum! Se ti è piaciuto l'articolo, condividilo :)","payloadType":"str","topic":"","x":350,"y":260,"wires":&#91;&#91;"d888d828.322968","c25cc62b.1ee028"]]},{"id":"d888d828.322968","type":"ui_toast","z":"39aca26d.29ddee","position":"top right","displayTime":"3","highlight":"","outputs":0,"ok":"OK","cancel":"","topic":"","name":"","x":570,"y":260,"wires":&#91;]},{"id":"2ff73ece.8889a2","type":"ui_group","z":"","name":"Group 1","tab":"88dbc928.195cd8","order":1,"disp":false,"width":"6","collapse":false},{"id":"88dbc928.195cd8","type":"ui_tab","z":"","name":"Dashboard","icon":"dashboard","order":2}]