Raspberry Pi, la domotica con Node-Red: invio dati IoT con MQTT #5


Informatica / sabato, Gennaio 9th, 2021

Oggi sperimentiamo come inviare tramite il protocollo MQTT, i dati raccolti dai vari Arduino, WeMos, Raspberry Pi, posizionati per casa.

I dati potrebbero ad esempio essere la temperatura e umidità di ogni zona della casa, la luminosità esterna, la rilevazione di un movimento in una zona della casa, la posizione gps di uno smartphone, e come sempre, il limite è la tua fantasia.

Proseguiamo il nostro viaggio nella sperimentazione nell’ uso di Node Red per la nostra casa domotica.

La mia rubrica Raspberry Pi, la domotica con Node-Red.

Stiamo ancora preparando la schermata di gestione e impostazioni. Immagina di aver messo in giardino un Wemos D1 mini che registra la temperatura, umidità e luminosità esterna.
Messo li così fa gran poco, vogliamo leggere quei dati da smartphone, ed attuare delle azioni in caso si raggiungano determinate soglie. Ma non serve scrivere software per farlo, è sufficiente Node Red.

Cos’è MQTT

Parlando facile, il protocollo MQTT, è una specie di chat, ma per i computer.

Esiste un server che esegue la “chat” , chiamato broker.

Poi ci sono i gruppi di discussione, chiamati Topic.

All’interno dei Topic, i client con i loro id. Essi scrivono e leggono messaggi tra di loro.

Ci sono client, che come la tua anziana vicina, ascolta tutti i discorsi di tutti, iscrivendosi a tutte le chat usando nel campo topic il simbolo # .

Poi ci sono i client, a cui non interessa tutto, ma magari semplicemente conoscere la temperatura della piscina e per farlo si iscriveranno al topic /piscina/temperatura ad esempio.

In tutto questo richiedere dati, ci saranno gli addetti alla trasmissione dei dati. Sempre dei client, ma che invieranno il dato in chat, nel topic prestabilito dal creatore della chat.

In Node Red useremmo il nodo MQTT fornito di default.

node red mqtt

MQTT sta per MQ Telemetry Transport. È un protocollo di messaggistica di pubblicazione / sottoscrizione, estremamente semplice e leggero, progettato per dispositivi vincolati e reti a bassa larghezza di banda, alta latenza o inaffidabili. I principi di progettazione consistono nel ridurre al minimo la larghezza di banda della rete e i requisiti delle risorse del dispositivo, cercando anche di assicurare l‘affidabilità e un certo grado di garanzia della consegna. Questi principi si rivelano anche ideali per rendere ottimizzato il protocollo del mondo emergente dei dispositivi connessi “machine-to-machine” (M2M) o “Internet of Things” e per le applicazioni mobile in cui la larghezza di banda e la carica della batteria sono fondamentali.

Per conoscenza, esistono vari operatori che forniscono sim dedicate per il traffico M2M.

Lo scopo di questa guida non è trattare MQTT, per questo il sito di mqtt potrà dare un comprensione più dettagliata.

L’idea della guida è provare subito le basi, solo successivamente, poter approfondire solo ciò che effettivamente vi servirà per i vostri progetti.

Il Broker MQTT

Come abbiamo visto ci servirà un dispositivo su cui far girare i nostri dati, ci servirà un broker.

Dove trovarlo un broker?

Molte aziende che hanno fiutato il futuro dell’ IoT, hanno reso disponibili gratuitamento e a pagamento i loro server con un broker pubblico o privato, con o senza password e criptazione dei dati. I broker cloud hanno il vantaggio di essere veloci e stabili e raggiungibili da ogni parte del mondo con semplicità.

L’alternativa ai Broker MQTT cloud è installarlo in sede, magari direttamente nel nostro Raspberry Pi, semplicemente digitando

12apt updateapt install mosquitto

Le procedure aggiornate per le varie piattaforme, le troverai nel sito principale di mosquitto.

Per leggere le istruzioni del server mosquitto, sarà sufficiente il classico comando.

1man mosquitto

Il file d’esempio completamente commentato, in Raspberry Pi, lo troveremo con

1zcat /usr/share/doc/mosquitto/examples/mosquitto.conf.gz

Tra i vari public broker gratuiti cloud mi vengono in mente, il sito di mosquitto (solo a scopo di test) ed Hive che fornisce il broker e anche il client web.

Per poter sfruttare gratuitamente il broker gratuito di hive, dovremmo usare i seguenti dati:

  • Broker: broker.hivemq.com
  • TCP Port: 1883
  • Websocket Port: 8000

Mentre i dati default di mosquitto saranno

  • Broker: localhost o ip del dispositivo in cui lo hai installato
  • TCP Port: 1883

Per leggere il log di mosquitto dalla cartella log.

1sudo tail /var/log/mosquitto/mosquitto.log

parametri di configurazione di mosquitto sono veramente molti, sta a te scegliere quali si adattano meglio alla tua situazione, ad esempio in una rete domestica, senza accesso dall’ esterno, inviare dati di temperatura, non necessita di criptare tutto. Diciamo che per una rete domestica, non serve configurare nulla se ci limitiamo alla semplice elttura dei sensori.

Client MQTT

Eccellente hai scelto il tuo broker? E’ giunto il momento di scegliere un client mqtt. I client mqtt sono molti, app android, librerie python, web, ecc…  La pagina scritta da Hive, può essere un buon inizio.

Personalmente per python uso la libreria Paho della Eclipse Foundation , mentre per Android IoT MQTT Panel un app ben fatta, in grado di creare dashboard con i dati letti.

