Archivo de la etiqueta: Contexto Node-RED

Contexto y Variables de Entorno en Node-RED

Contexto

En Node-RED, una consideración es cómo administrar cualquier información de estado en sus flujos. Por ejemplo, llevar un recuento de cuántos mensajes pasan por un flujo o el estado actual de un sensor externo.

Node-RED proporciona el sistema de contexto para administrar el estado dentro del tiempo de ejecución. El contexto puede tener el alcance de la misma pestaña, subflujo o estar disponible globalmente.

Si solo los nodos de una pestaña en particular necesitan una parte de la información de estado, debe utilizar un ámbito de flujo en lugar de global. También debe elegir con cuidado los nombres de las variables de contexto; asegúrese de que sean descriptivos y fáciles de identificar.

Si un solo nodo necesita acceder a un valor, como un nodo de función o un contador, el contexto de nodo es suficiente.

Otra opción es administrar el estado fuera de Node-RED, como usar mensajes MQTT retenidos o una base de datos de algún tipo. Esas opciones agregan una dependencia externa para administrar y no están tan convenientemente integradas como las variables de contexto, pero también se pueden usar junto con el contexto y no como un reemplazo completo. Por ejemplo, cuando desee compartir la información de estado en varias instancias de Node-RED, o en el caso de MQTT, poder activar un flujo siempre que cambie un valor.

Documentación oficial: https://nodered.org/docs/user-guide/context 

Api context: https://nodered.org/docs/api/context/

Node-RED proporciona una forma de almacenar información que se puede compartir entre diferentes nodos sin utilizar los mensajes que pasan por un flujo. Esto se llama «contexto».

En node-red se puede trabajar con variables de contexto:

  • Contexto – solo aplica a un nodo
  • Flujo – aplica solo al flujo
  • globales – aplica a todo.

Por defecto, Node-RED utiliza un almacén de contexto en memoria, los valores no se guardan entre reinicios. Se puede configurar para usar un almacén basado en el sistema de archivos para que los valores sean persistentes. También es posible conectar complementos de almacenamiento alternativos.

Node-RED proporciona dos módulos integrados para esto: memory y localfilesystem. Es posible configurar Node-RED para guardar datos de contexto en disco para que esté disponible en todos los reinicios, se almacena en caché los valores en la memoria y solo los escribe en el sistema de archivos cada 30 segundos.

La forma más fácil de establecer un valor en contexto es usar el nodo Change. Por ejemplo, la siguiente regla de cambio de nodo almacenará el valor de msg.payload en el contexto de flujo bajo la clave de myData.

Varios nodos pueden acceder al contexto directamente. Por ejemplo, el nodo Inject puede configurarse para inyectar un valor de contexto y el nodo Switch puede enrutar mensajes en función de un valor almacenado en contexto.

El contexto se puede eliminar de forma permanente mediante el uso de un conjunto de nodos Change para eliminar o desde la barra lateral en la pestaña “Context Data”

Mas información: http://www.steves-internet-guide.com/node-red-variables/ 

La barra lateral de contexto muestra el contenido del almacén de datos de contexto. El panel se divide en tres secciones, una para cada ámbito de contexto; nodo, flujo y global. Se debe hacer clic en el botón de actualización para cargar el contenido del contexto.

Las secciones Nodo y Flujo tienen una casilla de verificación junto a su botón de actualización para activar la actualización automática de los contenidos cada vez que cambia el nodo o flujo seleccionado.

Al pasar el mouse sobre cualquier nombre de propiedad de contexto, se mostrará un botón de actualización que se puede usar para actualizar solo ese valor.

Al pasar el cursor sobre el valor de una propiedad de contexto, se mostrará un botón para copiar su contenido en el portapapeles del sistema.

Addon para ver el context en node red: https://flows.nodered.org/node/node-red-contrib-contextbrowser

Varios nodos pueden acceder al contexto directamente. Por ejemplo, el nodo Inject puede configurarse para inyectar un valor de contexto y el nodo Switch puede enrutar mensajes en función de un valor almacenado en contexto.

