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

Ejercicios Finales

Veamos unos ejercicios completos con todo lo aprendido durante el curso.

Este ejercicio consiste en el montaje de 15 nodos remotos basados en Wemos D1 mini que gestionaremos con Node-RED y 15 Raspberry Pi con un led y un pulsador cada una y que además ejecutarán Node-RED localmente.

Montaje

Esquema de conexión nodo Remoto Wemos D1 Mini basado en:

Esquema de conexión RAspberry Pi:

  • Pin LED: 12 (GPIO 18) 
  • Pin Pulsador: 16 (GPIO 23) (Usando la resistencia interna de Pulldown)

Preparación

La programación de los nodos remotos basados en ESP8266 se hará mediante Node-RED ejecutado en cada Raspberry Pi, para ello se instalará un firmware que puede obtenerse de: https://github.com/jecrespo/Curso-Node-RED/blob/master/04-Ejercicio%20Final/firmware-Ejercicio_Final/firmware-Ejercicio_Final.ino.

NOTA: este firmware es para el nodo 14, pero en caso de que el nodo sea otro nº de nodo sustituir estas líneas, siendo X = 1, 2, 3, 4 ,5, 6, ….:

  • const char* publish_10sec = “nodoX/dato10s”;
  • const char* publish_60sec = “nodoX/dato60s”;
  • const char* publish_reset = “nodoX/reset”;
  • const char* subs_led = “nodoX/led”;
  • const char* subs_rele = “nodoX/rele”;
  • if (client.connect(“wemosd1mini187222X”,”usuario_mosquitto”,”password_mosquitto”))

Este firmware publica en un topic cada 10 segundos y en otro cada 60 segundos. Los topics son:

  • nodoX/dato10s
  • nodoX/dato60s

En caso de que el nodo se resete publica en el topic: nodoX/reset

Los nodos estás suscrito a dos topic:

  • nodoX/led – enciende y apaga el led integrado de ESP8266
  • nodoX/rele – enciende y apaga el relé

Para el control del LED y botón de Raspberry Pi, se hará mediante la programación en cada uno de los Node-RED de cada Raspberry Pi.

  • RPiX/led – topic al que se suscribe para indicar si se enciende o apaga
  • RPiX/pulsador – topic al que publica el estado: pulsado (1) o liberado (0)

Testeo del Sistema

Una vez configurado todo el sistema comprobar que cada nodo y Raspberry Pi está publicando los datos y funciona el control al modificar los valores de los topics a los que están suscritos.

Para ello usar un cliente MQTT como MQTT.fx:

  • suscrito a los topics:
    • nodoX/dato10s
    • nodoX/dato60s
    • nodoX/reset
    • RPiX/pulsador
  • publicando a los topics:
    • nodoX/led
    • nodoX/rele
    • RPiX/led

Una vez comprobado que leo los valores que publican los nodos y que puedo modificar el estado de los leds y relé publicando en los topics, pasamos a programar el sistema completo usando Node-RED.

Todo el código de los ejercicios: https://github.com/jecrespo/Curso-Node-RED/tree/master/04-Ejercicio%20Final

Ejercicio 1 – Dashboard

Configura Node-RED para que se vea un dashboard “Home” con tres grupos:

  • Suscripciones: las 3 suscripciones y botón que resete los valores
  • Pulsadores: dos botones para encender led y relé de nodo remoto
  • RPi: un pulsador que maneje el LED de la RPi y un gauge con el estado del pulsador.

Además al pulsar el pulsador encender el led detectando flaco, una pulsación enciende y otra pulsación apaga.

La configuración en Node-RED es:

Código: https://github.com/jecrespo/Curso-Node-RED/blob/master/04-Ejercicio%20Final/Ejercicio_1/Ejercicio_1-1.json

Código: https://github.com/jecrespo/Curso-Node-RED/blob/master/04-Ejercicio%20Final/Ejercicio_1/Ejercicio_1-2.json

Ejercicio 2 – Interacción por Grupos

Crear un nuevo grupo del dashboard Home llamado “Control Relés” con 3 botones que encienda:

  • Botón 1: controla relés 1, 2, 3, 4, 5
  • Botón 2: controla relés 6, 7, 8, 9, 10
  • Botón 3: controla relés 11, 12, 13, 14, 15

Dashboard

Nodos

