Cuando comience a usar Node-RED, probablemente comience a agregar todos sus nodos a la misma pestaña en el editor. Con el tiempo, eso puede provocar un desorden de nodos y cables que dificultan encontrar partes particulares del flujo.
Pensar un poco en cómo estructurar sus flujos al comienzo de cualquier proyecto de desarrollo puede ayudar a mantenerlos organizados y facilitar su mantenimiento. El método principal para organizar los flujos en Node-RED es separarlos en varias pestañas dentro del editor. Hay algunas estrategias diferentes que se pueden utilizar para hacer eso.
Si puede identificar componentes lógicos separados de su aplicación, considere colocarlos en pestañas separadas.
Para una aplicación de automatización del hogar, puede poner la lógica de flujo para cada habitación en una pestaña separada para reflejar el espacio físico. O es posible que desee separar los flujos según la función, por lo que todos los flujos relacionados con la iluminación van en una pestaña y la calefacción en otra.
Si está creando un backend de API HTTP, cada pestaña podría representar un tipo de recurso independiente al que accede la API.
El objetivo debe ser facilitar la «lectura» de un flujo individual de principio a fin. Mantenerlo en una sola pestaña puede ayudar a lograrlo.
Otra consideración es si está trabajando junto con otros desarrolladores en la misma aplicación Node-RED. Es mucho más fácil administrar la combinación de cambios si están en pestañas separadas. Si tiene desarrolladores con diferentes roles o especializaciones, considere cómo eso puede afectar la forma en que se organizan sus flujos.
Hacer Flujos Reutilizables
A medida que crea sus flujos, es posible que encuentre algunas partes comunes que desee reutilizar en varios lugares. Debe evitar tener varias copias de esas partes comunes distribuidas en sus flujos, ya que se vuelven más difíciles de mantener; termina con varios lugares para aplicar correcciones y podría pasar por alto uno fácilmente.
Node-RED proporciona dos formas diferentes de crear flujos reutilizables: nodos de enlaces y subflujos
Los nodos de enlace (link nodes) le permiten crear un flujo que puede saltar entre pestañas en el editor; agregan un cable virtual desde el final de un flujo hasta el inicio de otro.
Los subflows le permiten crear un nuevo nodo en la paleta cuya implementación interna se describe como un flujo. Luego, puede agregar nuevas instancias del subflujo en cualquier lugar donde lo haría con un nodo normal.
Existen algunas diferencias importantes entre los dos enfoques. Los nodos de enlace no se pueden usar en medio de un flujo, donde los mensajes se pasan por el enlace y luego regresan cuando el otro flujo se completa. Solo se pueden utilizar para iniciar o finalizar un flujo. También se pueden conectar a más de un nodo de enlace. Esto le permite pasar mensajes a varios flujos o hacer que varios flujos pasen mensajes a un solo flujo. Se pueden usar dentro de una sola pestaña para ayudar a que haya flujos en el espacio de trabajo sin que haya muchos cables que se crucen de derecha a izquierda.
Los link nodes no se pueden crear entrando o saliendo de un subflujo.
Más información sobre los nodos link: https://techexplorations.com/guides/esp32/nore-red-esp32-project/node-red-link/
Los subflujos aparecen como nodos regulares, por lo que se pueden utilizar en cualquier punto de un flujo. Sin embargo, cada instancia del subflujo es independiente de las demás. Cualquier contexto de flujo dentro del subflujo se limitará a las instancias individuales. Si el subflujo crea una conexión a un sistema remoto (p.e mandar un email), cada instancia creará su propia conexión.
Subflows en Node-RED
Un subflujo es una colección de nodos que se contraen en un solo nodo en el espacio de trabajo. Se pueden usar para reducir la complejidad visual de un flujo o para agrupar un grupo de nodos como un flujo reutilizable que se usa en varios lugares.
Una vez creado, el subflujo se agrega a la paleta de nodos disponibles. Las instancias individuales del subflujo se pueden agregar al espacio de trabajo como cualquier otro nodo.
Crear Subflows
Se puede crear un subflujo seleccionando la opción “Subflow -> Create Subflow” en el menú. Esto creará un subflujo en blanco y lo abrirá en el espacio de trabajo.
También es posible convertir la selección actual de nodos a un subflujo seleccionando la opción “Subflow -> Selection to Subflow” en el menú. Los nodos se moverán a un nuevo subflujo y se reemplazarán por un nodo de instancia de subflujo dentro del flujo.
Esto solo es posible si los cables que entran en la selección están conectados a un nodo, ya que el nodo de subflujo resultante solo puede tener como máximo una entrada.
Un subflujo no puede contener una instancia de sí mismo, ni directa ni indirectamente.
Editar un Subflow
Hay dos formas de abrir un subflujo para editar su contenido. Haga doble clic en su nodo en la paleta o haga clic en el botón “Editar plantilla de flujo” en el cuadro de diálogo de edición de un nodo de instancia de subflujo.
El subflujo se abre en el espacio de trabajo como una nueva pestaña. A diferencia de las pestañas de flujo normal, las pestañas de subflujo se pueden cerrar para ocultarlas.
Las entradas y salidas del subflujo están representadas por los nodos cuadrados grises que se pueden conectar al flujo de forma normal.
La barra de herramientas ofrece opciones para agregar y eliminar estos nodos. Al igual que con los nodos de flujos normales, puede haber como máximo una entrada y tantas salidas como sea necesario.
La barra de herramientas ofrece una opción para agregar una salida de “estado” a un subflujo. Esto se puede utilizar para actualizar el estado de los nodos de instancia de subflujo. Lo que haya en payload y se mande al node ‘status’, se mostrará en el esatdo del subflow. También se puede usar el nodo ‘status’ y mandar al estado del subflow para mostrarlo.
El botón «editar propiedades» abre el cuadro de diálogo de propiedades del subflujo. Al igual que con el cuadro de diálogo Propiedades del flujo, se puede establecer el nombre y la descripción del subflujo.
- Propiedades: propiedades por instancia que se exponen como variables de entorno dentro del subflujo.
- Descripción: documentación por nodo formateada con Markdown. Esto se muestra en la barra lateral de Información cuando se selecciona el nodo.
- Apariencia: opciones para personalizar la apariencia del nodo.
La pestaña Apariencia ofrece opciones para:
- cambiar la categoría de paleta en la que aparece el nodo
- seleccione si se muestra la etiqueta del nodo
- cambiar el color del nodo
- cambiar el icono del nodo
- proporcionar etiquetas de puerto personalizadas.
Personalizar Subflows
Al crear subflujos, es posible que desee poder personalizar su comportamiento de alguna manera. Por ejemplo, cambiar el tema de MQTT en el que publica. Un patrón para hacer eso es establecer msg.topic en cada mensaje que se pasa al subflujo. Pero eso requiere agregar un nodo Cambiar delante de cada instancia de subflujo para establecer el valor deseado.
Una forma más sencilla de hacerlo es mediante las propiedades de subflujo. Estas son propiedades que se pueden establecer en la instancia de subflujo y aparecen como variables de entorno dentro del subflujo.
La pestaña “Propiedades” del cuadro de diálogo de edición se puede utilizar para definir un conjunto de propiedades que luego se pueden personalizar para cada instancia del subflujo. Luego, las propiedades se exponen como variables de entorno dentro del subflujo.
Cada entrada en la tabla de propiedades se puede expandir para personalizar cómo se muestra cuando se edita una instancia del subflujo. La pestaña “Vista previa de la interfaz de usuario” proporciona una vista previa de cómo aparecerán.
En la propia instancia de subflow puedes añadir variables de entorno para solo esa instancia.
El valor que se pone es el valor por defecto y en la personalización puedo añadir el icono, label y el input type que puede ser de tipo:
- input
- credential
- select
- checkbox
- spinner
Por ejemplo, para que dentro de un subflow publique en un topic que se defina como una variable de entorno y que se indica al crear el nodo, se pone como:
Entonces añadir MY_TOPIC como una propiedad del subflow.
Cuando un usuario edita una instancia individual, puede proporcionar un valor personalizado para MY_TOPIC para esa instancia del subflow.
Este patrón se puede aplicar a cualquier campo de configuración de nodo que le permita ingresar el valor directamente. Actualmente, no funciona para campos que se exponen como checkboxes u otros elementos personalizados de la IU.
Contexto en Subflow
Para los nodos en un subflujo, el contexto del flujo lo comparten esos nodos y no el flujo en el que se encuentra el subflujo. Los nodos dentro de un subflujo pueden acceder al contexto del flujo principal anteponiendo $parent. a la clave de contexto: var colour = flow.get(«$parent.colour»);
Las variables de flow creadas dentro de un subflow, no se ven en el “context data”.
Captura de errores en un Subflow
Si se registra un error desde el interior de un subflow, el tiempo de ejecución primero comprobará si hay nodos Catch dentro del subflujo. Si no hay ninguno allí, el error se propagará hasta el flujo que contiene la instancia del subflujo.
En el caso del estado de del subflow, se puede detectar dentro del subflow con el nodo “status” o desde el flujo que contiene el subflow, también con el nodo “status”.
Borrar un Subflow
El botón «delete subflow» de la barra de herramientas del subflujo se puede utilizar para eliminar el subflujo y todas las instancias del mismo.
Más información de Subflows:
- https://www.youtube.com/watch?v=EeHw2Uf9y0E
- https://www.youtube.com/watch?v=zdDdBG_zuLU
- https://thewindev.net/creating-subflows-in-node-red
Exportable Subflows
En próximas versiones de Node-RED va a estar disponible los Subflows exportables. Se quiere facilitar a los usuarios la creación de sus propios nodos y compartirlos con la comunidad. El objetivo es permitir que los subflujos se publiquen como módulos de nodo adecuados que luego se puedan instalar como cualquier otro nodo de la biblioteca.
El trabajo ya está en marcha en esto: hay un borrador de PR (Pull Request) que agrega soporte básico para cargar subflujos en el tiempo de ejecución desde un módulo.
Ejemplo de Subflow
Ejemplo de subflow simple con un if then else. Consiste en crear unas variables de entorno MAX y MIN y en función de ellas enrutar. Estas variables tienen un valor por defecto de 100 en el MAX y de 0 en el MIN.
[{"id":"88bbe218.63673","type":"subflow","name":"Subflow 1","info":"","category":"","in":[{"x":50,"y":30,"wires":[{"id":"ab7f195c.aa0308"}]}],"out":[{"x":340,"y":200,"wires":[{"id":"ab7f195c.aa0308","port":"2"}]},{"x":340,"y":80,"wires":[{"id":"ab7f195c.aa0308","port":"0"}]},{"x":340,"y":140,"wires":[{"id":"ab7f195c.aa0308","port":"1"}]}],"env":[{"name":"MAX","type":"num","value":"100","ui":{"icon":"font-awesome/fa-thermometer-full","type":"spinner"}},{"name":"MIN","type":"num","value":"0","ui":{"icon":"font-awesome/fa-thermometer-empty","type":"spinner"}}],"color":"#DDAA99"},{"id":"ab7f195c.aa0308","type":"switch","z":"88bbe218.63673","name":"If else","property":"payload","propertyType":"msg","rules":[{"t":"lt","v":"MIN","vt":"env"},{"t":"gt","v":"MAX","vt":"env"},{"t":"else"}],"checkall":"true","repair":false,"outputs":3,"x":160,"y":140,"wires":[[],[],[]]},{"id":"95c32f11.1ede8","type":"tab","label":"Ejemplo Subflow","disabled":false,"info":""},{"id":"cf06a908.bb4758","type":"subflow:88bbe218.63673","z":"95c32f11.1ede8","name":"","env":[],"x":380,"y":80,"wires":[["98bc246e.47db78"],["11198781.6b7008"],["e488842f.92dd48"]]},{"id":"614a918a.f2d9","type":"inject","z":"95c32f11.1ede8","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"-1","payloadType":"str","x":130,"y":80,"wires":[["cf06a908.bb4758"]]},{"id":"98bc246e.47db78","type":"debug","z":"95c32f11.1ede8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":670,"y":60,"wires":[]},{"id":"11198781.6b7008","type":"debug","z":"95c32f11.1ede8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":670,"y":100,"wires":[]},{"id":"e488842f.92dd48","type":"debug","z":"95c32f11.1ede8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":670,"y":140,"wires":[]}]
Pingback: Saber Más Node-RED Developer | Aprendiendo Arduino
Pingback: Diario del Curso IoT, Smart Cities y Node-RED | Aprendiendo Arduino