Nodo para almacenar información de configuración en una ubicación central y usarla para establecer propiedades de contexto de flujo y globales al inicio (fase de inicialización) o durante el tiempo de ejecución. Se pueden usar varios nodos de configuración para almacenar ajustes de configuración alternativos y cambiar entre ellos durante el tiempo de ejecución: https://flows.nodered.org/node/node-red-contrib-config 

Ejemplo, enrutar un mensaje en función del valor de una variable de contexto: https://cookbook.nodered.org/basic/route-on-context 

Variables de Entorno

Las variables de entorno se pueden utilizar más ampliamente dentro de Node-RED para crear flujos que se pueden personalizar para diferentes plataformas sin tener que realizar cambios manuales.

Por ejemplo, puede tener un flujo que planea ejecutar en varios dispositivos, pero cada dispositivo debe suscribirse a su propio tema MQTT único.

Al igual que en el ejemplo de subflujo, puede configurar el nodo MQTT para publicar en $ {MY_TOPIC} y luego establecerlo como una variable de entorno antes de ejecutar Node-RED. Eso permite que esas personalizaciones específicas del dispositivo se mantengan por separado de los flujos que deberían ser comunes a todos los dispositivos.

Se puede usar el mismo enfoque cuando los flujos pueden ejecutarse en diferentes sistemas operativos, donde la ruta a un archivo utilizado por los flujos puede ser diferente según el sistema operativo.

Los nodos Inject y Change pueden acceder a las variables de entorno utilizando la opción «env» en su TypedInput. El nodo Función puede usar la función env.get ().

Trabajar con variables de entorno:

Cualquier propiedad de nodo se puede establecer con una variable de entorno estableciendo su valor en una cadena de la forma ${ENV_VAR}. Cuando el tiempo de ejecución carga los flujos, sustituirá el valor de esa variable de entorno antes de pasarla al nodo.

Esto solo funciona si reemplaza toda la propiedad; no se puede usar para reemplazar solo una parte del valor. Por ejemplo, no es posible utilizar CLIENT-${HOST}

Como los nodos proporcionan su propio diálogo de edición, no todas las propiedades proporcionarán una entrada de texto que se pueda utilizar para introducir la cadena env-var. En ese caso, puede considerar editar manualmente el archivo de flujo para establecer la propiedad.

No puede establecer variables de entorno en tiempo de ejecución. Solo se evalúan cuando se inician los flujos.

El tiempo de ejecución obtiene sus valores antes de pasarlos a nodos individuales. Los nodos no saben que el valor proviene de una variable de entorno. Si cambia una var env, no hace que mágicamente el nodo cambie su configuración. Debería reiniciar Node-RED para recoger los cambios.

Una forma de configurar las variables de entorno es en su archivo settings.js.

Lo siguiente establecerá la variable de entorno MY_ENV_VAR: process.env.MY_ENV_VAR = «Hello World»;

Puede agregar líneas como esa en la parte superior de su archivo de configuración.

La otra opción es configurarlos completamente fuera de Node-RED en el shell en el que está ejecutando Node-RED. Cómo lo haga dependerá de su sistema operativo y de cómo esté ejecutando Node-RED.

Nodo para leer variables de entorno https://flows.nodered.org/node/node-red-contrib-env

Ejemplo de uso de env var: https://flows.nodered.org/flow/8a13d11dfe80e279df83341e3e17bcc1 

Usando el Widget TypedInput

Dentro del editor, el widget TypedInput puede ofrecer «variable de entorno» como tipo. Cuando se selecciona este tipo, su valor se evaluará de la siguiente manera:

  • si no hay $ {} presente, usa el valor completo como el nombre de la variable de entorno. Por ejemplo, «FOO» se reemplazará con el valor de process.env.FOO
  • si $ {} está presente, sustituirá la variable de entorno correspondiente en el resultado: por ejemplo, dado el valor «Hola ${FOO}» y la var env FOO se establece en Mundo, esto da como resultado el valor «Hola mundo»

