Il protocollo MQTT

Una volta configurato, il Master effettuerà:

  • la connessione al Broker MQTT
  • la sottoscrizione ai Topic necessari al suo funzionamento
  • l’invio di un pacchetto di dati in base:
    • alle priorità dei suoi moduli di espansione
    • alle priorità dei moduli di espansione degli Slave eventualmente a lui abbinati
    • alla ricezione di un messaggio broadcast da un Tag

Topic generici del Master

Prima di vedere i Topic dei singoli moduli vediamo i Topic generici.

Quando un Master si connette al broker anche se non ha moduli di espansione o Slave abbinati invia due messaggi nei seguenti Topic ed effettua una sottoscrizione:

TOPIC

MESSAGGIO

DESCRIZIONE

TIPO

App_Id/Id_Master/CONFIG_REQ messaggio di CONFIG_REQ vedi sotto PUBLISH
App_Id/Id_Master/FW_VER versione del firmware es: 0.10 PUBLISH
App_id/TIME_STAMP orario <unix time>.<millisecondi> SUBSCRIBE

Dove App_Id è il nome dell’ecosistema precedentemente attribuito e Id_Master è il MAC address del Master.

Il messaggio di Config_Req

Il messaggio di CONFIG_REQ è un messaggio inviato dal Master che descrive la sua configurazione hardware e quella degli Slave ad esso abbinati.

Lo schema del messaggio descrive:

  • MAC address Master;
  • gli 8 slot per i moduli di espansione;
  • Mac address degli 8 Slave;
  • i due slot espansione di ogni Slave.

Ovvero:

IdMaster_slot1_slot2_slot3_slot4_slot5_slot6_slot7_slot8_IdSlave1_slot1_slot2_IdSlave2_slot1_slot2_IdSlave3_slot1_slot2_IdSlave4_slot1_slot2_IdSlave5_slot1_slot2_IdSlave6_slot1_slot2_IdSlave7_slot1_slot2_IdSlave8_slot1_slot2”

Un esempio di messaggio di CONFIG_REQ dove un Master ha un modulo di espansione aggiunto, è abbinato ad un solo Slave che possiede un modulo espansione:

00124B00117AB407_1_0_0_0_0_0_0_0_01184B00456AN407_1_0_0000000000000000_0_0_0000000000000000_0_0_0000000000000000_0_0_0000000000000000_0_0_0000000000000000_0_0_0000000000000000_0_0_0000000000000000_0_0”

I numeri che vanno a riempire il campo slot corrispondono al tipo di modulo di espansione e sono:

  • 1 = Modulo Environment
  • 2 = Modulo Energy Meter
  • 3 = Modulo Expansion
  • 4 = Modulo Dali

Il Time Stamp

Il Master ha bisogno di un orario per determinare il proprio funzionamento. Una volta connesso alla rete Wi-Fi tenterà di raggiungere un servizio NTP online per ottenere l’ora esatta. Qualora la rete Wi-Fi non dovesse disporre di uscite verso Internet il Master automaticamente imposta un orario di partenza randomico. Per avere un corretto funzionamento del sistema ed allinearlo all’orario corretto è possibile iniettare l’orario sul Topic AppId_/TIME_STAMPTutti i Master alla connessione con il broker si sottoscrivono a questo Topic e alla ricezione dell’orario impostano il clock interno sul valore ricevuto. Tramite una qualsiasi applicazione è possibile manualmente o automaticamente inviare l’orario corretto ai Master. Il formato del messaggio e quindi dell’orario da inviare è UNIX time dal 1 Gen. 1970 0:00 UTC e i millisecondi.

Esempio:   1516878000000.000 

Data che corrisponde alle 12:00:00.000 del 25 Gennaio 2018.

Topic dei singoli moduli

Se un Master o uno Slave sono dotati di uno o più moduli di espansione sottoscriveranno e pubblicheranno nei corrispondenti Topic come da schema successivo:

