Il gateway industriale LoRaWAN Milesight UG56 è un dispositivo robusto progettato per applicazioni indoor, dotato di 8 canali per la raccolta e la gestione dei dati provenienti da sensori LoRaWAN. Grazie alla connettività flessibile tramite rete Ethernet, Wi-Fi e/o cellulare, consente una trasmissione affidabile dei dati verso piattaforme cloud o sistemi locali.
L’adozione del chip Semtech SX1302, insieme a una CPU quad-core ad alte prestazioni, permette al gateway di gestire in modo efficiente un elevato numero di dispositivi, supportando la connessione simultanea di oltre 2000 nodi.
Il dispositivo garantisce una portata fino a 15 km in campo aperto e circa 2 km in ambienti urbanizzati, assicurando una copertura stabile e affidabile. Queste caratteristiche lo rendono particolarmente adatto per applicazioni in ambito smart building, industria e in generale per tutte le soluzioni IoT che richiedono comunicazioni scalabili e a lungo raggio in ambienti interni.

Approfondimenti
- In questo articolo informazioni su comunicazione Modbus su rete LoRaWAN.
- In questo topic consigli sulla gestione della riconnessione alla rete LTE da script Node-RED.
Configurazione dispositivo
Per l’alimentazione utilizzare un alimentatore a 5Vdc con uscita USB Type-C. Connettersi in ethernet configurando la scheda con 192.168.23.200 ed accedendo alla pagina web del gateway all’indirizzo 192.168.23.150, user admin password password.
Dalla versione firmware 56.0.0.6 l’interfaccia ethernet è configurata con IP dinamico e si pone in attesa di un server DHCP. Eseguendo la scansione di rete con un programma di scan come IPScanner si potrà visualizzare l’indirizzo IP assegnato dal server (Cercare GATEWAY.localdomain).
Accesso da WiFi: di default il gateway ha abilitato la modalità AP senza crittografia, quindi è possibile cercare la rete WiFi generata dal gateway del tipo Gateway_****** dove i 6 asterischi sono le ultime 6 cifre dell’indirizzo MAC del gateway. Il gateway ha il DHCP server abilitato sulla connessione WAN e quindi è possibile raggiungerlo da pagina web all’indirizzo 192.168.1.1. Se la rete WiFi è protetta da password definire password iotpassword.
Dal menù Network->Interface->Port è possibile configurare l’interfaccia di rete in base alle proprie necessità. Dagli altri menù è possibile configurare la rete WiFi il loopback, ecc… Nel caso l’impostazione non venga accettata controllare le impostazioni in WLAN per evitare sovrapposizioni di classe IP.
Dal menù System->General Settings è possibile impostare i servizi attivi, l’ora ed il servizio SMTP di inoltro eMail.
Per riportare il gateway alle condizioni di fabbrica (Factory reset) tenere premuto il tasto di reset per più di 5 Secondi, rilasciarlo quando lampeggia il LED SYSTEM.

Configurazione rete cellulare (Solo per modello con LTE)
A gateway spento rimuovere il coperchio frontale ed inserire la SIM (Consiglio di eliminare il PIN). Dal menù Network->Interface->Cellular (1) è possibile configurare i parametri di connessione alla rete cellulare. Solitamente occorre solo impostare l’APN comunicata dal fornitore della SIM (Eventualmente il PIN se abilitato sulla SIM).
Dopo circa 1 minuto dal menù Status->Cellular (2) è possibile verificare la connessione alla rete cellulare con tutti i relativi parametri di connessione compreso l’indirizzo IP assegnato dal gestore.
Per il test della connessione è possibile dal menù Tools->Ping effettuare un ping all’indirizzo IP 8.8.8.8 ed all’URL www.google.com. Se i pings hanno esito positivo la connessione LTE è operativa.

Informazioni su Application Key (Importante)
L’Application Key (AppKey) è una chiave AES a 128 bit (32 caratteri esadecimali) usata per la procedura di OTAA (Over-The-Air Activation). Milesight utilizzava la stessa chiave 5572404c696e6b4c6f52613230313823 per tutti i dispositivi.
Con le ultime versioni firmware la policy è stata modificata, ora i dispositivi utilizzano una application key univoca per ogni dispositivo. Il valore della AppKey si ricava duplicando il valore di DeviceEUI. Quindi ad esempio un dispositivo con DeviceEUI=24E124433F483723 avrà come application key il valore 24E124433F48372324E124433F483723.
Collegamento sensori
Prima di iniziare il collegamento dei sensori LoRaWAN accertarsi di avere l’ultima versione del firmware (Menù Status->Overview, Firmware Version). Eseguire il Download dell’ultima versione disponibile ed eseguire l’aggiornamento dal menù Maintenance->Upgrade.
Dal menù Network Server->Application è possibile definire una applicazione a cui verranno abbinati i vari sensori.

Configurazione sensori su gateway
Dal menù Network Server->Device è possibile aggiungere i vari sensori LoRaWAN. Tutti i campi in grigio verranno automaticamente compilati con il pairing del sensore che avviene alla prima ricezione dati dal sensore. Per il sensore occorre definire:
- DeviceEUI: Ogni sensore ha un suo EUI univoco, di solito è riportato sull’esterno del sensore.
- Device-Profile: La specifica LoRaWAN definisce tre tipi di dispositivi: Classe A, Classe B e Classe C
- Application: I sensori connessi al gateway sono suddivisi in applicazioni dal menù Network Server->Applications, è possibile definire le varie applicazioni. Ad una applicazione è possibile abbinare più sensori. All’ID di applicazione si potrà fare riferimento per la sottoscrizione/pubblicazione MQTT.
- Paylod Codec: I dati ricevuti dal sensore devono essere decodificati, dal menù Network Server->Payload Codec è possibile visualizzare tutti i codec preinstallati o definirne di nuovi. Milesight mette a disposizione una pagina GitHub con tutti i nuovi codec rilasciati. Se si utilizza il FB MlsDevice settare il codec definito in questo articolo al capitolo Milesight payload codec.
- Port: Definizione porta di comunicazione con il sensore, il default dei sensori Milesight è 85.
- Application Key: Chiave di crittografia vedere il capitolo Informazioni su Application Key. Nelle nuove versioni firmware del gateway il campo viene automaticamente compilato.

Classe dispositivi
La specifica LoRaWAN definisce tre classi di dispositivi: Classe A, Classe B e Classe C (Vedi articolo). Tutti i dispositivi LoRaWAN devono implementare la Classe A, mentre la Classe B e la Classe C sono estensioni della specifica. Tutte le classi supportano la comunicazione bidirezionale (uplink e downlink).
- Class A: Il dispositivo può inviare un messaggio di uplink in qualsiasi momento, terminata la trasmissione, il dispositivo apre due brevi finestre di ricezione per ricevere messaggi di downlink dalla rete.
- Class B: Esegue apertura periodica delle finestre di ricezione chiamate ping slot per ricevere messaggi di downlink. Il gateway deve trasmettere periodicamente un beacon che viene viene usato dai dispositivi come riferimento temporale.
- Class C: Mantiene sempre aperta la finestra di ricezione tranne durante la trasmissione di un uplink. I dispositivi possono quindi ricevere messaggi di downlink in qualsiasi momento.
Impostazione invio beacon
I dispositivi di classe B devono ricevere dal gateway un messaggio di beacon. Nel menù Packet Forwarder->Advanced occorre impostare il parametro Beacon Period (Solitamente si impostano 128 S).
Sul dispositivo tramite il programma ToolBox è possibile impostare il parametro Response Time che indica il tempo di pausa tra l’apertura delle finestre di ricezione. Minore è il valore più veloce è la ricezione dei messagggi di downlink da gateway ma maggiore sarà il consumo del dispositivo.
Configurazione sensori
Per la configurazione dei sensori utilizzare il programma ToolBox, alcuni sensori sono configurabili solo via NFC, scaricare l’App Milesight Toolbox dal marketplace.
Sensore Temperatura/Umidità TM300
Eseguendo la connessione via NFC al sensore è possibile visualizzarne i dati ed agendo sul selettore Device status è possibile accenderlo/spegnerlo.
Il dispositivo opera in classe A, definire l’Application Key per la crittografia, vedere il capitolo Informazioni su Application Key.
Impostati i dati salvare le impostazioni, per il pairing con il gateway attendere la trasmissione del primo pacchetto inviato dal sensore al gateway. Il sensore di default invia i dati ogni 10 minuti, per evitare di attendere è possibile da connessione NFC spegnere ed accenderlo tramite il Device Status. Alla accensione viene immediatamente inviato un pacchetto dati che stabilisce il pairing.

Controllo valvole a solenoide UC51x
Eseguendo la connessione via NFC al sensore è possibile visualizzarne i dati ed agendo sul selettore Device status è possibile accenderlo/spegnerlo.
Il dispositivo opera in classe A, definire l’Application Key per la crittografia, vedere il capitolo Informazioni su Application Key.
Impostati i dati salvare le impostazioni, per il pairing con il gateway attendere la trasmissione del primo pacchetto inviato dal sensore al gateway. Il sensore di default invia i dati ogni 10 minuti, per evitare di attendere è possibile da connessione NFC spegnere ed accenderlo tramite il Device Status. Alla accensione viene immediatamente inviato un pacchetto dati che stabilisce il pairing.

