Raspberry PI Sense HAT: Come pubblicare i dati su CloudAMQP via MQTT

In un mondo dove tutto è connesso e tutti comunicano sfruttando reti e protocolli, l’obiettivo di questo articolo è mostrare in particolare come raccogliere e pubblicare su CloudAMQP (RabbitMQ as a Service) le informazioni di telemetria provenienti da un blocco di sensori attraverso il protocollo MQTT (MQ Telemetry Transport or Message Queue Telemetry Transport).

AMQP (standard internazionale approvato da ISO e IEC come ISO/IEC 19464:2014) è un protocollo di messaggistica wire-level efficiente e affidabile che può essere utilizzato per creare applicazioni di messaggistica multipiattaforma e affidabili. Questo protocollo assolve a uno scopo semplice, ovvero definire i meccanismi per la trasmissione sicura, affidabile ed efficiente dei messaggi tra due parti. I messaggi sono codificati usando una rappresentazione dati portatile che consente a mittenti e destinatari eterogenei di scambiarsi messaggi strutturati con assoluta fedeltà.

Il vantaggio principe che deriva dall’utilizzo di RabbitMQ e di conseguenza CloudAMQP, consiste nell’unificazione dei messaggi AMQP e MQTT. Grazie a questo aspetto siamo nelle condizioni di poter elaborare messaggi che provengono da dispositivi Internet of Things (IoT).

Figura 1 - Macro architettura del prototipo della soluzione IoT con Raspberry Pi, CloudAMQP, Logstash, Liferay e Elasticsearch

Figura 1 – Macro architettura del prototipo della soluzione IoT con Raspberry Pi, CloudAMQP, Logstash, Liferay e Elasticsearch

Uno degli aspetti chiave di questo prototipo è l’utilizzo del protocollo MQTT, uno dei protocolli di fatto nella connettività machine-to-machine (M2M), che diventa popolare con l’evoluzione e la divulgazione dei concetti IoT. Il protocollo MQTT può essere pensato come un analogo leggero e semplificato di AMQP, anch’esso basato sul modello publish/subscribe, ma fornisce un footprint di rete molto più piccolo e può essere utilizzato da dispositivi di piccole dimensioni e con limitate capacità di calcolo.

La Figura 1 mostra la macro architettura completa del prototipo della soluzione IoT suddivisa in tre principali layer:

  • Device: questo è il layer dove troviamo i “pezzi di ferro” che fanno parte della soluzione IoT. Il layer è costituito dal Raspberry Pi, dal blocco Sensori e dal blocco attuatori;
  • Integration: questo è il layer d’integrazione tra i due mondi: Device e Application layer. In questo layer trova posto il componente CloudAMQP;
  • Application: questo è il layer dove i componenti presenti assumono il ruolo di consumatori e produttori di messaggi AMQP. In questa soluzione sul layer applicativo ho deciso d’inserire anche Liferay

In questo primo articolo dedicato all’argomento Internet of Things (IoT), vorrei mostrarvi come programmare il Sense HAT con lo scopo di pubblicare i dati acquisiti dai sensori su CloudAMQP

Per i neofiti di RabbitMQ e CloudAMQP consiglio la lettura dell’articolo RabbitMQ Exchanges, routing keys and bindings di Lovisa Johansson (@lillajja) che descrive in modo chiaro e completo i componenti chiave di cui faremo ampio uso nel corso di quest’articolo.  Per maggiori approfondimenti potreste leggere l’eBook The Optimal RabbitMQ Guide.

1. Cos’è il Sense HAT

Il Sense HAT è una scheda multi-funzione dotata di sensori integrati che forniscono informazioni sull’orientamento e la posizione della scheda tramite un giroscopio, un accelerometro e un magnetometro, oltre alla pressione dell’aria, la temperatura e i livelli di umidità. La comunicazione con il Raspberry Pi avviene tramite un bus i2C (abbreviazione di Inter Integrated Circuit).

