# Sesión 7: Node-RED ## Introducción a las herramientas No-Code y Low-Code Las herramientas No-Code y Low-Code son plataformas de desarrollo de software que proporcionan interfaces gráficas de usuario para programar y desarrollar aplicaciones, reduciendo la necesidad de escribir código manualmente. Estas herramientas están diseñadas para acelerar el proceso de desarrollo de software y hacerlo más accesible a personas que no son programadores profesionales. ### Herramientas No-Code Las herramientas No-Code permiten a los usuarios desarrollar aplicaciones completas sin escribir una sola línea de código. En lugar de escribir código, los usuarios construyen la lógica de la aplicación utilizando una interfaz gráfica de usuario, generalmente a través de un proceso de arrastrar y soltar. Estas herramientas a menudo vienen con una variedad de plantillas y widgets predefinidos que los usuarios pueden personalizar para sus necesidades específicas. Ejemplos de herramientas No-Code incluyen: - **Bubble**: Una plataforma No-Code que permite a los usuarios construir aplicaciones web completas, incluyendo interfaces de usuario, bases de datos y lógica de backend. - **Adalo**: Una plataforma No-Code para construir aplicaciones móviles. Adalo ofrece una variedad de plantillas y componentes predefinidos que los usuarios pueden personalizar para crear su aplicación. ### Herramientas Low-Code Las herramientas Low-Code, por otro lado, requieren algo de codificación, pero minimizan la cantidad de código que los usuarios necesitan escribir. Estas herramientas proporcionan una interfaz gráfica de usuario para construir la estructura y la lógica de la aplicación, pero también permiten a los usuarios escribir y ejecutar su propio código para personalizar la funcionalidad de la aplicación. Ejemplos de herramientas Low-Code incluyen: - **OutSystems**: Una plataforma Low-Code para el desarrollo rápido de aplicaciones. OutSystems proporciona una interfaz visual para construir la lógica de la aplicación, pero también permite a los usuarios escribir su propio código para personalizar la funcionalidad. - **Node-RED**: Una herramienta de programación Low-Code para conectar dispositivos de hardware, APIs y servicios en línea. Node-RED utiliza un enfoque de programación de flujo de datos, donde los usuarios construyen la lógica de la aplicación conectando nodos en un flujo. Ambas categorías de herramientas, No-Code y Low-Code, están cambiando el panorama del desarrollo de software, permitiendo a más personas participar en el proceso de creación de aplicaciones y acelerando el tiempo de desarrollo. ## ¿Qué es Node-RED? Node-RED es una herramienta de programación de flujo de datos basada en el entorno de ejecución de JavaScript Node.js. Fue desarrollada por IBM Emerging Technology y es una parte integral de la Fundación JS abierta. Node-RED proporciona un entorno de programación visual que facilita la creación de aplicaciones interactivas y conectadas. El paradigma de programación de flujo de datos de Node-RED permite a los desarrolladores centrarse en la lógica de alto nivel de una aplicación sin tener que preocuparse por los detalles de bajo nivel de la programación de red, la gestión de archivos, la gestión de bases de datos, la interfaz de usuario y otras preocupaciones comunes en el desarrollo de software. En el corazón de Node-RED se encuentra el concepto de "nodos" que se conectan para formar "flujos". Los nodos son entidades de programación discretas que realizan una función específica, como leer datos de un sensor, realizar una operación matemática, publicar un mensaje en un servidor MQTT, o generar una interfaz de usuario. Los flujos son redes de estos nodos, conectados de tal manera que los datos pueden fluir entre ellos. Node-RED es particularmente útil en el contexto de Internet de las Cosas (IoT), donde puede actuar como el cerebro de una red de dispositivos y servicios conectados. Con su capacidad para integrarse con una amplia gama de sistemas y protocolos, Node-RED puede recoger datos de sensores y dispositivos, procesar esos datos de formas significativas y controlar dispositivos físicos en función de esa información. ## Arquitectura de Node-RED La arquitectura de Node-RED se basa en tres componentes principales: nodos, flujos y el runtime, aplicando el paradigma de Arquitectura Orientada a Eventos (Event Driven Architecture) ### Event Driven Architecture (EDA) La Arquitectura Orientada a Eventos (Event Driven Architecture, EDA) es un paradigma de diseño de software en el que los componentes del sistema producen, detectan, consumen y reaccionan a los eventos. En este contexto, un evento es un cambio de estado significativo en el sistema o en el entorno del sistema. La EDA es particularmente relevante en el contexto de las aplicaciones de IoT, donde los eventos pueden ser generados por una variedad de fuentes, como sensores y dispositivos, y pueden requerir una variedad de respuestas, como la actualización de una base de datos, la generación de una alerta, o el control de un dispositivo físico. ![](https://hackmd.io/_uploads/Byl8mMKvh.jpg) ### Aplicación de EDA a Node-RED Node-RED implementa una forma de EDA a través de su modelo de programación de flujo de datos. En Node-RED, un evento es representado por un mensaje que fluye a través de los nodos de un flujo. Cada nodo en el flujo puede actuar como un productor, un consumidor, o ambos, dependiendo de su funcionalidad. Por ejemplo, un nodo de entrada puede producir un evento al leer datos de un sensor. Este evento se representa como un mensaje que se pasa al siguiente nodo en el flujo. Este nodo puede consumir el evento procesando los datos del sensor, y puede producir un nuevo evento al generar un resultado derivado de estos datos. Este nuevo evento se pasa al siguiente nodo en el flujo, y así sucesivamente. A través de este mecanismo, Node-RED permite a los desarrolladores diseñar y construir aplicaciones que responden de manera flexible y eficiente a los eventos generados por una variedad de fuentes. Esto hace de Node-RED una herramienta poderosa para el desarrollo de aplicaciones de IoT y otras aplicaciones basadas en eventos. ### Nodos Los nodos son las unidades fundamentales de procesamiento en Node-RED. Cada nodo está diseñado para realizar una tarea específica. Los nodos pueden ser de entrada (por ejemplo, para leer datos de un sensor o recibir una petición HTTP), de procesamiento (para realizar cálculos o transformar datos) o de salida (para enviar datos a un servidor o controlar un dispositivo físico). Los nodos se conectan entre sí para formar flujos. #### Tipos de Nodos en Node-RED Los nodos en Node-RED se pueden clasificar en varias categorías atendiendo a su funcionalidad. A continuación, se presentan algunas de las categorías más comunes y los nodos más utilizados dentro de cada una de ellas. ##### Nodos de Entrada Los nodos de entrada son responsables de introducir datos en un flujo. Estos nodos pueden leer datos de una variedad de fuentes, como sensores de hardware, archivos, bases de datos, APIs web y protocolos de red. - **HTTP In**: Este nodo escucha las solicitudes HTTP en una URL específica y genera un mensaje cada vez que se recibe una solicitud. - **MQTT In**: Este nodo se suscribe a un topic en un servidor MQTT y genera un mensaje cada vez que se publica un mensaje en ese topic. - **GPIO In**: Este nodo lee datos de un pin GPIO en un dispositivo de hardware y genera un mensaje cada vez que se leen los datos. ##### Nodos de Procesamiento Los nodos de procesamiento consumen mensajes, realizan algún tipo de procesamiento en los datos contenidos en los mensajes y generan nuevos mensajes con los resultados del procesamiento. - **Function**: Este nodo permite a los usuarios escribir código JavaScript personalizado para procesar los datos de los mensajes. - **Switch**: Este nodo dirige los mensajes a diferentes rutas en función de sus propiedades. - **Range**: Este nodo mapea los valores de los mensajes de un rango a otro. - **Split**: Este nodo divide los mensajes en múltiples mensajes más pequeños. ##### Nodos de Salida Los nodos de salida consumen mensajes y realizan alguna acción en función de los datos contenidos en los mensajes, como enviar los datos a un dispositivo de hardware, una base de datos, una API web o un protocolo de red. - **HTTP Request**: Este nodo realiza una solicitud HTTP a una URL específica con los datos de los mensajes. - **MQTT Out**: Este nodo publica los datos de los mensajes en un topic en un servidor MQTT. - **GPIO Out**: Este nodo escribe los datos de los mensajes en un pin GPIO en un dispositivo de hardware. ##### Nodos de Interfaz de Usuario Los nodos de interfaz de usuario permiten a los usuarios construir interfaces de usuario interactivas para sus flujos. - **Dashboard Nodes**: Estos nodos permiten a los usuarios construir tableros interactivos que muestran los datos de los mensajes y permiten a los usuarios interactuar con los flujos. Estas son solo algunas de las categorías de nodos y los nodos más utilizados en Node-RED. Hay muchos otros nodos disponibles, y los usuarios también pueden crear sus propios nodos personalizados. ### Flujos Los flujos son redes de nodos conectados que definen la lógica de una aplicación. Los datos fluyen a través de los nodos en el orden definido por las conexiones entre ellos. Los flujos pueden ser guardados, compartidos y desplegados como unidades discretas de funcionalidad. ### Runtime El runtime de Node-RED es el motor que ejecuta los flujos. Se basa en Node.js, lo que permite a Node-RED aprovechar la amplia gama de bibliotecas disponibles en el ecosistema de Node.js. El runtime gestiona el ciclo de vida de los nodos y controla el flujo de datos a través de la aplicación. Además de estos componentes, Node-RED también proporciona una interfaz de usuario basada en web para la creación y gestión de flujos. Esta interfaz de usuario proporciona una representación visual de los flujos y permite a los usuarios arrastrar y soltar nodos para construir la lógica de la aplicación. ## Ejemplos prácticos ### Procesamiento de datos de un sensor a través de MQTT, transformación de datos y almacenamiento en una base de datos 1. **Nodo de entrada MQTT**: Este nodo se suscribe a un topic específico en un servidor MQTT. Cada vez que se publica un mensaje en este topic (por ejemplo, cuando un sensor envía datos), el nodo MQTT genera un evento que se representa como un mensaje en Node-RED. 2. **Nodo de función**: Este nodo consume el evento generado por el nodo MQTT. El nodo de función contiene código JavaScript personalizado que procesa los datos del sensor. Por ejemplo, el código podría calcular un promedio móvil de los datos del sensor. 3. **Nodo Range**: Este nodo consume el evento generado por el nodo de función y mapea el rango de los datos del sensor a un nuevo rango. Por ejemplo, podría transformar los datos del sensor de un rango de 0-100 a un rango de 0-1. 4. **Nodo de base de datos**: Este nodo consume el evento generado por el nodo Range y escribe los datos procesados en una base de datos. El nodo de base de datos podría, por ejemplo, insertar los datos en una tabla de una base de datos SQL. ### Monitorización de un archivo CSV, extracción de campos, preparación de texto y envío de alertas a través de Telegram 1. **Nodo de entrada de archivo**: Este nodo vigila un archivo CSV específico. Cada vez que el archivo se modifica, el nodo de archivo genera un evento que se representa como un mensaje en Node-RED. 2. **Nodo CSV**: Este nodo consume el evento generado por el nodo de archivo y extrae campos específicos del archivo CSV. Por ejemplo, el nodo CSV podría estar configurado para extraer los campos que representan la fecha y hora de la última modificación y el valor de un sensor. 3. **Nodo Switch**: Este nodo consume el evento generado por el nodo CSV y verifica si el valor del sensor ha superado un cierto umbral. Si es así, pasa el mensaje al siguiente nodo. 4. **Nodo Template**: Este nodo consume el evento generado por el nodo Switch y prepara un texto para enviar como alerta. Por ejemplo, el texto podría ser "Alerta: El valor del sensor ha superado el umbral a las {hora}". 5. **Nodo de Telegram**: Este nodo consume el evento generado por el nodo Template y envía el texto preparado a un bot de Telegram. Los usuarios que se suscriban al bot de Telegram recibirán la alerta en su aplicación de Telegram. ### Lectura de datos de una API REST, transformación de datos y visualización en un tablero 1. **Nodo de entrada HTTP**: Este nodo realiza una solicitud a una API REST específica a intervalos regulares. Cada vez que se recibe una respuesta de la API, el nodo HTTP genera un evento que se representa como un mensaje en Node-RED. 2. **Nodo Split**: Este nodo consume el evento generado por el nodo HTTP y divide los datos de la API en mensajes individuales. Por ejemplo, si la API devuelve una lista de elementos, el nodo Split podría generar un mensaje para cada elemento. 3. **Nodo de función**: Este nodo consume los eventos generados por el nodo Split. El nodo de función contiene código JavaScript personalizado que procesa cada elemento individualmente. Por ejemplo, el código podría calcular una estadística específica para cada elemento. 4. **Nodo de gráfica**: Este nodo consume los eventos generados por el nodo de función y muestra las estadísticas en una gráfica (requiere instalación de los nodos node-RED Dashboard). El nodo de gráfica podría, por ejemplo, mostrar un gráfico de barras de las estadísticas. ### Control de un dispositivo físico basado en datos de un sensor 1. **Nodo de entrada GPIO**: Este nodo lee datos de un sensor conectado a un pin GPIO específico en un dispositivo de hardware (por ejemplo, una Raspberry Pi). Cada vez que se leen datos del sensor, el nodo GPIO genera un evento que se representa como un mensaje en Node-RED. 2. **Nodo de función**: Este nodo consume el evento generado por el nodo GPIO. El nodo de función contiene código JavaScript personalizado que procesa los datos del sensor. Por ejemplo, el código podría determinar si los datos del sensor han superado un cierto umbral. 3. **Nodo de salida GPIO**: Este nodo consume el evento generado por el nodo de función y controla un dispositivo físico conectado a otro pin GPIO. Por ejemplo, si los datos del sensor han superado el umbral, el nodo GPIO podría encender un LED. ### Sistema de Monitoreo y Control de Cultivo Hidropónico 1. **Nodos de entrada GPIO**: Estos nodos leen datos de varios sensores conectados a un dispositivo de hardware (por ejemplo, un Raspberry Pi). Los sensores podrían incluir un sensor de temperatura y humedad, un sensor de luz, un sensor de pH y un sensor de nivel de agua. Cada vez que se leen datos de los sensores, los nodos GPIO generan eventos que se representan como mensajes en Node-RED. 2. **Nodo de función**: Este nodo consume los eventos generados por los nodos GPIO. El nodo de función contiene código JavaScript personalizado que procesa los datos de los sensores y determina si se necesitan ajustes en las condiciones ambientales. Por ejemplo, si la temperatura es demasiado alta, el código podría generar un evento para activar un sistema de enfriamiento. 3. **Nodo Switch**: Este nodo consume el evento generado por el nodo de función y determina qué acción tomar en función de los datos del sensor. Por ejemplo, si el nivel de agua es demasiado bajo, el nodo Switch podría generar un evento para activar una bomba de agua. 4. **Nodos de salida GPIO**: Estos nodos consumen los eventos generados por el nodo Switch y controlan varios dispositivos físicos conectados al dispositivo de hardware. Los dispositivos podrían incluir un sistema de enfriamiento, una bomba de agua, una luz de crecimiento y un sistema de dosificación de nutrientes. 5. **Nodo de Dashboard**: Este nodo consume los eventos generados por los nodos GPIO de entrada y muestra los datos del sensor en un tablero. El tablero podría incluir gráficos de tiempo real de la temperatura, la humedad, el nivel de luz, el pH y el nivel de agua. 6. **Nodo de correo electrónico**: Este nodo consume los eventos generados por el nodo de función y envía alertas por correo electrónico cuando se detectan condiciones que requieren la atención del usuario. Por ejemplo, si el sistema de enfriamiento falla, el nodo de correo electrónico podría enviar una alerta al usuario. Este ejemplo muestra cómo Node-RED puede ser utilizado para crear un sistema de monitoreo y control sofisticado para un cultivo hidropónico, utilizando una combinación de hardware y software para optimizar las condiciones de crecimiento de las plantas.