Ir al contenido principal
Todas las coleccionesConecta tus dispositivos
Conectar un RAK7204 a Helium y Ubidots
Conectar un RAK7204 a Helium y Ubidots

Aprende a integrar un RAK7204 a Ubidots a través de Helium LongFi.

Sergio M avatar
Escrito por Sergio M
Actualizado hace más de una semana

Como se muestra en el diagrama anterior, los datos ambientales son recopilados por un RAK7204 WisNode Sense Home y se envían a Internet a través de la red Helium LongFi. Una vez que los datos han sido recibidos en la consola de Helium, los datos son decodificados y reenviados a Ubidots.

Requisitos

1. Integración de RAK7204 WisNode Sense Home y Helium

El RAK7204 es un nodo LPWAN con un sensor ambiental de alta precisión integrado. Puede medir cambios en la temperatura, humedad y presión del aire. Todos los datos detectados pueden ser enviados a Helium a través de un Helium Hotspot / RAK Hotspot Miner para ser reenviados a la nube más tarde.]

NOTA IMPORTANTE: En esta guía, ya deberías tener un hotspot configurado en la consola de Helium, o que tengas cobertura de red cercana.

Configuración de Helium

Para gestionar nuestros dispositivos en la consola de Helium, debemos usar "Etiquetas." Un mecanismo poderoso que proporciona escalabilidad y flexibilidad a nuestros proyectos organizando dispositivos, asignando integraciones, añadiendo funciones, etc.

Paso 1: Para agregar una nueva etiqueta, ve a “Etiquetas > Crear una nueva etiqueta.”
Paso 2: Asigna un nombre de etiqueta. Por ejemplo, “RAK7204 WisNodes”. Luego, haz clic en “Crear etiqueta.”
Paso 3: Para agregar un nuevo dispositivo, ve a “Dispositivos > Agregar un nuevo dispositivo.”
Paso 4: Asigna un Nombre de Dispositivo. Por ejemplo, “RAK7204 #1”. Luego, adjunta la etiqueta previamente creada y haz clic en “Enviar.”
Paso 5: Haz clic en el dispositivo creado y guarda el Device EUI, App EUI, App Key para la configuración del RAK7204.

Paso 6: Para decodificar los datos entrantes, crea una función de decodificación. Ve a “Funciones > Crear Nueva Función.”
Paso 7: Asigna un nombre de función. Luego, elige “Decodificador” como Tipo de Función y “Script personalizado” como Formato.
Paso 8: Pega el siguiente código dentro del cuadro del editor de código.