Una matrice 8×8 di LED fornisce un output e l’interazione è possibile grazie all’uso del joystick a cinque vie del Sense HAT. La Figura 2 mostra la mia scheda Sense HAT.

Figura 2 - Raspberry Pi Sense HAT

Figura 2 – Raspberry Pi Sense HAT

Questa scheda è stata progettata per l’uso con il programma Astro Pi che attualmente sta orbitando attorno alla Terra come parte di un progetto spaziale messo in orbita dalla Stazione Spaziale Internazionale.

 

Il Sense HAT è compatibile con il Raspberry Pi Model A+ e Model B+, il Raspberry Pi 2 e il Raspberry Pi 3. È compatibile anche con il modello Pi Zero. Non è compatibile con il modelli Model A o Model B, né con il Compute Module. Non sono certo della compatibilità con modello Pi 4.

 

Grazie alle interfacce GPIO/I2C, SPI e USB, il Raspberry Pi può essere esteso in modo flessibile con i dispositivi collegati, inclusi, quelli in grado di raccogliere diverse informazioni di misurazione e telemetria.

2. Di cosa abbiamo bisogno

A livello hardware occorre:

  • disporre di uno dei modelli di Raspberry Pi che supporti il Sense HAT;
  • disporre della scheda Sense HAT.

A livello software occorre:

  • disporre dell’ultima versione del sistema operativo Raspbian che include:

Se per qualsiasi motivo è necessario installare manualmente il software di Sense HAT, consiglio di seguire le istruzioni riportate sulla pagina ufficiale sense-hat. La Figura 3 a seguire mostra la scheda Sense HAT montata sul Raspberry Pi 3 Model B+.

 

Figura 3 - Scheda Sense HAT montata sul Raspberry Pi 3 Model B+

Figura 3 – Scheda Sense HAT montata sul Raspberry Pi 3 Model B+

 

Affinché sia possibile inviare i dati dei sensori su CloudAMQP è necessario che il Raspberry Pi sia correttamente configurato per accedere alla rete internet. La connessione alla rete può avvenire via ethernet o wifi. Consiglio di seguire la documentazione Wireless connectivity per maggiori informazioni su come configurare la scheda WiFi per la connettività verso la rete internet.

3. Overview e configurazione di CloudAMQP

Il layer d’integrazione dell’architettura è dove s’incontrano due mondi: Device e Application layer (vedi Figura 1). In questo strato è collocato CloudAMQP, il broker di messaggi AMQP diventato popolare in ambienti IT eterogenei ed efficacemente utilizzato nel campo dell’integrazione di applicazioni attraverso lo scambio di messaggi tra componenti dell’infrastruttura IT, dove gli aspetti chiave sono alte prestazioni, throughput elevato, scalabilità, alta disponibilità e diversità tecnologica per i produttori e consumatori di messaggi.

CloudAMQP è il componente d’integrazione core dell’intero prototipo, fornendo servizi di broker MQTT per il Raspberry Pi e servizi di broker AMQP per Logstash (Integration Layer) e Liferay (Application Layer).

Le azioni che occorre eseguire su CloudAMQP al fine della configurazione sono:

La Figura 4 mostra la console di CloudAMPQ con evidenza del pulsante di creazione nuova istanza e l’istanza RaspberryPi appena creata, quest’ultima può essere amministrata attraverso RabbitMQ Manager.

 

Figura 4 - Creazione Nuova Istanza CloudAMQP

Figura 4 – Creazione Nuova Istanza CloudAMQP

 

La Figura 5 illustra invece il dettaglio della nuova istanza RaspberryPi con evidenza il dettaglio della configurazione MQTT. Mettiamo da parte i valori hostnameusername, password porta che serviranno al momento della scrittura del codice di pubblicazione dei dati dei sensori su CloudAMQP via MQTT.

 

Figura 5 - Dettagli di configurazione della nuova istanza Raspberry Pi