Código: https://github.com/jecrespo/Curso-Node-RED/blob/master/04-Ejercicio%20Final/Ejercicio_2/Ejercicio_2.json

Ejercicio 3 – Seguridad

Poner un pin para encender los Reles, de forma que si no hay pin no se puede encender desde el dashboard. Simular una cerradura de forma que al poner el pin correcto se abre y luego a los 5 segundos se cierra.

Mostar en el dashboard el estado de la cerradura.

Crear un tab nuevo en el dashboard llamado pin de seguridad

Basarse en el flujo: https://flows.nodered.org/flow/7bcb0b049df4fa3c962294137ebaec19

Hacer el flujo como un subflow.

Dashboard

Flujo

Subflow

Código:

Ejercicio 4 – Email y SMS

Hacer un formulario en el dashboard para mandar un correo electrónico y otro para mandar un SMS usando el servicio de Twilio: https://www.twilio.com/

Dashboard

Flujo

Código: https://github.com/jecrespo/Curso-Node-RED/blob/master/04-Ejercicio%20Final/Ejercicio_4/Ejercicio_4.json

Luego usar esta configuración para enviar un correo y un SMS cuando se pulse el botón de la Raspberry Pi y el relé del nodo remoto 14 esté encendido, viéndolo en un dashboard.

Ejercicio 5 – Imágenes

Coger mediante Node-RED la imagen publicada en http://www.aprendiendoarduino.com/servicios/imagen.jpg y que se actualiza cada 30 segundos en el servidor.

Mostrar la imagen en el dashboard y su información.

Publicar en el topic raspberrypi/image la imagen por MQTT para poder reutilizarla.

Mandar la imagen por email al pulsar un botón.

Dashboard

Flujo

Código: https://github.com/jecrespo/Curso-Node-RED/blob/master/04-Ejercicio%20Final/Ejercicio_5/Ejercicio_5.json

Probar con otros servicios online a coger vídeo o imagen y tratarlo en Node-RED

Ejercicio 6 – Twitter

Hacer un flujo que tuitee algo. Para ello es necesario darse de alta en: https://developer.twitter.com/en/apps

