Instala correctamente Node-Red en 30 segundos.

Vamos a ver como hacer la instalación de Node-Red en un tiempo record y asegurándonos que hagamos lo que hagamos va a estar listo para ser ejecutado.

¿Qué es Node-Red?

Node-Red es una herramienta opensource de programación visual basada en flujos que fue creada por IBM para interconectar servicios API con hardware y otros dispositivos IOT de forma fácil y cómoda.

Gracias a esta herramienta y sin tener conocimientos de programación, podemos hacer verdaderas interconexiones entre dispositivos de una manera muy intuitiva. Es un sistema muy robusto y que ofrece al usuario, gracia a su sistema de flujos una facilidad de uso y de aprendizaje.

Además, al ser un sistema opensource, tiene multitud de conectores que te permiten interactuar o emular muchos de los dispositivos existentes.

¿Cómo programar Node-Red?

La forma de programación en NodeRed es muy simple, ya que basta con ir añadiendo nodos que iremos interconectando con otros nodos que pueden cambiar o elegir la salida dependiendo de lo que nosotros hayamos definido.

Programación Node-Red
Ejemplo de programación Node-Red

En el ejemplo anterior, se ve un evento que se dispara a las 22:00, el cual tiene una doble salida a un reloj que espera tiempos diferentes. La salida de este reloj va directamente a un servidor Mosquitto MQTT el cual opera sobre la luz de la cocina enviando un 1 para encenderla. El otro temporizador, espera más tiempo y pasa a un cambiador, el cual cambia el 1 por un 0 para apagar la luz.

Tutorial de Instalación en Docker

Como ya hemos hecho en otras ocasiones, vamos a realizar la instalación de este sistema en un docker oficial, el cual nos da la seguridad de que es mantenido por el equipo de desarrollo de Node-Red y de que no va a tener ningún tipo de regalo o puerta oculta dejada de forma accidental ó accidental.

La forma de levantar nuestro docker es muy simple:

docker run -d --restart=always --name NodeRed -p 1880:1880 -v /datos/NodeRed:/data nodered/node-red

Con el comando anterior, lo que hacemos es levantar un docker en modo daemon (-d) que en caso de fallar, se autoejecutará de nuevo (–restart), al cual hemos llamado (–name) NodeRed como no podía ser de otra forma. Hemos abierto el puerto (-p) 1880 que es el puerto por defecto de Node-Red y los datos los almacenaremos en nuestra carpeta (-v) /datos/NodeRed.

Con este comando tan simple, tendremos levantado nuestro sistema Node-red en menos de 30 segundos.

Para ver qué ha hecho o si ha levantado el docker correctamente, basta con ver los logs:

docker logs NodeRed

Y deberemos ver algo muy parecido a esto:


> node-red-docker@2.2.2 start /usr/src/node-red
> node $NODE_OPTIONS node_modules/node-red/red.js $FLOWS "--userDir" "/data"

13 Mar 23:33:53 - [info] 

Welcome to Node-RED
===================

13 Mar 23:33:53 - [info] Node-RED version: v2.2.2
13 Mar 23:33:53 - [info] Node.js  version: v14.18.2
13 Mar 23:33:53 - [info] Linux 5.4.0-104-generic x64 LE
13 Mar 23:33:54 - [info] Loading palette nodes
13 Mar 23:33:54 - [info] Settings file  : /data/settings.js
13 Mar 23:33:54 - [info] Context store  : 'default' [module=memory]
13 Mar 23:33:54 - [info] User directory : /data
13 Mar 23:33:54 - [warn] Projects disabled : editorTheme.projects.enabled=false
13 Mar 23:33:54 - [info] Flows file     : /data/flows.json
13 Mar 23:33:54 - [info] Creating new flow file
13 Mar 23:33:54 - [warn] 

---------------------------------------------------------------------
Your flow credentials file is encrypted using a system-generated key.

If the system-generated key is lost for any reason, your credentials
file will not be recoverable, you will have to delete it and re-enter
your credentials.

You should set your own key using the 'credentialSecret' option in
your settings file. Node-RED will then re-encrypt your credentials
file using your chosen key the next time you deploy a change.
---------------------------------------------------------------------

13 Mar 23:33:54 - [info] Server now running at http://127.0.0.1:1880/
13 Mar 23:33:54 - [info] Starting flows
13 Mar 23:33:54 - [info] Started flows

Node-Red en Raspberry

En Raspberry, se deben seguir los mismos pasos descritos anteriormente, ya que hay versiones de docker ya listas para ser ejecutadas en los mini ordenadores.

Interface Web Online de Node-Red

Para acceder a nuestro node-red recién instalado, nos bastará con ejecutar http://127.0.0.1:1880 o bien sustituir el 127.0.0.1 por la IP del equipo en el que lo hayamos instalado.

Al acceder por primera vez nos saldrá un pequeño tutorial sobre que es todo y dónde se encuentran las cosas, pero si nos hemos fijado, aún no nos han pedido ninguna credencial para acceder.

Veremos más adelante como securizar más adelante el acceso.

