Node-RED è uno degli strumenti più usati nel mondo dell’ Iot perché permette di organizzare e personalizzare i flussi di dati in modo semplice e intuitivo utilizzando “blocchettini” (“nodi“) di vario tipo, ognuno dei quali svolge una funzione ben precisa.
Uno dei casi d’uso più frequenti è quello in cui si ricorre a Node-RED per leggere dei dati da dei macchinari in modo da renderli accessibili da remoto tramite dei web service che e renderli utilizzabili da applicazioni realizzate con un qualsiasi framework.
Node-RED mette a disposizione un gran numero di nodi già pronti per interfacciarsi con servizi cloud, dispositivi e macchinari di ogni tipo. Spesso l’accesso a queste risorse è diretto tramite una rete locale ma può avvenire anche attraverso dei proxy. Le librerie di Node-RED supportano vari protocolli industriali: Lorawan, Modbus, Opc-ua, Ethernet, ecc. ma non è questo l’argomento di questo post. Basti sapere che i blocchetti per leggere i dati dai macchinari esistono e che c’è solo da configurarli.
Una volta letti i dati però bisogna pubblicarli, magari esponendo una Web service che permetta a un programma esterno di invocarlo.
Esempio: pubblicazione di un valore di temperatura di un macchinario
In seguito ci sono due flussi che mostrano come realizzare due semplici web service:
- il primo per rendere pubblica la misurazione della temperatura istantanea di un macchinario,
- il secondo per rendere pubblica la misurazione di più temperature in un dato intervallo di tempo.
I blocchetti utilizzati si trovano tutti nelle librerie standard e sono: Inject, Debug, Function, Json, Http In, Http Out.
Utilizzo del web service
Per visualizzare i risultati dei due end-point dell’esempio basta cliccare su questi due link e, se Node-RED è ancora attivo sul mio server, il risultato dovrebbe essere quello dell’immagine che segue il link:
Procedura per la creazione dei nodi
I due flussi sono uguali e composti da 6 nodi, differiscono soltanto per il nodo MeasureTemperature / MeasureTemperatures, che è il nodo che simula la lettura della temperatura da un macchinario.
Nel seguito indicherò i nodi (blocchettini) aggiunti e la loro configurazione. L’articolo cui mi sono ispirato è indicato nella sezione Riferimenti. Il modo di creare e salvare un nuovo flusso, aggiungere, configurare e collegare i blocchi è quello standard spiegato nel tutorial indicato sempre nella sezione Riferimenti.
I nodi da aggiungere sono:
- Req: Nodo di tipo “Http In” usato per intercettare le richieste esterne (GET). Configurazione:
- Method: GET
- URL: /api/getTemperature
- Name: Req
- Timestamp: Nodo di tipo “Inject“, usato per simulare l’arrivo di un richiesta e la partenza del flusso infase di debug. Configurazione:
- Payload: timestamp
- MeasureTemperature/s:
- MeasureTemperature: Nodo di tipo “Function“, che simula la lettura di una temperatura da un macchinario. Nella fattispecie è una funzione che in realtà genera un numero casualeda 0 a 50. Configurazione:
- Linguaggio: Javascript
- Function:
let val = ((Math.random() * 100 ) % 50).toFixed(3);
msg.payload = {
label: "temperature",
value: val,
}
return msg;
- MeasureTemperatures: Nodo di tipo “Function“, che simula la lettura di una seuenza di temperature da un macchinario. Nella fattispecie è una funzione che in realtà genera da 0 a 10 numeri casuali, ciascuno dei uali è un numero casuale da 0 a 50. Configurazione:
- Linguaggio: Javascript
- Function:
let counter = parseInt(Math.random() * 10);
let val = 0;
node.warn(counter);
msg.payload = [];
for (let i = 0; i < counter; i++) {
val = ((Math.random() * 100 ) % 50).toFixed(3);
msg.payload.push(
{
label: "temperature",
value: val,
}
)
}
return msg;
- MeasureTemperature: Nodo di tipo “Function“, che simula la lettura di una temperatura da un macchinario. Nella fattispecie è una funzione che in realtà genera un numero casualeda 0 a 50. Configurazione:
- Json: Nodo di tipo “Json“, utilizzato per convertire un oggetto
- Action: Always converto to JSON string.
- Property: msg.payload
- Response: Nodo di tipo “Http response“, utilzzato per inviare la risposta. Configurazione:
- Name: RESPONSE
- Status: 200
- Headers: Content-Type = application/son
- Debug: Nodo di tipo “Debug“, utilizzato per mostrare il risultato del flusso in fase di debug Configurazione:
- Output: msg.payload
- To: debug window
Possibili migliorie
- Mi accorgo che nel secondo web service non ho previsto e gestito gli intervalli temporali come mi ero prefissato di fare devo correggere il flusso.
- Mi sto ancora chiedendo perché il nodo con la funzione l’ho chiamato MeasureTemperature e non ReadTemperature.
Fonti e riferimenti:
- Node Red Essentials dal sito ufficiale di Node Red.
- “Un corso interessante su Node Red“: Un mio post precedente su Node Red.
- Node Red Cookbook: Http Endpoints.
- “Using Node-RED to mock out RESTful webservices” di Martin V.