Variables de Entorno en Subflows

Desde 0.20, los subflujos se pueden configurar con propiedades de instancia. Estos aparecen como variables de entorno dentro del subflujo y se pueden personalizar para instancias individuales del subflujo.

Por ejemplo, dada una API REST que proporciona acceso a diferentes tipos de registro, se podría crear un subflujo para acceder a la API y manejar la respuesta, utilizando una variable de entorno para identificar a qué tipo de registro se debe acceder. Las instancias individuales del subflujo se pueden personalizar para esos tipos particulares.

Almacenamiento de Contexto

Por defecto, el contexto se almacena sólo en la memoria. Esto significa que su contenido se borra cada vez que se reinicia el Node-RED. Con la versión 0.19, es posible configurar Node-RED para guardar datos de contexto de modo que estén disponibles en los reinicios.

La propiedad contextStorage de settings.js puede utilizarse para configurar cómo se almacenan los datos de contexto.

Node-RED proporciona dos módulos incorporados para ello: memory y localfilesystem. También es posible crear plugins de almacenamiento personalizados para guardar los datos en otro lugar.

Para habilitar el almacenamiento basado en archivos, se puede utilizar la siguiente opción:

 contextStorage: {
    default: {
        module: "localfilesystem"
    }
 } 

Esto establece que el almacén contextual por defecto sea una instancia del plugin localfilesystem, con todos sus ajustes por defecto. Esto significa que:

  • almacenará los datos de contexto en archivos bajo ~/.node-red/context/
  • almacena los valores en la memoria y sólo los escribe en el sistema de archivos cada 30 segundos.

Es posible configurar más de un almacén para que algunos valores se guarden en el sistema de archivos local y otros sólo se mantengan en la memoria.

Por ejemplo, para configurar el almacén predeterminado para que sólo esté en memoria, y un segundo almacén para el sistema de archivos, se pueden utilizar las siguientes opciones:

 contextStorage: {
    default: "memoryOnly",
    memoryOnly: { module: 'memory' },
    file: { module: 'localfilesystem' }
 } 

En este ejemplo, la propiedad por defecto le dice a Node-RED que guarde en memoria el contexto, si una solicitud de acceso al contexto no especifica un almacenamiento concreto.

Los detalles completos de los módulos incorporados, las opciones de configuración que ofrecen y cómo crear módulos personalizados, están disponibles en las páginas de la API: https://nodered.org/docs/api/context/

Opciones de guardado en fichero local el contexto: https://nodered.org/docs/api/context/store/localfilesystem

Varios nodos pueden acceder directamente al contexto. Por ejemplo, el nodo Inject puede configurarse para inyectar un valor de contexto y el nodo Switch puede enrutar mensajes basados en un valor almacenado en el contexto.

Si tiene varios almacenes de contexto configurados, la interfaz de usuario le permitirá elegir en qué almacén debe almacenarse un valor.

El contexto puede ser eliminado permanentemente usando un nodo de change establecido para eliminarlo.

Si se guarda en disco, los datos de las variables de contexto se almacenan en el directorio: .node-red/context

Se debe tener en cuenta que los datos se guardan en disco cada 30 segundos, lo que puede ser suficiente para algunas aplicaciones, pero para otras no.

Para hacer mediante código, debe hacerse set la variable de contexto a undefined.

Por ejemplo, para eliminar todas las variables del contexto de flow:

 var keys = flow.keys();
 keys.forEach(element => flow.set(element,undefined)); 

Más información: https://nodered.org/docs/user-guide/context#context-stores

Mensajes en Node-RED

Trabajar con mensajes: https://nodered.org/docs/user-guide/messages

Un flujo Node-RED funciona pasando mensajes entre nodos. Los mensajes son simples objetos de JavaScript que pueden tener cualquier conjunto de propiedades.

Los mensajes generalmente tienen una propiedad payload: esta es la propiedad predeterminada con la que trabajarán la mayoría de los nodos.