// Function to decode uplink data.// Decode decodes an array of bytes into an object.// - port contains the LoRaWAN fPort number// - bytes is an array of bytes, e.g. [225, 230, 255, 0]// The function must return an object, e.g. {"temperature": 22.5}function Decoder(bytes, port) {var decoded = {};var hexString=bin2HexStr(bytes);return rakSensorDataDecode(hexString);}// convert array of bytes to hex string.// e.g: 0188053797109D5900DC140802017A0768580673256D0267011D040214AF0371FFFFFFDDFC2Efunction bin2HexStr(bytesArr) {var str = "";for(var i=0; i<bytesArr.length; i++) {var tmp = (bytesArr[i] & 0xff).toString(16);if(tmp.length == 1) {tmp = "0" + tmp;}str += tmp;}return str;}// convert string to short integerfunction parseShort(str, base) {var n = parseInt(str, base);return (n << 16) >> 16;}// convert string to triple bytes integerfunction parseTriple(str, base) {var n = parseInt(str, base);return (n << 8) >> 8;}// decode Hex sensor string data to objectfunction rakSensorDataDecode(hexStr) {var str = hexStr;var myObj = {};while (str.length > 4) {var flag = parseInt(str.substring(0, 4), 16);switch (flag) {case 0x0768:// HumiditymyObj.humidity = parseFloat(((parseShort(str.substring(4, 6), 16) * 0.01 / 2) * 100).toFixed(1)) + "%RH";//unit:%RHstr = str.substring(6);break;case 0x0673:// Atmospheric pressuremyObj.barometer = parseFloat((parseShort(str.substring(4, 8), 16) * 0.1).toFixed(2)) + "hPa";//unit:hPastr = str.substring(8);break;case 0x0267:// TemperaturemyObj.temperature = parseFloat((parseShort(str.substring(4, 8), 16) * 0.1).toFixed(2)) + "°C";//unit: °Cstr = str.substring(8);break;case 0x0188:// GPSmyObj.latitude = parseFloat((parseTriple(str.substring(4, 10), 16) * 0.0001).toFixed(4)) + "°";//unit:°myObj.longitude = parseFloat((parseTriple(str.substring(10, 16), 16) * 0.0001).toFixed(4)) + "°";//unit:°myObj.altitude = parseFloat((parseTriple(str.substring(16, 22), 16) * 0.01).toFixed(1)) + "m";//unit:mstr = str.substring(22);break;case 0x0371:// Triaxial accelerationmyObj.acceleration_x = parseFloat((parseShort(str.substring(4, 8), 16) * 0.001).toFixed(3)) + "g";//unit:gmyObj.acceleration_y = parseFloat((parseShort(str.substring(8, 12), 16) * 0.001).toFixed(3)) + "g";//unit:gmyObj.acceleration_z = parseFloat((parseShort(str.substring(12, 16), 16) * 0.001).toFixed(3)) + "g";//unit:gstr = str.substring(16);break;case 0x0402:// air resistancemyObj.gasResistance = parseFloat((parseShort(str.substring(4, 8), 16) * 0.01).toFixed(2)) + "KΩ";//unit:KΩstr = str.substring(8);break;case 0x0802:// Battery VoltagemyObj.battery = parseFloat((parseShort(str.substring(4, 8), 16) * 0.01).toFixed(2)) + "V";//unit:Vstr = str.substring(8);break;case 0x0586:// gyroscopemyObj.gyroscope_x = parseFloat((parseShort(str.substring(4, 8), 16) * 0.01).toFixed(2)) + "°/s";//unit:°/smyObj.gyroscope_y = parseFloat((parseShort(str.substring(8, 12), 16) * 0.01).toFixed(2)) + "°/s";//unit:°/smyObj.gyroscope_z = parseFloat((parseShort(str.substring(12, 16), 16) * 0.01).toFixed(2)) + "°/s";//unit:°/sstr = str.substring(16);break;case 0x0902:// magnetometer xmyObj.magnetometer_x = parseFloat((parseShort(str.substring(4, 8), 16) * 0.01).toFixed(2)) + "μT";//unit:μTstr = str.substring(8);break;case 0x0a02:// magnetometer ymyObj.magnetometer_y = parseFloat((parseShort(str.substring(4, 8), 16) * 0.01).toFixed(2)) + "μT";//unit:μTstr = str.substring(8);break;case 0x0b02:// magnetometer zmyObj.magnetometer_z = parseFloat((parseShort(str.substring(4, 8), 16) * 0.01).toFixed(2)) + "μT";//unit:μTstr = str.substring(8);break;default:str = str.substring(7);break;}}return myObj;}

Paso 9: Adjunta la etiqueta previamente creada y haz clic en “Guardar Función.”

Configuración de RAK7402

El WisNode Sense funciona directamente con su firmware que soporta LoRaWAN. Solo necesitas interactuar con él usando la herramienta RAK Serial Port para configurar los parámetros necesarios para unirse a la red Helium. Para comenzar con la herramienta, sigue todos los pasos proporcionados en la siguiente guía: Interfacing with the RAK7204 WisNode Sense Home

Una vez que la comunicación serial con el dispositivo se haya establecido correctamente, verifica la versión del firmware con el comando AT (at+version) y actualízalo a la última versión si es necesario. Luego puedes ejecutar los siguientes comandos para establecer los parámetros requeridos para establecer una conexión con la red Helium.

Paso 1: Establecer OTAA como modo de activación

  • Modo de activación OTAA: at+set_config=lora:join_mode:0

Paso 2: Escribe el siguiente comando AT para establecer: Frecuencia/Región, Device EUI, Application EUI, y Application Key. Recuerda reemplazar "xxxx" con el parámetro correspondiente proporcionado en el proceso de creación del dispositivo Helium (Figura X, Paso X, etc.).

  • Frecuencia/Región: at+set_config=lora:region:xxxxxx

  • Device EUI: at+set_config=lora:dev_eui:xxxxxxxxxxxxxxxx

  • Application EUI: at+set_config=lora:app_eui:xxxxxxxxxxxxxxxx

  • Application Key: at+set_config=lora:app_key:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Paso 3: Únete a la red en modo OTAA:

  • Unirse: at+join

Paso 4: Establecer el intervalo de envío de datos:

  • Configuración del intervalo: at+set_config=lora:send_interval:X:Y

Donde:

  • X - abrir o cerrar el mecanismo de intervalo de envío de datos. Si X se establece en 0, el dispositivo no enviará datos automáticamente. Si X se establece en 1, el dispositivo enviará datos cada Y segundos.

  • Y - tiempo de intervalo en segundos. Este parámetro solo es válido cuando X se establece en 1.

Ahora puedes visualizar los datos del sensor a medida que llegan en tiempo real en la consola de Helium. Ingresa a la página del dispositivo que acabas de crear y verifica la sección de Registro de Eventos en la parte inferior:

3. Integración de Helium y Ubidots

Para enviar datos desde la consola de Helium a Ubidots para desarrollar y desplegar aplicaciones IoT, puedes usar una función de Helium llamada “Integraciones.” Esta es una función que reenvía todos los datos entrantes recibidos a Ubidots usando un UbiFunction.

Configuración de UbiFunction

La UbiFunction manejará el esquema JSON de Helium para gestionar tanto los mensajes de uplink como los de downlink dentro de la plataforma.

NOTA: El ejemplo a continuación no gestionará estos mensajes de downlink. En caso de que desees gestionar mensajes de downlink, debes manejar una solicitud HTTP POST a la URL proporcionada bajo la clave "downlink_url" recibida en el esquema JSON.

Sigue las instrucciones a continuación para crear una UbiFunction en tu cuenta de Ubidots:

Paso 1: Haz clic en “Dispositivos > Función
Paso 2: Haz clic en el icono de más (“+”) ubicado en la esquina superior derecha.
Paso 3: Asigna un nombre para tu UbiFunction. Por ejemplo, “Integración de Helium.”
Paso 4: Selecciona “POST” como el Método
Paso 5: Selecciona “NodeJS 10” como el Runtime
Paso 6: Deja la opción “Disparador basado en tiempo” desactivada
Paso 7: Pega el código a continuación en el Editor de UbiFunction

// Import the 'axios' library so we can make HTTP request from the functionvar axios = require("axios");// Define Ubidots constantconst UBI_TOKEN = "BBFF-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";const UBI_URL_API_2 = "https://industrial.api.ubidots.com/api/v2.0";const UBI_URL = "https://industrial.api.ubidots.com/api/v1.6";// Main function - runs every time the function is executed.// "args" is a dictionary containing both the URL params and the HTTP body (for POST requests).async function main(args) {let data = {};let appEUI = args["app_eui"];let payload = args["decoded"]["payload"];let payloadStatus = args["decoded"]["status"];let devEUI = args["dev_eui"];let devAddr = args["devaddr"];let downlinkUrl = args["downlink_url"];let nodeId = args["id"];let organizationId = args["metadata"]["organization_id"];let name = args["name"];let payloadBase64 = args["payload"];let reportedAt = args["reported_at"];// Check if the device does not exist in Ubidots Platformlet deviceStatus = await ubidotsGetDevice(UBI_TOKEN, devAddr);// If the device does not exist, create itif (deviceStatus == 404) {await ubidotsDeviceCreation(UBI_TOKEN, name, devAddr);};// Filter the payload received from heliumconst variables = Object.entries(payload).reduce((previous, current) => {const [key, value] = current;const varValue = parseFloat(value);const unit = value.replace(/[\d\.]/g, '')return [...previous, [key, varValue, unit]];}, []);// Create respective custom variablesfor (const variable of variables) {let variableStatus = await ubidotsVariableCreation(UBI_TOKEN, devAddr, variable[0], variable[0], variable[2]);data[variable[0]] = variable[1]}// Send variables' values to Ubidotslet variablesRequest = await ubidotsSendVariableValues(UBI_TOKEN, devAddr, data);return {"status": variablesRequest};}/** Create a custom device in Ubidots Platform* API Documentation: docs.ubidots.com** @arg token [Mandatory], Ubidots account's Token* @arg deviceName [Mandatory], device's friendly name* @arg deviceLabel [Mandatory], single and unique label of device* @arg lat [Optional], latitude corresponding to the device's location* @arg lng [Optional], longitude corresponding to the device's location** @return response/error, request response*/async function ubidotsDeviceCreation(token, deviceName, deviceLabel, lat = 0, lng = 0) {let endpoint = UBI_URL_API_2.concat("/devices");let deviceParams = {"label": deviceLabel,"name": deviceName};if (lat != 0 && lng != 0) {deviceParams.properties = {"_location_type":"manual","_location_fixed": {"lat": lat,"lng": lng}};}return axios.post(endpoint, deviceParams, {headers: {"content-type": "application/json","X-Auth-Token": token}}).then(function (response) {//console.log(response);}).catch(function (error) {//console.log(error.response);});}/** Get an existent device in Ubidots Platform* API Documentation: docs.ubidots.com** @arg token [Mandatory], Ubidots account's Token* @arg deviceLabel [Mandatory], single and unique label of device** @return response/error, request response*/async function ubidotsGetDevice(token, deviceLabel) {let endpoint = UBI_URL_API_2.concat("/devices/~" + deviceLabel);return axios.get(endpoint, {headers: {"content-type": "application/json","X-Auth-Token": token}}).then(function (response) {return response.statusText;}).catch(function (error) { return error.response.status;});}/** Create a custom variable in Ubidots Platform* API Documentation: docs.ubidots.com** @arg token [Mandatory], Ubidots account's Token* @arg deviceLabel [Mandatory], single and unique label of device* @arg variableName [Mandatory], variable's friendly name* @arg variableLabel [Mandatory], single and unique label of variable* @arg unit [Mandatory], unit associated to the value of the variable** @return response/error, request response*/async function ubidotsVariableCreation(token, deviceLabel, variableName, variableLabel, unit) {let endpoint = UBI_URL_API_2.concat("/variables");let variableParams = {"label": variableLabel,"name": variableName,"device": "~".concat(deviceLabel).toLowerCase(),"unit": unit};return axios.post(endpoint, variableParams, {headers: {"content-type": "application/json","X-Auth-Token": token}}).then(function (response) {return response.statusText;}).catch(function (error) {return error.response.status;});}/** Handle a POST request to Ubidots API* API Documentation: https://ubidots.com/docs/sw/** @arg token [Mandatory], Ubidots account's Token* @arg device_label [Mandatory], single and unique label of device* @arg payload [Mandatory], variables and values to be sent in a JSON format** @return response/error, request response*/async function ubidotsSendVariableValues(token, deviceLabel, payload) {let endpoint = UBI_URL.concat("/devices/" + deviceLabel);return axios.post(endpoint, payload, {headers: {"content-type": "application/json","X-Auth-Token": token}}).then(function (response) {return response.statusText;}).catch(function (error) {return error.response.status;


