Node-Red

Sitio: Facultad de Ingeniería U.Na.M.
Curso: IC511 - Internet de las Cosas, Sensores y Redes
Libro: Node-Red
Imprimido por: Invitado
Día: miércoles, 3 de julio de 2024, 07:24

1. Introducción


Node-RED es una herramienta de programación para conectar dispositivos de hardware, API y servicios en línea de formas nuevas e interesantes.

Proporciona un editor basado en navegador que facilita la conexión de flujos mediante la amplia gama de nodos de la paleta que se pueden implementar en su tiempo de ejecución con un solo clic.


Las funciones de JavaScript se pueden crear dentro del editor utilizando un editor de texto enriquecido.

Una biblioteca integrada le permite guardar funciones, plantillas o flujos útiles para su reutilización.

2. Instalación

#branch NRa

3. Vista General

Para acceder nos dirigimos a la IP local de nuestro servidor y al puerto 1880

En el centro se crean los flujos (flows). A la izquierda están las paletas con sus nodos. A la derecha están las opciones de configuración.

4. Flujo Básico

Un primer ejemplo que utiliza un nodo inject para generar un JSON y el nodo debug para visualizarlo.

Después de cada modificación hay que desplegar el flujo (deploy)


5. Seguridad

Por seguridad habilitamos las sesiones con usuario/contraseña.

Primero debemos crear el hash de nuestra contraseña. Para ello invocamos una terminal dentro del contenedor node-red

~/docker $ docker exec -it node-red /bin/bash

y ejecutamos el comando (en este caso para admin)

665ee3da8f4f:~$ node-red admin hash-pw

el hash obtenido lo utilizamos en el archivo settings.js de node-red. En este archivo descomentamos la propiedad adminAuth

luego de reinicar el contenedor nos pedirás las credenciales para acceder


6. Mqtt

#branch NRa


En el siguiente usaremos el nodo mqtt in de la paleta network. En la configuración del nodo mqttin deberemos agregar el broker al que nos queremos conectar


para ver los mensajes que llegan utilizaremos nuevamente el nodo debug. Los datos de humedad y temperatura están empaquetados en el objeto msg.payload como un JSON. Además tenemos la propiedad msg.topic.


7. InfluxDB

En este proyecto utilizaremos la base de datos InfluxDB.

InfluxDB es una base de datos de series temporales (TSDB) de código abierto desarrollada por la empresa InfluxData. Está escrito en el lenguaje de programación Go para el almacenamiento y la recuperación de datos de series de tiempo en campos como el monitoreo de operaciones, métricas de aplicaciones, datos de sensores de Internet de las cosas y análisis en tiempo real. También tiene soporte para procesar datos de Graphite.

Una vez creado el contenedor podremos utilizar al administrador web de InfluxDB accediendo a la IP local de nuestro servidor con el puerto 8086.

La primera vez que accedemos deberemos crear nuestro usuario y contraseña. También se nos pide información sobre la organización y el "balde" (bucket). Esto es parte de la nomenclatura/jerarquía de almacenamiento de datos de InfluxDB:

Organization->Bucket->Measurement

Para poder vincular nuestras aplicaciones a la base de datos necesitaremos un Token. Lo creamos en LoadData -> API Tokens.

El token se mostrará una única vez. Tomar los recaudos necesarios.


De la lista desplegable seleccionamos "custom api token"


8. Instalar Paletas

Por defecto Node-Red incluye la paleta node-red con 49 nodos.


Para utilizar InfluxDB deberemos agregar la paleta correspondiente. Para agregar paletas nos dirigimos a Manage palettes.

en la pestaña Install buscamos "influxdb" e instalamos node-red-contrib-influxdb.


9. Almacenar en InfluxDB

Como vimos desde mqtt llega un JSON con los datos de humedad y temperatura. Esto lo podríamos enviar directamente a un bloque influxdb out pero, pensando en escalabilidad, agregaremos el identificador de nodo como un Tag. Esto lo hacemos con un bloque function que me permite implementar código javascript.

En la documentación del nodo influxdb out leemos: "Si msg.payload es una matriz que contiene dos objetos, el primer objeto se escribirá como el conjunto de campos con nombre, el segundo es el conjunto de etiquetas (tags)."


Ahora obtenemos un array con dos objetos JSON.



Solo resta insertar en la base de datos. Para ello utilizamos el bloque influxdb out. Tendremos que configurar nuestro servidor InfluxDB. Utilizamos el token que generamos en la base de datos.


Así queda nuestro nodo



Usando el explorador de datos de InfluxDB


10. Telegram Bot

Para crear un bot de Telegram primero necesitamos instalar la paleta correspondiente.

Creamos un flujo utilizando como entrada el nodo inject y como salida el nodo sender de Telegram


En el nodo sender configuramos nuestro bot con su correspondiente token. También se puede especificar los usuarios/IDs autorizados a utilizar el bot

Configuramos el nodo inject para que envíe un JSON con nuestro mensaje



10.1. Comandos Telegram Bot

Ahora vamos a crear respuestas a comandos enviados por el usuario. Usamos el nodo command.


Para responder al comando /start configuramos de la siguiente manera. Reutilizamos el bot que creamos anteriormente.

En el bloque función empaquetamos un teclado y un mensaje de bienvenida

Cuando el usuario presiona el botón "Temperatura" recibirá un mensaje con la última medición de temperatura.

10.2. Atender Respuestas

Para atender la respuesta del teclado usamos un nodo reciver.


Con un switch nos aseguramos de que la respuesta sea la que queremos. En nuestro caso "Temperatura"

la consulta a la base de datos la realizamos con el nodo influxdb in y utilizando lenguaje flux. Para obtener la última medición de temperatura es la siguiente


Usamos un nodo debug para ver lo que devuelve la base de datos. En este caso lo configuramos para ver el mensaje completo y no solo el payload

luego de realizar una consulta a la base de datos vemos en la ventana de debug lo siguiente

podemos observar que en el payload está el resultado de la consulta como un arreglo. El nodo influxdb in devuelve un arreglo con un objeto por registro. En nuestro caso utilizamos el modificador last() en la consulta así que hay un solo objeto dentro del arreglo.

También vemos que el mensaje que ingresó al nodo influxdb in se empaquetó en el mensaje de salida bajo el objeto originalMessage. Con esta información armamos nuestro mensaje de respuesta en un nodo función.


11. Interfaz de usuario

Para crear una interfaz de usuario necesitamos instalar la paleta Dashboard.

Vamos a crear un gráfico temporal utilizando el nodo chart.


Primero deberemos crear un agrupamiento de nodos

Como vemos en la imagen vamos a querer un linea (serie) por cada sensor de temperatura. Esto está explicado en la ayuda del nodo chart: "Multiple series can be shown on the same chart by using a different msg.topic value on each input message." O sea que cada mensaje que llega al nodo chart debe tener en el tópico la serie (sensor) a la que pertenece y en el payload el valor de la medición.

Utilizamos un nodo función entre mqtt in y el chart que se encargue de acondicionar el mesaje


Para acceder la página con la interfaz de usuario nos dirigimos a la dirección de node-red subcarpeta /ui