3D view of the engine cube part of our test bench

Objetivo de la instalación


En el marco de la implementación de un sistema de seguridad para nuestro banco de pruebas, hemos elegido utilizar un sensor LoRaWan (ver abajo) para detectar la apertura de la tapa de nuestro cubo de pruebas. A la derecha, un esquema que ilustra el comportamiento esperado del sistema.

En resumen, nuestro objetivo es ser notificados cada vez que se abra la tapa, y recibir una alerta si la tapa permanece abierta durante el funcionamiento del motor. 

Esta alerta será generada por una señal sonora, el envío de un correo electrónico y la visualización de un indicador en un panel de control. El sensor se comunicará a través del protocolo LoRaWAN con nuestra puerta de enlace WISE-6610.
Esquema del proceso del sistema de seguridad que estamos implementando

Sensor utilizado: Dragino DS03 (LoRaWan)

El DS03A es un sensor LoRaWAN diseñado para monitorear la apertura y el cierre de puertas. Transmite información clave como el estado de la puerta (abierta o cerrada), la duración de la apertura, así como el número de aperturas, y todo esto a través del protocolo LoRaWAN. Deseamos instalarlo en nuestro banco de pruebas, para detectar la apertura del cubo del motor.

Conexión del sensor con la puerta de enlace LoRaWan


El procedimiento de emparejamiento varía según la puerta de enlace LoRaWAN utilizada. En este caso, utilizaremos la puerta de enlace Advantech WISE-6610 V1. Este paso de emparejamiento permitirá a la puerta de enlace establecer una comunicación con el sensor DS03, permitiéndole así recibir, leer y decodificar los mensajes transmitidos por este.
Puente LoRaWan Advantech Wise-6610

Utilizamos aquí la versión 1 de la pasarela WISE-6610 (ya instalada en nuestro banco), que no es la más reciente. Aunque pueden existir diferencias sutiles, el procedimiento así como los principios generales siguen siendo aplicables para la versión 2 (o Wise-6610-EB).

Configuración general de la pasarela

En este caso, utilizamos una puerta de enlace preconfigurada en gran medida. Solo queda agregar nuestro sensor a la lista de dispositivos.

Para proceder, es conveniente conectarse a la puerta de enlace a través de su red local para acceder al panel de configuración, simplemente abriendo la dirección IP de la puerta de enlace en un navegador. Las credenciales predeterminadas son `root` / `root`.

Las credenciales predeterminadas de la puerta de enlace Wise-6610 v2 son `admin`/ `admin`.

Una vez conectados, en el menú `User Modules > LoRaWAN Gateway > Network Server > Settings`, es esencial verificar que la red LoRaWAN esté activada.
La configuración de la red LoRaWAN se puede ajustar a través de la página dedicada, accesible conectándose al puerto `1660` de la puerta de enlace (tenga en cuenta que este puerto es modificable).

El acceso al LNS de la v2 se realiza a través del menú `LoRaWan > Advantech LoRaWan Service`.
Tablero del LNS de la Wise-6610 v1

Tablero del LNS de la Wise-6610 v1

Tablero del LNS de la Wise-6610 v1

Tablero del LNS de la Wise-6610 v1

Añadir el sensor

Nuestro sensor funciona en modo de activación OTAA. Para añadirlo, simplemente abre el menú `Devices > Commissioned`, y luego haz clic en el botón `Create`.

En la v2, este menú es accesible a través de `Devices > Create Device > Type : OTAA`

En este paso, varios campos deben ser completados con información específica del sensor. Estos datos, únicos para cada dispositivo, están disponibles en la etiqueta del sensor : 
Etiqueta del sensor LoRaWan DS03A utilizado para el proyecto
Una vez que se hayan completado los campos, solo hay que hacer clic en el botón `Submit` para añadir el dispositivo.

Después de encender el sensor (manteniendo el botón presionado durante 3 segundos), este debería conectarse automáticamente a la pasarela. Su LED se enciende primero en verde durante unos momentos, luego pasa a azul antes de apagarse.

Para verificar la conexión, simplemente acceda al menú `Received Frames` (v1) o `Frames Traffic` (v2), donde los tramas enviadas por el DS03 deberían aparecer.

Interpretación y envío de los datos del sensor


El sensor DS03 transmite sus datos en forma de cadenas hexadecimales. Para almacenarlos de manera inteligible en nuestro software IoTEdge, debemos convertirlos a un formato compatible. IoTEdge acepta los datos en formato JSON, enviados a través de MQTT.

Por lo tanto, procederemos a la conversión de los datos hexadecimales en un objeto JSON que contenga información clara y legible. Para ello, utilizaremos la herramienta Node-RED, incluida en nuestra puerta de enlace.

