IoT Platforms: Node-RED

Node-RED è la piattaforma con cui implementare la logica associata al funzionamento della piattaforma, come MQTT è un prodotto dei laboratori di IBM distribuita con una licenza Open Source (ma anche integrata nella piattaforma cloud IBM Bluemix!!!) .

Basata sul server Node.js e sul linguaggio Javascript è anche disponibile tramite il sistema di pacchettizzazione NPM.

Abbiamo già visto come installare la piattaforma in un articolo precedente, vediamo ora qualche semplice esercizio per prendere confidenza con la piattaforma.

ESERCIZIO 1

Il nodo Inject  consente di iniettare messaggi all’interno di un flusso cliccando sul bottone o con altre logiche (all’avvio, a scadenze regolari, ecc).

0f4805ee-529d-4d55-9bef-04ab5d109da2-1

Per aggiungere il nodo basta cercarlo nella paletta dei nodi e tenendolo cliccato spostarlo sullo spazio di lavoro. Sulla barra di destra possono essere viste tutte le informazioni riguardanti il nodo selezionato (tab Info) mentre un doppio click consente di accedere alla configurazione del nodo stesso.

Il nodo Debug consente di visualizzare ogni messaggio (o parte di esso) sulla barra di destra nel tag Debug; normalmente viene visualizzato solo il payload del messaggio ma è possibile visualizzare un ulteriore campo o addirittura tutto il messaggio.

Aggiungiamo un nodo allo spazio di lavoro.

a981b444-0082-49af-a89a-6227ac5d196d

Non resta ora che connettere i nodi aggiunti ovvero connettere il morsetto di uscita (a destra del nodo) dell’Inject con il morsetto di ingresso (a sinistra del nodo) del Debug, per far ciò non serve altro che cliccare sul nodo di uscita e, tenendo premuto il tasto del mouse, spostarsi sul morsetto di ingresso, in questa maniera al rilascio verrà disegnato un connettore tra questi due morsetti.

d89e7958-9d0b-42b6-b3a2-9dca5a0773a8

Arrivati a questo punto però il flusso (formato dai due nodi e dalla connessione) esiste solo nell’editor e va attivato all’interno di Node-RED mediante la funzione di Deploy, per far ciò basta cliccare il tasto Deploy in alto a destra.

e786824e-1e52-464d-bece-cb9bf68105db

Se proviamo a selezionare latab di debug, una volta clicckato il bottone di inject possiamo vedere apparire un numero o una stringa. In questo caso nel payload è presente il numero di secondi passati dal 1 gennaio 1970.

Proviamo ora a rendere questa informazione più leggibile, per farlo aggiungiamo un nodo function che ci permette di manipolare il contenuto del messaggio mediante del codice JavaScript.

b065ee8e-2c70-42e3-82d6-cbe2d03b6a78

Aggiungiamo quindi un nodo Function selezionandolo dal tab edit e configuriamolo (mediante doppio click) aggiungendo il codice di seguito riportato.

Clickkiamo Ok per chiudere la finestra di editing, colleghiamo la funzione tra Inject e Debug e procediamo al deployment tramite il bottone di deploy.

628b6085-ce20-4aa2-89e1-5427c868b9aa

Ora per ogni pressione del tasto Inject viene generato un messaggio passato alla funzione Function che, dopo averlo formattato, lo passa al nodo di Debug.

Facile! Ora si possono guardare tutti gli altri nodi già presenti in Node-RED e quelli che possono essere installati da http://flows.nodered.org/ e perdere qualche nottata giocando con questa potente piattaforma.

