Ir al contenido principal
Todas las coleccionesGuías de desarrollador
UbiFunctions: Integra datos de la plataforma MachineQ a Ubidots
UbiFunctions: Integra datos de la plataforma MachineQ a Ubidots

Aprende a conectar la plataforma MachineQ de Comcast a Ubidots y desarrolla tus aplicaciones de Business Intelligence con facilidad.

David Sepúlveda avatar
Escrito por David Sepúlveda
Actualizado hace más de 3 meses

La plataforma MachineQ de Comcast es una poderosa plataforma de recopilación y agregación de datos para el IoT. Conecta tus datos de MachineQ a Ubidots para desarrollar y desplegar aplicaciones de inteligencia empresarial en días, no en meses. En este artículo de UbiFunctions de Ubidots, exploraremos cómo comunicar los datos de tus dispositivos con Machine Q y luego retransmitir todos los datos a Ubidots, donde se pueden hacer inteligentes y agregar valor a tu negocio.

Contenidos:

  1. Configuración de Ubidots

  2. Configuración de Machine Q

  3. Códigos de muestra para la función de analizador de datos de Machine Q en UbiFunctions
    * DECODIFICADOR PREDEFINIDO - Python y NodeJS
    * DECODIFICADOR DESCONOCIDO - Python y NodeJS

1. Configuración de Ubidots

1. Crea una función en tu cuenta de Ubidots:

1.1 Haz clic en "Función" en la pestaña "Dispositivos" de tu encabezado de Ubidots:

1.2 Haz clic en el ícono azul "+" para crear una nueva función:

1.3 Nombra la función que describa el tipo de dispositivo que estás utilizando. Recomendamos usar el formato "Marca-Referencia", es decir, "mq-stm" o "mq-mqspark".

1.4. Selecciona "POST" como método:

1.5. Haz clic en "Hacerlo en vivo" para desplegar una URL de punto final de API que contenga el nombre de tu función. Encontrarás la URL actualizada en la Función como se muestra a continuación:

1.6. A continuación, elige tu lenguaje preferido (NodeJS o Python) y copia y pega dentro de la función los códigos de muestra que se encuentran a continuación (.py si eliges python, .txt si eliges nodejs).

2. Configuración de MACHINE Q

1. Desde tu tablero de MachineQ, navega a Perfiles de salida

2. Crea un nuevo Perfil de salida

3. Luego haz clic en "AGREGAR PERFIL REST"

4. Completa con los siguientes parámetros:

5. Completa el nombre del perfil de salida con un identificador - usamos "Ubidots" como ejemplo.

NOTA: Si tienes múltiples dispositivos de diferentes marcas, se recomienda asignar el nombre del perfil de salida basado en la marca. Por ejemplo, “ubidots-mqspark

6. Haz clic en "enviar" en la parte inferior del perfil de salida para guardar tu trabajo.

7. A continuación, navega a la Sección de Dispositivos y Editar configuraciones.

8. Edita la configuración de tu dispositivo actual

9. Selecciona un Tipo de Decodificación (si no eliges uno, MQ enviará los datos como hexadecimal y la función no funcionará correctamente) y elige el perfil de salida de Ubidots creado en paso 6.

NOTA IMPORTANTE: Los datos pueden ser recibidos de diferentes maneras, DECODIFICADOR PREDEFINIDO o DECODIFICADOR DESCONOCIDO. Según cómo se envían los datos, utiliza el código respectivo que se encuentra al final de este tutorial.

10. Enviar y Guardar la configuración de tu dispositivo.

11. Regresar a Ubidots para ver los datos reportados en tu Sección de Dispositivos. Ahora es el momento de desarrollar tu aplicación de BI con:

Códigos de Muestra para la Función de Machine Q en Ubidots

1. Usando un DECODIFICADOR PREDEFINIDO

  • Código de Muestra en Python

import requestsimport timeimport structimport binasciidef parse_data(comcast_payload):  '''  analiza la carga útil que proviene de comcast y devuelve el Token de Ubidots, DEVEUI  y las claves decoded_payload, a continuación puedes encontrar un ejemplo de carga útil  '''  ubi_token = comcast_payload.get("token", None)  ubi_device = comcast_payload.get("DevEUI", None)  ubi_payload = comcast_payload.get("decoded_payload", None)  return (ubi_token, ubi_device, ubi_payload)def send_to_ubidots(token, device, payload):  '''  Función para enviar datos a ubidots  '''  url = "http://industrial.api.ubidots.com"  url = "{}/api/v1.6/devices/{}".format(url, device)  headers = {"X-Auth-Token": token, "Content-Type": "application/json"}  status = 400  attempts = 0  print("[INFO] intentando enviar datos a Ubidots")  while status >= 400 and attempts <= 5:      req = requests.post(url=url, headers=headers, json=payload)      status = req.status_code      attempts += 1      if status >= 400:          time.sleep(1)  if status == 200 or status == 201:      print("[INFO] Datos publicados correctamente")      return True  print("[ERROR] No se pudieron publicar los datos")  return Falsedef main(comcast_payload):  print("[INFO] Intentando decodificar datos")  ubi_token, ubi_device, ubi_payload = parse_data(comcast_payload)  '''  Analiza los datos entrantes de machineQ  '''  payload = ubi_payload   if ubi_payload is not None and ubi_device is not None:      result = send_to_ubidots(ubi_token, ubi_device, ubi_payload)      return {"status": result}  print("[ERROR] No se pudieron enviar datos a Ubidots")  return {"status": False}
  • Código de Muestra en NodeJS