Introducción a Node-RED

Node-RED es un entorno de programación visual diseñado para la recolección, transformación y transferencia de datos. Basado en un motor JavaScript, su interfaz se compone de flujos y bloques conectables, permitiendo realizar operaciones, enviar y transformar datos, así como procesar estos últimos de manera flexible.

Utilizaremos frecuentemente el bloque `función`, que permite integrar código JavaScript directamente en el flujo de Node-RED.

La transferencia de información entre los bloques se realiza en forma de objetos JavaScript.

Para acceder a  Node-RED en la puerta de enlace, basta con dirigirse al puerto 1880 (por defecto) de la puerta de enlace accediendo a la siguiente URL: `http://{IP de la puerta de enlace}:1880/#`.
Captura de pantalla de la interfaz de Node-RED

Captura de pantalla de la interfaz de Node-RED

Si Node-RED no está ya activado, es conveniente acceder a la página de configuración de la pasarela (`http://{IP de la pasarela}`). En el menú de la izquierda, seleccione luego `Customization > User Modules`.

En la v2 `Application Tools > Node-RED > Settings`.

Encontrará un enlace clicable titulado `Node-RED`, que le permitirá configurar la herramienta. Después de hacer clic en este enlace, marque la casilla `Enable Automatic Start`, luego haga clic en `Apply` para validar la configuración.

En la v2, marque `Node-RED control`.

Decodificación y envío de datos a través de Node-RED

La pasarela recibe un marco LoRaWAN y realiza un primer procesamiento, convirtiéndolo en un objeto JSON que contiene el marco hexadecimal, la calidad de la señal, la marca de tiempo y el identificador del sensor. Estos datos se envían a un broker MQTT interno, que los retransmite a nuestro flujo Node-RED. Este proceso se lleva a cabo completamente de forma interna dentro de la pasarela.

El flujo de Node-RED diseñado es simple y sigue el plan al lado. La idea es decodificar el mensaje y luego formatearlo correctamente para enviarlo a IoTEdge.
Descripción del flujo de Node-RED para la conversión y formateo de los tramas del sensor DS03A
Algunas precisiones adicionales :

Entrada : El topic utilizado para la entrada es un wildcard `uplink/#` que permite recibir los datos de todos los sensores conectados a la puerta de enlace. Si se desea restringir el flujo a un solo sensor, se debe reemplazar `#` por el identificador DevAddr del sensor.

Conversión :  La conversión corresponde a la etapa de traducción del marco hexadecimal en datos utilizables, de acuerdo con la documentación oficial del fabricante. Aunque un script de decodificación proporcionado por Dragino esté disponible en línea, este requiere varios ajustes para funcionar correctamente (ver la nota n°1) y presenta una incompatibilidad con la puerta de enlace 6610-V1 (la v2 también requiere ajustes).
Por lo tanto, utilizaremos un script alternativo (ver más abajo), específicamente desarrollado para asegurar la compatibilidad con la puerta de enlace 6610-V1. Simplemente hay que copiar este script en el segundo bloque funcional de su entorno Node-RED.

Envoltura : Para que IoTEdge pueda aceptar e interpretar correctamente los datos, estos deben estar estructurados según el siguiente formato :

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

Script de decodificación del DS03A en la Wise-6610

