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:
Configuración de Ubidots
Configuración de Machine Q
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:
URL: coloca la URL creada previamente en tu cuenta de Ubidots (paso 1.5.) aquí.
TokenType:
X-Auth-Token
TokenValue: Coloca tu Token de Ubidots aquí.
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: