Vista 3D della parte cubica del motore del nostro banco di prova

Obiettivo dell'installazione


Nell'ambito dell'implementazione di un sistema di sicurezza per il nostro banco di prova, abbiamo scelto di utilizzare un sensore LoRaWan (vedi sotto) per rilevare l'apertura del coperchio del nostro cubo di prova. A fianco, uno schema che illustra il comportamento atteso del sistema.

In sintesi, il nostro obiettivo è essere notificati ogni volta che il coperchio viene aperto e ricevere un avviso se il coperchio rimane aperto durante il funzionamento del motore. 

Questo avviso sarà generato da un segnale acustico, l'invio di un'e-mail e la visualizzazione di un indicatore su un cruscotto. Il sensore comunicherà tramite il protocollo LoRaWAN con il nostro gateway WISE-6610.
Schema del processo del sistema di sicurezza che stiamo implementando

Sensore utilizzato: Dragino DS03 (LoRaWan)

Il DS03A è un sensore LoRaWAN progettato per monitorare l'apertura e la chiusura delle porte. Trasmette informazioni chiave come lo stato della porta (aperta o chiusa), la durata di apertura, nonché il numero di aperture, e ciò, tramite il protocollo LoRaWAN. Vogliamo installarlo sul nostro banco di prova, per rilevare l'apertura del cubo motore.

Connessione del sensore con il gateway LoRaWan


La procedura di accoppiamento varia a seconda del gateway LoRaWAN utilizzato. In questo caso, utilizzeremo il gateway Advantech WISE-6610 V1. Questo passaggio di accoppiamento permetterà al gateway di stabilire una comunicazione con il sensore DS03, consentendogli così di ricevere, leggere e decodificare i messaggi trasmessi da quest'ultimo.
Gateway LoRaWan Advantech Wise-6610

Utilizziamo qui la versione 1 del gateway WISE-6610 (già installata sul nostro banco), che non è la più recente. Sebbene possano esistere differenze sottili, la procedura e i principi generali rimangono applicabili per la versione 2 (o Wise-6610-EB).

Configurazione generale del gateway

In questo caso, utilizziamo una gateway preconfigurata in larga misura. Non resta che aggiungere il nostro sensore all'elenco dei dispositivi.

Per procedere, è opportuno connettersi alla gateway tramite la sua rete locale per accedere al pannello di configurazione, aprendo semplicemente l'indirizzo IP della gateway in un browser. Le credenziali predefinite sono `root` / `root`.

Le credenziali predefinite della gateway Wise-6610 v2 sono `admin`/ `admin`.

Una volta connessi, nel menu `User Modules > LoRaWAN Gateway > Network Server > Settings`, è essenziale verificare che la rete LoRaWAN sia attivata.
La configurazione della rete LoRaWAN può quindi essere regolata tramite la pagina dedicata, accessibile connettendosi alla porta `1660` della gateway (si noti che questa porta è modificabile).

L'accesso al LNS della v2 avviene tramite il menu `LoRaWan > Advantech LoRaWan Service`.
Dashboard del LNS della Wise-6610 v1

Dashboard del LNS della Wise-6610 v1

Dashboard del LNS della Wise-6610 v1

Dashboard del LNS della Wise-6610 v1

Aggiunta del sensore

Il nostro sensore funziona in modalità di attivazione OTAA. Per aggiungerlo, basta aprire il menu `Devices > Commissioned`, quindi fare clic sul pulsante `Create`.

Nella v2, questo menu è accessibile tramite `Devices > Create Device > Type : OTAA`

In questa fase, diversi campi devono essere compilati con informazioni specifiche sul sensore. Questi dati, unici per ogni dispositivo, sono disponibili sull'etichetta del sensore : 
Etichetta del sensore LoRaWan DS03A utilizzata per il progetto
Una volta compilati i campi, basta cliccare sul pulsante `Submit` per aggiungere il dispositivo.

Dopo aver acceso il sensore (tenendo premuto il pulsante per 3 secondi), questo dovrebbe connettersi automaticamente al gateway. Il suo LED si accende prima di verde per alcuni istanti, poi passa al blu prima di spegnersi.