Node-RED también agrega una propiedad llamada _msgid: este es un identificador para el mensaje que puede usarse para rastrear su progreso a través de un flujo.

El valor de una propiedad puede ser cualquier tipo de JavaScript válido, como:

  • Boolean – true, false
  • Number – eg 0, 123.4
  • String – «hello»
  • Array – [1,2,3,4]
  • Object – { «a»: 1, «b»: 2}
  • Null

Entender la Estructura del Mensaje

La forma más fácil de comprender la estructura de un mensaje es pasarlo a un nodo de debug y verlo en la barra lateral de depuración.

De forma predeterminada, el nodo debug mostrará la propiedad msg.payload, pero se puede configurar para mostrar cualquier propiedad o el mensaje completo.

Al mostrar una matriz u objeto, la barra lateral proporciona una vista estructurada que se puede utilizar para explorar el mensaje.

  • En la parte superior muestra el nombre de la propiedad que se ha pasado. Aquí, se ha utilizado el msg.payload predeterminado.
  • Junto al nombre de la propiedad está el tipo de propiedad: objeto, cadena, matriz, etc.
  • Luego muestra el contenido de la propiedad. Para matrices y objetos, la propiedad se contrae en una sola línea. Al hacer clic en él, la propiedad se expandirá para mostrar más detalles.

Cuando pasa el cursor sobre cualquier elemento, aparece un conjunto de botones a la derecha, se puede:

  • Copiar la ruta al elemento seleccionado en su portapapeles. En este ejemplo, copiará payload.Phone[2].type. Esto le permite determinar rápidamente cómo acceder a una propiedad en un nodo de Cambio o Función.
  • Copiar el valor del elemento en su portapapeles como una cadena JSON. Tenga en cuenta que la barra lateral trunca las matrices y los búferes en una determinada longitud. Al copiar el valor de dicha propiedad, se copiará la versión truncada.
  • Fijar el elemento seleccionado para que siempre se muestre. Cuando se recibe otro mensaje del mismo nodo de depuración, se expande automáticamente para mostrar todos los elementos anclados.

JSON, (JavaScript Object Notation), es una forma estándar de representar un objeto JavaScript como una cadena. Es comúnmente utilizado por las API web para devolver datos. Si una propiedad de mensaje contiene una cadena JSON, primero debe analizarse en su objeto JavaScript equivalente antes de poder acceder a las propiedades que contiene.

Node-RED proporciona un nodo JSON para hacer esta conversión: https://cookbook.nodered.org/basic/convert-json 

Notación JSON: https://www.json.org/json-en.html 

Cambiar las Propiedades de Mensajes

Hay dos nodos principales para modificar un mensaje, el nodo Función y el nodo Change.

El nodo Función le permite ejecutar cualquier código JavaScript en el mensaje. Esto le brinda total flexibilidad en lo que hace con el mensaje, pero requiere familiaridad con JavaScript y es innecesario para muchos casos simples.

El nodo Change proporciona mucha funcionalidad sin necesidad de escribir código JavaScript. No sólo puede modificar las propiedades de los mensajes, sino que también puede acceder al flujo y al contexto global.

Proporciona cuatro operaciones básicas:

  • Set – Establecer una propiedad a un valor
  • Change – Cambiar una propiedad de la cadena realizando una búsqueda y reemplazando
  • Delete – Borrar una propiedad
  • Move – Mover una propiedad

Para la operación de Set, primero identifica qué propiedad quieres ajustar, luego el valor que quieres que tenga. Ese valor puede ser un valor codificado, como una cadena o un número, o puede ser tomado de otro mensaje o propiedad de flujo/contexto global. También soporta el uso del lenguaje de expresión JSONata para calcular un nuevo valor.

Más información: https://nodered.org/docs/user-guide/nodes#change

Secuencia de Mensajes

Una secuencia de mensajes es una serie ordenada de mensajes que están relacionados de alguna manera. Por ejemplo, el nodo Split puede convertir un mensaje único cuya carga útil sea una matriz, en una secuencia de mensajes en la que cada mensaje tenga una carga útil correspondiente a uno de los elementos de la matriz.

