NodeRED III: nodo función

En la entrada anterior, NodeRED II: nodos principales, presente el funcionamiento de unos nodos mediante ejemplos. En la presente entrada, NodeRED III: nodo función, me centraré en el nodo función con el cual podremos definir una función definida en código Java Script empleando el nodo Function.

La descripción funcional del conjunto de flujos de trabajo definidos en la entrada son los siguientes:

  • Ejemplo 1: función básica.- Definición de un flujo de trabajo con una función básica.
  • Ejemplo 2: función y sentencias condicionales.- Definición de un flujo de trabajo con una función en donde se emplean sentencias condicionales.
  • Ejemplo 3: función y salidas múltiples.- Definición de un flujo de trabajo con una función de salida múltiple.
  • Ejemplo 4: función y bucles.- Definición de un flujo de trabajo con una función en donde se aplican bucles.
  • Ejemplo 5: función variables de entorno y trazas.- Definición de un flujo de trabajo con una función en donde se trabaja variables de contexto y trazas.
  • Ejemplo 6: función variables de entorno.- Definición de un flujo de trabajo con una función en donde se trabaja con variables de contexto.

Ejemplo 1: función básica.

En el flujo de trabajo del ejemplo 1, se define un nodo inyección en donde se inicia el arranque del flujo; se define un nodo función; y, por último, se define un nodo debug para mostrar por consola el resultado y la trazabilidad.

La función del nodo función flujo define una funcionalidad en el evento «On Message», la funcionalidad definida en este evento es muy sencilla: definición de una variable xyx, definición de una variable newMsg, la cual almacena la longitud del string pasado en el objeto msg, y el retorno de la variable msg. La función realiza la escritura de dos trazas en la consola de log: la primera de tipo warning y la segunda de tipo log.

Desde un punto de vista gráfico, el ejemplo con el código de la función y una ejecución en la consola de NodeRed queda representada en la siguiente imagen de la captura de pantalla del interfaz visual:

Figura 1: definición del flujo y código del ejemplo 1.

Ejemplo 2: función y sentencias condicionales.

En el flujo de trabajo del ejemplo 2, se define un nodo inyección en donde se inicia el arranque del flujo; se define un nodo función; dos nodos template para procesar la salida; y, por último, dos nodos debug para mostrar por consola el resultado y la trazabilidad de la ejecución.

La funcionalidad del nodo función define una funcionalidad en el evento «On Message», la funcionalidad definida en este evento es la siguiente: definición de una variable de tipo lista; una sentencia condicional la cual asigna un valor para cada condición; dos nodos template para parsear la salida; y, por último, los nodos debug para mostrar por consola el resultado.

Desde un punto de vista gráfico, el ejemplo con el código de la función y una ejecución en la consola de NodeRed queda representada en la siguiente imagen de la captura de pantalla del interfaz visual:

Figura 2: definición del flujo y código del ejemplo 2.

Ejemplo 3: función y salidas múltiples.

En el flujo de trabajo del ejemplo 3, se define un nodo inyección en donde se inicia el arranque del flujo; se define un nodo función; dos nodos template para procesar la salida; y, por último, dos nodos debug para mostrar por consola el resultado y la trazabilidad de la ejecución.

La funcionalidad del nodo función define una funcionalidad en el evento «On Message», la funcionalidad definida en este evento es la siguiente: definición de cuatro variables de tipo diccionario y, como salida, retorno una estructura de tipo lista con las variables definidas.

Desde un punto de vista gráfico, el ejemplo con el código de la función y una ejecución en la consola de NodeRed queda representada en la siguiente imagen de la captura de pantalla del interfaz visual:

Figura 3: definición del flujo y código del ejemplo 3.

Ejemplo 4: función y bucles.

En el flujo de trabajo del ejemplo 4, se define un nodo inyección en donde se inicia el arranque del flujo; se define un nodo función; un nodo template para procesar la salida; y, por último, dos nodos debug para mostrar por consola el resultado y la trazabilidad de la ejecución.

La funcionalidad del nodo función define una funcionalidad en el evento «On Message», la funcionalidad definida en este evento es la siguiente: definición de un variable de tipo lista, definición de una variable lista con el contenido del string pasado por parámetro, un bucle que recorre las palabras string y, como salida, retorna la estructura con las palabras.

Desde un punto de vista gráfico, el ejemplo con el código de la función y una ejecución en la consola de NodeRed queda representada en la siguiente imagen de la captura de pantalla del interfaz visual:

Figura 4: definición de flujo y código del ejemplo 4

Ejemplo 5: función variables de entorno y trazas.