Paso 8: Reemplaza el valor de la variable llamada “UBI_TOKEN” con el Token de Ubidots asociado a tu cuenta.
Paso 9: Guarda la UbiFunction haciendo clic en el botón “Hacerla activa” ubicado en la esquina inferior izquierda.
Paso 10: Copia la URL generada bajo el cuadro “URL de Endpoint HTTPS”.


Una vez que la función se haya creado correctamente, debes observar lo siguiente:

Configuración de Integración de Helium

La integración de Helium permite a los dispositivos conectarse a aplicaciones basadas en la nube preconfiguradas o enviar datos directamente a través de HTTP o MQTT. Para este proyecto, vamos a usar la integración HTTP.


Sigue las instrucciones a continuación para crear una Integración en tu consola de Helium:


Paso 1: Desde la navegación del lado izquierdo, haz clic en “Integraciones.”
Paso 2: Elige “HTTP” como el tipo de integración personalizada
Paso 3: Bajo la opción “Detalles de Conexión HTTP”, asigna “POST” como método, y la URL de Endpoint de UbiFunction HTTPS como Endpoint.
Paso 4: Asigna un nombre para tu Integración de Helium. Por ejemplo, “Integración de Ubidots.”
Paso 5: Asigna la “Etiqueta” asociada con el dispositivo que deseas integrar con Ubidots.
Paso 6: Guarda la integración haciendo clic en el botón “Crear Integración”.


Una vez que la integración se haya creado correctamente, debes observar lo siguiente:

Prueba de Integración

Una vez que hayas configurado ambos servicios, los valores ambientales detectados por el RAK7402 se actualizarán una vez que el siguiente paquete de datos llegue a la consola de Helium.


Para verificar si la integración está funcionando correctamente, ve a la Consola de Helium y selecciona la sección "Dispositivos". Luego, elige cualquier dispositivo que contenga la etiqueta asociada con la integración de Ubidots, y haz clic en la opción de depuración:

En este punto, puedes notar el mensaje "Esperando datos..." en la consola de depuración hasta que se reciba un nuevo paquete de datos. Una vez recibido, la siguiente respuesta se informará en la opción de Integración:

Después de seleccionar el dispositivo creado, podemos ver todas las variables ambientales reportadas por el RAK7204 WisNode Sense Home.

El último paso es verificar si los datos llegaron correctamente a la Plataforma Ubidots. Ve a la cuenta y haz clic en "Dispositivos > Dispositivos" en esta sección, notaremos que un nuevo dispositivo ha sido creado automáticamente. Después de hacer clic en el dispositivo, podemos ver todas las variables ambientales reportadas por el RAK7204 WisNode Sense Home:

En caso de que tengas más de un RAK7204 configurado en la consola de Helium, también se crearán automáticamente en Ubidots, siempre que todos los dispositivos manejen la misma etiqueta.

Finalmente, puedes personalizar tus Dashboards y aplicaciones en solo unos pocos clics, consulta las siguientes guías para aprender cómo.

Otros usuarios también encontraron útil...

¿Ha quedado contestada tu pregunta?