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, 4 de diciembre de 2024, 23:20 |
1. Introducción
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
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