Archivo de la categoría: Programación Node-RED

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.

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.

Ejemplos Node-RED y MQTT

Node-RED y MQTT

Sólo tienes que arrastrar el nodo mqtt que está en la categoría input al flujo.

sistema alarma node-red

Ahora hay que configurarlo. Aquí es donde vemos la potencia de Node-RED. Cuando utilizamos una tecnología, nos centramos en lo superficial. En el caso de MQTT lo único que tenemos que hacer es configurar el broker y el topic.

Al tratarse de un nodo de entrada, lo que hace es recibir los mensajes publicados en un topic es decir, se suscribe al topic. Haz doble click sobre el nodo para que abra el panel de configuración.

En el panel de configuración MQTT vamos a configurar primero el broker MQTT. Haz click en el lápiz que aparece en Server.

sistema alarma node-red

Esto abre un nuevo panel de configuración. Pon un nombre al broker MQTT por ejemplo RASPBERRY PI MOSQUITTO. En Server tienes que poner la IP donde está instalado el broker MQTT y el puerto que utiliza, normalmente es el 1883.

Esta sería la configuración mínima. No te olvides de hacer click en el botón Add.

Después de esta acción volverás al panel de configuración del nodo mqtt y automáticamente, habrá seleccionado el broker MQTT que acabamos de crear.

Por último, vamos a rellenar el campo de Topic. Debe ser el mismo que hemos puesto en Arduino o el ESP8266, /casa/puerta/alarma. Una vez lo tengas, haz click en Done.

sistema alarma node-red

Ahora sólo nos queda probarlo. Para ello vamos a utilizar el mismo nodo debug de la categoría output que hemos utilizado antes.

Arrástralo al flujo, conecta los dos nodos y haz click en el botón Deploy.

sistema alarma node-red

Para probar el sistema lo podemos hacer de dos formas. Desde una terminal de Raspberry Pi podemos publicar un mensaje en el topic o directamente conectando la placa y simulando que abren la puerta.

El resultado sería el siguiente.

sistema alarma node-red

Ejemplo

Vamos a usar los Wemos D1 mini, para integrarlos como nodos remotos y programarlos desde Node-RED.

Esquema:

El firmware para los nodos remotos:

Cada firmware ya está configurado para solo configurar el topic donde va a publicar y el topic al que se suscribe:

  • RELE: Paso ON y OFF
  • OLED: Paso el string que va a mostrar por pantalla
  • LEDS: 7 topics donde paso el color en formato RGB y el brillo

Probar cada firmware y hacer un programa sencillo para interactuar con ellos.

Completos tutoriales:

Uso del Editor de Node-RED

Manual: https://nodered.org/docs/user-guide/editor/

Workspace

Manual: https://nodered.org/docs/user-guide/editor/workspace/

Flujos: https://nodered.org/docs/user-guide/editor/workspace/flows

Nodos: https://nodered.org/docs/user-guide/editor/workspace/nodes

Si un nodo tiene cambios no desplegados, muestra un círculo azul sobre él. Si hay errores con su configuración, muestra un triángulo rojo.

Pulsando ctrl + click del ratón puedo añadir nodos de una forma rápida:

La configuración de un nodo se puede editar haciendo doble clic en el nodo o presionando enter cuando el espacio de trabajo tenga el foco. Si se seleccionan varios nodos, se editará el primer nodo de la selecció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.

Por ejemplo, los nodos MQTT In y Out utilizan un nodo de configuración MQTT Broker para representar una conexión compartida a un agente MQTT.

Los nodos de configuración se agregan a través del diálogo de edición de un nodo que requiere el nodo de configuración. Tendrá un campo para seleccionar entre los nodos de configuración disponibles del tipo requerido o para agregar una nueva instancia.

Wires: https://nodered.org/docs/user-guide/editor/workspace/wires

Subflows: https://nodered.org/docs/user-guide/editor/workspace/subflows

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.

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.

Selección: https://nodered.org/docs/user-guide/editor/workspace/selection

Importar y Exportar Flujos: https://nodered.org/docs/user-guide/editor/workspace/import-export

Búsqueda de flujos: https://nodered.org/docs/user-guide/editor/workspace/search

Paleta

Manual: https://nodered.org/docs/user-guide/editor/palette/

Gestor de paleta: https://nodered.org/docs/user-guide/editor/palette/manager

El Administrador de paletas se puede usar para instalar nuevos nodos en la paleta. Se puede acceder en la pestaña palette del cuadro de diálogo Configuración de usuario.

Añadir nodos a la paleta: https://nodered.org/docs/user-guide/runtime/adding-nodes

Además de instalar nodos mediante el administrador de paletas (Palette Manager) podemos instalar mediante:

  • npm: Para instalar un módulo de nodo desde la línea de comandos, puede usar el siguiente comando desde su directorio de datos de usuario (por defecto, $HOME/.node-red) – npm install <npm-package-name>
  • Manual: Durante el desarrollo también es posible instalar nodos copiando sus archivos .js y .html en un directorio de nodos dentro de su directorio de datos de usuario. Si estos nodos tienen dependencias npm, también deben instalarse dentro del directorio de datos del usuario. Esto solo se recomienda realmente para fines de desarrollo.

Actualizar nodos:

  • La forma más fácil de buscar actualizaciones de nodos es abrir el administrador de paletas en el editor. Luego puede aplicar esas actualizaciones según sea necesario.
  • También puede buscar actualizaciones desde la línea de comandos usando npm. En su directorio de usuario, ~/.node-red ejecute el comando: npm outdated
    Para instalar la última versión de cualquier módulo, ejecute el comando: npm install <nombre-de-módulo>

Independientemente de la opción que tome, deberá reiniciar Node-RED para cargar las actualizaciones.

Barra Lateral

Manual: https://nodered.org/docs/user-guide/editor/sidebar/

La barra lateral contiene una serie de herramientas útiles del editor:

Algunos nodos contribuyen con sus propios paneles de barra lateral, como node-red-dashboard: https://flows.nodered.org/node/node-red-dashboard

Ejercicios

Crear un flujo que al pulsar un botón de tu raspberry pi, encienda el led de la raspberry pi del compañero.

Modifica el anterior para que encienda todas las de la fila, de forma consecutiva durante 1 segundo haciendo el efecto del coche fantástico Usa el node de delay.

Instalar el nodo de dashboard e intentar hacer un botón que encienda el led de la Raspberry Pi https://flows.nodered.org/node/node-red-dashboard

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