App_ID / ID_Dispositivo/ Modulo/ Dettaglio

Dove:

  • App_Id: corrisponde al nome dato all’ecosistema quando è stato creato.
  • Id_Dispositivo: corrisponde al MAC address del modulo Radio.
  • Modulo: corrisponde al tipo di modulo a cui il dato è riferito.
  • Dettaglio: è la tipologia di dato.

 

Modulo Environment

TOPIC

MESSAGGIO

DESCRIZIONE

TIPO

APP_ID/ID_DEVICE/SENSOR_1/LED B, G, BG, OFF Gestisce il Led del modulo, B = blue, G = Green, BG = white, OFF = spento SUBSCRIBE
APP_ID/ID_DEVICE/SENSOR_1/TEMP XX.X Temperatura in °C PUBLISH
APP_ID/ID_DEVICE/SENSOR_1/HUMIDITY XX Umidità in % PUBLISH
APP_ID/ID_DEVICE/SENSOR_1/LUX XX Luminosità in LUX PUBLISH
APP_ID/ID_DEVICE/SENSOR_1/GFORCE XX.X, YY.Y, ZZ.Z X,Y,Z in G PUBLISH
APP_ID/ID_DEVICE/SENSOR_1/GYROSCOPE XXX, YYY, ZZZ X,Y,Z in °/S PUBLISH
APP_ID/ID_DEVICE/SENSOR_1/GALARM X.XX +/-G SUBSCRIBE
APP_ID/ID_DEVICE/SENSOR_1/STATUS OK, FAULT Segnala corretto funzionamento o malfunzionamento PUBLISH
APP_ID/ID_DEVICE/SENSOR_1/PRIORITY 0….255 Imposta la priorità del modulo SUBSCRIBE

 

Modulo Energy Meter

TOPIC

MESSAGGIO

DESCRIZIONE

TIPO

APP_ID/ID_DEVICE/METERING_1/LED B, G, BG, OFF Gestisce il Led del modulo, B=blue, G=Green, BG=white, OFF=spento SUBSCRIBE
APP_ID/ID_DEVICE/METERING_1/CURRENT XX.X Ampere PUBLISH
APP_ID/ID_DEVICE/METERING_1/AC_DC_SEL AC, DC Seleziona il tipo di corrente tra AC e DC SUBSCRIBE
APP_ID/ID_DEVICE/METERING_1/RELE ON, OFF Accende e spegne il Relè SUBSCRIBE
APP_ID/ID_DEVICE/METERING_1/STATUS OK, FAULT Segnala corretto funzionamento o malfunzionamento PUBLISH
APP_ID/ID_DEVICE/METERING_1/PRIORITY 0….255 Imposta la priorità del modulo SUBSCRIBE

 

Modulo Expansion

Per quanto riguarda il modulo Expansion bisogna fare alcune precisazioni iniziali.

Il modulo ha due ingressi digitali che vengono letti dal microcontrollore. Lo stato High o Low del pin è possibile leggerlo al Topic APP_ID/ID_DEVICE/FLOW_1/INPer alcune applicazioni potrebbe essere interessante contare quante volte un pin alterna lo stato di High e quello di Low ad esempio per leggere flussometri, contatori, anemometri etc. In questo caso bisognerà pubblicare nel Topic APP_ID/ID_DEVICE/FLOW_1/MOD una delle tre ipotesi:

  • UP
  • 2UP
  • INCREM

Tramite la modalità UP il modulo conterà gli impulsi che provengano dal pin A o dal pin B sommandoli. Tramite la modalità 2UP il modulo conterà gli impulsi in due registri separati, uno per il pin A e uno per il pin B. Nella modalità INCREM invece le pulsazioni del pin A andranno ad aumentare positivamente il contatore e gli impulsi del pin B andranno a diminuirlo. In tal modo sarà possibile gestire strumenti in quadratura. È possibile leggere il contatore all’interno del Topic TOTAL e PARTIALTramite il Topic RESET è possibile riportarli a zero.

