- 19 May 2025
- Imprimir
- DF
Cambio de Receta usando Node-RED y HTTP
- Actualizado el 19 May 2025
- Imprimir
- DF
Esta guía muestra cómo cambiar recetas en la cámara OV20i utilizando solicitudes HTTP en Node-RED. Crearás un flujo que permite cambiar dinámicamente entre recetas mediante simples llamadas a una API.
Vista General
La cámara OV20i admite el cambio de recetas mediante solicitudes HTTP, lo que te permite alternar entre diferentes configuraciones de inspección de forma programada y sin intervención manual. Esto es especialmente útil en entornos de producción donde distintos productos requieren configuraciones distintas de inspección. En esta guía, usaremos Node-RED como herramienta para activarlo.
Requisitos Previos
Antes de comenzar, necesitarás lo siguiente:
- Cámara OV20i encendida y conectada
- Acceso al modo avanzado de Node-RED
- Al menos dos recetas creadas en tu cámara
- Conocimientos básicos sobre solicitudes HTTP
Construcción del Flujo en Node-RED
1. Crear el Flujo Base
- Abre la interfaz de Node-RED
- Agrega un nodo inject al espacio de trabajo
- Agrega un nodo function al espacio de trabajo
- Agrega un nodo http request
- Conecta los nodos como se muestra a continuación
2. Configurar los Nodos
Para que la solicitud HTTP funcione, se debe enviar un objeto de mensaje al Endpoint correspondiente a la receta. Debido a eso, el flujo requiere configurar los tres nodos.
- Configurar el nodo [inject]
- Haz doble clic en el nodo inject
- En [msg.payload] escribe: [#Número único de receta]
- Guardar
El número único de receta no es el mismo que el número de receta del PLC. Este número puede encontrarse en la parte superior de la URL cuando una receta está activa. Cambia dependiendo de la receta y no hay dos iguales.
- Configurar el nodo [function]
- Haz doble clic en el nodo function
- Inserta esta lógica dentro del nodo:
- Guardar
let recipeID = msg.payload;
msg.headers = {
'Content-Type': 'application/json'
};
msg.payload = JSON.stringify({ id: recipeID });
return msg;
La solicitud HTTP tipo POST requiere que los datos estén estructurados correctamente en un arreglo. Por eso se usa una función para darles el formato adecuado. El mensaje enviado debe incluir msg.headers y msg.payload; si alguno de los dos no está bien configurado, no funcionará.
- Configurar el nodo [HTTP request]
- Haz doble clic en el nodo HTTP
- Configura el [method] como: POST
- Cambia la [URL] a: localhost:5001/pipeline/activate
3. Agregar Manejo de Respuesta
- Agrega un nodo debug después del nodo HTTP
- Configúralo para mostrar el objeto de mensaje completo
- Haz clic en Deploy para desplegar el flujo y probar la conexión
Pruebas y Verificación
Para verificar que todo esté funcionando correctamente:
- Haz clic en el botón del nodo inject para disparar la solicitud HTTP
- Revisa el panel debug para ver la respuesta
- Verifica que la cámara haya cambiado a la receta especificada
Resultado esperado:
Si la configuración del nodo es correcta, la receta cambiará a la deseada.
Si hay algún error en el flujo, aparecerá una respuesta en el debug con "success": false.
Ejemplo Completo del Flujo
Como referencia, aquí tienes el flujo completo en formato JSON que puedes importar directamente a Node-RED:
[
{
"id": "b5238f8d4507ccf4",
"type": "function",
"z": "6e6e08c3c76c7987",
"name": "Set JSON Payload",
"func": "let recipeID = msg.payload;\n\nmsg.headers = {\n 'Content-Type': 'application/json'\n};\nmsg.payload = JSON.stringify({ id: recipeID }); \nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 350,
"y": 300,
"wires": [
[
"8936e614d67306e3",
"aa98933f4f267615"
]
]
},
{
"id": "e224efdee3be4a3e",
"type": "debug",
"z": "6e6e08c3c76c7987",
"name": "Debug Response",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 810,
"y": 300,
"wires": []
},
{
"id": "8936e614d67306e3",
"type": "debug",
"z": "6e6e08c3c76c7987",
"name": "Debug Response",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 570,
"y": 260,
"wires": []
},
{
"id": "4b0e8a7a6eafced8",
"type": "inject",
"z": "6e6e08c3c76c7987",
"name": "Insert number",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "11",
"payloadType": "str",
"x": 150,
"y": 300,
"wires": [
[
"b5238f8d4507ccf4"
]
]
},
{
"id": "aa98933f4f267615",
"type": "http request",
"z": "6e6e08c3c76c7987",
"name": "POST to Recipe Endpoint",
"method": "POST",
"ret": "txt",
"paytoqs": "ignore",
"url": "localhost:5001/pipeline/activate",
"tls": "",
"persist": false,
"proxy": "",
"insecureHTTPParser": false,
"authType": "",
"senderr": false,
"headers": [],
"x": 590,
"y": 300,
"wires": [
[
"e224efdee3be4a3e"
]
]
},
{
"id": "449e298c0b326a9a",
"type": "comment",
"z": "6e6e08c3c76c7987",
"name": "Insert the number of recipe in inject",
"info": "",
"x": 180,
"y": 240,
"wires": []
},
{
"id": "c66c7133edffb7ed",
"type": "comment",
"z": "6e6e08c3c76c7987",
"name": "Sets message for HTTP",
"info": "",
"x": 340,
"y": 340,
"wires": []
},
{
"id": "bd7fea04b31c534d",
"type": "comment",
"z": "6e6e08c3c76c7987",
"name": "Message post on endpoint for recipe change",
"info": "",
"x": 650,
"y": 340,
"wires": []
}
]