Más información: https://www.youtube.com/watch?v=c6qXLko0n48

Cada mensaje en una secuencia tiene una propiedad llamada msg.parts. Se trata de un objeto que contiene información sobre cómo encaja el mensaje en la secuencia. Tiene las siguientes propiedades:

  • msg.parts.id – un identificador único para la secuencia
  • msg.parts.index – la posición del mensaje dentro de la secuencia
  • msg.parts.count – si se conoce, el número total de mensajes en la secuencia

Hay un número de nodos de core que pueden trabajar a través de secuencias de mensajes:

  • Split – Convierte un solo mensaje en una secuencia de mensajes. Dependiendo del payload, el comportamiento es diferente.
  • Join – Convierte una secuencia de mensajes en un solo mensaje. El nodo proporciona tres modos de funcionamiento: Automatic, Manual, Reduce
  • Sort – Ordena la secuencia basada en el valor de una propiedad o en el resultado de la expresión JSONata.
  • Batch – Crea nuevas secuencias de mensajes a partir de los recibidos. El nodo proporciona tres modos de funcionamiento: Número de mensajes, Intervalo de tiempo, Concatenar Secuencias.

Por ejemplo, dado un flujo de datos de sensor proveniente de un nodo MQTT, el nodo Batch puede usarse para crear secuencias divididas en el tiempo que el nodo Join reduce para calcular la lectura promedio del sensor dentro de cada segmento de tiempo.

Los nodos CSV y File In, al enviar varios mensajes, los manda como secuencias de mensajes correctamente formadas. Esto le permite transmitir de manera más eficiente archivos CSV grandes a través de un flujo

Más información: https://nodered.org/docs/user-guide/messages#message-sequences

Manejo de Mensajes

Poner la propiedad de un mensaje a un valor fijo: https://cookbook.nodered.org/basic/set-message-property-fixed

Borrar una propiedad de un mensaje: https://cookbook.nodered.org/basic/delete-message-property

Mover la propiedad de un mensaje: https://cookbook.nodered.org/basic/move-message-property 

Mapear una propiedad entre diferentes rangos numéricos con el nodo range: https://cookbook.nodered.org/basic/map-between-different-number-ranges 

Contexto

Trabajar con el contexto: https://nodered.org/docs/user-guide/context

Node-RED proporciona una forma de almacenar información que se puede compartir entre diferentes nodos sin usar los mensajes que pasan a través de un flujo. Esto se llama «contexto».

El «scope» de un valor de contexto particular determina con quién se comparte. Hay tres niveles de alcance de contexto:

  • Nodo: solo visible para el nodo que establece el valor
  • Flujo: visible para todos los nodos en el mismo flujo (o pestaña en el editor)
  • Global: visible para todos los nodos

Si un valor solo necesita ser accedido por un solo nodo, como un nodo Función, entonces el contexto de Nodo es suficiente.

Por defecto, el contexto se almacena solo en la memoria. Esto significa que su contenido se borra cada vez que Node-RED se reinicia (no cuando se hace un deploy). Es posible configurar Node-RED para guardar datos de contexto en disco para que esté disponible en todos los reinicios, se almacena en caché los valores en la memoria y solo los escribe en el sistema de archivos cada 30 segundos.

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»);

El contexto global se puede preconfigurar con valores utilizando la propiedad functionGlobalContext en el archivo de configuración.

La forma más fácil de establecer un valor en contexto es usar el nodo Change. Por ejemplo, la siguiente regla de cambio de nodo almacenará el valor de msg.payload en el contexto de flujo bajo la clave de myData.

Varios nodos pueden acceder al contexto directamente. Por ejemplo, el nodo Inject puede configurarse para inyectar un valor de contexto y el nodo Switch puede enrutar mensajes en función de un valor almacenado en contexto.

El contexto se puede eliminar de forma permanente mediante el uso de un conjunto de nodos Change para eliminar o desde la barra lateral en la pestaña “Context Data”