Qualora si volesse leggere un flussometro è possibile dare i comandi:

  • APP_ID/ID_DEVICE/FLOW_1/SetMaxRPM tramite il quale si impostano il numero massimo di giri dello strumento collegato al modulo (andare oltre i giri indicati farà inviare un messaggio di OVERFLOW nel Topic STATUS)
  • APP_ID/ID_DEVICE/FLOW_1/SetPulsRev tramite il quale si impostano gli impulsi per ogni giro dello strumento.

Sarà possibile leggere la velocità rilevata (rpm) in base a questi parametri nel Topic SPEED.

TOPIC

MESSAGGIO

DESCRIZIONE

TIPO

APP_ID/ID_DEVICE/FLOW_1/LED B, G, BG, OFF Gestisce il Led del modulo, B=blue, G=Green, BG=white, OFF=spento SUBSCRIBE
APP_ID/ID_DEVICE/FLOW_1/IN 00, 01, 10, 11 Stato degli ingressi A e B PUBLISH
APP_ID/ID_DEVICE/FLOW_1/RESET RESET Resetta i contatori SUBSCRIBE
APP_ID/ID_DEVICE/FLOW_1/MOD UP, 2UP, INCREM Seleziona il tipo di encoder SUBSCRIBE
APP_ID/ID_DEVICE/FLOW_1/SetMaxRPM 0….65535 Set limite rpm per fault SUBSCRIBE
APP_ID/ID_DEVICE/FLOW_1/SetPulsRev 0….65535 Set impulsi/giro SUBSCRIBE
APP_ID/ID_DEVICE/FLOW_1/TOTAL XXXXXXXX Contatore totale PUBLISH
APP_ID/ID_DEVICE/FLOW_1/PARTIAL XXXXXXXX Contatore parziale PUBLISH
APP_ID/ID_DEVICE/FLOW_1/SPEED XXXXX RPM PUBLISH
APP_ID/ID_DEVICE/FLOW_1/STATUS OK, FAULT, OVERFLOW Segnala corretto funzionamento o malfunzionamento o superamento limite giri PUBLISH
APP_ID/ID_DEVICE/FLOW_1/PRIORITY 0….255 Imposta la priorità del modulo SUBSCRIBE

 

Modulo DALI

TOPIC

MESSAGGIO

DESCRIZIONE

TIPO

APP_ID/ID_DEVICE/DALI_1/LED B, G, BG, OFF Gestisce il Led del modulo, B=blue, G=Green, BG=white, OFF=spento SUBSCRIBE
APP_ID/ID_DEVICE/DALI_1/CURRENT XX.X, ND Ampere (ND se non disposnibile) PUBLISH
APP_ID/ID_DEVICE/DALI_1/AC_DC_SEL M, S Seleziona Master o Slave Dali SUBSCRIBE
APP_ID/ID_DEVICE/DALI_1/RELE ON, OFF, XXX% Accende, spegne o dimmera il Dali SUBSCRIBE
APP_ID/ID_DEVICE/DALI_1/STATUS OK, FAULT Segnala corretto funzionamento o malfunzionamento PUBLISH
APP_ID/ID_DEVICE/DALI_1/PRIORITY 0….255 Imposta la priorità del modulo SUBSCRIBE

 

Topic di periferiche Slave

Alla ricezione di un messaggio di uno Slave, il Master inoltra al Broker un messaggio su un Topic dedicato in cui espone il MAC Address dello Slave, il valore degli RSSI rilevati, il Time Stamp e lo stato dell’alimentazione.

TOPIC

MESSAGGIO

DESCRIZIONE

TIPO

APP_ID/ID_MASTER/RSSI Id_Slave,TIME_STAMP,RSSI,BATT Mac Address Slave, time stamp in UNIX time, RSSI in dbm, alimentazione “plugged” se alimentato via micro-usb o il livello di carica della batteria in V PUBLISH

 