En el flujo de trabajo del ejemplo 5, se define un nodo inyección en donde se inicia el arranque del flujo; se define un nodo función; un nodo template para procesar la salida; y, por último, dos nodos debug para mostrar por consola el resultado y la trazabilidad de la ejecución.

La funcionalidad del nodo función define una funcionalidad en el evento «On Message», la funcionalidad definida en este evento es la siguiente: definición de un variable de tipo lista, definición de una variable lista con el contenido del string pasado por parámetro, un bucle que recorre las palabras string y, como salida, retorna la estructura con las palabras. Además, se muestra por consola el valor de la variable de contexto «counter» y se crea una variable global con nombre «varGlobal» la cual se emplea en el flujo del ejemplo 6. En el evento «On Start», se define la variable de contexto «counter» utilizada en la funcionalidad «On Message».

Desde un punto de vista gráfico, el ejemplo con el código de la función y una ejecución en la consola de NodeRed queda representada en la siguiente imagen de la captura de pantalla del interfaz visual:

Figura: definición del evento On Start
Figura 5: definición del flujo y código del ejemplo 5.

Ejemplo 6: función variables de entorno.

En el flujo de trabajo del ejemplo 6, se define un nodo inyección en donde se inicia el arranque del flujo; se define un par de nodos función; un nodo template para procesar la salida; y, por último, un nodo debug para mostrar por consola el resultado y la trazabilidad de la ejecución.

El primer nodo función es prácticamente igual que el nodo del ejemplo 5 salvo que se muestra la variable de contexto «counter», se definen variables múltiples con nombre values y se define la variable «varFlow». En el segundo nodo función, se muestra por consola las trazas de nivel warning, las variables de contexto y de flujo. Por último, el nodo template aplica una plantilla para retornos al siguiente nodo unstring con el valor del atributo payload del objeto msg y la variable varFlow definida en el flujo.

Desde un punto de vista gráfico, el ejemplo con el código de la función y una ejecución en la consola de NodeRed queda representada en la siguiente imagen de la captura de pantalla del interfaz visual:

Figura 6: definición del flujo y el código de la función 6-1.
Figura 7: definición del flujo y el código de la función 6-2.

Los ejemplos mostrados en la entrada permiten mostrar cómo usar nodos función, algunas características básicas del lenguaje Java Script para la definición de funcionalidad en los nodos función y, además, cómo trabajar con diferentes tipos de entrada y salida con nodos tipo función.

En la siguientes entrada, NodeRED IV: mensajes y secuencias, me centraré en la utilización de mensajes y secuencias de mensajes.

NodeRED II: nodos principales

En la entrada anterior, NodeRED I: Instalación y ejemplo base, realice una breve descripción de NodeRED, cómo levantar NoderRED en un contenedor Docker y un ejemplo básico. En la presente entrada, NodeRED2: nodos principales, describiré cómo usar ciertos nodos en un flujo de trabajo.

Los ejercicios que presento en la entrada son ejercicios sencillos cuyo objetivo es mostrar la funcionalidad de los nodos empleados. Lógicamente, existirán nodos que aparezcan en todos los ejemplos; como por ejemplo: el nodo inyector, para insertar valores e iniciar el flujo; y, el nodo debug, para escribir por consola un valor determinado y así poder depurar un flujo.

Los objetivos de los ejemplos son los siguientes:

  • Ejemplo 1: profundizar en el uso del nodo de inyección.
  • Ejemplo 2: definición de un flujo de trabajo el cual realiza una petición HTTP, trabaja con un fichero CSV y filtra valores para mostrar un mensaje.
  • Ejemplo 3: definición de un flujo de trabajo el cual realiza una bifurcación (nodo switch).

Ejemplo 1: inyector programable.

Para la realización de una inyección de datos, se emplea el nodo de inyección en el cual se define en el objeto msg el valor que se quiere inyectar al flujo; y, para definir el intervalo de repetición, en el campo «Repeat» ubicado en la parte inferior del cuadro, definimos la frecuencia de repetición. En el ejemplo, hemos definido un intervalo de 3 segundos en el cual se inyecta el valor timestamp. El nodo siguiente es un nodo de tipo debug el el cual escribirá en consola en valor timestamp. Desde un punto de vista gráfico, la definición del flujo de trabajo queda representado en la siguiente imagen con la captura de pantalla de NodeRED:

Figura 1: inyección periódica.

Ejemplo 2: tratamiento de CSV

En el siguiente ejemplo, complicamos la funcionalidad y el número de nodos. El objetivo del flujo es el siguiente: realiza la descarga de un fichero CSV mediante una petición HTTP; escribir cada línea del fichero en consola; filtrar los valores del contenido del fichero; modificar el valor filtrado; y, por último, escribir en consola el valor modificado.