Per verificare la connessione, è sufficiente accedere al menu `Received Frames` (v1) o `Frames Traffic` (v2), dove i frame inviati dal DS03 dovrebbero apparire.

Interpretazione e invio dei dati del sensore


Il sensore DS03 trasmette i suoi dati sotto forma di stringhe esadecimali. Per memorizzarli in modo comprensibile sul nostro software IoTEdge, dobbiamo convertirli in un formato compatibile. IoTEdge accetta i dati nel formato JSON, inviati tramite MQTT.

Procederemo quindi alla conversione dei dati esadecimali in un oggetto JSON contenente informazioni chiare e leggibili. A tal fine, utilizzeremo lo strumento Node-RED, incluso nel nostro gateway.

Introduzione a Node-RED

Node-RED è un ambiente di programmazione visiva progettato per la raccolta, la trasformazione e il trasferimento di dati. Basato su un motore JavaScript, la sua interfaccia è composta da flussi e blocchi collegabili, che consentono di eseguire operazioni, inviare e trasformare dati, nonché di elaborare questi ultimi in modo flessibile.

Utilizzeremo frequentemente il blocco `funzione`, che consente di integrare codice JavaScript direttamente nel flusso Node-RED.

Il trasferimento di informazioni tra i blocchi avviene sotto forma di oggetti JavaScript.

Per accedere a  Node-RED sulla gateway, è sufficiente recarsi sulla porta 1880 (di default) della gateway accedendo all'URL seguente: `http://{IP della gateway}:1880/#`.
Screenshot dell'interfaccia Node-RED

Screenshot dell'interfaccia Node-RED

Se Node-RED non è già attivato, è necessario accedere alla pagina di configurazione del gateway (`http://{IP del gateway}`). Nel menu a sinistra, selezionare quindi `Customization > User Modules`.

Nella v2 `Application Tools > Node-RED > Settings`.

Troverete un link cliccabile intitolato `Node-RED`, che vi permetterà di configurare lo strumento. Dopo aver cliccato su questo link, selezionate la casella `Enable Automatic Start`, quindi cliccate su `Apply` per convalidare la configurazione.

Nella v2, selezionate `Node-RED control`.

Decodifica e invio dei dati tramite Node-RED

Il gateway riceve un frame LoRaWAN e svolge un primo trattamento, convertendolo in un oggetto JSON contenente il frame esadecimale, la qualità del segnale, il timestamp e l'identificativo del sensore. Questi dati vengono poi inviati a un broker MQTT interno, che li relaziona al nostro flow Node-RED. Questo processo si svolge interamente internamente all'interno del gateway.

Il flow Node-RED progettato è semplice e segue il piano qui accanto. L'idea è di decodificare il messaggio e poi formattarlo correttamente per inviarlo su IoTEdge.
Descrizione del flusso Node-RED per la conversione e la formattazione dei frame del sensore DS03A
Alcune precisazioni aggiuntive :

Input : Il topic utilizzato per l'input è un wildcard `uplink/#` che consente di ricevere i dati da tutti i sensori connessi al gateway. Se si desidera limitare il flusso a un solo sensore, è necessario sostituire `#` con l'identificativo DevAddr del sensore.

Conversione :  La conversione corrisponde alla fase di traduzione del frame esadecimale in dati utilizzabili, conformemente alla documentazione ufficiale del produttore. Sebbene uno script di decodifica fornito da Dragino sia accessibile online, questo richiede diversi aggiustamenti per funzionare correttamente (vedere la nota n°1) e presenta un'incompatibilità con il gateway 6610-V1 (la v2 richiede anch'essa degli aggiustamenti).
Utilizzeremo quindi uno script alternativo (vedere qui sotto), specificamente sviluppato per garantire la compatibilità con il gateway 6610-V1. È sufficiente copiare questo script nel secondo blocco funzione del proprio ambiente Node-RED.

Wrapping : Affinché IoTEdge possa accettare e interpretare correttamente i dati, questi devono essere strutturati secondo il seguente formato :

{
	"d":[
		{
			"tag":"Something:IoTEdge_Tag",
			"value":value
		},
		{
			"tag":"Something:IoTEdge_Other_Tag",
			"value":other_value
		}
	],
	"ts":"00000000000"
}

Script di decodifica del DS03A sulla Wise-6610

//Questo script attualmente non supporta la modalità Dual Channel.
bytes = []

c = 0 
while(c < msg["data"].length) {
    bytes.push(parseInt(msg["data"].substr(c, 2), 16));
    c+=2;
}

result = {}

if(msg.port == 2 || msg.port == 3) {
    //Stato di apertura/chiusura in tempo reale e storico
    //Per semplicità, traduci solo la prima voce degli eventi storici. 
    result["DOOR:COUNT_MODE"] = (bytes[0] & 0x08) ? "RES" : "FAC"; //RES : Da reset / FAC : Da fabbrica 
    result["DOOR:TDC"] = (bytes[0] & 0x04) ? 1 : 0;
    result["DOOR:ALARM"] = (bytes[0] & 0x02) ? 1 : 0;
    result["DOOR:DOOR_OPEN_STATUS"] = (bytes[0] & 0x01) ? 1 : 0;
    result["DOOR:DOOR_OPEN_TIMES"] = bytes[1] << 16 | bytes[2] << 8  | bytes[3];
    result["DOOR:LAST_DOOR_OPEN_DURATION"] = bytes[4] << 16 | bytes[5] << 8 | bytes[6];
}
if(msg.port == 4) {
    //Configurazione del sensore
    //Inviato solo dopo il messaggio di downlink dal server 
    result["DOOR:TDC"] = bytes[0] << 16 | bytes[1] << 8 | bytes[2];
    result["DOOR:DISALARM"] = (bytes[3] & 0x1) ? 1:0;
    result["DOOR:KEEP_STATUS1"] = (bytes[4] & 0x1) ? 1:0;
    result["DOOR:KEEP_TIME1"] = bytes[5] << 8 | bytes[6]
    result["DOOR:KEEP_STATUS2"] = (bytes[7] & 0x1) ? 1 : 0;
    result["DOOR:KEEP_TIME2"] = bytes[8] << 8 | bytes[9]
    result["DOOR:ALARM_INTERVAL"] = bytes[10]
}

if(msg.port == 5) {
    //Stato del dispositivo    
    result["DOOR:SENSOR_MODEL"] = (bytes[0] & 0x1B) ? "DS03A" : "Dispositivo sconosciuto";
    result["DOOR:FIRMWARE_VERSION"] = "${bytes[1]}";
    result["DOOR:FREQUENCY_BAND"] = "EU868";
    result["DOOR:SUB_BAND"] = 0x00;
    result["DOOR:BATTERY"] = byte[5] << 8 | byte[6];
}

output = {
    "d":[],
    "ts":"00000000000000000000000"
}

for(k in result) {
    output["d"].push({"tag":k, "value":result[k]})
}

output["raw"] = result

return output
Screenshot del flusso NodeRED impostato

Ora, il gateway trasferisce i dati del sensore verso IoTEdge, nel cloud.

Configurazione dello storage dei dati in IoTEdge


La trasmissione dei dati verso IoTEdge avviene tramite il protocollo MQTT. Affinché IoTEdge possa interpretarli correttamente, è necessario creare una rappresentazione del dispositivo all'interno della piattaforma. Questa entità permetterà di associare i dati ricevuti a un dispositivo identificato.

In IoTEdge, i dispositivi (devices) sono definiti come insiemi di variabili che rappresentano lo stato di un sensore. Ogni dispositivo si basa su un modello di dispositivo — l'equivalente di un tipo di sensore — e la sua configurazione specifica è chiamata dettagli del dispositivo, rappresentando un'istanza concreta di questo modello.

Ora procederemo a creare un nuovo modello di dispositivo. Per farlo, accedi all'interfaccia IoTEdge, quindi vai alla sezione Device Center > Device Model.
Schermata di gestione del modello di dispositivo in IoTEdge
Quindi fai clic su + Aggiungi per aprire la finestra di creazione di un nuovo modello. È quindi necessario definire le variabili esposte dal sensore, ovvero :