Hacer un flujo que monitorice un hashtag (p.e. #Rioja), lo publique en cloudMQTT y lo guarde en una BBDD MySQL.

Flujo

Código: https://github.com/jecrespo/Curso-Node-RED/blob/master/04-Ejercicio%20Final/Ejercicio_6/Ejercicio_6.json

Ejercicio 7 – Open Weather Map

Usando el node de OpenWeatherMap, hacer un dashboard con la temperatura, humedad y presión donde se actualice el dato en un gauge y se haga una gráfica que muestre los últimos 7 días.

Mandar el dato de la temperatura a los nodos remotos, para ello publicar en el topic “nodoX/temperatura” el dato de temperatura y comprobar que llegan, para ello modificar el firmware para que los nodos remotos estén suscritos y lo muestren por el puerto serie.

Hacer un botón para que mande la predicción de los próximos 5 días al correo electrónico.

Dashboard

Flujo

Código: https://github.com/jecrespo/Curso-Node-RED/blob/master/04-Ejercicio%20Final/Ejercicio_7/Ejercicio_7.json

Ejercicio 8 – Telegram

Hacer un bot de Telegram con Node-RED que mande mensajes a grupos o canales y que responda a determinados comandos.

Para crear un bot de telegram: https://core.telegram.org/bots

Para añadir comandos al bot:

  • /setcommands
  • @aprendiendoarduino_bot

Pasar los comandos:

help – Ayuda
start – Inicio
enciende – Enciende Led
apaga – Apaga led
lee – Muestra datos broker

Y ya tengo los comandos configurados:

  • /help
  • /start
  • /enciende
  • /apaga
  • /lee

Para configurar el bot en Telegram solo hace falta poner el nombre del bot y el token.

Crear un canal o un grupo y hacer un flujo sencillo que al pulsar mande un un mensaje por Telegram a tu usuario y a al grupo o canal.

Ahora queda que desde Node-RED lea los comandos y responda. Al mandar el comando /enciende el LED de la Raspberry Pi al mandar el comando /apaga el LED de la Raspberry Pi. El comando /lee me devuelve el estado del LED.

Una forma de hacer esto es publicando el el topic /raspberrypi/led el valor ON u OFF y ya tengo otro flujo hecho en el ejercicio 1.

Para saber el estado, se puede guardar en una variable de flujo que se actualiza con el topic /raspberrypi/led de forma que no solo cuando modifico desde el bot sino desde otros lugares.

Flujo

Código: https://github.com/jecrespo/Curso-Node-RED/blob/master/04-Ejercicio%20Final/Ejercicio_8/Ejercicio_8.json

Integración Node-RED con Otros Servicios

Integración con MQTT

Para integrar Node-RED con servicios MQTT existen los nodos de MQTT de publish y suscribe.

Más información: http://www.steves-internet-guide.com/configuring-the-mqtt-publish-node/

MQTT Recipes:

Integración con API REST

Para integrar Node-Red con APIs que utilizan el protocolo HTTP demos usar las HTTP requests de Node-RED. HTTP recipes en Node-RED: https://cookbook.nodered.org/http/

Nodo HTTP request: https://flows.nodered.org/node/node-red-contrib-http-request

NOTA: antes de usar el nodo de HTTP request para acceder a una API pública buscar en https://flows.nodered.org/ si ya de ha publicado el nod que lo haga. Por ejemplo https://flows.nodered.org/node/node-red-node-openweathermap

HTTP requests

HTTP request para novatos: http://www.steves-internet-guide.com/node-red-http-request-node-beginners/

El nodo de solicitud http se mejoró enormemente en Node-RED versión 0.20 con la adición de los modos de autenticación Bearer y Digest. Además, se agregó una nueva opción para permitir la creación de una cadena de consulta de msg.payload.

El nodo de solicitud HTTP opcionalmente puede codificar automáticamente msg.payload como parámetros de cadena de consulta para una solicitud GET.

Por ejemplo:

Ejemplo Básico 

Ejemplo sencillo de recopilación de datos regularmente de una web de terremotos https://earthquake.usgs.gov/, convertir los datos y generar una alerta si el terremoto tiene un valor mayor o igual que 7.

Obtengo los terremotos significativos de los últimos 30 días: https://earthquake.usgs.gov/earthquakes/map/#%7B%22feed%22%3A%2230day_sig%22%2C%22search%22%3Anull%2C%22listFormat%22%3A%22default%22%2C%22sort%22%3A%22newest%22%2C%22basemap%22%3A%22terrain%22%2C%22autoUpdate%22%3Atrue%2C%22restrictListToMap%22%3Afalse%2C%22timeZone%22%3A%22utc%22%2C%22mapposition%22%3A%5B%5B-78.49055166160312%2C74.8828125%5D%2C%5B78.42019327591201%2C325.1953125%5D%5D%2C%22overlays%22%3A%7B%22plates%22%3Atrue%7D%2C%22viewModes%22%3A%7B%22map%22%3Atrue%2C%22list%22%3Atrue%2C%22settings%22%3Afalse%2C%22help%22%3Afalse%7D%7D

Tutorial: https://nodered.org/docs/tutorials/second-flow 

Ejemplo AEMET

Ejemplo más complejo donde se deben realizar varios pasos para obtener los datos de la AEMET.

Ejemplos: https://github.com/jecrespo/Curso-Node-RED/tree/master/01-REQUEST%20API%20REST

Ejemplo de integración con API de lectores 2N

Es posible integrar Node-RED con los lectores de tarjetas de 2N. Card readers AccessUnit: https://www.2n.cz/en_GB/products/ip-access-control

Manual API: https://wiki.2n.cz/hip/hapi/latest/en

Si quiero abrir remotamente el switch mediante Node-RED, me conecto a las APIs:

Usa digest authentication:

Envío de Emails

Nodo para envío de emails: https://flows.nodered.org/node/node-red-node-email

npm: https://www.npmjs.com/package/node-red-node-email

Si está accediendo a GMail, es posible que necesites habilitar una contraseña de aplicación o habilitar un acceso menos seguro a través de la configuración de su cuenta de Google.

Si inicias directamente no deja hacerlo google porque: https://support.google.com/accounts/answer/6010255?p=lsa_blocked&hl=es&visit_id=637210948261881071-1978480038&rd=1

Para resolverlo:

Solucionar problemas si no puedes loguearte con tu cuenta de gmail: https://support.google.com/mail/answer/7126229?visit_id=637210978957705918-3645915622&rd=2#cantsignin

Input: Repetidamente recibe correos electrónicos de un servidor IMAP o POP3 y los reenvía como mensajes si aún no los ha visto. El asunto se carga en msg.topic y msg.payload es el cuerpo del texto sin formato. Si hay texto / html, se devuelve en msg.html. msg.from y msg.date también se establecen si los necesita.

Además, msg.header contiene el objeto de encabezado completo que incluye a, cc y otras propiedades potencialmente útiles.

Output: Envía msg.payload como un correo electrónico, con un asunto de msg.topic. El destinatario predeterminado del mensaje se puede configurar en el nodo; si se deja en blanco, se debe configurar con la propiedad msg.to del mensaje entrante.

Opcionalmente, puede anular la dirección de correo electrónico desde configurando msg.from, de lo contrario, el nodo utilizará la configuración de ID de usuario desde la conexión del servidor.

El payload puede tener formato html. Si payload es un búfer binario, se convertirá en un archivo adjunto. El nombre del archivo debe establecerse usando msg.filename. Opcionalmente, se puede agregar msg.description para el texto del cuerpo.

Alternativamente, puede proporcionar msg.attachments que deben contener una matriz de uno o más archivos adjuntos en formato nodemailer.

Estos nodos utilizan el módulo npm imap y nodemailer.

Ejemplos:

Otros relativos a email:

Envio SMS

Mandar SMSs usando el servicio de Twilio: https://www.twilio.com/

Pricing: https://www.twilio.com/pricing

Free account: https://www.twilio.com/docs/usage/tutorials/how-to-use-your-free-trial-account

Trial de Twilio: https://support.twilio.com/hc/en-us/articles/223136107-How-does-Twilio-s-Free-Trial-work-

Limitaciones de la cuenta gratuita: https://support.twilio.com/hc/en-us/articles/360036052753-Twilio-Free-Trial-Limitations

TwiML: https://www.twilio.com/docs/voice/twiml

Nodo: https://flows.nodered.org/node/node-red-node-twilio

Envía un mensaje SMS o realiza una llamada de voz utilizando el servicio Twilio. El nodo de salida Twilio está configurado para enviar SMS o hacer llamadas, dependiendo de la opción seleccionada ingrese el número de teléfono o número de teléfono y una URL para crear el archivo de respuesta TWiML.

msg.payload se usa como el cuerpo del mensaje. El nodo se puede configurar con el número al que enviar el mensaje. Alternativamente, si el número se deja en blanco, se puede configurar usando msg.topic. La carga útil también puede ser la URL para crear el archivo de respuesta TWiML.

Debe tener una cuenta con Twilio para usar este nodo.

Aquí hay un ejemplo del uso de este nodo para crear un IVR simple: https://flows.nodered.org/flow/637b5f6128a8d423503f

SMS con Node-RED USANDO UN PINCHO 3G: https://maker.pro/raspberry-pi/tutorial/how-to-make-an-sms-app-for-raspberry-pi-with-node-red

Telegram

Este paquete contiene un receptor y un nodo emisor que actúan como un bot de Telegram. Lo único que se requiere es el token que puede recuperar el bot de telegram @botfather.

Bots en Telgram: https://core.telegram.org/bots

API Telegram: https://core.telegram.org/bots/api

Nodo: https://flows.nodered.org/node/node-red-contrib-telegrambot

Basado en https://github.com/yagop/node-telegram-bot-api

El nodo de entrada recibe mensajes del bot y envía un objeto de mensaje con el siguiente layout:

  • msg.payload contiene los detalles del mensaje
    • chatId: la identificación única del chat. Este valor debe pasarse al nodo de salida al responder al mismo chat.
    • type: el tipo de mensaje recibido: mensaje, foto, audio, ubicación, video, animación, voz, contacto
    • content: contenido del mensaje recibido: cadena o id_archivo, u objeto con datos completos (ubicación, contacto)
  • msg.originalMessage contiene el objeto de mensaje original de la librería https://github.com/yagop/node-telegram-bot-api

El nodo de salida envía el contenido a un chat específico. Un flujo de eco simple se ve así:

Nodo de Configuración

Lo único que se debe ingresar aquí es el token que recibió de @botfather al crear un nuevo bot. El nodo contiene dos propiedades opcionales: users y chatids. Puede ingresar una lista de nombres y/o chatids que estén autorizados para usar este bot.

Receiver Node

Este nodo recibe todos los mensajes de un chat. Simplemente invita al bot a un chat. Puede controlar si el bot recibe todos los mensajes llamando / setprivacy @botfather.

El mensaje original de la biblioteca de nodos subyacente se almacena en msg.originalMessage.

msg.payload contiene los datos más importantes como chatId, tipo y contenido. El contenido depende del tipo de mensaje. Si recibe un mensaje, el contenido es una cadena. Si recibe una ubicación, el contenido es un objeto que contiene latitud y longitud.

La segunda salida se activa cuando se aplica seguridad y el usuario no está autorizado para acceder al bot.

Cuando el nodo receptor recibe datos como videos, documentos, etc., el archivo se descarga automáticamente al disco duro local cuando saveDataDir se configura en el nodo de configuración. El directorio también forma parte de la carga útil del mensaje: msg.payload.path. Además, el mensaje contiene el enlace de descarga directa en la carga útil: msg.payload.weblink

Los siguientes tipos pueden ser recibidos:

  • message – content is text
  • photo – content is the file_id of the photo with the highest resolution (all photos are stored in the photos property of the output object)
  • audio – content is the file_id of the audio file
  • document – content is the file_id of the document
  • sticker – content is the file_id of the sticker
  • animation – content is the file_id of the animation file
  • video – content is the file_id of the video file
  • video_note – content is the file_id of the video note file
  • voice – content is the file_id of the voice file
  • location – content is an object with latitude and longitude
  • venue – content is the venue object
  • contact – content is the contact information object Note that media groups are received not as group, but as separate messages of type photo and video.

Sender Node

Este nodo envía la carga útil al chat. La carga útil debe contener los siguientes campos:

  • msg.payload.chatId – chatId o una matriz de chatIds si desea enviar el mismo mensaje a muchos chats
  • msg.payload.type, p.e. “message”
  • msg.payload.content – su mensaje de texto
  • msg.error – se establece cuando ocurre una excepción

Junto al envío de contenido, el nodo remitente se puede utilizar para enviar comandos directos a la API. msg.payload.type debe establecerse en uno de los siguientes, msg.payload.content contiene los argumentos necesarios, mientras se pasan argumentos adicionales en msg.payload.options:

  • editMessageCaption
  • editMessageText
  • editMessageReplyMarkup
  • deleteMessage
  • editMessageLiveLocation
  • stopMessageLiveLocation
  • callback_query
  • inline_query
  • action
  • leaveChat
  • kickChatMember
  • unbanChatMember
  • restrictChatMember
  • promoteChatMember
  • exportChatInviteLink
  • setChatPhoto
  • deleteChatPhoto
  • setChatTitle
  • setChatDescription
  • pinChatMessage
  • unpinChatMessage
  • getChatAdministrators
  • getChatMembersCount
  • getChat
  • getChatMember

Command Node

El nodo de comando se puede usar para activar un mensaje cuando se recibe un comando específico: p. help.

Tiene dos salidas

  1. se activa cuando se recibe el comando
  2. se activa cuando no se recibe el comando

El segundo es útil cuando quieres usar un teclado. Los comandos generalmente comienzan con /. De acuerdo con la documentación de la API de Telegram, el comando debe emitirse siguiendo el nombre del bot como /foo@YourBot. Esto es importante cuando agrega varios bots diferentes a un solo chat grupal. Para evitar que el bot maneje comandos que no se le envían directamente usando la notación larga, puede establecer el modo “estricto” en las opciones del nodo de comando. En este caso, el bot solo acepta la notación de comando completo en los chats grupales.

Event Node

El nodo recibe eventos del bot como:

  • callback_query de teclados en línea.
  • inline_query
  • edited_message que se activa cuando alguien modifica un mensaje ya enviado.
  • edited_message_text que se activa cuando alguien modifica un mensaje de texto ya enviado.
  • edited_message_caption que se activa cuando alguien modifica un caption ya enviado, p.e. una foto
  • channel_post que se activa cuando el bot es miembro de un canal público (/setprivacy to disabled).
  • edited_channel_post, que se activa cuando alguien modifica un mensaje ya enviado en un canal público.
  • edited_channel_post_text, que se activa cuando alguien modifica un mensaje de texto ya enviado en un canal público.
  • edited_channel_post_caption que se activa cuando alguien altera un caption ya enviado de p.e. una foto en un canal público.

Reply Node

El nodo de respuesta espera una respuesta a un mensaje específico. Debe usarse junto con el nodo emisor.

Ejemplos

Implementar un comando help:

Implementar un teclado:

La respuesta es enviada a la segunda salida que activa el flujo inferior. Los datos se pasan a través de propiedades globales aquí.

Ver más ejemplos en: https://flows.nodered.org/node/node-red-contrib-telegrambot

Twitter

Nodos para usar twitter con Node-RED

Nodo: https://flows.nodered.org/node/node-red-node-twitter

Es necesario darse de alta como developer en Twitter: https://developer.twitter.com/en/apps

Proporciona dos nodos: uno para recibir mensajes y otro para enviar.

Nodo de entrada de Twitter. Se puede usar para buscar:

  • el público o la transmisión de un usuario para tweets que contienen el término de búsqueda configurado
  • todos los tweets de usuarios específicos
  • mensajes directos recibidos por el usuario autenticado

El nodo de salida de Twitter tuitea msg.payload.

Para enviar un mensaje directo (DM), use una carga útil como:

  • D {username} {message}

Consumir streaming data de Twitter: https://developer.twitter.com/en/docs/tutorials/consuming-streaming-data

Open Weather Map

Obtener datos climatológicos: https://openweathermap.org/

Se podría usar la API y hacer una integración similar a la vista en el apartado de API REST, pero en este caso al haber un nodo, se simplifica todo.

Y ver openweathermap y la API: https://openweathermap.org/api

Open Weather Map:

Un nodo de Nodo-RED que obtiene el informe meteorológico y el pronóstico de OpenWeatherMap.

Dos nodos que obtienen el informe meteorológico y el pronóstico de OpenWeatherMap.

Se requiere una clave API para usar estos nodos. Para obtener una clave API, vaya a OpenWeatherMap.

Input Node: Obtiene el clima actual o el pronóstico de 5 días en una ubicación especificada por ciudad y país o latitud y longitud cada 10 minutos, y genera un mensaje si algo ha cambiado.

Query Node: Acepta una entrada para activar la obtención del clima actual, ya sea desde una ciudad y país específicos o latitud y longitud.

Resultados de clima actual:

  • description – a brief verbal description of the current weather for human reading.
  • weather – a very short description of the current weather.
  • icon – the weather icon code for the current conditions.
  • id – the id given to the current weather by OpenWeatherMap
  • tempc – the current ground temperature at that location in Celsius.
  • tempk – the current ground temperature at that location in Kelvin.
  • humidity – the current relative humidity at the location in percent.
  • windspeed – the current wind speed at the location in metres per second.
  • winddirection – the current wind direction at the location in meteorological degrees.
  • location – the name of the location from which the data was sourced.

Pronóstico de 5 días:

  • dt – epoch timestamp
  • pressure – in hPa
  • humidity – in %
  • speed – wind speed in metres per second
  • deg – wind direction in degrees
  • clouds – cloudiness in %
  • temp – an object with various temperatures in degC,
    • day, min, max, night, eve, morn
  • weather – an object with some misc. data,
    • description, icon, main, id

Más información en: https://flows.nodered.org/node/node-red-node-openweathermap

Ejemplos:

IFTTT

Cualquiera puede pensar que node-red es un superconjunto de IFTTT y que todo lo que puede hacer con IFTTT debe poder hacerlo con node-red. Pero en algunos casos nos puede ser útil y más rápido hacerlo con IFTTT.

Tres librerías:

Es necesaria la API key de IFTTT.

Maker Webhooks: https://ifttt.com/maker_webhooks

Me permite hacer llamadas a webhooks que se integran con herramientas de terceros.

Publica msg.payload.value1, 2 y 3 en el canal Maker en IFTTT en el canal especificado.

Creo el evento “nodered” para mandar datos al webhook.

Otra librería más avanzada pero en un estado de desarrollo temprano es: https://flows.nodered.org/node/node-red-contrib-ifttt-broker

Ejemplos:

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

Configurar y Securizar Node-RED

Configurar Node-RED

Para configurar Node-RED seguir: https://nodered.org/docs/user-guide/runtime/configuration

El fichero de configuración se encuentra normalmente en $HOME/.node-red/settings.js

El fichero de configuración por defecto es settings.js y está situado en /usr/lib/node-modules/node-red/ y puede encontrarse en https://github.com/node-red/node-red/blob/master/packages/node_modules/node-red/settings.js

Settings file: https://nodered.org/docs/user-guide/runtime/settings-file

Si no está seguro de qué archivo de configuración está usando Node-RED, debe verificar la salida del registro cuando se inicie Node-RED. Registrará la ruta completa al archivo:

  • 22 Jun 12:34:56 – [info] Settings file  : /Users/nol/.node-red/settings.js

El fichero por defecto viene con muchas opciones comentadas, para habilitarla, simplemente quitar el comentario “//”.

Al añadir una nueva opción asegurarse de añadir una coma al principio y final para separar del resto de opciones.

El fichero de flujos se encuentra por defecto en $HOME/.node-red/flows_<hostname>.json

Por defecto el directorio donde se guardan los nodos es $HOME/.node-red/nodes_modules

Existe una API de Node-RED que permite administrar remotamente en runtime: https://nodered.org/docs/api/admin/

Logging Node-RED

Ver https://nodered.org/docs/user-guide/runtime/logging

Node-RED utiliza un logger que escribe su salida en la consola. También admite el uso de módulos de logging personalizados para permitir que la salida se envíe a otra parte.

Esto se puede configurar mediante el fichero de configuración: https://nodered.org/docs/user-guide/runtime/settings-file

Securizar Node-RED (Autorización y Autenticación)

Por defecto, el editor Node-RED no está protegido: cualquier persona que pueda acceder a su dirección IP puede acceder al editor e implementar cambios.

Para securizar Node-RED a nivel de atenticación y autorización seguir: https://nodered.org/docs/user-guide/runtime/securing-node-red para añadir usuario y password, así como otras configuraciones de seguridad

El editor y la API de administración admiten dos tipos de autenticación:

  • autenticación basada en credenciales de nombre de usuario / contraseña
  • autenticación contra cualquier proveedor de OAuth / OpenID como Twitter o GitHub

Para habilitar la autenticación basada en usuario y password, descomentar la propiedad adminAuth del fichero de configuración:

adminAuth: {
    type: "credentials",
    users: [
        {
            username: "admin",
            password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",
            permissions: "*"
        },
        {
            username: "george",
            password: "$2b$08$wuAqPiKJlVN27eF5qJp.RuQYuy6ZYONW7a/UWYxDTtwKFCdB8F19y",
            permissions: "read"
        }
    ]
}

La propiedad de los usuarios es una matriz de objetos de usuario. Esto le permite definir múltiples usuarios, cada uno de los cuales puede tener diferentes permisos.

El nivel de permisos se puede configurar a nivel de los métodos de la API de administración: https://nodered.org/docs/api/admin/methods/

Las contraseñas se codifican de forma segura utilizando el algoritmo bcrypt

Para calcular la contraseña se usa: node-red-admin hash-pw

La herramienta le pedirá la contraseña que desea usar y luego imprimirá el hash que se puede copiar en el archivo de configuración.

Hay servicios web que permiten calcular el hash: https://passwordhashing.com/BCrypt

Command line administration: https://nodered.org/docs/node-red-admin 

Más información:

Autenticación HTTP Node-Red

Para proteger las rutas HTTP expuestas por los nodos y el dashboard se puede usar una autenticación básica.

La propiedad httpNodeAuth en su archivo settings.js se puede usar para definir un nombre de usuario y contraseña únicos que podrán acceder a las rutas.

  • httpNodeAuth: {user:”user”,pass:”$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.”},

La propiedad pass, usa el mismo formato que adminAuth utilizando el algoritmo bcrypt

Manual: https://nodered.org/docs/user-guide/runtime/securing-node-red#http-node-security

Securizar node red dashboard: https://github.com/node-red/node-red-dashboard/blob/master/README.md#securing-the-dashboard

Más información:

SSL en Node-Red

Para usar https con Node-RED seguir estos tutoriales:

Lo configuro el https en  $HOME/.node-red/settings.js

Líneas a descomentar/configurar:

var fs=require("fs")

https: {

key: fs.readFileSync('/user/myuser/privatekey.pem'),

cert: fs.readFileSync('/user/myuser/certificate.pem')

},

requireHttps: true,

Aplicar cambios de la nueva configuración con: node-red -s settings.js

Y restart node:

  • node-red-stop
  • node-red-start

Pero si tienes systemctl: systemctl start nodered.service

Como exponer un Node-Red de forma segura en Internet: https://github.com/node-red/cookbook.nodered.org/wiki/How-to-safely-expose-Node-RED-to-the-Internet