Vue 3D de la partie cube moteur de notre banc de test

Objectif de l'installation


Dans le cadre de la mise en place d’un système de sécurité pour notre banc de test, nous avons choisi d’utiliser un capteur LoRaWan (voir ci-dessous) pour détecter l’ouverture du couvercle de notre cube de test. Ci-contre, un schéma illustrant le comportement attendu du système.

En résumé, notre objectif est d’être notifiés chaque fois que le couvercle est ouvert, et de recevoir une alerte si le couvercle demeure ouvert pendant le fonctionnement du moteur. 

Cette alerte sera générée par un signal sonore, l'envoi d'un e-mail et l'affichage d’un indicateur sur un tableau de bord. Le capteur communiquera via le protocole LoRaWAN avec notre passerelle WISE-6610.
Schéma du processus du système de sécurité que nous mettons en place

Capteur utilisé : Dragino DS03 (LoRaWan)

Le DS03A est un capteur LoRaWAN conçu pour surveiller l’ouverture et la fermeture des portes. Il transmet des informations clés telles que l’état de la porte (ouverte ou fermée), la durée d’ouverture, ainsi que le nombre d’ouvertures, et ce, via le protocole LoRaWAN. Nous souhaitons l'installer sur notre banc de test, pour détecter l'ouverture du cube moteur.

Connexion du capteur avec la passerelle LoRaWan


La procédure d’appairage varie en fonction de la passerelle LoRaWAN utilisée. Dans ce cas, nous utiliserons la passerelle Advantech WISE-6610 V1. Cette étape d’appairage permettra à la passerelle d’établir une communication avec le capteur DS03, lui permettant ainsi de recevoir, de lire et de décoder les messages transmis par celui-ci.
Passerelle LoRaWan Advantech Wise-6610

Nous utilisons ici la version 1 de la passerelle WISE-6610 (déjà installée sur notre banc), qui n’est pas la plus récente. Bien que des différences subtiles puissent exister, la procédure ainsi que les principes généraux demeurent applicables pour la version 2 (ou Wise-6610-EB).

Configuration générale de la passerelle

Dans ce cas, nous utilisons une passerelle préconfigurée dans une large mesure. Il ne reste plus qu'à ajouter notre capteur à la liste des dispositifs.

Pour procéder, il convient de se connecter à la passerelle via son réseau local pour accéder au panneau de configuration, en ouvrant simplement l'adresse IP de la passerelle dans un navigateur. Les identifiants par défaut sont `root` / `root`.

Les identifiants par défaut de la passerelle Wise-6610 v2 sont `admin`/ `admin`.

Une fois connectés, dans le menu `User Modules > LoRaWAN Gateway > Network Server > Settings`, il est essentiel de vérifier que le réseau LoRaWAN est bien activé.
La configuration du réseau LoRaWAN peut ensuite être ajustée via la page dédiée, accessible en se connectant au port `1660` de la passerelle (notez que ce port est modifiable).

L'accès au LNS de la v2 se fait via le menu `LoRaWan > Advantech LoRaWan Service`.
Tableau de bord du LNS de la Wise-6610 v1

Tableau de bord du LNS de la Wise-6610 v1

Tableau de bord du LNS de la Wise-6610 v1

Tableau de bord du LNS de la Wise-6610 v1

Ajout du capteur

Notre capteur fonctionne en mode d’activation OTAA. Pour l’ajouter, il suffit d’ouvrir le menu `Devices > Commissioned`, puis de cliquer sur le bouton `Create`.

Dans la v2, ce menu est accessible via `Devices > Create Device > Type : OTAA`

À cette étape, plusieurs champs doivent être remplis avec des informations spécifiques au capteur. Ces données, uniques à chaque appareil, sont disponibles sur l’étiquette du capteur : 
Etiquette du capteur LoRaWan DS03A utilisé pour le projet
Une fois les champs renseignés, il suffit de cliquer sur le bouton `Submit` pour ajouter le dispositif.

Après avoir allumé le capteur (en maintenant le bouton enfoncé pendant 3 secondes), celui-ci devrait se connecter automatiquement à la passerelle. Sa LED s’allume d'abord en vert pendant quelques instants, puis passe au bleu avant de s’éteindre.

Pour vérifier la connexion, il suffit d’accéder au menu `Received Frames` (v1) ou `Frames Traffic` (v2), où les trames envoyées par le DS03 devraient apparaître.

Interprétation et envoi des données du capteur


Le capteur DS03 transmet ses données sous forme de chaînes hexadécimales. Afin de les stocker de manière intelligible sur notre logiciel IoTEdge, nous devons les convertir en un format compatible. IoTEdge accepte les données au format JSON, envoyés via MQTT.

