Web service con Node Red: come rendere disponibili i dati di una misurazione

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:

  1. Req: Nodo di tipo “Http In” usato per intercettare le richieste esterne (GET). Configurazione:
    • Method: GET
    • URL: /api/getTemperature
    • Name: Req
  2. Timestamp: Nodo di tipo “Inject“, usato per simulare l’arrivo di un richiesta e la partenza del flusso infase di debug. Configurazione:
    • Payload: timestamp
  3. 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;

  4. Json: Nodo di tipo “Json“, utilizzato per convertire un oggetto 
    • Action: Always converto to JSON string.
    • Property: msg.payload
  5. Response: Nodo di tipo “Http response“, utilzzato per inviare la risposta. Configurazione:
    • Name: RESPONSE
    • Status: 200
    • Headers: Content-Type = application/son
  6. 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:

 

 

3 years ago

Leave a Reply

Your email address will not be published. Required fields are marked *