Ir al contenido principal
Todas las coleccionesTutoriales de proyectos IoT
Seguimiento de activos GPS Sigfox DIY con Ubidots
Seguimiento de activos GPS Sigfox DIY con Ubidots

Conecte su dispositivo de seguimiento GPS de Sigfox a la nube de Ubidots y despliegue sus aplicaciones de seguimiento de activos IoT en poco tiempo.

Sergio M avatar
Escrito por Sergio M
Actualizado hace más de 2 meses

Los dispositivos de baja potencia y amplia cobertura de Sigfox y Ubidots son una solución IoT fácil de integrar desde el dispositivo hasta la aplicación. Rastrear coches, autobuses, contenedores, cubos de basura, o incluso tu bolsa de golf. Mantén un seguimiento del ganado o lleva tu dispositivo Sigfox para explorar la naturaleza.

En este tutorial utilizaremos UbiFunctions, una herramienta de características de la plataforma de desarrollo de aplicaciones IoT de Ubidots.

Requisitos

1. Configuración del Suntech ST730

El Suntech ST730 es un dispositivo portátil equipado con tecnología Sigfox, localización GNSS, Wi-Fi y un conjunto de sensores, lo que lo convierte en una buena opción para el seguimiento de activos listo para usar. Este módulo permite a los usuarios gestionar datos cuando sea necesario, evitando el consumo excesivo de energía con tiempos de espera eficientes.

Esta guía explicará algunas de las posibles configuraciones que tiene el Suntech ST730, como la localización GPS de alta resolución.

Nota: Ubidots se compromete a ayudarte a conectar tu ST730 a nuestra plataforma de aplicaciones IoT y en la nube de la manera más fácil posible. Con más guías llegando todo el tiempo, consulta UbiFunctions para más funciones de análisis de datos que emparejen o mejoren tus aplicaciones.

Configuración GPS del Suntech ST730:

El módulo Sigfox puede transmitir un máximo de 12 bytes. El formato de la información enviada es:

La explicación de algunos modos disponibles que tiene el dispositivo para la transmisión de datos se puede encontrar a continuación. Cada uno será tomado en cuenta al realizar la UbiFunction que decodifica estos datos y POST a Ubidots.

  1. Localización GPS

Este tipo de datos se compone de:

  • 3 bytes para la latitud en grados.

  • 3 bytes para la longitud en grados.

Tanto la latitud como la longitud están codificadas utilizando el formato de punto flotante IEEE- Standard 754. Si una lectura GPS no sigue este formato, no se enviará ninguna lectura de datos. Aquí hay un ejemplo de una lectura GPS correctamente realizada:

Ejemplo: 01c1b6c8c23c55

  • 0x01 – tipo de dato

  • 0xC1B6C8 – latitud = -22.84771

  • 0xC23C55 – longitud = -47.083084

2. Localización GPS de alta resolución

El formato de datos para GPS en este tutorial es:

  • 4 bytes para la latitud

  • 4 bytes para la longitud

Ejemplo: 02c1b6c81cc23c5514

  • 0x02 – tipo de dato

  • 0xC1B6C81C – latitud = -22.84771

  • 0xC23C5514 – longitud = -47.083084

3. Temperatura

En este caso hay dos opciones posibles para calcular el valor de la temperatura en Celsius. Si el valor es menor que 127, la temperatura se calcularía de la siguiente manera:

Temperature = value / 2

De lo contrario, si el valor es mayor que 127, la expresión sería

Temperature = (256-value) / 2

Ejemplo: 0328

  • 0x03 – tipo de dato

  • 0x28 – Temperatura = 0x28 / 2 = 20

4. Voltaje de la batería

Estos datos están codificados con una resolución de 0.1 voltios. Por lo tanto, para obtener el valor en V, la expresión sería:

Voltage = value / 0.1

Ejemplo: 0422

  • 0x04 – tipo de dato

  • 0x22 – voltaje = 34 / 0.1 = 340 V

5. Nivel de batería

Estos datos son la carga de la batería en porcentaje

Ejemplo: 053C

  • 0x05 – tipo de dato

  • 0x3C – Nivel de batería = 60 %

6. Acelerómetro

