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.
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
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.