clinet mqtt mqttbox

Un client deve conoscere un po’ di parametri del broker e del tipo di messaggi da inviare.

mqttbox

dati di base sono

  • il broker, l’ip o il suo dominio.
  • la porta, se omessa si usa quella di default 1883.
  • l’ id del client, ad esempio “CellulareEnrico” , in una chat bisogna sapere chi ha scritto.
  • il topic in cui scrivere, ad esempio /giardino/temperatura
  • ed il dato da inviare, in node red di solito è il msg.payload . ad esempio 22 , si solo il minimo indispensabile.

Ora che abbiamo un broker ed un client, facciamo delle prove con Node-Red.

Nodo MQTT-IN

L’argomento di abbonamento può includere caratteri jolly MQTT, + per un livello, # per più livelli.
Questo nodo richiede una connessione a un broker MQTT da configurare. Questo si configura facendo clic sull’icona della matita.

Diversi nodi MQTT (in o out) possono condividere la stessa connessione broker se necessario.

mqtt-in

Posizioniamo il nodo mqtt-in in Node Red. Questo nodo leggerà tutti i messaggi nei topic prescelti ed invierà come payload, il loro messaggio.

node red nodo mqtt-in

Come puoi notare, è veramente semplice, il server va configurato premendo la matita.

Il topic va scelto a tuo discrezione, può essere ad esempio “giardino” . Il cancelletto ascolterà tutti i topic, mentre per sfruttare tutte le wild card ti rimando ad un completo articolo su Hive . Potresti ad esempio leggere tutte i topic contenenti “temperatura” o tutti i sub-topic in “soggiorno”. I loro nomi e gerarchia sono a tua scelta in base al tuo progetto.

mqtt-in node

Cliccando la matita, imposteremo il server per quel nodo. Nell’ immagine sopra io ho usato Hive, come clientID avrei potuto usare “PcEnrico” ad esempio. Se preferisci mosquitto, nel campo nome, se è installato in locale usa “localhost” , in alternativa l’ip locale, pubblico, il ddns, o un dominio a cui risponderà il broker.

username

Nel tab security, potremmo associare i dati di login precedentemente creati nel broker, mentre in messages

username mqtt

i messaggi che invieremo per segnalare la corretta connessione.

Proseguire il flusso MQTT

Una volta in ascolto su un determinato topic, ad esempio la temperatura di una qualche stanza, potremmo proseguire il flusso dal nodo mqtt-in verso un azione a noi necessaria.

Per iniziare colleghiamo un nodo debug, per leggere il payload ricevuto tramite la finestra di debug.

Oltre al debug vogliamo vedere nella nostra dashboard web il valore ricevuto, grazie al nodo gauge visto in precedenza.

node gauge

Il nodo mqtt-in inoltrerà come msg.payload il valore letto dal broker, nel topic (ad esempio “soggiorno/temperatura“) verso il nodo gauge, che visualizzerà il payload che dovrà contenere solo il valore di temperatura, senza altri simboli in questo caso.

gauge

Possiamo notare, una volta premuto il tasto “deploy”

delpy node red

La scritta “connected“, che ci conferma la correttezza dei dati immessi per il broker.

Come extra, ho voluto aggiungere il nodo file col valore append, per registrarmi in modo molto casereccio, i dati su di un file. Attenzione però, se lo scrivi su di una micro sd, scrivere tanti dati spesso inutili, la rovineranno in fretta. La scelta ottimale dipende dalle tue necessità, magari un database influxdb su un pc o server remoto sarebbe la via più professionale.

Cosa succederà dopo il nodo mqtt-in, lo lascio scegliere a te.

Esempi

Alcuni esempi che mi vengono in mente al volo:

  • sensore di pioggia in giardino invia un payload con valore “True“, nel topic “giardino/pioggia“, segue un nodo rpi gpio out che attiva un relè per chiudere le tapparelle.
  • sensore di luminosità rileva che il led del vecchio scaldabagno è spento, inviando “False” nel topic “bagno/scaldabagno/led” , seguito da un nodo per inviarmi un messaggio telegram.
  • Raspberry Pi con webcam legge i valori del contatore del gas tramite Raspberry Pi  e Tesseract . Payload: 5620, Topic: “contatori/gas/consumo” segue un nodo per salvarlo su influxdb ed attivare una sequenza IFTTT.
  • sensore di fumo, payload: on , topic: cucina/fumo . Segue un allarme su ogni mio sistema di messaggistica.

Come sempre, con Raspberry Pi basta l’immaginazione e grazie a Node-Red non serve necessariamente saper scrivere programmi. (Anche se, per le cose “PRO“,  conoscere JavaScript per sfruttare il nodo “Function” ti permetterà di ampliare molto il potenziale di Node Red, per tutto il resto c’è la raccolta di flussi e nodi pronti all’uso .

Test finale

Apri il tuo client Mqtt prescelto, può essere anche il nodo mqtt-out ed invia un messaggio, al broker prescelto, nel topic desiderato. se funziona tutto, nella finestra di debug node red troverai il messaggio.

Continua con la rubrica Raspberry Pi, la domotica con Node-Red.

Cosa ne pensi di questo viaggio insieme con Node Red? Scrivicelo nei commenti e seguici sui social.

Compiti per casa

  • invia i dati dei sensori dello smartphone nella dashboard di Node-Red.
  • invia da un altro dispositivo IoT i dati di un sensore.
  • attiva una sequenza IFTTT una volta ricevuto un messaggio mqtt.
  • esegui comandi shell, leggendoli in un topic.
  • leggi il manuale di mosquitto man mosquitto.