Nous allons donc procéder à la conversion des données hexadécimales en un objet JSON contenant des informations claires et lisibles. Pour ce faire, nous utiliserons l'outil Node-RED, inclus dans notre passerelle.

Introduction à Node-RED

Node-RED est un environnement de programmation visuelle conçu pour la collecte, la transformation et le transfert de données. Fondé sur un moteur JavaScript, son interface se compose de flux et de blocs connectables, permettant de réaliser des opérations, d’envoyer et de transformer des données, ainsi que de traiter ces dernières de manière flexible.

Nous utiliserons fréquemment le bloc `fonction`, qui permet d’intégrer du code JavaScript directement dans le flux Node-RED.

Le transfert d’informations entre les blocs s’effectue sous forme d’objets JavaScript.

Pour accéder à  Node-RED sur la passerelle, il suffit de se rendre sur le port 1880 (par défaut) de la passerelle en accédant à l'URL suivante : `http://{IP de la passerelle}:1880/#`.
Capture d'écran de l'interface Node-RED

Capture d'écran de l'interface Node-RED

Si Node-RED n’est pas déjà activé, il convient d’accéder à la page de configuration de la passerelle (`http://{IP de la passerelle}`). Dans le menu de gauche, sélectionnez ensuite `Customization > User Modules`.

Dans la v2 `Application Toos > Node-RED > Settings`.

Vous y trouverez un lien cliquable intitulé `Node-RED`, qui vous permettra de configurer l'outil. Après avoir cliqué sur ce lien, cochez la case `Enable Automatic Start`, puis cliquez sur `Apply` pour valider la configuration.

Dans la v2, cochez `Node-RED control`.

Décodage et envoi des données via Node-RED

La passerelle reçoit une trame LoRaWAN et effectue un premier traitement, la convertissant en un objet JSON contenant la trame hexadécimale, la qualité du signal, le timestamp et l'identifiant du capteur. Ces données sont ensuite envoyées à un broker MQTT interne, qui les relaie à notre flow Node-RED. Ce processus se déroule entièrement en interne au sein de la passerelle.

Le flow Node-RED conçu est simple et suit le plan ci-contre. L'idée est de décoder le message puis de le formatter correctement pour l'envoyer sur IoTEdge.
Descriptif du flux Node-RED de conversion et formattage des trames du capteur DS03A
Quelques précisions supplémentaires :

Input : Le topic utilisé pour l'input est un wildcard `uplink/#` permettant de recevoir les données de tous les capteurs connectés à la passerelle. Si l'on souhaite restreindre le flux à un seul capteur, il convient de remplacer `#` par l'identifiant DevAddr du capteur.

Conversion :  La conversion correspond à l'étape de traduction de la trame hexadécimale en données exploitables, conformément à la documentation officielle du fabricant. Bien qu’un script de décodage fourni par Dragino soit accessible en ligne, celui-ci nécessite plusieurs ajustements pour fonctionner correctement (voir la note n°1) et présente une incompatibilité avec la passerelle 6610-V1 (la v2 nécessite également des ajustements).
Nous utiliserons donc un script alternatif (voir ci-dessous), spécifiquement développé pour assurer la compatibilité avec la passerelle 6610-V1. Il convient simplement de copier ce script dans le second bloc fonction de votre environnement Node-RED.

Wrapping : Pour que IoTEdge puisse accepter et interpréter correctement les données, celles-ci doivent être structurées selon le format suivant :

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

Script de décodage du DS03A sur la Wise-6610