Topic di periferiche Tag

Alla ricezione di un messaggio di un Tag, il Master inoltra al Broker il messaggio su un Topic dedicato.

Il Tag può essere dotato o meno di modulo Environment e in base a questo cambierà il tipo di Topic ovvero:

  • App_ID/Master_Id/TAG1_RSSI è il Topic dedicato al Tag senza moduli di espansione.
  • App_ID/Master_Id/TAG2_RSSI è il Topic dedicato al Tag con modulo Environment.
  • App_ID/Master_Id/TAG2_DATA è il Topic dedicato ai valori dei sensori del Tag con modulo Environment.

TOPIC

MESSAGGIO

DESCRIZIONE

TIPO

APP_ID/ID_MASTER/TAG1_RSSI Id_Tag,TIME_STAMP,RSSI,BATT Mac address Tag, time stamp in UNIX time, RSSI in dbm, alimentazione “plugged” se alimentato via micro-usb o il livello di carica della batteria in V PUBLISH
APP_ID/ID_MASTER/TAG2_RSSI Id_Tag,TIME_STAMP,RSSI,BATT Mac address Tag, time stamp in UNIX time, RSSI in dbm, alimentazione “plugged” se alimentato via micro-usb o il livello di carica della batteria in V PUBLISH
APP_ID/ID_MASTER/TAG2_DATA Id_Tag,Gx,Gy,Gz,T°,Lux,Hum,Status Mac address Tag, accelerometro sugli assi XYZ, Temperatura, Luminosità, Umidità, Status PUBLISH

NB: nello status del Topic TAG2_DATA viene indicato con “OK” il messaggio di vitalità mentre con FAULT il superamento della soglia impostata di alert per l’accelerometro (vedi sezione “Tempi di lettura e scrittura”).

Nello specifico, il FAULT è sempre seguito da un codice che identifica il tipo di soglia superato. Seguire le indicazioni seguenti per la sua interpretazione. Il messaggio di FAULT è così rappresentato: FAULT_HHLL, dove HHLL rappresentano i bit il cui significato è il seguente:

BYTE BASSO (LL)

Bit Significato peso

0

BIT_FAULT_1_NO_TEMPERATURE_IC 0x01

1

BIT_FAULT_1_TEMPERATURE_OVERRANGE 0x02

2

BIT_FAULT_1_NO_UMIDITY_IC 0x04

3

BIT_FAULT_1_UMIDITY_OVERRANGE 0x08

4

BIT_FAULT_1_NO_LUMINOSITY_IC 0x10

5

BIT_FAULT_1_NO_ACCELEROMETER_IC 0x20

6

BIT_ FREE_FALL_DETECTED 0x40

7

BIT_THRESHOLD _MAX_G_AXIS_X 0x80

BYTE ALTO (HH)

Bit Significato peso

0

BIT_ THRESHOLD _MAX_G_AXIS_Y 0x01

1

BIT_ THRESHOLD _MAX_G_AXIS_Z  0x02

2

BIT_FAULT_2_NO_GYROSCOPE_IC  0x04

Nello specifico, per interpretare i FAULT di alert di movimento esponiamo alcuni esempi di messaggio:

Messaggio Significato
FAULT_0100 Superamento soglia asse Y messaggio triggerato da accelerometro
FAULT_0200 Superamento soglia asse Z messaggio triggerato da accelerometro
FAULT_0300  Superamento soglia asse Y e Z messaggio triggerato da accelerometro
FAULT_0080 Superamento soglia asse X messaggio triggerato da accelerometro
FAULT_0180 Superamento soglia asse Y e X messaggio triggerato da accelerometro
FAULT_0280 Superamento soglia asse Z e X messaggio triggerato da accelerometro
FAULT_0380 Superamento soglia asse Y e Z e X messaggio triggerato da accelerometro

Topic di periferiche Bridge

Under development.