Mensajes en Node-RED

Trabajar con mensajes: https://nodered.org/docs/user-guide/messages

Un flujo Node-RED funciona pasando mensajes entre nodos. Los mensajes son simples objetos de JavaScript que pueden tener cualquier conjunto de propiedades.

Los mensajes generalmente tienen una propiedad payload: esta es la propiedad predeterminada con la que trabajarán la mayoría de los nodos.

Node-RED también agrega una propiedad llamada _msgid: este es un identificador para el mensaje que puede usarse para rastrear su progreso a través de un flujo.

El valor de una propiedad puede ser cualquier tipo de JavaScript válido, como:

  • Boolean – true, false
  • Number – eg 0, 123.4
  • String – «hello»
  • Array – [1,2,3,4]
  • Object – { «a»: 1, «b»: 2}
  • Null

Entender la Estructura del Mensaje

La forma más fácil de comprender la estructura de un mensaje es pasarlo a un nodo de debug y verlo en la barra lateral de depuración.

De forma predeterminada, el nodo debug mostrará la propiedad msg.payload, pero se puede configurar para mostrar cualquier propiedad o el mensaje completo.

JSON, (JavaScript Object Notation), es una forma estándar de representar un objeto JavaScript como una cadena. Es comúnmente utilizado por las API web para devolver datos. Si una propiedad de mensaje contiene una cadena JSON, primero debe analizarse en su objeto JavaScript equivalente antes de poder acceder a las propiedades que contiene.

JSON: https://www.w3schools.com/js/js_json_intro.asp

Node-RED proporciona un nodo JSON para hacer esta conversión.

Contexto

Trabajar con el contexto: https://nodered.org/docs/user-guide/context

Node-RED proporciona una forma de almacenar información que se puede compartir entre diferentes nodos sin usar los mensajes que pasan a través de un flujo. Esto se llama «contexto».

El «scope» de un valor de contexto particular determina con quién se comparte. Hay tres niveles de alcance de contexto:

  • Nodo: solo visible para el nodo que establece el valor
  • Flujo: visible para todos los nodos en el mismo flujo (o pestaña en el editor)
  • Global: visible para todos los nodos

Si un valor solo necesita ser accedido por un solo nodo, como un nodo Función, entonces el contexto de Nodo es suficiente.

Por defecto, el contexto se almacena solo en la memoria. Esto significa que su contenido se borra cada vez que Node-RED se reinicia. Es posible configurar Node-RED para guardar datos de contexto para que esté disponible en todos los reinicios.

La forma más fácil de establecer un valor en contexto es usar el nodo Cambiar. Por ejemplo, la siguiente regla de cambio de nodo almacenará el valor de msg.payload en el contexto de flujo bajo la clave de myData.

Varios nodos pueden acceder al contexto directamente. Por ejemplo, el nodo Inject puede configurarse para inyectar un valor de contexto y el nodo Switch puede enrutar mensajes en función de un valor almacenado en contexto.

Programación Básica Node-RED

Node-RED es un motor de flujos con enfoque IoT, que permite definir gráficamente flujos de servicios, a través de protocolos estándares como REST, MQTT, Websocket, AMQP… ademas de ofrecer integración con apis de terceros, tales como Twitter, Facebook, Yahoo!…

Más información: https://about.sofia2.com/2016/11/16/que-es-nodered/

Historia de Node-RED: https://nodered.org/about/#history

Conceptos básicos de nodered: https://nodered.org/docs/user-guide/concepts

  • Nodo: Un nodo es el bloque de construcción básico de un flujo. Los nodos se activan al recibir un mensaje del nodo anterior en un flujo o al esperar algún evento externo, como una solicitud HTTP entrante, un temporizador o un cambio de hardware GPIO. Procesan ese mensaje o evento y luego pueden enviar un mensaje a los siguientes nodos del flujo.
  • Nodo de Configuración: Un nodo de configuración (config) es un tipo especial de nodo que contiene una configuración reutilizable que los nodos regulares pueden compartir en un flujo.
  • Flow (Flujo) Un flujo se representa como una pestaña dentro del espacio de trabajo del editor y es la forma principal de organizar los nodos. El término «flujo» también se utiliza para describir informalmente un conjunto único de nodos conectados. Por lo tanto, un flujo (pestaña) puede contener múltiples flujos (conjuntos de nodos conectados).
  • Contexto: El contexto es una forma de almacenar información que se puede compartir entre nodos sin usar los mensajes que pasan a través de un flujo. Hay tres tipos de contexto:
    • Nodo: solo visible para el nodo que establece el valor
    • Flujo: visible para todos los nodos en el mismo flujo (o pestaña en el editor)
    • Global: visible para todos los nodos
  • Mensaje: Los mensajes son los que pasan entre los nodos en un flujo. Son objetos simples de JavaScript que pueden tener cualquier conjunto de propiedades. A menudo se les conoce como msg dentro del editor. Por convención, tienen una propiedad llamada “payload” que contiene la información más útil.
  • Subflow: 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 componente reutilizable que se usa en varios lugares.
  • Wire: Los cables conectan los nodos y representan cómo pasan los mensajes a través del flujo.
  • Palette (Paleta): La paleta está a la izquierda del editor y enumera los nodos que están disponibles para usar en los flujos. Se pueden instalar nodos adicionales en la paleta utilizando la línea de comandos o el Administrador de paletas.
  • Workspace: El área de trabajo es el área principal donde se desarrollan los flujos arrastrando nodos de la paleta y conectándolos. El espacio de trabajo tiene una fila de pestañas en la parte superior; uno para cada flujo y cualquier subflujo que se haya abierto.
  • Barra Lateral: La barra lateral contiene paneles que proporcionan una serie de herramientas útiles dentro del editor. Estos incluyen paneles para ver más información y ayuda sobre un nodo, para ver el mensaje de depuración y para ver los nodos de configuración del flujo.

Con respecto a Node-RED, se pueden hacer muchas cosas. Desde encender un LED en remoto, crear una API Rest en 5 minutos o conectar con una base de datos InfluxDB para graficar con Grafana. Aunque es visual, se requieren unos conocimientos técnicos en programación y tecnología medios y/o avanzados.

También permite programar en JavaScript funciones que pueden hacer de todo. Node-RED da mucho juego para muchas cosas.

El editor de flujos de Node-RED consiste en una sencilla interfaz en HTML, accesible desde cualquier navegador, en la que arrastrando y conectando nodos entre sí, es posible definir un flujo que ofrezca un servicio.

Como vemos, el editor se estructura como un entorno gráfico sencillo con:

  • Paleta de Nodos: Muestra todos los nodos que tenemos disponibles en nuestra instalación. Como veremos más adelante, existe un repositorio de nodos desarrollados por otros usuarios e incluso podemos crear e instalar nuestros propios nodos.
  • Editor: Nos permite arrastrar nodos desde la paleta y conectarlos. De este modo iremos creado el flujo de operación. El lienzo de node-red no tiene límites y se puede hacer zoom.

Asimismo, seleccionando cada nodo, se muestra a la izquierda su formulario de configuración, donde es posible establecer las propiedades concretas de dicho nodo:

Usar el editor: https://nodered.org/docs/user-guide/editor/

En node-Red los nodos se comunican entre sí mediante msg, que es un objeto con propiedades y que podemos añadir propiedades. La propiedad principal es payload, pero puedo añadir las que quiera. Puedo añadir otras propiedades como temperatura.

Los nodos se unen en flujos que se ejecutan en paralelo.

En los nodos con entrada y salida, lo que entra sale y se mantiene la información salvo la que modifiques en el nodo. 

Hay tres propiedades principales y que siempre existen:

  • número de mensaje
  • topic
  • payload

Ejemplo:

  • {«_msgid»:»f5daa4f0.f34888″,»topic»:»timestamp»,»payload»:»2020-03-08T11:53:50.646Z»}