Los nodos empleados para realizar el flujo de trabajo son los siguientes:

  • Nodo de red HTTP Request.- Dicho nodo realiza la invocación al servicio HTTP mediante una petición GET a una URL determinada y realiza la definición del tipo de salida.
  • Nodo de parseo CSV.- Dicho nodo realiza el parseo del fichero definiendo el carácter separador de las columnas, el tipo de salida y qué salida define el nodo.
  • Nodo función filter.- Dicho nodo realiza la lectura de un valor de entrada especificado en el objeto msg.paylod.mag y su valor de filtro, en nuestro caso, verifica todos los valores mayores o iguales a 7.
  • Nodo función cambio.- Dicho nodo realiza la modificación de un valor, sustituyendo el valor de entrada correspondiente al campo msg.payload por el string «PANIC!».
  • Nodo función debug.- Dicho nodo realiza la escritura de las trazas de depuración.

Desde un punto de vista gráfico, el flujo de trabajo descrito queda representado en la siguiente captura de pantalla con los elementos y la salida por la consola.

Figura 2: flujo de trabajo de lectura de un CSV con mensaje de error

Ejemplo 3: bifurcaciones en flujos de trabajo

Para finalizar, definimos un flujo de trabajo compuesto de dos flujos. El primer flujo es aquel que trabaja con el nodo función plantilla el cual aplica una plantilla de texto al valor inicial insertado; dicha plantilla con el parseo del valor de entrada, se escribe en la consola de debug. El segundo flujo, define un flujo de trabajo con una bifurcación.

Los nodos empleados para realizar el flujo de trabajo son los siguientes:

  • Nodo función plantilla.- Dicho nodo aplicará una plantilla de texto a los datos de entrada para tener una salida de un tipo determinado.
  • Nodo función switch.- Dicho nodo define las N posibles salida en función de la lógica definida.
  • Nodo función cambio.- Dicho nodo realiza una operación de suma incrementando en 10 el valor de entrada.

Desde un punto de vista gráfico, el flujo de trabajo descrito queda representado en la siguiente captura de pantalla con los elementos y la salida por la consola:

Figura 3: Definición y uso de nodo switch y plantillas.

Con los ejemplos descritos nos permiten realizar una extrapolación del tipo de flujos de trabajo que podemos realizar con NodeRED para interconectar dispositivos y definir flujos de trabajo con una secuencia lógica de operaciones compleja. En las siguiente entradas, seguiré mostrando más ejemplos.

En la siguiente entrada, NodoRed III: nodo función, describiré mediante ejemplos la funcionalidad del nodo función.

NodeRED I: Instalación y ejemplo base

En la presente entrada, NodeRED I: Instalación, realizaré una descripción de la herramienta NodeRed y explicaré los primeros pasos para utilizar NodeRED mediante la definición de un programa básico representado en un flujo NodeRED.

Node-RED es aquella herramienta de programación que permite la conexión de dispositivos hardware, API y servicios online.

El editor de Node-RED está basado en una herramienta gráfica que se accede desde el navegador web La estructura de la interfaz gráfica está compuesta en la parte central por un panel de trabajo; en la parte izquierda, se muestra los diferentes nodos funcionales categorizados por funcionalidades; y, en la parte derecha, un conjunto de pantallas en donde se puede visualizar diferentes paneles de información.

Un programa de NodeRED es aquella estructura visual de un flujo de operaciones compuesta por la unión de nodos la cual realiza una funcionalidad determinada a partir de los datos de entrada definidos en los nodos para tal fin y, como salida, un resultado determinado en los nodos de salida.

Instalación en Docker

NodeRED puede ser instalado en varias plataformas: en una máquina local, en un contenedor docker, en un dispositivo como puede ser una placa Raspberry o bien en un servicio en la nube como AWS o Azure. En el caso que presento, describiré los pasos que he seguido para utilizar NodeRED en un contenedor Docker.

Para realizar la descarga de la imagen de Docker con la instalación de NodeRED, ejecuté el siguiente comando:

docker pull nodered/node-red

Para realizar el arranque de NodeRED con la imagen descargada, ejecutaré el siguiente comando desde la línea de comandos:

docker run -it -p 1880:1880 -v node_red_data:/data --name mynodered nodered/node-red

Una segunda forma para arrancar NodeRED en Docker es identificando el volumen externo del contenedor con una carpeta del sistema de ficheros de la máquina en donde levanta. Para realizar este arranque, identificamos el path de la carpeta de la siguiente forma:

docker run -it -p 1880:1880 -v /path/to/folder:/data --name mynodered nodered/node-red