//This script currently doesnt support Dual Channel Mode.
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) {
    //Real Time Open/Close status and historical
    //For simplicity sake, only translate the first entry of historical events. 
    result["DOOR:COUNT_MODE"] = (bytes[0] & 0x08) ? "RES" : "FAC"; //RES : Since reset / FAC : Since factory 
    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) {
    //Sensor configuration
    //Only sent after downlink msg from 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) {
    //Device status    
    result["DOOR:SENSOR_MODEL"] = (bytes[0] & 0x1B) ? "DS03A" : "Unknown Device";
    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
Capture d'écran du flux NodeRED mis en place

Désormais, la passerelle transfère les données du capteur vers IoTEdge, dans le cloud.

Configuration du stockage des données dans IoTEdge


La transmission des données vers IoTEdge s’effectue via le protocole MQTT. Afin qu’IoTEdge puisse les interpréter correctement, il faut de créer une représentation de l’appareil au sein de la plateforme. Cette entité permettra d’associer les données reçues à un dispositif identifié.

Dans IoTEdge, les appareils (devices) sont définis comme des ensembles de variables représentant l’état d’un capteur. Chaque appareil est basé sur un device model — l’équivalent d'un type de capteur — et sa configuration spécifique est appelée device details, représentant une instance concrète de ce modèle.

Nous allons à présent créer un nouveau device model. Pour cela, rendez-vous dans l’interface IoTEdge, puis accédez à la section Device Center > Device Model.
Ecran de gestion des device model dans IoTEdge
Cliquez ensuite sur + Add pour ouvrir la fenêtre de création d’un nouveau modèle. Il convient alors de définir les variables exposées par le capteur, à savoir :

//Les bool dans IoTEdge sont représentés par {0, 1}, pour pouvoir etre utilisé dans les dashboard
bool DOOR_OPEN_STATUS;
bool ALARM;
int LAST_DOOR_OPEN_DURATION; // in seconds
int DOOR_OPEN_COUNT;

Le modèle d’appareil (device model) apparaît désormais comme suit une fois sa création terminée.
Récapitulatif de la création du device model DS03A dans IoTEdge
L’étape suivante consiste à créer un Device Detail à partir du modèle précédemment défini. Pour cela, accédez à `Device Center > Device Detail`, puis cliquez sur + Add afin d’ouvrir le formulaire de création. Il suffit ensuite de renseigner les informations requises.
Ecran de création d'un device detail dans IoTEdge

Remarque : veillez à cocher l’option Generate Link lors de la création. Cette option permet de générer des identifiants MQTT uniques pour votre device. Vous les utiliserez ensuite dans la passerelle LoRaWan pour assurer la sécurité des échanges avec IoTEdge
Une fois le Device Detail créé, il apparaîtra dans la liste des appareils. Cliquez sur son nom pour accéder à ses paramètres détaillés.

Dans la section Device Extension Config, notez les informations suivantes, nécessaires pour la configuration MQTT :
  • brokerUsername
  • brokerPassword

Profitez également de cette étape pour définir le champ topic , en y renseignant le topic MQTT souhaité (par exemple : data ).
Ecran de configuration des paramètres de connexion à IoTEdge par device detail
Ces informations permettront de finaliser la configuration du flux Node-RED de la passerelle.

Avant cela, il convient d’associer le script de conversion personnalisé au Device Detail. Ce script permet à IoTEdge de décrypter le format de données JSON défini plus haut dans notre flux Node-RED.

Commencez par copier le Device ID de l'équipement, puis rendez-vous dans l’onglet Overview. Ouvrez les paramètres d’une des variables, puis dans la section Device Extension Config, modifiez le champ Payload Type en sélectionnant Custom Script.
Ecran de modification du type de payload dans IoTEdge
Plus bas dans la section Message Codec (voir illustration ci-contre) : 
  1. Cliquez sur le bouton Edit Debug (1) pour ouvrir l’éditeur de script.
  2. Remplacez le contenu existant par votre script de conversion.
  3. Veillez à modifier la ligne 9 du script en remplaçant la valeur par défaut de d_id par l’identifiant de votre device (2).
Modification du script de décodage des données d'un device detail

Enfin, il suffit de renseigner les identifiants du broker MQTT récupéré plus tôt dans le flux NodeRED que nous avions pré-configuré dans la passerelle.

Installation physique du capteur


Lors des essais en environnement de test, le capteur était activé en rapprochant directement les deux aimants jusqu’à contact. Cependant, dans le cadre de l’installation finale, ces aimants ne seront pas en contact direct. Il est donc essentiel de déterminer la distance à laquelle le capteur bascule d’un état à l’autre.

Des mesures manuelles ont montré que le changement d’état s’effectue à environ 3 centimètres d’écart entre les aimants. Cette distance peut varier légèrement en fonction de la vitesse d’ouverture.

Bien que ce paramètre ne présente pas de contrainte dans notre cas, il est important d’en tenir compte dans des contextes d’installation plus sensibles.
Installation physique du capteur sur le cube moteur
Les deux aimants du capteur peuvent être placés à l’intérieur du bloc de test. Cependant, il est préférable d’installer le capteur à l’extérieur. 

Pour cela, il est nécessaire de détacher la partie aimantée du boîtier principal, de la fixer à l’intérieur du cube, puis de faire passer le câble de liaison par un orifice percé dans la paroi.

Lors du réassemblage du capteur, il est essentiel de reconnecter correctement les fils de l’aimant. Par défaut, le câble rouge doit être raccordé à la borne 1, et le câble noir à la borne 9.
Capteur d'ouverture/fermeture ouvert

La partie 2 de cet article est en cours de rédaction.