Figura 5 – Dettagli di configurazione della nuova istanza Raspberry Pi

 

Su CloudAMQP il supporto MQTT è attivo per impostazione predefinita (vedi configurazione su Figura 5), anche se con alcuni limiti per il piano free , al contrario, su di una installazione locale di RabbitMQ, il supporto al protocollo MQTT deve essere installato (vedi RabbitMQ MQTT Adapter).

L’ultimo step di configurazione da fare via RabbitMQ Manager è la creazione della nuova queue RPi.Telemetry e la successiva configurazione del binding tra l’exchange (di tipo topic) amq.topic e la nuova queue appena creata. La Figura 6 mostra la form di creazione della nuova queue.

 

Figura 6 - Creazione nuova queue RPi.Telemetry

Figura 6 – Creazione nuova queue RPi.Telemetry

 

Una volta creata la nuova queue RPi.Telemetry, questa sarà visibile nella lista delle queues mostrando una serie di dati, quali, lo stato della queue, lo stato dei messaggi e il message rates (vedi Figura 7).

 

Figura 7 - Pagina di dettaglio delle queue

Figura 7 – Pagina di dettaglio delle queue

 

La Figura 8 mostra la creazione del binding tra l’exchange di tipo topic amq.topic e la queue RPi.Telemetry. La Figura 9 mostra invece il dettaglio di amq.topic con evidenza del binding appena creato.

 

Figura 8 - Creazione binding tra il topic amq.topic e la queue RPi.Telemetry

Figura 8 – Creazione binding tra il topic amq.topic e la queue RPi.Telemetry

 

In fase di creazione del binding occorre specificare due parametri: la queue (o la coda) e la Routing Key, che in questo caso vale RPi.Data. La Routing Key è un attributo del messaggio. Questa chiave è utilizzata per instradare correttamente il messaggio alle code a seconda del tipo di exchange.

 

Figura 9 - Dettaglio dell'exchange amq.topic

Figura 9 – Dettaglio dell’exchange amq.topic

 

Brevemente vediamo il flusso standard dei messaggi RabbitMQ, descritto a seguire e mostrato in forma di diagramma in Figura 10.

  1. Il producer pubblica un messaggio verso l’exchange;
  2. L’exchange riceve il messaggio ed è ora responsabile del routing del messaggio;
  3. È necessario impostare un’associazione o binding tra la coda e l’exchange. L’exchange indirizza il messaggio verso le code;
  4. I messaggi rimangono in coda fino a quando non vengono gestiti da un consumer;
  5. Il consumer gestisce il messaggio.

 

 

Figura 10 - Flusso standard dei messaggi in RabbitMQ

Figura 10 – Flusso standard dei messaggi in RabbitMQ

 

Con riferimento alla soluzione descritta in Figura 1, il producer è il Raspberry Pi, mentre i consumer sono Logstash e Liferay.

Adesso che l’attività di configurazione su CloudAMQP è ultimata, possiamo procedere con la programmazione del Sense HAT al fine di raggiungere il nostro scopo finale: inviare i dati dei sensori su CloudAMQP via MQTT.

4. Programmazione del Sense HAT

Il modo più veloce per iniziare a programmare il Sense HAT consiste nell’usare Python come linguaggio di programmazione. Se avete installato sul vostro Raspberry Pi l’ultima versione di Raspbian, dovreste avere tutto ciò che serve per iniziare a scrivere codice. La cosa più semplice da implementare è la scritta scorrevole che sfrutta appunto la matrice di LED.

Il codice necessario per leggere i dati dei sensori integrati del Sense HAT è molto semplice e mostrato a seguire.

Questo codice Python esegue un loop infinito, aggiornando costantemente le letture, mostrandole sulla matrice di LED. A questo punto non resta altro che scrivere il codice Python per inviare i dati dei sensori verso CloudAMQP.