La descripción de los parámetros del comando anterior son las siguientes:

  • -it.- Modo de arranque del contenedor.
  • -p 1880:1880.- Acceso al interfaz gráfico del contenedor por el puerto 1880.
  • -v node_red_data:/data.- Creación de un volumen de datos a la carpeta de configuración de datos de NodeRED con el nombre /data.
  • –name mynodered.- Asignación del nombre del contenedor con nombre mynodered.
  • nodered/node-red.- Nombre de la imagen docker que se emplea en el contenedor.

Para verificar si el contenedor se ha levantado correctamente, se ejecuta el siguiente comando desde la línea de comandos:

docker container ps -a

Para acceder a la interfaz gráfica del editor de NodeRED una vez arrancado el contenedor, se abre una ventana de un navegador y se utiliza la siguiente URL: localhost:1880. El aspecto visual del editor queda representado en la siguiente imagen:

Figura1: NodeRED interfaz
Figura1: NodeRED interfaz

Ejemplo básico

Para definir un programa en NodeRED, se realiza la definición de un flujo de nodos en el panel de trabajo central con los nodos existentes en la paleta de nodos existentes en la parte izquierda del interfaz. El proceso se realiza seleccionando y arrastrando los nodos y enlazando dichos nodos.

Las categorías de los nodos en NodeRED son las siguientes:

  • Categoría common.- Nodos en donde definen funcionalidades comunes como; por ejemplo: inyección de un valor, operación de debug.
  • Categoría function.- Nodos en donde definen funciones de usuario, funciones de control de flujo,…
  • Categoría network.- Nodos en donde se definen operaciones de red; por ejemplo: peticiones MQTT o bien HTTP, entre otras.
  • Categoría sequences.- Nodos en donde se definen operaciones sobre secuencias de flujo.
  • Categoría parser.- Nodos en donde se definen operaciones de parseo de tipos de datos.
  • Categoría storage.- Nodos en donde se definen operaciones de almacenamiento.

Para desplegar y verificar el correcta definición, es necesario pulsar al botón «Deploy» ubicado en la parte superior derecha.

Un ejemplo básico tipo «Hola Mundo» consiste en inyectar un dato, como por ejemplo, el valor de una fecha determinada; procesar dicho valor en una función y, por último, mostrarlo por la consola debug.

El flujo se compondrá por los siguiente nodos: el primero, un nodo de tipo common de tipo inject el cual inyecta un valor; el segundo, un nodo tipo función el cual, el valor que recibe como parámetro de entrada, lo procesará y retornará para el siguiente nodo; y, por último, un nodo de tipo debug el cual realiza la escritura del valor inyectado.

Nodo inyector

El nodo inyector es aquel nodo que está compuesto por un objeto msg compuesto de dos atributos: payload, con el valor timestamp que se inyecta; y, topic, con el mensaje adicional a inyectar. El aspecto visual del componente es el siguiente:

Figura2: nodo inyector

Nodo Function

El nodo función es aquel nodo el cual gestiona distintos eventos los cuáles pueden ser: evento On Start, funcionalidad que se realiza al inicio del nodo; evento On Message, funcionalidad que se ejecuta al recibir un mensaje; y, evento On Stop, fncionalidad que se realiza al parar el nodo. Todo la funcionalidad se define en Java Script.

En nuestro ejemplo, se define la funcionalidad de evento al recibir un mensaje la cual realiza el tratamiento del valor timestamp recibido y su transformación en tipo String. El aspecto visual del componente es el siguiente:

Figura3: nodo function

Nodo Debug

El nodo debug es aquel que escribe en la consola el campo del mensaje especificado. El aspecto visual del componente es el siguiente:

Figura 4: nodo debug.

Para ejecutar el flujo de trabajo es necesario pulsar en el cuadro izquierdo ubicado en el nodo inject. El aspecto de la salida en la consola del ejemplo descrito es el siguiente:

Figura 5: nodo debug con resultado.

Obtención de la configuración y flujos de trabajo.

La definición de los flujos de trabajo que se definen de forma visual, representados en el fichero flows.json, así como la configuración de NodeRED, representado en el fichero settings.js, se encuentra en la carpeta data del contenedor y en el volumen de Docker. Una forma sencilla para realizar una copia de la carpeta data, es utilizando el comando docker de copiado. Así, para realizar una copia de la carpeta data del contenedor utilizado mynodered a una carpeta determinada, se puede emplear el siguiente comando:

docker cp  mynodered:/data  /your/backup/directory

En las siguiente entrada, NodeRED II: nodos principales, iré profundizando en la definición de flujos y usos de NodeRED.