Flow de Ejemplo Node-Red

En la siguiente imagen, podrás ver un flow muy simple, que lo que hace es obtener mediante una llamada a la web http://ipinfo.io/ip nuestra IP pública y lo envía a un debug, además convierte la fecha que le hemos pasado en timestamp al hacer click en el evento en horas, minutos, segundos,….

ejemplo Flow nodered
Instala correctamente Node-Red en 30 segundos. 4

Importar y exportar un Flow

Vamos a importar el ejemplo anterior a un nuevo flow para que podamos practicar, para ello es tan simple como desplegar el menú que hay arriba a la derecha y seleccionar la opción Import.

Una vez ahí nos saldrá varias opciones como pegar, o subir un fichero. En nuestro caso, pegaremos el siguiente código:

[{"id":"2064e960c3a060c8","type":"tab","label":"Flow 1","disabled":false,"info":"","env":[]},{"id":"e129cce57c7a06be","type":"inject","z":"2064e960c3a060c8","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":420,"y":120,"wires":[["e097b66be48192c8","fd44dae7517cec20"]]},{"id":"e097b66be48192c8","type":"http request","z":"2064e960c3a060c8","name":"IPInfo","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://ipinfo.io/ip","tls":"","persist":false,"proxy":"","authType":"","senderr":false,"x":590,"y":100,"wires":[["01eda8c82623100b"]]},{"id":"01eda8c82623100b","type":"debug","z":"2064e960c3a060c8","name":"Debug","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":770,"y":120,"wires":[]},{"id":"fd44dae7517cec20","type":"function","z":"2064e960c3a060c8","name":"www.alferez.es","func":"var dt = new Date(msg.payload);\nmsg={};\nmsg.payload = {\n\t'mes':\tdt.getMonth() + 1,\n\t'dia':\t\tdt.getDate(),\n\t'año':\t\tdt.getFullYear(),\n\t'hora':\tdt.getHours(),\n\t'minutos':\t\tdt.getMinutes(),\n\t'Segundos':\tdt.getSeconds(),\n\t'Web': 'www.alferez.es'\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":600,"y":160,"wires":[["01eda8c82623100b"]]}]

Aunque parezca mentira, eso nos dará lo que hemos visto en el ejemplo anterior.

Para Exportar es la opción que hay para ello justo debajo de Import. Si queremos podemos exportar todo el proyecto o sólo el flow que deseemos, además de poderlo hacer con formato o comprimido, como yo lo he hecho antes.

Solicitar autenticación web de Node Red

Como hemos hablado antes, el acceder ha sido muy simple, con poner la IP ya nos ha bastado, pero cualquiera podría acceder a nuestro sistema y podría cambiar cualquier parámetro que hiciese que no funcionase como nostros lo hemos diseñado.

Para ello primero tenemos que obtener el hash de la contraseña con el siguiente comando:

docker exec -ti NodeRed node-red admin hash-pw

Esto lo que hace es conectarse al docker de Node que tenemos levantado y solicitar el hash de una password.

Una vez tengamos el hash en nuestro poder, debemos editar el fichero settings.js para declarar que queremos autentificación.

Para nuestra prueba, vamos a poner dos usuarios, uno con permisos totales y otro con solo lectura. Para ello, editamos el fichero setting.js y buscamos la cadena adminAuth. Una vez localizada, insertaríamos el siguiente código personalizando nuestros datos:

adminAuth: {
    type: "credentials",
    users: [
        {
            username: "admin",
            password: "$2b$08$vYeoAkjgJ24Ju9hPk1PFYuWHQW0dA.1y1vAJTYNaifRD/COvS0Rmi",
            permissions: "*"
        },
        {
            username: "alferez",
            password: "$2b$08$JeLoJ6W1imX5wI8S8SvrV.Pv5JIUQ6241qlevOmvQyJVl.CJK3tuq",
            permissions: "read"
        }
    ]
}

Con esto, el usuario admin tendría permisos totales para todo nuestro sistema, y un usuario alferez el cual sólo tendrá acceso de lectura.

Este acceso de lectura es un poco extraño, porque como tal, tiene acceso a todo lo que quiera, borrar, modificar o añadir tanto nodos como fows. Lo único es que no puede es hacer un deploy con los cambios que haya realizado.

Añadir complementos a nuestro NodeRed

Por último, vamos a ver como añadir complementos que necesitemos para nuestra programación. Estos complementos son nodos que pueden interactuar o comportarse de una forma concreta llegado un momento, o que directamente son servidores que se montan y que pueden ser usado a posteriori como puede ser el servidor Modbus TCP.

Para añadir un complemento a nuestro sistema, tendremos que desplegar el menú que tenemos junto al botón del deploy arriba a la derecha. Escogemos la opción «Manage Palette«. Ahí nos saldrá una ventana como esta:

ManagePaletteNode
Añadir complementos a Node-Red

Ahí podremos buscar el complemento que necesitemos e instalarlo, además nos dará la opción de actualizar complementos que ya teníamos y para los que ha salido una versión más actual.