var request = require('request-promise');async function main(args) {      /*   Analiza la carga útil que proviene de comcast. Devolviendo:    - TOKEN de Ubidots    - EUI del Dispositivo    - Datos ya decodificados   */   // Obtener el token   var ubidots_token = args.token;     // Obtener la etiqueta del dispositivo   var device_label = args.DevEUI;     // Obtener carga útil   var data = args.decoded_payload;   // Hacer solicitud POST a Ubidots   var post_response = await send_to_ubidots(ubidots_token, device_label, data);     // Pasar la respuesta de la API de Ubidots a la respuesta de la función   return post_response;}async function send_to_ubidots(ubidots_token, device_label, data) {  /*  Función para enviar datos a ubidots  */  var options = {      method: 'POST',      url: 'https://industrial.api.ubidots.com/api/v1.6/devices/' + device_label + '?force=true',      body: data,      json: true,      headers: {          'Content-Type': 'application/json',          'X-Auth-Token': ubidots_token      }  };  return await request.post(options);}

2. Usando un DECODIFICADOR DESCONOCIDO

Los códigos proporcionados a continuación muestran cómo decodificar los datos hexadecimales recibidos de machineQ. Ten en cuenta que esto debe ser modificado según cómo se envían los datos desde el dispositivo.

Como ejemplo, supongamos que el dispositivo utilizado está enviando los datos: 0x1B37, donde el primer byte está relacionado con un valor de temperatura y el segundo con un valor de humedad, resultando en...

Datos enviados: 0x1B = 27 (temperatura), 0x37 = 55 (humedad)

  • Código de Muestra en Python

import requestsimport timeimport structimport binasciidef parse_data(comcast_payload):   '''   analiza la carga útil que proviene de comcast y devuelve el Token de Ubidots, DEVEUI   y las claves decoded_payload, a continuación puedes encontrar un ejemplo de carga útil   '''   ubi_token = comcast_payload.get("token", None)   ubi_device = comcast_payload.get("DevEUI", None)   ubi_payload = comcast_payload.get("decoded_payload", None)   ubi_payload = ubi_payload["RawData"]   return (ubi_token, ubi_device, ubi_payload)def send_to_ubidots(token, device, payload):   '''   Función para enviar datos a ubidots   '''   url = "http://industrial.api.ubidots.com"   url = "{}/api/v1.6/devices/{}".format(url, device)   headers = {"X-Auth-Token": token, "Content-Type": "application/json"}   status = 400   attempts = 0   print("[INFO] intentando enviar datos a Ubidots")   while status >= 400 and attempts <= 5:       req = requests.post(url=url, headers=headers, json=payload)       status = req.status_code       attempts += 1       if status >= 400:           time.sleep(1)   if status == 200 or status == 201:       print("[INFO] Datos publicados correctamente")       return True   print("[ERROR] No se pudieron publicar los datos")   return Falsedef main(comcast_payload):   print("[INFO] Intentando decodificar datos")   ubi_token, ubi_device, ubi_payload = parse_data(comcast_payload)   '''   Analiza los datos entrantes de machineQ   '''   payload = ubi_payload   len_payload_odd = int(round(len(payload) / 2.0) * 2.0)   fill = payload.rjust(len_payload_odd, '0')      temp_value, hum_value = struct.unpack('b'*int(len_payload_odd / 2), binascii.unhexlify(fill))     '''   Construye la carga útil que se publicará   '''   ubi_payload = {"temperature": temp_value, "humidity": hum_value}     if ubi_payload is not None and ubi_device is not None:       result = send_to_ubidots(ubi_token, ubi_device, ubi_payload)       return {"status": result}   print("[ERROR] No se pudieron enviar datos a Ubidots")   return {"status": False}
  • Código de Muestra en NodeJS

var request = require('request-promise');async function main(args) {   /*   Analiza la carga útil que proviene de comcast. Devolviendo:    - TOKEN de Ubidots    - EUI del Dispositivo    - Datos (2 bytes)   */     // Obtener el Token de Ubidots   var ubidots_token = args.token;     // Obtener la etiqueta del dispositivo   var device_label = args.DevEUI;     // Obtener carga útil   var data = args.decoded_payload.RawData;     // Analizando datos para ser publicados   var buf = new Buffer(data, 'hex');       var temperature = buf.readInt8(0);   var humidity = buf.readInt8(1);   // Construir carga útil   var payload = {"temperature": temperature, "humidity": humidity};     // Hacer solicitud POST a Ubidots   var post_response = await send_to_ubidots(ubidots_token, device_label, payload);   // Pasar la respuesta de la API de Ubidots a la respuesta de la función   return post_response;}async function send_to_ubidots(ubidots_token, device_label, data) {   /*   Función para enviar datos a ubidots   */   var options = {       method: 'POST',       url: 'https://industrial.api.ubidots.com/api/v1.6/devices/' + device_label + '?force=true',       body: data,       json: true,       headers: {           'Content-Type': 'application/json',           'X-Auth-Token': ubidots_token       }   };   return await request.post(options);}


ADVERTENCIA: Recuerda que los códigos del DECODIFICADOR DESCONOCIDO deben actualizarse siguiendo la estructura de cómo tu dispositivo está enviando los datos.


Otros usuarios también encontraron útil:

¿Ha quedado contestada tu pregunta?