Para obtener los valores muestreados por el sensor 3D del acelerómetro. Cada eje toma 2 bytes y la resolución es de 3.9mg

acceleration_x = x value * 3.91acceleration_y = y value * 3.91acceleration_z = z value * 3.91

Ejemplo: 08FFF9FF4700C7

  • 0x08 – tipo de dato

  • FFF9 – acceleration_x = -7 * 3.91 = - 27 mg

  • FF47 – acceleration_y = -185 * 3.91 = - 723 mg

  • 00C7 – acceleration_z = 199 * 3.91 = 778 mg

7. Velocidad

Este tipo de datos informa el valor de la velocidad en km/h

Ejemplo: 0925

  • 0x09 – tipo de dato

  • 0x25 – velocidad = 37 km/h

Consulta el Manual del Usuario SuntechST730 para instrucciones adicionales o solución de problemas en la configuración de tu hardware.

Una vez que hayas configurado el módulo para enviar datos con una de las opciones mostradas arriba, ahora podrás configurar la UbiFunction.

2. Configuración de UbiFunction

Después de entender la estructura de carga útil del Suntech ST730, para procesar estos datos antes de enviarlos a Ubidots, debemos usar la función UbiFunctions, que permite transformar y analizar los datos proporcionados por el dispositivo.

Esta función te permitirá crear una solicitud personalizada HTTP GET o HTTP POST. UbiFunction acepta NodeJS8 y Python3 como se ilustra a continuación

  1. Para crear una función, ve a tu cuenta de Ubidots –> Datos –> Funciones.

NOTA: Si no puedes ver el módulo de Funciones en el menú de tu cuenta, necesitarás habilitar el complemento por $29/mes en la sección de facturación de tu cuenta.

2. Haz clic en el ícono de más azul en la esquina superior derecha para crear una función:

3. Asigna un nombre a la función, por ejemplo, "suntech-ubidots", para identificarla más tarde en el backend de Sigfox, selecciona POST como el método HTTP desde la barra de desplazamiento y selecciona Python3 como tiempo de ejecución.


4. Haz clic en "Hacerlo en vivo" para generar una URL de punto final de API que contenga el nombre de tu función. La URL debería verse así:

5. Ahora, solo copia y pega el código a continuación en el Editor de UbiFunction. Cuando lo pegues, asigna tu TOKEN de Ubidots donde se indica:

import requestsimport structimport json#ConstantesTOKEN = "" #Asigna tu TOKEN de UbidotsBASE_URL = "https://industrial.api.ubidots.com"def data_type(data:str):    #obtener el tipo de dato     key = struct.unpack("B", bytearray.fromhex(data[0:2]))    return keydef gps_location(data:str):    #convertir la cadena a hex y tomar el big endian '>'    #f:float    data = data[:8] + '00' + data[8:] + '00'    latitude = struct.unpack(">f",bytearray.fromhex(data[2:10]))[0]    longitude = struct.unpack(">f",bytearray.fromhex(data[10:18]))[0]    payload = {    "position":{        "value":1,         "context":{            "lat": latitude,            "lng": longitude            }        }    }    return payloaddef gps_high_resolution(data:str):    latitude = struct.unpack(">f",bytearray.fromhex(data[2:10]))[0]    longitude = struct.unpack(">f",bytearray.fromhex(data[10:18]))[0]    payload = {    "position":{        "value":1,         "context":{            "lat": latitude,            "lng": longitude            }        }    }    return payloaddef temperature(data:str):    rawTemperature = struct.unpack(">B",bytearray.fromhex(data[2:4]))    if rawTemperature[0]< 127:        temperature = rawTemperature[0]/2    else:        temperature = (256-rawTemperature[0])/2    payload = {    "temperature": temperature    }    return payloaddef battery_voltage(data:str):    rawBattery = struct.unpack(">B",bytearray.fromhex(data[2:4]))    battery = rawBattery[0]/0.1    payload = {    "Battery": battery    }    return payloaddef battery_level(data:str):    battery = struct.unpack(">B",bytearray.fromhex(data[2:4]))    payload = {    "Battery": battery    }    return payloaddef accelerometer(data:str):    rawAcelaration_x = struct.unpack(">h",bytearray.fromhex(data[2:6]))    rawAcelaration_y = struct.unpack(">h",bytearray.fromhex(data[6:10]))    rawAcelaration_z = struct.unpack(">h",bytearray.fromhex(data[10:14]))    acelaration_x = rawAcelaration_x[0] * 3.91    acelaration_y = rawAcelaration_y[0] * 3.91    acelaration_z = rawAcelaration_z[0] * 3.91    payload = {    "acelaration_x": acelaration_x,    "acelaration_y": acelaration_y,    "acelaration_z": acelaration_z,    }    return payloaddef speed(data:str):    speed = struct.unpack(">B",bytearray.fromhex(data[2:4]))    payload = {    "Speed": speed    }    return payloaddef tracking(data:str):    latitude = struct.unpack(">f",bytearray.fromhex(data[4:12]))[0]    longitude = struct.unpack(">f",bytearray.fromhex(data[12:20]))[0]    rawBattery = struct.unpack(">B",bytearray.fromhex(data[22:24]))    battery = rawBattery[0]*0.5    payload = {    "Battery":{        "value":battery,         "context":{            "lat": latitude,            "lng": longitude            }        }    }    return payloadmap_functions = {    1: gps_location,    2: gps_high_resolution,    3: temperature,    4: battery_voltage,    5: battery_level,    8: accelerometer,    9: speed,    32: tracking}def send_to_ubidots(payload:str,device:str):    url = "{}/api/v1.6/devices/{}".format(BASE_URL, device)    headers = {"X-Auth-Token": TOKEN, "Content-Type": "application/json"}    req=requests.post(url,json=payload,headers=headers)    return reqdef main(args):    print(args)    #jsonData=json.loads(args)    print(args['data'])    key = data_type(args['data'])    function = map_functions.get(key[0], None)    if function is None:        return {"Status": "Modo no disponible en esta función"}    payload= function(args['data'])    req=send_to_ubidots(payload,args['device'])    # Imprime el resultado de la solicitud    print("[INFO] Resultado de la solicitud:")    print(req.text)    return {"status": "Ok", "result": req.json()}


Para ejecutar una prueba de función, por favor pega este código en el editor que aparece:

{"device": "12345", "data": "02c1b6c81cc23c5514"}

3. Configuración de Callback de Sigfox

Haz clic aquí para una introducción y documentos para configurar una llamada en el backend de Sigfox con tu dispositivo Suntech. Para esto, necesitarás usar los parámetros listados a continuación.

  • Tipo: DATA - UPLINK

  • Canal: URL

  • Configuración de carga útil personalizada: Déjalo en blanco

  • Patrón de URL: https://parse.ubidots.com/prv/iotexpo/suntech-ubidots (este es el URL generado por el parser de Ubidots en el paso anterior)

  • Usar método HTTP: POST

  • Encabezado: X-Auth-Token - {Asigna_tu_token_de_ubidots}

  • Tipo de contenido: application/json

  • Cuerpo:

{  "device": "{device}",  "data":"{data}"}

Cuando el callback se ejecute correctamente, tu backend de Sigfox se verá similar a esto:

2. Presiona "OK" para guardar todos los cambios y visualizar tu nuevo dispositivo en Ubidots.

Con esto, tu callback de Sigfox está listo y la UbiFunction está transformando correctamente los datos recibidos a la nube de Ubidots. Ahora es el momento de desarrollar tu aplicación con las herramientas de aplicación IoT sin código de Ubidots.

Ve a la sección de Dispositivos y observa un nuevo dispositivo creado con el ID de Dispositivo Suntech como nombre:


Ubidots es una Plataforma de Desarrollo de Aplicaciones de Internet de las Cosas (IoT) que empodera a los integradores de sistemas e innovadores para lanzar aplicaciones de control, monitoreo y automatización que convierten los datos de los sensores en información procesable. Contratar un equipo de ingeniería para fusionar el mundo físico con un mundo digital y crear una aplicación IoT que funcione y se vea bien es costoso tanto en tiempo como en dinero, así que lo hicimos por ti. Ubidots existe como un recurso eficiente y económico para desarrollar aplicaciones IoT basadas en la nube privada e integrar soluciones basadas en datos en empresas e investigaciones.


¿Ha quedado contestada tu pregunta?