//Este script actualmente no soporta el modo de canal dual.
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) {
    //Estado de apertura/cierre en tiempo real y eventos históricos
    //Por simplicidad, solo traduce la primera entrada de eventos históricos. 
    result["DOOR:COUNT_MODE"] = (bytes[0] & 0x08) ? "RES" : "FAC"; //RES : Desde el reinicio / FAC : Desde la fábrica 
    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) {
    //Configuración del sensor
    //Solo se envía después del mensaje de bajada del servidor 
    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) {
    //Estado del dispositivo    
    result["DOOR:SENSOR_MODEL"] = (bytes[0] & 0x1B) ? "DS03A" : "Dispositivo desconocido";
    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
Captura de pantalla del flujo NodeRED implementado

Ahora, la pasarela transfiere los datos del sensor a IoTEdge, en la nube.

Configuración del almacenamiento de datos en IoTEdge


La transmisión de datos hacia IoTEdge se realiza a través del protocolo MQTT. Para que IoTEdge pueda interpretarlos correctamente, es necesario crear una representación del dispositivo dentro de la plataforma. Esta entidad permitirá asociar los datos recibidos a un dispositivo identificado.

En IoTEdge, los dispositivos (devices) se definen como conjuntos de variables que representan el estado de un sensor. Cada dispositivo se basa en un modelo de dispositivo — el equivalente a un tipo de sensor — y su configuración específica se llama detalles del dispositivo, representando una instancia concreta de este modelo.

Ahora vamos a crear un nuevo modelo de dispositivo. Para ello, dirígete a la interfaz de IoTEdge, luego accede a la sección Centro de Dispositivos > Modelo de Dispositivo.
Pantalla de gestión del modelo de dispositivo en IoTEdge
A continuación, haga clic en + Agregar para abrir la ventana de creación de un nuevo modelo. A continuación, debe definir las variables expuestas por el sensor, a saber :

//Los bool en IoTEdge se representan por {0, 1}, para poder ser utilizados en los dashboards
bool DOOR_OPEN_STATUS;
bool ALARM;
int LAST_DOOR_OPEN_DURATION; // en segundos
int DOOR_OPEN_COUNT;

El modelo de dispositivo aparece ahora como sigue una vez que su creación ha finalizado.
Resumen de la creación del modelo de dispositivo DS03A en IoTEdge
El siguiente paso consiste en crear un Device Detail a partir del modelo previamente definido. Para ello, acceda a `Device Center > Device Detail`, luego haga clic en + Add para abrir el formulario de creación. A continuación, solo tiene que completar la información requerida.
Pantalla de creación de un detalle de dispositivo en IoTEdge

Nota: asegúrese de marcar la opción Generar enlace al crear. Esta opción permite generar identificadores MQTT únicos para su dispositivo. Luego los utilizará en la puerta de enlace LoRaWan para garantizar la seguridad de los intercambios con IoTEdge
Una vez creado el Detalle del Dispositivo, aparecerá en la lista de dispositivos. Haga clic en su nombre para acceder a sus parámetros detallados.

En la sección Configuración de Extensión del Dispositivo, anote la siguiente información, necesaria para la configuración de MQTT :
  • brokerUsername
  • brokerPassword

Aproveche también esta etapa para definir el campo topic, ingresando el topic MQTT deseado (por ejemplo: data).
Pantalla de configuración de los parámetros de conexión a IoTEdge por detalle del dispositivo
Esta información permitirá finalizar la configuración del flujo de Node-RED de la puerta de enlace.

Antes de eso, es necesario asociar el script de conversión personalizado al Detalle del Dispositivo. Este script permite a IoTEdge descifrar el formato de datos JSON definido anteriormente en nuestro flujo de Node-RED.

Comience por copiar el ID del Dispositivo del equipo, luego dirígete a la pestaña Resumen. Abre los parámetros de una de las variables, luego en la sección Configuración de Extensión del Dispositivo, modifica el campo Tipo de Payload seleccionando Script Personalizado.
Pantalla de modificación del tipo de payload en IoTEdge
Más abajo en la sección Mensaje Codec (ver ilustración al lado): 
  1. Haga clic en el botón Editar Depuración (1) para abrir el editor de scripts.
  2. Reemplace el contenido existente con su script de conversión.
  3. Asegúrese de modificar la línea 9 del script reemplazando el valor predeterminado de d_id por el identificador de su dispositivo (2).
Modificación del script de decodificación de los datos de un dispositivo detalle

Finalmente, solo es necesario ingresar los identificadores del broker MQTT recuperados anteriormente en el flujo NodeRED que habíamos preconfigurado en la puerta de enlace.

Instalación física del sensor


Durante las pruebas en un entorno de test, el sensor estaba activado al acercar directamente los dos imanes hasta el contacto. Sin embargo, en el marco de la instalación final, estos imanes no estarán en contacto directo. Por lo tanto, es esencial determinar la distancia a la que el sensor cambia de un estado a otro.

Las mediciones manuales mostraron que el cambio de estado se produce a aproximadamente 3 centímetros de separación entre los imanes. Esta distancia puede variar ligeramente en función de la velocidad de apertura.

Aunque este parámetro no presenta ninguna restricción en nuestro caso, es importante tenerlo en cuenta en contextos de instalación más sensibles.
Instalación física del sensor en el cubo del motor
Los dos imanes del sensor pueden colocarse en el interior del bloque de prueba. Sin embargo, es preferible instalar el sensor en el exterior. 

Para ello, es necesario separar la parte imantada del cuerpo principal, fijarla en el interior del cubo y luego pasar el cable de conexión a través de un orificio perforado en la pared.

Al volver a ensamblar el sensor, es esencial reconectar correctamente los cables del imán. Por defecto, el cable rojo debe estar conectado a la terminal 1, y el cable negro a la terminal 9.
Sensor de apertura/cierre abierto

La parte 2 de este artículo está en redacción.