En esta entrada del blog vamos a continuar con el caso práctico de redes LoraWAN para dar de alta en TTN un gateway y una aplicación (sensor). Además, veremos cómo decodificar los datos e integrarlos con Node-Red. En esta tercera parte nos centraremos en el manejo de los datos enviados por nuestro sensor a TTN. Asi que empezamos donde lo dejamos. En TTN ya dimos de alta el sensor y el status es connected y ya recibimos datos. Vamos a ver los siguientes pasos
Decodificando el payload del mensaje Lora de la red LoraWAN
El payload es donde el sensor codifica la información y a través del protocolo Lora en una red LoraWan se envía esta información a través del gateway. Esta información llega al servidor LoraWAN y es el servidor el encargado de gestionar esta información. Existen varias formas para tratar los datos. En esta veremos como a través del servidor LoraWAN TTN somos capaces de decodificar la información e integrarla con terceras aplicaciones. En este caso realizaremos un ejemplo sencillo donde decodificaremos la información del sensor, haremos uso de la integración de Data Storage para almacenar los datos en TTN y leeremos la información con Node-Red a través de HTTP request. Con este simple ejemplo queremos mostrar las posibilidades que ofrece este tipo de solución. Esperamos que os despierten la imaginación y las ganas de usarla y si tenéis dudas aquí estamos para ayudaros.
Tal y como vimos en la anterior entrada hemos usado el sensor de humedad y temperatura Tabs de Browan concretamente el modelo TBHH100-868 si leemos la documentación de este sensor vemos como se conforma el payload y por tanto mediante la programación de una función de decodificación podemos traducir esta información. Del manual de usuario del sensor obtenemos la siguiente información:
Con esta información ya deberíamos ser capaces de crear una función para decodificar los datos del sensor, pero nuestros amigos de Sensational Systems han hecho un gran trabajo y han puesto a disposición de la comunidad una función con licencia MIT que permite decodificar los datos de este modelo. Así que solo nos queda ver donde tenemos que poner esta función en TTN y ver la información.
Si nos logueamos en TTN seleccionamos nuestra aplicación y vamos a Payload Formats veremos que nos aparece un desplegable en el que seleccionaremos Custom y en decoder copiaremos y pegaremos lo siguiente:
function Decoder(bytes, port) {
var params = {
«bytes»: bytes
};
// VOC Measurement
voc = (bytes[7] << 8) | bytes[6];
if (voc === 65535) {
voc_error = true;
} else {
voc_error = false;
}
// CO2 Measurement
co2 = (bytes[5] << 8) | bytes[4];
if (co2 === 65535) {
co2_error = true;
} else {
co2_error = false;
}
// Humidity Measurement
rh = bytes[3] &= 0x7f;
if (rh === 127) {
rh_error = true;
} else {
rh_error = false;
}
// Temp measurement
temp = bytes[2] & 0x7f;
temp = temp – 32;
// Battery measurements
batt = bytes[1] & 0x0f;
cap = bytes[1] >> 4;
batt = (25 + batt) / 10;
cap = (cap / 15) * 100;
params.voc = voc;
params.voc_error = voc_error;
params.co2 = co2;
params.co2_error = co2_error;
params.rh = rh;
params.rh_error = rh_error;
params.temp = temp;
params.batt = batt;
params.cap = cap;
return params;
}
Podemos pulsar en test para ver que hemos escrito correctamente la función. Si todo ha ido correctamente veremos un mensaje indicando que el Payload is valid. Ahora ya podemos esperar a recibir los datos del sensor y veremos como ya nos aparecen los datos decodificados.
Ahora que ya tenemos los datos en el formato correcto vamos a ver cómo hacer uso de las integraciones TTN. En la misma ventana de devices pulsamos en la pestaña de integrations – add integration. Nos aparecerá una ventana con todas las posibles integraciones de TTN. En nuestro caso vamos a seleccionar Data Storage. Esta integración almacena en TTN los datos de nuestras aplicaciones durante 7 días.
Si todo ha ido correcto veremos que el status es Running y podemos acceder a la plataforma para ver la forma de acceder a los datos mediante la API.
En esta página que nos aparece podemos probar los datos obtenidos. Para ello solo tenemos que autorizar el acceso. Para ello debemos darle el valor de Access Keys que nos aparece en la pestaña del device de TTN.
Podemos crear diferentes claves de acceso, pero por el momento vamos a usar la de por defecto. Una vez dada la autorización ya podemos probar la api y podemos ver los comandos para poder acceder a la información. Te dejamos a tu criterio que lo pruebes y si tienes dudas contacta con nosotros y resolveremos las dudas. Vamos a ver ahora como crear un flujo en Node-Red para obtener los datos del sensor mediante consultas HTTP.
Node-Red y LoraWAN la combinación perfecta
La instalación y puesta en marcha de Node-Red queda fuera del alcance de esta entrada del blog, pero si quieres puedes consultarnos y como siempre decimos estaremos encantados de ayudarte.
Lo primero que haremos en Node-Red es crear el siguiente flujo. No es necesario instalar ningún paquete de nodos adicional.
En este flujo tenemos por una parte el nodo inject que nos permite crear el flujo de manera controlada. En nuestro caso vamos a obtener los datos bajo demanda así que cada vez que pulsemos en el botón del nodo timestamp se creará el flujo que nos dará como resultado el último valor almacenado en la integración de TTN. Como hemos visto anteriormente podemos obtener muchos mas datos pero para el ejemplo esto será suficiente.
La config del timestamp es la siguiente.
El siguiente nodo que tenemos en el flujo es el de function. En este nodo lo que vamos a realizar una función es la creación del payload y cabecera que le pasaremos al siguiente nodo. El código que tenemos que añadir es el siguiente. En este código hay que tener en cuenta que tenemos que cambiar el valor del key por el que hemos obtenido en el default-ley de nuestro dispositivo en TTN
msg.payload = «data to post»;
msg.headers = {};
msg.headers[‘Accept’] = ‘application/json’;
msg.headers[‘Authorization’] = ‘key ttn-account-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx’;
return msg;
El siguiente nodo es el encargado de lanzar la consulta http get a TTN. Para ello tenemos que proporcionarle el valor de la URL de nuestro dispositivo que encontramos en la integración. El resto de opciones las dejamos por defecto sin el check y le indicamos al nodo que nos devuelva un objeto JSON
Y los dos últimos nodos en paralelo son nodos de debug que nos permiten ver el resultado del flujo. En el primero de ellos veremos toda la salida que obtenemos de TTN. En el segundo mostramos como obtener el valor de un único elemento de la consulta en este caso el valor del estado de la batería.
Veamos un ejemplo de los datos obtenidos cuando ejecutamos el flujo
13/1/2021 18:09:28node: eb32f2b5.7e6e9msg.payload : array[1]
array[1]
0: object
batt: 3.6
bytes: «[8 251 47 70 255 255 255 255]»
cap: 100
co2: 65535
co2_error: true
device_id: «tabs_xxxx_01»
raw: «CPsvRv////8=»
rh: 70
rh_error: false
temp: 15
time: «2021-01-13T17:08:34.299953132Z»
voc: 65535
voc_error: true
13/1/2021 18:09:28node: 38cfe1b3.62d05emsg.payload[0][«batt»] : number
3.6
Como podemos observar en la salida del flujo la consulta y la integración están funcionando correctamente. Estos datos ya podemos tratarlos de la forma que consideremos. Podemos enviarlos al dashboard de Node-red, integrarlos en una base de datos temporal como puede ser InfluxDB, Grafana, Ubidots, ,BLink, etc. La imaginación al poder. Con este ejemplo hemos querido demostrar la potencia de Lora, LoraWAN, TTN, Node-red. ¿Te unes a la comunidad? Nos vemos en las siguientes entradas y quedamos a tu disposición para cualquier duda que tengas sobre este caso práctico.