Controller IoT LoRaWAN UC300
Per la configurazione del dispositivo occorre collegarlo al connettore USB di un PC ed eseguire il programma ToolBox. Per la connessione occorre impostare la porta seriale e definire la password che di default è 123456. Dal menù LoRaWAN ToolBox è possibile eseguire la configurazione.
Il dispositivo opera in classe C, definire l’Application Key per la crittografia, vedere il capitolo Informazioni su Application Key.
Salvate le impostazioni attendere l’invio del primo pacchetto dal sensore con il quale viene stabilito il pairing. Con il programma ToolBox è possibile settare i parametri per le varie funzioni del dispositivo.


Verifica sensori
Dal menù Network Server->Packets è possibile inviare pacchetti e visualizzare i pacchetti ricevuti.

Abilitazione Node-RED
Node-RED è uno strumento di sviluppo basato sul flusso per la programmazione visiva. Un editor di flusso accessibile da browser Web permette di creare funzioni JavaScript (Vedi articolo), dal menù APP->Node-RED è possibile abilitarne il supporto. Eseguita l’attivazione digitando da browser https://IP gateway/node-red è possibile accedere all’editor di sviluppo.Verranno richieste le credenziali di accesso, utilizzare le stesse definite per l’accesso alla pagina web del gateway.
Il modo più semplice di gestire i dati ricevuti dai sensori è di istanziare un oggetto mqtt in, e connetterlo al broker interno al gateway definendo come server localhost:1883 con credenziali di accesso Username: loraadm e password URloraadm123456, sottoscrivendo il topic application/Application number/device/+/rx. In questo modo saranno ritornati i pacchetti ricevuti da tutti i dispositivi connessi alla applicazione definita.

Flow acquisizione sensori
Ecco un semplice flow Node-RED per la visualizzazione dei dati ricevuti dai sensori. Vediamo il significato dei nodi:
- Nodo mqtt in: Si connette al broker interno del gateway localhost:1883 e sottoscrive il topic application/1/device/+/rx. In pratica riceve i messaggi da tuttii sensori connessi alla applicazione 1.
- Nodo debug: Riceve il messaggio di payload ricevuto dal nodo mqtt e lo invia alla console di debug.

[{"id":"b25dafc8cecac1c9","type":"tab","label":"Flow 1","disabled":false,"info":"","env":[]},{"id":"f0682c5c5ab14811","type":"mqtt in","z":"b25dafc8cecac1c9","name":"","topic":"application/1/device/+/rx","qos":"2","datatype":"auto-detect","broker":"7c60046baeb00026","nl":false,"rap":true,"rh":0,"inputs":0,"x":190,"y":80,"wires":[["13579d946b811e7a"]]},{"id":"13579d946b811e7a","type":"debug","z":"b25dafc8cecac1c9","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":500,"y":80,"wires":[]},{"id":"7c60046baeb00026","type":"mqtt-broker","name":"","broker":"localhost:1883","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""}]
Flow visualizzazione sensori (SensorsOnDashboard)
Ecco un semplice flow Node-RED per la visualizzazione dei valori ricevuti dai sensori in una dashboard con visualizzazione numerica e gauge Vediamo le operazioni necessarie:
- Installare dal menù Manage Palette il nodo node-red-dashboard, questo nodo aggiunge oggetti grafici utilizzabili in dashboard.
- Alla acquisizione vista in precedenza ho aggiunto una funzione per la decodifica dal messaggio ricevuto dei valori di temperatura e umidità.
- I valori decodificati sono inviati agli oggetti grafici di visualizzazione.

[{"id":"b25dafc8cecac1c9","type":"tab","label":"SensorsOnDashboard","disabled":false,"info":"","env":[]},{"id":"f0682c5c5ab14811","type":"mqtt in","z":"b25dafc8cecac1c9","name":"","topic":"application/1/device/+/rx","qos":"2","datatype":"auto-detect","broker":"7c60046baeb00026","nl":false,"rap":true,"rh":0,"inputs":0,"x":190,"y":80,"wires":[["13579d946b811e7a","11bdee7c1e09d209"]]},{"id":"13579d946b811e7a","type":"debug","z":"b25dafc8cecac1c9","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":400,"y":80,"wires":[]},{"id":"a31c50d0ef5adbbb","type":"ui_numeric","z":"b25dafc8cecac1c9","name":"","label":"Temperature","tooltip":"","group":"4557d0a9410ca9eb","order":1,"width":0,"height":0,"wrap":false,"passthru":true,"topic":"topic","topicType":"msg","format":"{{value}}","min":0,"max":10,"step":1,"className":"","x":550,"y":120,"wires":[[]]},{"id":"11bdee7c1e09d209","type":"function","z":"b25dafc8cecac1c9","name":"Decode","func":"return [\n { payload: msg.payload.object.temperature },\n { payload: msg.payload.object.humidity }\n];","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":380,"y":140,"wires":[["a31c50d0ef5adbbb"],["69eb4db0f35b4265"]]},{"id":"69eb4db0f35b4265","type":"ui_gauge","z":"b25dafc8cecac1c9","name":"","group":"4557d0a9410ca9eb","order":2,"width":0,"height":0,"gtype":"gage","title":"Humidity","label":"units","format":"{{value}}","min":0,"max":"100","colors":["#00b500","#e6e600","#ca3838"],"seg1":"","seg2":"","diff":false,"className":"","x":540,"y":160,"wires":[]},{"id":"7c60046baeb00026","type":"mqtt-broker","name":"","broker":"localhost:1883","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"4557d0a9410ca9eb","type":"ui_group","name":"Group 1","tab":"9373de5fa7ed15d7","order":1,"disp":true,"width":6},{"id":"9373de5fa7ed15d7","type":"ui_tab","name":"Tab 1","icon":"dashboard","order":1}]
Flow controllo connessione LTE (LTEConnection)
Ecco un utile flow Node-RED per il controllo della connessione LTE del gateway. Per farlo funzionare correttamente, occorre installare nella palette il nodo ping (node-red-node-ping). Il flow esegue periodicamente un ping all’indirizzo IP di Google (8.8.8.8) e ne controlla il risultato:
- Installare dal menù Manage Palette il nodo node-red-node-ping, questo nodo aggiunge la gestione del comando di ping.
- Se il ping va a buon fine, il contatore degli errori viene azzerato.
- Se il ping fallisce, il contatore degli errori consecutivi viene incrementato.
- Quando il numero di errori consecutivi supera soglia prestabilita si attiva il nodo exec, che riavvia la connessione LTE.

[{"id":"d30976a0d3105657","type":"tab","label":"LTEConnection","disabled":false,"info":"","env":[]},{"id":"cd75276c547f5f0a","type":"exec","z":"d30976a0d3105657","command":"/etc/init.d/quagga restart","addpay":"","append":"","useSpawn":"false","timer":"","winHide":false,"oldrc":false,"name":"","x":550,"y":180,"wires":[["be1c1b04893962b0"],[],[]]},{"id":"be1c1b04893962b0","type":"debug","z":"d30976a0d3105657","name":"debug 5","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":760,"y":160,"wires":[]},{"id":"ping1","type":"ping","z":"d30976a0d3105657","mode":null,"name":"Ping Google","host":"8.8.8.8","timer":"60","inputs":0,"x":150,"y":120,"wires":[["debug1","d6b0e714f2a436ea"]]},{"id":"debug1","type":"debug","z":"d30976a0d3105657","name":"Risultato ping","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":340,"y":100,"wires":[]},{"id":"d6b0e714f2a436ea","type":"function","z":"d30976a0d3105657","name":"function 1","func":"// Conteggio ping eseguiti\n\nlet PNumber = flow.get(\"PNumber\") || 0;\nif (++PNumber > 9999) PNumber=0;\nflow.set(\"PNumber\", PNumber);\nmsg.pings = PNumber;\n\n// Controllo se errore esecuzione ping.\n\nlet PErrors = flow.get(\"PErrors\") || 0;\nif (msg.payload === false) PErrors++; else PErrors = 0;\nflow.set(\"PErrors\", PErrors);\nmsg.errors = PErrors;\n\n// Controllo soglia errori per restart LTE.\n\nif (PErrors < 5) return [msg, null];\n\nPErrors=0;\nflow.set(\"PErrors\", PErrors);\nlet cmd = {}; // oggetto nuovo\ncmd.payload = \"Reset\"; \nreturn [msg, cmd];\n","outputs":2,"noerr":0,"initialize":"","finalize":"","libs":[],"x":320,"y":160,"wires":[["0608ee4c6f03d2e1"],["cd75276c547f5f0a"]]},{"id":"0608ee4c6f03d2e1","type":"debug","z":"d30976a0d3105657","name":"debug 8","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":500,"y":140,"wires":[]}]