Se avete fatto attenzione alle prime righe di codice, dovreste esservi accorti che le righe 4-7 importano di default le librerie native della scheda Sense HAT, in caso d’errore, sarà invece importata la libreria Sense HAT Emulator.

Utilizzare il Sense HAT Emulator è molto utile quanto non abbiamo a disposizione la scheda Sense HAT oppure mentre stiamo sviluppando il codice per programmare la scheda sul nostro PC.

L’installazione del Sense HAT Emulator fornisce un’applicazione GTK (GIMP Toolkit) interattiva per consentire la manipolazione dei sensori emulati, insieme alle utility disponibili da riga di comando per la registrazione e la riproduzione delle letture dei sensori da un Sense HAT reale.

Il codice mostrato in questo articolo, quando eseguito per esempio su un PC (e nel mio caso su macOS) e il Sense HAT Emulator è installato, sarà aperto l’emulatore. La Figura 11 mostra il Sense HAT Emulator in esecuzione sul mio ambiente di sviluppo.

 

Figura 11 - Esecuzione degli script Python su Sense HAT Emulator

Figura 11 – Esecuzione degli script Python su Sense HAT Emulator

 

4.1 Invio dei dati verso CloudAMQP

Abbiamo visto come leggere in Python i dati dei sensori integrati del Sense HAT, adesso il secondo step da realizzare è quello che consenta la pubblicazione dei dati sul topic definito su CloudAMQP e che abbiamo configurato in precedenza (3. Overview e configurazione di CloudAMQP).

Il protocollo di riferimento per lo scambio di dati tra il Raspberry Pi e CloudAMQP è l’MQTT. L’unico requisito da soddisfare prima di passare alla scrittura del codice è l’installazione del modulo Paho Python Client che fornisce una classe client con supporto per MQTT v3.1 e v3.1.1 su Python 2.7 o 3.x.

Per l’installazione di Paho occorre eseguire da shell il comando a seguire.

A questo punto siamo pronti per affrontare il codice Python necessario per inviare via protocollo MQTT i dati dei sensori del Sense HAT.

 

Cerchiamo di analizzare macroscopicamente il codice mostrato sopra:

  1. Importa il modulo Sense HAT (anche nella versione emulatore);
  2. Importa il modulo Paho Python Client;
  3. Imposta la frequenza (in secondi) d’invio dei dati. In questo caso 5s;
  4. Inizializza il Sense HAT, impostando inizialmente la rotazione di 180° e il colore rosso per la matrice LCD;
  5. Definisce e implementa le funzioni per il recupero dei dati di: temperatura, pressione e umidità;
  6. Definisce e implementa le funzioni di callback per gestire gli eventi: pubblicazione, connessione e disconnessione;
  7. Crea il client MQTT impostando il deviceId, userName e password;
  8. Registra le funzioni di callback;
  9. Instaura la connessione verso il broker MQTT
  10. Utilizza il modulo signal per gestire correttamente la disconnessione dal broker MQTT nel caso il programma riceva i due segnali SIGTERM e SIGINT ;
  11. All’interno di ciclo while true colleziona i dati dei sensori del Sense HAT e li pubblica in formato JSON via MQTT su CloudAMQP. Sul metodo publish è stata specificato il topic RPi.Data, questo corrisponde al valore della routing key.

Dall’esecuzione dello script Python (Source Code 3) che legge e invia i dati dei sensori su CloudAMQP, non dovremmo aspettarci sorprese se fin dall’inizio abbiamo seguito tutti i passi in modo corretto.

 

Tutti i dispositivi elettronici generano calore e il Raspberry Pi e il Sense HAT non fanno eccezione. È possibile quindi notare che i valori letti per esempio dal sensore di temperatura del Sense HAT sono più alti, rispetto ad altri sensori posti in altri punti della stanza, questi valori possono salire ancora se la matrice LED è in uso.

5. Avvio della pubblicazione dei dati di telemetria

