Ir al contenido principal

Configurar el ADAM-6050: E/S Advantech a la nube por MQTT

Publica las 12 entradas y 6 salidas digitales del Advantech ADAM-6050 en Ubidots por MQTT, sin gateway: ajustes del Utility, tópicos y función decodificadora.

Escrito por Sergio M

El Advantech ADAM-6050 es un módulo de E/S Ethernet con 12 entradas y 6 salidas digitales. Con firmware MQTT, publica el estado de sus E/S directamente en la nube, sin un gateway de por medio. Esta guía envía esos datos a Ubidots. El módulo publica en una UbiFunction, que convierte el formato de mensaje de Advantech en una variable de Ubidots por canal.

Al terminar, Ubidots muestra un dispositivo con una variable por canal: di1 a di12 para las entradas, do1 a do6 para el estado de las salidas y online para la conexión.

El dispositivo ADAM-6050 en Ubidots, con una tarjeta por cada variable de canal: di1, di2, di3 y las demás

Requisitos

  • Un ADAM-6050-D o ADAM-6050-D1. Las revisiones anteriores -CE y -BE no soportan MQTT. Para esas, consulta las preguntas frecuentes al final.

  • Firmware V6.15 o posterior, de la página de firmware del ADAM-6050 de Advantech. Sobrescribir los tópicos MQTT requiere como mínimo V6.11 B41.

  • Un PC con Windows y Adam/Apax .NET Utility V2.05.11 B23 o posterior.

  • Una red que permita al módulo llegar a functions.ubidots.com por el puerto 1883, o el 8883 con TLS.

Cómo llegan los datos a Ubidots

El ADAM-6050 publica un formato JSON fijo: una clave por canal con valor true/false, más cuatro claves que Advantech reserva (s, t, q y c):

{"s":1,"t":0,"q":192,"c":1,"di1":true,"di2":false,...,"di12":true,"do1":false,...,"do6":false}

Puedes renombrar las claves, pero no puedes quitar las reservadas ni cambiar los valores true/false. Por eso el módulo publica en una UbiFunction en functions.ubidots.com y no directamente en el broker de Ubidots. La función descarta las claves reservadas, convierte true/false en 1/0 y escribe cada canal como una variable de un mismo dispositivo.

El endpoint de funciones solo acepta mensajes publicados bajo /prv/<tu-usuario>/ y rechaza las suscripciones. El ADAM-6050, además, se suscribe a sus propios tópicos de control (Advantech/<MAC>/ctl/...) cada vez que se conecta, y eso no se puede desactivar. Los pasos de abajo redirigen todos los mensajes que el módulo permite redirigir y apagan los mensajes de configuración que publica en tópicos fijos de Advantech. Si aun así la conexión se cae una y otra vez, consulta Solución de problemas.

1. Crea la función decodificadora en Ubidots

  • En tu cuenta de Ubidots, ve a Dev Center → Functions y haz clic en + para crear una función.

  • Pon adam-6050-decoder en Name, POST en Method y Python 3.14 Lite en Runtime.

  • Borra el código de ejemplo y pega el código de abajo. Reemplaza PUT-YOUR-TOKEN-HERE por tu token de Ubidots.

  • Guarda la función.

import json
import requests

BASE_URL = "https://industrial.api.ubidots.com"
TOKEN = "PUT-YOUR-TOKEN-HERE"

# Keys the ADAM adds to every message. Advantech reserves them, so they are skipped.
RESERVED = {"s", "t", "q", "c"}


def main(args):
payload = args.get("payload") or {}
if isinstance(payload, str):
payload = json.loads(payload)

# Topic: /prv/<username>/<function-label>/<device-label>[/status]
parts = args["topic"].strip("/").split("/")
device_label = parts[3].lower() if len(parts) > 3 else "adam-6050"

if "status" in payload:
# Will topic: "connect" when the module connects, "disconnect" when it drops
values = {"online": 1 if payload["status"] == "connect" else 0}
else:
values = {}
for key, value in payload.items():
if key in RESERVED:
continue
if isinstance(value, bool):
value = int(value)
if isinstance(value, (int, float)):
values[key.lower()] = value

if not values:
return {"status": "ignored"}

response = requests.post(
f"{BASE_URL}/api/v1.6/devices/{device_label}/",
headers={"X-Auth-Token": TOKEN, "Content-Type": "application/json"},
json=values,
timeout=10,
)
return {"status": response.status_code, "text": response.text}

Copia el label de la función desde la URL de su endpoint HTTPS, que termina en /prv/<tu-usuario>/<label-de-la-funcion>. No lo escribas a partir del nombre, porque el label puede ser distinto, por ejemplo con guiones bajos en lugar de guiones. Lo vas a usar en los tópicos del módulo en el paso 3.

2. Encuentra el ADAM-6050 y actualiza su firmware

  • Conecta el ADAM-6050 a la alimentación y a tu red con un cable Ethernet. Su dirección IP por defecto es 10.0.0.1.

  • Abre Adam/Apax .NET Utility, haz clic derecho en la entrada Ethernet y haz clic en Search Device. El módulo aparece en el árbol de dispositivos.

  • Selecciona el módulo. La pestaña Information muestra su Firmware Version. Cuando apliques cambios, el Utility te pide la contraseña del módulo, 00000000 por defecto.

  • Asigna una dirección IP, máscara de subred y gateway de tu red para que el módulo pueda salir a internet.

  • Si el firmware es anterior a V6.15, actualízalo a la versión más reciente. La página de firmware de Advantech indica el orden: primero V6.05 B00, luego V6.14 B00 y después V6.15.

Adam/Apax .NET Utility: clic derecho en Ethernet y luego Search Device

El ADAM-6050 en el árbol de dispositivos, con su versión de firmware en la pestaña Information

3. Configura MQTT en el ADAM-6050

En el Utility, selecciona el módulo y abre la pestaña Cloud y luego la subpestaña IOT.

Conexión

  • Pub/Sub Service: ADAM MQTT

  • Host: functions.ubidots.com

  • Port: 1883. Deja TLS apagado por ahora. Lo activas cuando ya lleguen datos.

  • User Name: el nombre de usuario de tu cuenta de Ubidots

  • Password: tu token de Ubidots

  • Publish Interval: 60000 ms. El valor por defecto es 5000 ms. Cada publicación es una ejecución de la función con 18 valores, así que cada 5 segundos son unas 17.000 ejecuciones al día. Los cambios en una entrada digital también disparan una publicación, limitada por Deadband, así que un intervalo más largo igual registra cada cambio.

  • Heartbeat, Retain Message y Deadband: deja los valores por defecto.


Nota: el endpoint de funciones recibe tu nombre de usuario como usuario MQTT y tu token como contraseña. Es al revés que en el broker principal de Ubidots, donde el token es el usuario.


Publica solo el tópico de datos

En Basic Settings, la lista Publish Topic muestra todos los tópicos que publica el módulo. Deja marcado el primero, Advantech/<MAC>/data, y desmarca los demás. Esos llevan datos de configuración a tópicos fijos de Advantech que el endpoint de funciones no acepta. Si tu versión del Utility muestra Publish Value Mode, déjalo apagado, porque también publica cada canal en tópicos fijos.

Haz clic en Apply.

La pestaña Cloud, subpestaña IOT: Pub/Sub Service, Host, Port, TLS, User Name y Password, Heartbeat, Publish Interval, Deadband y la lista Publish Topic

La captura muestra los valores de ejemplo de Advantech, con una dirección IP como Host y TLS en el puerto 8883. Usa los valores de la lista de arriba.

Apunta los tópicos y mensajes a la función

Abre Advanced Settings y luego la subpestaña Publish, y configura:

  • User Defined MQTT Publish: marca Enable.

  • Overwrite Will Topic Name: /prv/<tu-usuario>/<label-de-la-funcion>/<label-del-dispositivo>/status. El will topic por defecto está fuera de /prv/, y el endpoint puede rechazar la conexión por eso.

  • Overwrite Will Message: {"status":"disconnect"}

  • Overwrite Connect Message: {"status":"connect"}

  • Overwrite Publish Topic Name: /prv/<tu-usuario>/<label-de-la-funcion>/<label-del-dispositivo>. La última parte se convierte en el label del dispositivo en Ubidots. Por ejemplo: /prv/acme/adam-6050-decoder/adam-6050.

Haz clic en Apply Advanced Settings.

Advanced Settings, subpestaña Publish: User Defined MQTT Publish, Overwrite Will Topic Name, Overwrite Will Message, Overwrite Connect Message y Overwrite Publish Topic Name

Los mensajes de conexión y desconexión llegan a la función por el tópico /status, y la función los convierte en la variable online.

4. Revisa los datos en Ubidots

  • En el Utility, abre Cloud → Diagnosis. MQTT Connection State muestra Connected, MQTT Heart Count sigue subiendo y MQTT Diagnostic Information lista una entrada Publish por cada mensaje.

  • En Ubidots, ve a Devices. Aparece un dispositivo con el label que definiste, con las variables di1 a di12, do1 a do6 y online, cada una en 1 o 0. Ubidots le pone al dispositivo el nombre de su label; puedes cambiarlo, como en la captura.

La subpestaña Diagnosis: MQTT Connection State en Connected, el contador de heartbeat y una lista de entradas Publish

Después de un corte de energía o de red repentino, el módulo no alcanza a enviar su mensaje de desconexión, así que online puede seguir en 1. Para recibir un aviso cuando el módulo deje de reportar, configura un evento de inactividad en el dispositivo.

5. Opcional: cifra la conexión con TLS

Cuando ya lleguen datos por el puerto 1883, vuelve a Cloud → IOT, marca TLS: Enable, cambia Port a 8883 y haz clic en Apply. El endpoint acepta las suites de cifrado TLS 1.2 del módulo.

Deja Use TLS Certificate y Verify Certificate date sin marcar. El módulo solo carga certificados CA mediante la actualización remota (OTA) de Advantech, que necesita un broker capaz de enviarle comandos al módulo. La conexión queda cifrada, pero el módulo no verifica el certificado del servidor. Si cargas un certificado CA por otra vía, usa ISRG Root X1 y ajusta el reloj del módulo en la pestaña SNTP para que las fechas del certificado sean válidas.

Solución de problemas: ¿por qué no llegan datos a Ubidots?

  • Diagnosis muestra el módulo desconectado. Revisa que Host sea functions.ubidots.com y que el puerto coincida con el ajuste de TLS (1883 apagado, 8883 activado). El usuario debe ser el nombre de usuario de tu cuenta y la contraseña tu token. Revisa también que el gateway del módulo tenga salida a internet.

  • La conexión se cae justo después de conectarse, una y otra vez. Diagnosis reporta que el broker se desconectó después de la conexión. Primero revisa que solo el tópico de datos esté marcado en Publish Topic y que el will topic esté sobrescrito. Si se sigue cayendo, el endpoint está cerrando la conexión por las suscripciones integradas del módulo. Pon un puente adelante: un broker Mosquitto local o un flujo de Node-RED que reciba los mensajes del módulo y reenvíe solo los tópicos de datos y de estado a functions.ubidots.com. Para una flota, Ubidots también puede asignar un broker dedicado a tu función; contacta a ventas de Ubidots.

  • Conectado, pero no aparece ningún dispositivo. El tópico de datos debe empezar por /prv/<tu-usuario>/<label-de-la-funcion>/, con el label copiado del endpoint de la función, y el método de la función debe ser POST. Abre los logs de la función para ver si se ejecutó. Si Diagnosis no lista entradas Publish, actualiza el firmware a la versión V6.15 más reciente: se reportaron versiones anteriores que se conectaban sin publicar.

  • La función se ejecuta pero devuelve 401 o 403. El token del código está mal o fue eliminado.

  • Los valores se actualizan tarde. Baja el Publish Interval. Los cambios en las entradas digitales se publican de inmediato, dentro del tiempo de Deadband.

Preguntas frecuentes

¿Qué modelos del ADAM-6050 soportan MQTT?

El ADAM-6050-D y el -D1. MQTT llegó con el firmware V6.01 B11, el usuario y la contraseña con V6.02 B01, y la sobrescritura de tópicos con V6.11 B41. Usa V6.15 o posterior. La revisión -CE (firmware 5.x) y la -BE (4.x) no soportan MQTT.

¿El ADAM-6050 puede publicar directamente en el broker de Ubidots, sin función?

El tópico se puede configurar como un tópico de dispositivo de Ubidots, pero el mensaje no se puede cambiar lo suficiente. Siempre incluye las cuatro claves reservadas, que llegarían como cuatro variables de más, y envía true/false en lugar de números. La función resuelve ambos problemas.

¿Ubidots puede activar las salidas del ADAM-6050?

No con esta configuración. El endpoint de funciones solo recibe datos, así que los datos van en un solo sentido, del módulo a Ubidots. El estado de las salidas llega en las variables do1 a do6.

¿La misma función sirve para otros módulos ADAM-6000?

La función no depende de los nombres de canal del ADAM-6050. Escribe todas las claves numéricas o true/false que recibe, así que varios módulos pueden compartirla. Dale a cada módulo su propio label de dispositivo al final de sus tópicos.

Mi ADAM-6050 es una revisión anterior sin MQTT. ¿Qué opciones tengo?

Consúltalo por Modbus TCP desde un gateway y deja que el gateway envíe los datos a Ubidots. Consulta Modbus TCP en EdgeLink Studio: ECU-1051 y ADAM-6717 para el ECU-1051, o Usa vNode para sondear datos de sensores utilizando Modbus TCP.

Otras guías de Advantech

¿Ha quedado contestada tu pregunta?