Activación con MQTT y Node-Red
  • 15 May 2025
  • DF

Activación con MQTT y Node-Red

  • DF

Resumen del artículo

Esta guía te explicará cómo configurar y usar la comunicación MQTT para activar la OV20i usando Node-RED. Al finalizar, podrás activar remotamente la captura y el procesamiento de imágenes mediante mensajes MQTT.


Vista General

MQTT (Message Queuing Telemetry Transport) es un protocolo de mensajería ligero, ideal para dispositivos IoT. Usar MQTT con la OV20i permite activar la cámara de forma remota y comunicarte con otros sistemas en tu red. Este enfoque es especialmente útil en entornos de producción donde necesitas integrar la cámara con otros sistemas automatizados.

Requisitos Previos

Antes de comenzar, es necesario tener lo siguiente:

  • Cámara OV20i conectada a tu red
  • Node-RED instalado y configurado
  • Un broker MQTT configurado (puede configurarse dentro de Node-RED)
  • Conocimiento básico sobre flujos en Node-RED
  • Cámara configurada con una receta funcional
  • El disparo de la cámara debe estar configurado como Disparo manual en la configuración de imagen
Nota

Si aún no has configurado la comunicación MQTT, consulta primero la guía de Configuración de Comunicación MQTT.

Configuración del Flujo para MQTT

* Configurar la conexión con el Broker MQTT

  1. Abre tu editor de Node-RED en el navegador
  2. Arrastra un nodo mqtt-in desde la librería a tu espacio de trabajo
  3. Haz doble clic en el nodo para abrir sus propiedades
  4. Haz clic en el ícono del lápiz junto al campo Server para agregar un nuevo broker
  5. Configura el broker con los siguientes datos:
    • Nombre: Broker MQTT Cámara
    • Servidor: Dirección IP de tu broker (ejemplo: 192.168.1.100) o localhost
    • Puerto: 1883 (puerto por defecto de MQTT)
    • Client ID: Puedes dejarlo vacío para que se genere automáticamente
  6. Haz clic en Add para guardar la configuración del broker

image.png
image.png

* Configurar el Flujo

Para que la solicitud MQTT funcione, se deben enviar objetos de mensaje a distintos topics. En este flujo, se deben enviar 2 mensajes. El primero pone la cámara en modo HMI y el segundo solicita el disparo de la cámara

image.png

  1. Configurar el nodo Inject

    • Haz doble clic en el nodo [Inject]
    • [msg.payload]: puede dejarse como timestamp, ya que funcionará como punto de inicio o pulso para activar la cámara
    • Guardar
  2. Configurar el primer nodo Change

    • Haz doble clic en el nodo change
    • Configura estas dos reglas:
      • Haz clic en "Agregar" → SET → msg.topic con el valor: stream_mode/set
      • Haz clic en "Agregar" nuevamente → SET → msg.payload con el valor: HMI_MODE
    • Guardar

image.png

  1. Configurar el segundo nodo Change

    • Haz doble clic en el nodo [Change]
    • Configura estas dos reglas:
      • Haz clic en "Agregar" → SET → msg.topic con el valor: hmi/?/capture_mode
      • Haz clic en "Agregar" nuevamente → SET → msg.payload con el valor: single
    • Guardar

image.png

Importante

El número de receta único no es el mismo que el número de receta del PLC. El número de receta puede encontrarse en la parte superior de la URL de una receta activa. Cambiará según la receta y no habrá dos iguales.

image.png

  1. Conectar al nodo [Mqtt-in] que ya configuraste

Pruebas y Verificación

Para verificar que la configuración funcione correctamente:

  1. Haz clic en el botón del nodo inject para activar la solicitud MQTT
  2. Revisa el panel debug
  3. Verifica que la cámara haya tomado una fotografía. Una forma sencilla de confirmarlo es si aparece un nuevo mensaje en el debug del nodo AllBlocksOutput

Ejemplo Completo del Flujo

Como referencia, aquí tienes el flujo completo en formato JSON que puedes importar directamente en Node-RED:

[
    {
        "id": "80474d6fc128742d",
        "type": "mqtt out",
        "z": "6e6e08c3c76c7987",
        "name": "",
        "topic": "",
        "qos": "0",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "5628611a59df452b",
        "x": 850,
        "y": 860,
        "wires": []
    },
    {
        "id": "51e487a95039d080",
        "type": "change",
        "z": "6e6e08c3c76c7987",
        "name": "Set Payload 1",
        "rules": [
            {
                "p": "topic",
                "t": "set",
                "pt": "msg",
                "to": "stream_mode/set",
                "tot": "str"
            },
            {
                "p": "payload",
                "t": "set",
                "pt": "msg",
                "to": "HMI_MODE",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 680,
        "y": 860,
        "wires": [
            [
                "80474d6fc128742d"
            ]
        ]
    },
    {
        "id": "a6d5a4132ed1f39d",
        "type": "change",
        "z": "6e6e08c3c76c7987",
        "name": "Set Payload 2",
        "rules": [
            {
                "p": "topic",
                "t": "set",
                "pt": "msg",
                "to": "hmi/10/capture_mode",
                "tot": "str"
            },
            {
                "p": "payload",
                "t": "set",
                "pt": "msg",
                "to": "single",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 680,
        "y": 900,
        "wires": [
            [
                "80474d6fc128742d"
            ]
        ]
    },
    {
        "id": "25f5166b2886fcc7",
        "type": "delay",
        "z": "6e6e08c3c76c7987",
        "name": "",
        "pauseType": "delay",
        "timeout": "10",
        "timeoutUnits": "milliseconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "allowrate": false,
        "outputs": 1,
        "x": 510,
        "y": 900,
        "wires": [
            [
                "a6d5a4132ed1f39d"
            ]
        ]
    },
    {
        "id": "1435d7b97a321f86",
        "type": "inject",
        "z": "6e6e08c3c76c7987",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 320,
        "y": 860,
        "wires": [
            [
                "25f5166b2886fcc7",
                "51e487a95039d080"
            ]
        ]
    },
    {
        "id": "5628611a59df452b",
        "type": "mqtt-broker",
        "name": "",
        "broker": "localhost",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "4",
        "keepalive": "60",
        "cleansession": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthRetain": "false",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "",
        "closeQos": "0",
        "closeRetain": "false",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "",
        "willQos": "0",
        "willRetain": "false",
        "willPayload": "",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    }
]


¿Fue útil este artículo?

ESC

Eddy AI, una IA generativa, que facilita el descubrimiento de conocimiento a través de la inteligencia conversacional