Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

I principali nodi funzione

I principali nodi della categoria "functions" all'interno della tool box di NodeRED: delay, trigger, change, switch, range, template, etc.
I principali nodi della categoria "functions" all'interno della tool box di NodeRED: delay, trigger, change, switch, range, template, etc.
Link copiato negli appunti

Nella lezione precedente abbiamo realizzato un primo flow per la tipica applicazione "Hello World". I nodi utilizzati sono quelli basilari. In particolare abbiamo utilizzato function grazie al quale possiamo scrivere liberamente codice JavaScript ed elaborare il messaggio ricevuti in ingresso, restituendo il messaggio stesso oppure creandone uno completamente nuovo. Come abbiamo visto, tale nodo permette anche di restituire anche più messaggi in uscita.

In questo articolo analizzeremo gli altri nodi principali che rientrano nella categoria "functions" all'interno della tool box di NodeRED.

Delay: il ritardo nel flow

Un primo nodo da analizzare, semplice e potente, è il "delay", grazie al quale possiamo:

  • Aggiungere un ritardo (da millisecondi a giorni) nel trasferimento del messaggio dall'ingresso all'uscita. Tale ritardo può essere impostato in maniera precisa oppure fatto generare in maniera casuale dal nodo stesso nell'ambito di un intervallo prefissato;
  • Ridurre il "message rate" del flusso ossia della frequenza con cui i messaggi si propagano all'interno di esso. È possibile impostare il limite in termini di messaggi al secondo (oppure ore, minuti e giorni);

Queste funzionalità sono accessibili attraverso il campo "Action" della finestra di configurazione del nodo che, come sappiamo, è visibile cliccando due volte su di esso. Nel caso di limite del "message rate", è possibile specificare, attraverso l'opzione "drop intermediate messages", se il nodo deve scartare tutti i messaggi che riceve in ingresso e che non può inoltrare in uscita a causa del limite imposto; in caso contrario, il nodo ha un buffer in cui salva i messaggi in ingresso (fino ad un massimo di 1000) e dal quale attinge per trasferirli in uscita ad un rate ridotto (da noi desiderato).

Configurazione del nodo "delay"

Trigger, generare un "impulso"

Un altro interessante nodo è "trigger" la cui logica consiste nel generare due messaggi consecutivi in uscita, separati da un intervallo di tempo personalizzabile noto come timeout, alla ricezione di un qualsiasi messaggio in ingresso.

Attraverso la corrispondente finestra di configurazione è possibile impostare :

  • Il payload del primo messaggio in uscita che può coincidere con quello del messaggio in ingresso, essere completamente nuovo oppure vuoto (campo "Output");
  • Il payload del secondo messaggio in uscita che può essere impostato allo stesso modo del primo (campo "output");
  • l'intervallo di tempo (timeout) che deve trascorrere tra i due messaggi in uscita (campo "then wait");
  • se il timer, che gestisce il timeout corrispondente, deve essere riavviato ogni qual volta viene ricevuto un messaggio in ingresso (campo "and").

Configurazione del nodo "trigger"

Quando il nodo riceve un messaggio in ingresso, si dice che è "triggerato" ed applica la sua logica di funzionamento.

Un caso particolare è quello in cui impostiamo un timeout pari a 0: il "trigger" implementa un timeout infinito, per cui viene trasmesso in uscita solo il primo messaggio ma non il secondo così come l'operazione può essere innescata una ed una sola volta da un messaggio di ingresso (one shot).

Un interessante utilizzo può essere quello della realizzazione di un "watchdog timer". Infatti, impostando su "nothing" come primo messaggio in uscita ed abilitando l'estensione del timer ad ogni messaggio ricevuto in ingresso, il comportamento del nodo sarà il seguente: fintanto che riceve periodicamente un messaggio in ingresso, esso non produce alcun primo messaggio di uscita (impostato su "nothing") ma parte il timer che viene riavviato per ogni messaggio ricevuto. Ciò vuol dire che se per un tempo pari al timeout impostato non viene ricevuto alcun messaggio, il nodo produce il secondo messaggio in uscita che rappresenta una sorta di "alert" di mancata ricezione di una sequenza di messaggi nel tempo attesi in ingresso.

Change: manipolare le proprietà di un messaggio

Un nodo molto utile, che permette di elaborare "al volo" un messaggio, è il nodo change che permette di:

  • modificare il valore di una proprietà di un messaggio;
  • cancellare una proprietà di un messaggio;
  • eseguire un'operazione di ricerca e sostituzione di un certo valore all'interno di una proprietà di un messaggio addirittura mediante l'uso di una regular expression;

Configurazione del nodo "change"

La finestra di configurazione suggerisce di default come proprietà su cui intervenire quella relativa al payload poiché maggiormente utilizzata. È ovvio che il nodo può intervenire su qualsiasi altra proprietà, sia esso nativa (come "payload" o "topic") sia esso definita dallo sviluppatore. Infatti, ricordiamoci che i messaggi in un flusso di Node-RED sono oggetti JSON ed in quanto tali possiamo anche aggiungere ulteriori proprietà ad essi.

Switch e range: condizionare i messaggi di uscita e rimappare i valori

Così come nella programmazione tradizionale, anche nella flow-based programming si può pensare al costrutto condizionale di switch al quale corrisponde l'omonimo nodo in Node-RED.

Tale nodo è il primo, oltre al nodo function visto nell'articolo precedente, che ammette più di un'uscita. Infatti, esso permette di specificare una o più condizioni su una proprietà del messaggio di ingresso (di default il "payload") e per ciascuna di esse produrre un messaggio in uscita con un certo payload. Le condizioni possono essere realizzate utilizzando i principali operatori booleani oltre al match attraverso una regular expression.

Configurazione del nodo "switch"

Un'interessante opzione consiste nel fare in modo che il nodo si fermi alla prima condizione verificata in modo da produrre un solo messaggio di uscita sulla corrispondente porta oppure analizzare tutte le condizioni e produrre più messaggi contemporaneamente in uscita qualora ci fossero più condizioni valide.

Altro nodo interessante e semplice da usare è il nodo range che agisce solo su valori numerici contenuti nel payload di un messaggio e permette di eseguire una rimappatura assolutamente lineare da una scala di ingresso ad una di uscita; infatti, attraverso la sua finestra di configurazione è possibile stabilire quali siano il valore minimo e massimo del range di input e di ouput.

Configurazione del nodo "range"

Template: costruire un messaggio sulla base di un modello

Il nodo template è molto utile quando vogliamo generare un nuovo messaggio, sulla base di quello ricevuto in ingresso, il cui payload sia il risultato dell'applicazione di un template. Ad esempio, immaginando di ricevere in ingresso un messaggio del tipo seguente :

{ firstname : "Paolo", lastname : "Patierno" }

Si potrebbe ottenere un nuovo messaggio il cui payload sia del tipo "Ti chiami Paolo Patierno" applicando un template che ha la seguente sintassi :

Ti chiami {{firstname}} {{lastname}}

Da notare che le doppie parentesi graffe aperte e chiuse rappresentano il modo con cui si delimitano i placeholder all'interno del template; ciascun placeholder è identificato con il nome della proprietà da utilizzare a partire dal messaggio di ingresso.

Configurazione del nodo "template"

Nell'esempio osserviamo che il messaggio di ingresso non ha la proprietà "payload" ma è valido a tutti gli effetti; utilizzando un semplice nodo function siamo in grado di creare attraverso il JavaScript un nuovo oggetto JSON che assume la forma di cui sopra senza la proprietà "payload" che è presente nei messaggi generati di default dai nodi ma non è obbligatoria (così come "topic").

HTTP request: eseguire una richiesta HTTP

Utilizzando il nodo http request, eseguire una richiesta HTTP non è mai stato così facile. Il modo più semplice per effettuare una richiesta è quello di utilizzare la finestra di configurazione del nodo stesso attraverso cui impostare :

  • Il metodo HTTP da utilizzare (GET, POST, PUT e DELETE);
  • URL verso il quale eseguire la richiesta;
  • La possibilità di gestire la HTTP "basic authentication" specificando username e password;

Nel caso di richieste come POST e PUT che possono prevedere un body HTTP non vuoto, quest'ultimo è "riempito" con il contenuto della proprietà payload del messaggio che il nodo riceve in ingresso.

Configurazione del nodo "http request"

Una volta configurato, il nodo esegue la richiesta nel momento in cui riceve un messaggio in ingresso (con payload o meno) che funge quindi da evento scatenante e fornisce un messaggio di uscita che ha nel payload il body della risposta oltre alla proprietà statusCode ed headers che contengono rispettivamente lo Status Code e gli Headers della risposta stessa.

L'altra modalità, molto più flessibile di eseguire una richiesta HTTP, consiste nel non configurare il nodo ma iniettare un messaggio in ingresso che porti con se tutte le informazioni necessarie attraverso le seguenti proprietà :

Proprietà Descrizione
url URL della richiesta (HTTP o HTTPS)
method metodo della richiesta (GET, POST, PUT e DELETE)
headers oggetto JSON che contiene gli headers HTTP nella forma di chiave/valore
payload body della richiesta se necessario

Comment: commenti e rappresentazione dei dati

Molto spesso, se il flusso realizzato è molto complesso, può essere utile utilizzare il nodo comment mediante il quale poter aggiungere un semplice commento che descrive ciò che stiamo facendo in una parte o nell'ambito dell'intero flusso.

Altri nodi

Infine, per ultimi ma non meno importanti, ci sono i nodi che permettono di analizzare il payload del messaggio ricevuto in ingresso e fornirne una corrispondente rappresentazione in uscita nei seguenti formati: XML, HTML, JSON, CSV.

Per ciascuno di essi esiste il corrispondente nodo omonimo che ha la possibilità di elaborare il payload sia se è in formato stringa che come oggetto JSON. Ovviamente, il risultato del parsing sarà immesso nel payload del messaggio di uscita.

Abbiamo così concluso una panoramica sui principali nodi funzione che risultano molto utili nei flussi Node-RED per poter eseguire elaborazioni più o meno complesse sui messaggi. In seguito inizieremo ad analizzare con esempi pratici i nodi con cui è possibile interagire con il mondo esterno attraverso connessioni HTTP REST, TCP, MQTT oppure con i social network come Twitter.

Ti consigliamo anche