Per dare il via alla pubblicazione dei dati basta eseguire il codice sviluppato nel precedente capitolo. Il comando da lanciare via shell è mostrato subito sotto.

Vi ricordo che possiamo eseguire il codice (mostrato in Source Code 3) anche sul nostro ambiente di sviluppo locale, in questo caso sarà utilizzato il Sense HAT Emulator.

All’avvio del programma di pubblicazione dovremmo vedere in console l’instaurazione della connessione al broker MQTT e la successiva pubblicazione dei dati. Per ogni dato pubblicato, sulla matrice di LED è mostrato il messaggio: “Data published”.

In Figura 12 è mostrato il messaggio MQTT di connessione mentre in Figura 13 è mostrato il messaggio MQTT di pubblicazione del payload JSON che contiene i dati dei sensori del Sense HAT.

 

Figura 12 - Messaggio MQTT di connessione verso il broker MQTT di CloudAMQP

Figura 12 – Messaggio MQTT di connessione verso il broker MQTT di CloudAMQP

La Figura 12 evidenzia il messaggio MQTT da cui è possibile vedere i parametri di connessione che sono stati impostati sullo script Python (vedi Source Code 3). La Figura 13 evidenzia invece il messaggio MQTT da cui è possibile vedere il topic e il paylod.

 

Figura 13 - Pubblicazione del messaggio MQTT per il topic RPi.Data

Figura 13 – Pubblicazione del messaggio MQTT per il topic RPi.Data

A questo punto non resta altro che verificare che i dati pubblicati via MQTT su CloudAMQP siano stati effettivamente consegnati. Per fare questo controllo dobbiamo accedere alla console RabbitMQ Manager. Nelle figure a seguire sono mostrate l’effettiva connessione del Raspberry Pi e la stato della coda dei messaggi.

 

Figura 14 - Connessione client MQTT Raspberry Pi

Figura 14 – Connessione client MQTT Raspberry Pi

 

Figura 15 - Dettaglio della queue RPi.Telemetry

Figura 15 – Dettaglio della queue RPi.Telemetry

 

Figura 16 - Lettura di un messaggio dalla queue inviato dal Raspberry Pi via MQTT

Figura 16 – Lettura di un messaggio dalla queue inviato dal Raspberry Pi via MQTT

 

6. Qualche info sullo standard HAT

La Raspberry Pi Foundation ha creato lo standard HAT, che significa Hardware Attached on Top, per rendere più semplice agli sviluppatori la produzione di hardware garantito per il funzionamento con le board Raspberry Pi.

Lo standard riguarda sia il design fisico, sia il design elettrico della scheda. Per aderire allo standard HAT, la scheda deve poter essere collegata alla porta GPIO a 40 pin e includere i fori di montaggio che si possono allineare con quelli del Raspberry Pi Model B+ e più recenti.

La parte elettrica dello standard HAT richiede che sulla scheda sia installato un modulo EEPROM. Questa piccola porzione di memoria contiene informazioni sul modo in cui la scheda funziona, come devono essere usati i pin GPIO del Pi e un device tree per la configurazione della scheda tramite il sistema operativo.

Per maggiori informazioni sullo standard HAT consultare il progetto HAT su GitHub.

7. Il prossimo articolo

Discutere tutto d’un fiato l’intera soluzione presentata sarebbe stato un pochino pensate, ho così deciso di spezzettare in più articoli la trattazione della soluzione. Sul prossimo articolo vedremo come utilizzare gli attuatori e in particolare il modulo dei relè.

8 Condivisioni

Antonio Musarra

I began my journey into the world of computing from an Olivetti M24 PC (http://it.wikipedia.org/wiki/Olivetti_M24) bought by my father for his work. Day after day, quickly taking control until … Now doing business consulting for projects in the enterprise application development using web-oriented technologies such as J2EE, Web Services, ESB, TIBCO, PHP.

Potrebbero interessarti anche...