El valor de una propiedad puede ser cualquier tipo de JavaScript válido como:

  • Boolean – true, false
  • Number – eg 0, 123.4
  • String – «hello»
  • Array – [1,2,3,4]
  • Object – { «a»: 1, «b»: 2}
  • Null

Más información sobre los tipos en javascript: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures

Disponemos de un debug que nos muestra el objeto y la podemos sacar por pantalla.

Los nodos son la unidad mínima que podemos encontrar en Node-RED. En la parte izquierda de la interfaz podemos ver la lista de nodos que vienen instalados por defecto y organizados en categorías según su funcionalidad.

Hay nodos de entrada, salida, funciones, social, para almacenar datos, etc… Esto muestra la capacidad de Node-RED de comunicarse con otros servicios.

Se pueden clasificar en tres tipos de nodos:

  • Nodos que sólo admiten entradas: sólo admiten datos de entrada para ser enviados a algún sitio como pueda ser una base de datos o un panel de control.
  • Nodos que sólo admiten salidas: son los nodos que sólo ofrecen datos tras recibirlos a través de diferentes métodos como por ejemplo un mensaje MQTT.
  • Nodos que admiten entradas y salidas: estos nodos nos permiten la entrada de datos y luego ofrecen una o varias salidas. Por ejemplo, podemos leer una temperatura, transformarla en grados Celsius y enviarla a otro nodo.

Los nodos los arrastramos al flujo o flow, en inglés. Aquí es donde tendremos la lógica para cada dato a base de ir arrastrando nodos.

Algunos de los nodos disponibles en Node-RED, los nodes de core son: https://nodered.org/docs/user-guide/nodes 

  • Inject: para disparar un flujo manualmente. Inyecta una payload a un topic.
  • Debug: sirve para mostrar mensajes en la zona de debug de Node-RED. Puede habilitarse o deshabilitarse.
  • Function: permite programar un nodo mediante JavaScript, pero es mejor buscar nodos hechos que hagan la función deseada, por ejemplo un temporizador.
  • Change: se usa para modificar las propiedades de un mensaje sin usar funciones
  • Switch: permite que los mensajes sean enrutados a diferentes ramas de un flujo mediante un conjunto de reglas contra el mensaje.
  • Template: se usa para generar texto usando las propiedades de un mensaje.

Trabajar con mensajes en Node-RED: https://nodered.org/docs/user-guide/messages 

Escribir funciones en Node-RED: https://nodered.org/docs/writing-functions 

Existen además muchos tipos de nodos que podemos ver en https://flows.nodered.org/ que son contribuciones de terceros.

Los nodos se organizan en flujos, para organizar los nodos como queramos. Es recomendable agrupar en flujos tareas que tengan relación entre ellos, pero solo a modo organizativo.

En node-red se puede trabajar con variables:

  • Contexto – solo aplica a un nodo
  • Flujo – aplica solo al flujo
  • globales – aplica a todo.

Cookbook de nodered: https://cookbook.nodered.org/ 

Node-RED programming guide: http://noderedguide.com/ 

Administración de node red mediante comando: https://nodered.org/docs/node-red-admin

Running node-red: https://nodered.org/docs/getting-started/running 

Más información: https://programarfacil.com/blog/raspberry-pi/introduccion-node-red-raspberry-pi/ 

Por ejemplo, podemos suscribirnos a un topic de MQTT, recibir un dato de temperatura y mostrarlo en la pantalla de debug:

primer flujo node-red

Pero no sólo podemos hacer esto, también podemos conectar con servicios de terceros como IFTTT, ThingSpeak, Google Home, ThingerIO, etc…

Primeros Flujos

Ejercicios

Hacer un programa que publicando en el topic /raspberrypi/led el texto “on” se encienda y publicando off se apague. 

Hacer un flujo que cada vez que se pulse el botón publique en el topic /raspberrypi/boton el valor recibido

Hacer otro flujo para que al pulsar el botón se encienda al detectar un flanco ascendente y al volver a pulsar se apague.

Solución: https://github.com/jecrespo/Curso-Node-RED