5 Comments


  1. Hello Valerio,

    I’m hoping you can help me a little as I feel im going crazy now 🙂

    I have been stuck the pass days using your “Phant” Node-Red node.

    I have a json string that looks like this:

    {
    “gw_id”: “1234567890”,
    “payload”: “QCsSASaABAABSSVFeHBjkQ==”,
    “f_cnt”: 4,
    “lora”: {
    “spreading_factor”: 7,
    “bandwidth”: 125,
    “air_time”: 51456000
    },
    “coding_rate”: “4/5”,
    “timestamp”: “2017-10-28T07:32:20.087Z”,
    “rssi”: -33,
    “snr”: 9.8,
    “dev_addr”: “1234567890”,
    “frequency”: 868100000
    }

    When I put this object into connection node of the example you have provided, like so:

    var object = {
    “gw_id”: “1234567890”,
    “payload”: “QCsSASaABAABSSVFeHBjkQ==”,
    “f_cnt”: 4,
    “lora”: {
    “spreading_factor”: 7,
    “bandwidth”: 125,
    “air_time”: 51456000
    },
    “coding_rate”: “4/5”,
    “timestamp”: “2017-10-28T07:32:20.087Z”,
    “rssi”: -33,
    “snr”: 9.8,
    “dev_addr”: “1234567890”,
    “frequency”: 868100000
    }

    msg.object = object;
    msg.object.timestamp = msg.payload;
    return msg;

    I get the following error when I hit deploy…
    28 Oct 11:12:45 – [red] Uncaught Exception:
    28 Oct 11:12:45 – TypeError: Cannot read property ‘fields’ of null
        at Phant.add (/Users/development/.node-red/node_modules/phant-client/phant.js:308:27)
        at /Users/development/.node-red/node_modules/node-red-contrib-phant/phant/phant.js:70:17
        at /Users/development/.node-red/node_modules/phant-client/phant.js:146:21
        at Request.handleRequestResponse [as _callback] (/Users/development/.node-red/node_modules/unirest/index.js:461:25)
        at Request.self.callback (/Users/development/.node-red/node_modules/request/request.js:373:22)
        at emitTwo (events.js:106:13)
        at Request.emit (events.js:191:7)
        at Request.<anonymous> (/Users/development/.node-red/node_modules/request/request.js:1318:14)
        at emitOne (events.js:101:20)
        at Request.emit (events.js:188:7)
    Ling-MBP:.node-red development$
     

    all nodes are found in the flow ok.

    Thanks in advance for any help you can provide me with.

    Ling

    Reply

    1. Some notes:
      1. msg.payload is the object that the node push on phant so you will need

      msg.timestamp = msg.payload;
      msg.payload = object;
      msg.payload.timestamp = msg.timestamp;
      return msg;

      2. Try to make linear your JSON like:

      var object = {
      “gw_id”: “1234567890”,
      “payload”: “QCsSASaABAABSSVFeHBjkQ==”,
      “f_cnt”: 4,
      “lora_spreading_factor”: 7,
      “lora_bandwidth”: 125,
      “lora_air_time”: 51456000,
      “coding_rate”: “4/5”,
      “timestamp”: “2017-10-28T07:32:20.087Z”,
      “rssi”: -33,
      “snr”: 9.8,
      “dev_addr”: “1234567890”,
      “frequency”: 868100000
      }

      3. what lora board are you using????? I’m curious as a monkey about new technologies!

      Reply

  2. Also where is it you specify please the ip of where phant/spark is running?

    there is only fields for keys.

    Thanks in advance for help!

    Ling

    Reply

    1. Actually works with public https://data.sparkfun.com/ but if you check the code on phant.js (https://github.com/valerio-vaccaro/node-red-contrib-phant/blob/master/phant/phant.js) lines 40-42 you can see:
      manageUrl: “https://data.sparkfun.com/streams/” + this.publicKey,
      outputUrl: “https://data.sparkfun.com/output/” + this.publicKey,
      inputUrl: “https://data.sparkfun.com/input/” + this.publicKey,
      so if you update this url it will work for your local installation.

      If you do programmatically please consider to release your code on github!

      Reply

  3. I have changed the “connection” node URL = ip to my server

    instead of

     

    Now I see…
    28/10/2017, 11:40:17node: 78b7c71b.8e2658msg : string[40]
    “Unexpected token < in JSON at position 0”

    Any ideas please Sir,

    Ling

    Reply

Leave a Reply

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