//I booleani in IoTEdge sono rappresentati da {0, 1}, per poter essere utilizzati nei dashboard
bool STATO_PORTA_APERTA;
bool ALLARME;
int DURATA_ULTIMA_APERTURA_PORTA; // in secondi
int CONTEGGIO_APERTURE_PORTA;

Il modello del dispositivo appare ora come segue una volta completata la sua creazione.
Riepilogo della creazione del modello di dispositivo DS03A in IoTEdge
Il passo successivo consiste nel creare un Device Detail a partire dal modello precedentemente definito. Per fare ciò, accedi a `Device Center > Device Detail`, poi clicca su + Aggiungi per aprire il modulo di creazione. Basta quindi fornire le informazioni richieste.
Schermata di creazione di un dettaglio dispositivo in IoTEdge

Nota : assicurati di selezionare l'opzione Genera Link durante la creazione. Questa opzione consente di generare identificatori MQTT unici per il tuo dispositivo. Li utilizzerai poi nel gateway LoRaWan per garantire la sicurezza degli scambi con IoTEdge
Una volta creato il Dettaglio Dispositivo, apparirà nell'elenco dei dispositivi. Clicca sul suo nome per accedere alle sue impostazioni dettagliate.

Nella sezione Configurazione Estensione Dispositivo, prendi nota delle seguenti informazioni, necessarie per la configurazione MQTT :
  • brokerUsername
  • brokerPassword

Approfitta anche di questo passaggio per definire il campo topic, inserendo il topic MQTT desiderato (ad esempio: data).
Schermata di configurazione delle impostazioni di connessione a IoTEdge per dettagli del dispositivo
Queste informazioni permetteranno di finalizzare la configurazione del flusso Node-RED del gateway.

Prima di ciò, è necessario associare lo script di conversione personalizzato ai Dettagli del Dispositivo. Questo script consente a IoTEdge di decrittografare il formato di dati JSON definito in precedenza nel nostro flusso Node-RED.

Inizia copiando l'ID del Dispositivo dell'apparecchiatura, quindi vai alla scheda Panoramica. Apri le impostazioni di una delle variabili, quindi nella sezione Configurazione Estensione Dispositivo, modifica il campo Tipo di Payload selezionando Script Personalizzato.
Schermata di modifica del tipo di payload in IoTEdge
Più in basso nella sezione Codec Messaggio (vedi illustrazione a fianco): 
  1. Fai clic sul pulsante Modifica Debug (1) per aprire l'editor di script.
  2. Sostituisci il contenuto esistente con il tuo script di conversione.
  3. Assicurati di modificare la riga 9 dello script sostituendo il valore predefinito di d_id con l'identificativo del tuo dispositivo (2).
Modifica dello script di decodifica dei dati di un dispositivo dettagliato

Infine, è sufficiente inserire le credenziali del broker MQTT recuperate in precedenza nel flusso NodeRED che avevamo preconfigurato nella gateway.

Installazione fisica del sensore


Durante i test in ambiente di prova, il sensore era attivato avvicinando direttamente i due magneti fino al contatto. Tuttavia, nell'ambito dell'installazione finale, questi magneti non saranno in contatto diretto. È quindi essenziale determinare la distanza alla quale il sensore passa da uno stato all'altro.

Misurazioni manuali hanno mostrato che il cambiamento di stato avviene a circa 3 centimetri di distanza tra i magneti. Questa distanza può variare leggermente a seconda della velocità di apertura.

Sebbene questo parametro non presenti vincoli nel nostro caso, è importante tenerne conto in contesti di installazione più sensibili.
Installazione fisica del sensore sul cubo motore
I due magneti del sensore possono essere posizionati all'interno del blocco di test. Tuttavia, è preferibile installare il sensore all'esterno. 

Per questo, è necessario staccare la parte magnetica dal contenitore principale, fissarla all'interno del cubo e poi far passare il cavo di collegamento attraverso un foro praticato nella parete.

Durante il rimontaggio del sensore, è essenziale riconnettere correttamente i fili del magnete. Per impostazione predefinita, il cavo rosso deve essere collegato al terminale 1 e il cavo nero al terminale 9.
Sensore di apertura/chiusura aperto

La parte 2 di questo articolo è in fase di scrittura.