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”

4 comentarios en “Mensajes en Node-RED

  1. Pingback: Saber Más Node-RED Developer | Aprendiendo Arduino

  2. Pingback: Mensajes en Node-RED -

  3. Pingback: Diario del Curso IoT, Smart Cities y Node-RED | Aprendiendo Arduino

  4. Pingback: Diario Curso: Raspberry Pi y Node-RED. 2ª ed | Aprendiendo Arduino

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.