Archivo de la etiqueta: Práctica

Paso a Paso: Instalar y Configurar Raspberry Pi OS

Paso 1: Instalación de Raspberry Pi OS con Raspberry Pi Imager

Descargar Raspberry Pi Imager: https://www.raspberrypi.org/software/

Instalar Raspberry Pi Imager y conectar un lector de tarjetas SD. Coloque la tarjeta SD que usará con su Raspberry Pi en el lector y ejecute Raspberry Pi Imager.

Seleccionar Raspberry Pi OS (64-bit) y la SD card.

Pulsar en la rueda dentada y configurar:

  • Hostname
  • Habilitar SSH
  • Configurar el usuario y contraseña (usuario pi por defecto)
  • Configurar la wifi (WLAN country: ES)
  • Configurar locales (Europe/Madrid y keyboard: es)

Paso 2: Encontrar la IP de Raspberry Pi

Una vez instalado, habrá que localizar la IP de nuestra Raspberry Pi para conectarnos a ella.

Si en nuestra red funciona mDNS, será tan sencillo como lanzar el comando desde un PC en la misma red de Raspberry Pi: ping {nombre-hostname}.local

Si este método no funciona, revisar este tutorial de como encontrar tu IP: https://www.raspberrypi.com/documentation/computers/remote-access.html#ip-address, revisando el router, usando el comando nmap (escanear redes) u otro software de escaneo de redes.

Si nada de eso funciona, conectar a la Raspberry Pi un monitor y un teclado y ejecutar el comando ifconfig.

Paso 3: Conectar por SSH y Configurar la Conexión en PuTTY o similar

Una vez tenemos la IP de nuestra Raspberry Pi, podemos conectarnos por SSH: https://www.raspberrypi.com/documentation/computers/remote-access.html#secure-shell-from-linux-or-mac-os

Usar el comando: ssh pi@<IP>

Puede usar SSH para conectarse a su Raspberry Pi desde Windows 10 que usa la actualización de octubre de 2018 o posterior sin tener que usar clientes de terceros.

En caso de no funcionar, instalar en windows PuTTY: https://www.putty.org/ 

Paso 4: Actualizar Raspberry Pi

Conectarse por SSH con el usuario por defecto: pi y la contraseña por defecto: raspberry o la contraseña configurada.

Lo primero una vez nos conectemos es actualizar el sistema con:

  • sudo apt update
  • sudo apt upgrade

Paso 5: Activar VNC

Una vez dentro de la consola habilitar VNC (ya viene preinstalado) para conectarse al escritorio y continuar con la instalación desde el escritorio remoto: https://www.raspberrypi.com/documentation/computers/remote-access.html#enabling-the-vnc-server

  • ejecutar: sudo raspi-config
  • Navegar hasta Interfacing Options
  • Buscar y seleccionar VNC › Yes.

Paso 6: Instalar VNC Viewer y conectarse Raspberry Pi

Ahora ya nos podremos conectar por VNC desde nuestro ordenador.

Descargar e instalar VNC Viewer y conectarse a Raspberry Pi.

Descargar en https://www.realvnc.com/es/connect/download/viewer/ 

Darse de alta en https://www.realvnc.com/es/connect/ para acceder por VNC sin estar conectado a la misma red que la Raspberry Pi.

Configurar el acceso remoto en Raspberry Pi en el icono de VNC server e introducir el usuario y contraseña de realvnc.com creada anteriormente.

Paso 7: Acabar de configurar Raspberry Pi

Es posible hacer más configuraciones desde “Configuración de  Raspberry Pi” o desde comando “sudo raspi-config”:

Como se ha configurado desde el menú avanzado de Raspberry Pi Imager, muchas de las configuraciones ya estarán realizadas. 

Entrar en Raspberry Pi Configuration y acabar de configurar nuestra Raspberry Pi. Si se han seguido todos los pasos, solo será necesario el idioma y pedirá reiniciar la Raspberry Pi. También configurar la resolución de VNC si fuera necesario.

Paso 8: Configurar Acceso Remoto a Raspberry Pi con Remote.it

Darse de alta y crear una cuenta en https://remote.it/ 

Para Raspberry Pi usar el device package, es el método más sencillo: https://docs.remote.it/software/device-package 

Instalar la Desktop Application https://remote.it/download/ o usar la versión web https://beta.remote.it/ 

Añadir un nuevo dispositivo Raspberry Pi:

Ejecutar el comando en Raspberry Pi.

Una vez instalado, aparecerá el dispositivo en nuestra cuenta de remote.it

Documentación instalación: https://docs.remote.it/software/device-package/installation 

Ahora ya podremos conectarnos por SSH desde cualquier red, activando la conexión y siguiendo las instrucciones de conexión.

Paso 9: Configurar Acceso Remoto a Raspberry Pi con Zero Tier

Darse de alta y crear un usuario en https://www.zerotier.com/ 

Crear una red y obtener el identificador de la red https://zerotier.atlassian.net/wiki/spaces/SD/pages/8454145/Getting+Started+with+ZeroTier 

Instalar en Raspberry Pi el cliente de Zero Tier

https://www.zerotier.com/download/. Ejecutar el comando curl -s https://install.zerotier.com | sudo bash

Y luego unirse a la red con: sudo zerotier-cli join [network-id] with [device-id]

Si hemos creado una red privada, autorizar el dispositivo ponerle un nombre (p.e. el hostname)

Para saber en la Raspberry Pi el id del dispositivo, ejecutar el comando: sudo zerotier-cli info

Para ver la ruta añadida en nuestro dispositivo ejecutar: route -n

Para ver la red a la que está conectado nuestra Raspberry Pi, ejecutar: sudo zerotier-cli listnetworks

Comprobar que funciona, instalar Zero Tier en nuestro ordenador el cliente https://www.zerotier.com/download/ y conectar a la red creada.

Luego comprobar que conecta por SSH al dispositivo.

Ejercicios Finales Node-RED

Ejercicio 1

Hacer un CSV con los datos de temperatura, memoria y CPU que manda vuestra Raspberry PI y guardar en un fichero llamado raspberrypi.csv. Añadir también el campo timestamp al fichero csv.

Para ello tomar los datos publicados en MQTT, ordenarlos y prepararlos para que los pase a un nodo join y los ponga en este orden: timestamp,CPU,Memory,Temperature 

Para que los ordene de forma automática el nodo join debemos hacer uso de la propiedad parts como hace el nodo split usando:

  • parts.index – para el orden de los elementos del grupo a unir
  • parts.id – para indicar que es el mismo grupo
  • parts.count – para indicar el nº de mensajes del grupo

También crear un flujo con un nodo inject que cree el fichero con la cabecera: “timestamp,CPU,Memory,Temperature” y que además al hacerlo vacíe el fichero existente.

Crear otro flujo con un nodo inject que lee con “file in” el contenido del fichero y lo mande a la pantalla de debug.

Luego con un botón del dashboard hacer la parte de inicializar el fichero (que aparezca una notificación del dashboard para confirmar que se desea inicializar) y con otro botón del dashboard un flujo que lea el fichero y lo mande al nodo chart del dashboard y hacer las gráficas.

Opcionalmente, hacer un tercer botón que mande por email el fichero csv, como fichero adjunto.

Opcionalmente, hacer un flujo que lea los datos del fichero llamado raspberrypi.csv y obtener los datos de media, máxima y mínima de la temperatura, memoria y CPU y mostrar en el dashboard en un nodo texto.

Opcionalmente, hacer un flujo que agrupe los datos en grupos de 100 y sacar los datos de media, máxima y mínima cada 100 valores y guardar en otro fichero llamado raspberrypi_agrupados.csv con los campos: timestamp,CPU_AVG,CPU_MAX,CPU_MIN,Memory_AVG,Memory_MAX,Memory_MIN,Temperature_AVG,Temperature_MAX,Temperature_MIN

Mandar datos al nodo chart: https://github.com/node-red/node-red-dashboard/blob/master/Charts.md 

Código: https://github.com/aprendiendonodered/ejercicio10

Ejercicio 2 – 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:

Hacer el flujo como un subflow.

Dashboard

Flujo

Subflow

Código:

Ejercicio 3 – 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 4 – Predicción de Lluvia con datos AEMET

Hacer un panel de control que muestre la predicción de lluvia de los próximos 7 días de una ciudad usando los datos de AEMET y su API.

Solución: https://github.com/aprendiendonodered/AEMET_Prediccion_Dias

Además mostrar la predicción de temperatura de los próximos 5 días usado el nodo de open weather map https://flows.nodered.org/node/node-red-node-openweathermap 

Por último publicar todos los datos por MQTT con el topic: “educantabria/nodo00/santander/predicción/[lluvia/santander]/{dia}/{hora}”

Topics publicados:

  • casa/santander/prediccion/lluvia/{dia} – Publica la predicción de lluvia de santander obtenida de AEMET
  • casa/santander/prediccion/temperatura/{dia}/{hora} – Publica la predicción de temperatura de santander obtenida de Open Weather

Ejercicios Subflows y Funciones Node-RED

Ejercicio 01

Hacer un dashboard para controlar los wemos D1 Mini con el firmware instalado en el curso: https://aprendiendoarduino.wordpress.com/2021/02/20/mqtt-y-esp8266/

El Dashboard tendrá:

  • Un gauge y una gráfica indicando la temperatura de la sonda DS18B20
  • Un pulsador para encender y apagar el led del Wemos D1 Mini
  • Un pulsador para encender y apagar el relé
  • Un Input text o un formulario para mandar mensajes a la pantalla oled
  • Un slider para encender los 8 niveles de la matriz led.

Código: https://github.com/aprendiendonodered/ejercicio11 

Flujo:

Dashboard:

Ejercicio 2

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:

https://github.com/jecrespo/Curso-Node-RED/blob/master/04-Ejercicio%20Final/Ejercicio_1/Dashboard_1.png?raw=true

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 03

Hacer un subflujo con 5 salidas, que pasándole una variable de entorno con el número de datos a analizar, devuelva la media, máxima y mínima de esos datos por cada salida, una vez retenidos y analizados. En la cuarta salida me devuelva un array de los datos analizados y en la quinta el contador interno.

Personalizar el flujo, añadiendo documentación de lo que hace el subflow y lo que devuelve cada salida.

Código: https://github.com/aprendiendonodered/ejercicio07 

Ejercicio 04

Hacer una función que guarde los últimos 20 valores en una variable de contexto y una vez tenga los 20, mande la media, máximo y mínimo por tres salidas y en una cuarta mande los 20 mensajes que ha retenido de forma consecutiva. En la quinta salida mandar el dato del contador interno.

Una vez hecho, añadir una funcionalidad para que si recibe un mensaje en la propiedad msg.acumulado, tome ese dato como el número de datos a acumular para hacer el cálculo. Una vez llegue este dato, actualiza el acumulado del contador y en función de lo que lleve acumulado, espera hasta llegar al nuevo dato o si lo ha superado, manda lo que ya tiene.

Por último, encapsular esta función en un subflow para poder reutilizarlo.

Añadir dato a un array: https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Array/push 

Función reduce: https://www.w3schools.com/jsref/jsref_reduce.asp 

Función Max: https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/Math/max 

Código: https://github.com/aprendiendonodered/ejercicio09

Ejercicios Dashboard Node-RED

Ejercicio 01

Mostrar en el dashboard en un mismo grupo 3 widgets text donde cada segundo actualice el timestamp (epoch time), la fecha usando el nodo node-red-contrib-date y el día y hora en formato, usando el nodo moment para transformarlo.

Código: https://github.com/aprendiendonodered/ejercicio01 

Vídeo: https://youtu.be/wS0E1j1q7sM  

Ejercicio 02

Leer el dato de la temperatura publicado en MQTT y hacer que cuando la temperatura esté fuera de un rango entre 18 y 22 grados, ponga el estado de confort en un elemento del dashboard y mande un email.

Código: https://github.com/aprendiendonodered/ejercicio02 

Vídeos:

Imágenes:

Ejercicio 03

Sobre el ejercicio2, añadir de forma dinámica los umbrales máximos y mínimos de alerta mediante dos sliders en el dashboard.

También hacer que los valores de los colores del gauge cambien en función del valor de MAX y MIN introducido por los sliders

Opcionalmente mostrar los mensajes de alerta y los iconos:

  • Todo Correcto: <i class=”fa fa-lightbulb-o fa-2x nr-dashboard-ok”></i>
  • Temperatura Alta: <i class=”fa fa-warning fa-2x nr-dashboard-warning”></i>
  • Temperatura Baja: <i class=”fa fa-exclamation-circle fa-2x nr-dashboard-error”></i>

Para cambiar la configuración de los widgets de dashboard se usa mediante msg.ui_control como se indica aquí: https://github.com/node-red/node-red-dashboard/blob/master/config-fields.md 

En este caso uso un nodo change donde borro payload y pongo las propiedades msg.ui_control.seg1 y msg.ui_control.seg2 a los valores almacenados en las variables de contexto.

Por último no dejar que el valor MIN sea mayor que MAX, ni que MAX sea menor que min en el dashboard, para ello controlar el valor de MIN y MAX al cambiar con un nodo switch y tomar la decisión a hacer.

Código: https://github.com/aprendiendonodered/ejercicio06.git 

Ejercicios Básicos Node-RED

Primer Flujo en Node-RED

Vamos a probar un flujo muy simple. Lo que hará es mostrar un texto por el panel de debug. Arrastra un nodo inject de la categoría input y un nodo debug de la categoría output al flujo. Los tienes que conectar entre ellos arrastrando el punto de la parte derecha del nodo inject sobre el punto de la parte izquierda del nodo debug.

primer flujo node-red

A continuación vamos a editar el nodo inject. Si haces doble click sobre el nodo se abrirá un panel donde nos muestra diferentes parámetros. En este panel tienes que seleccionar del menú desplegable donde pone Payload, la opción que pone String.

En el campo de texto pon cualquier cosa como por ejemplo Hola mundo 🙂

Para guardar la aplicación sólo tienes que dar a Deploy que si te has dado cuenta, ha pasado de estar en un color gris oscuro a rojo.

deploy node-red

Una vez que lo hayas pulsado, volverá de nuevo al color gris oscuro. Esto quiere decir que ya tenemos guardados todos los cambios del flujo de Node-RED.

Para probar este primer flujo con Node-RED tenemos que abrir el panel de debug que está situado en la parte derecha. Luego, tienes que hacer click sobre la parte izquierda del nodo inject.

Esto hará que en el panel debug aparezca lo que hemos escrito en la configuración del nodo inject.

Como puedes ver, el mensaje se muestra en el panel debug.

Para saber que se ha hecho un deploy, se puede hacer que mande un correo cada vez que se reinicia Node-RED. Flujo:

[{"id":"67252650.d05f28","type":"e-mail","z":"45a71fc.1bebde","server":"smtp.gmail.com","port":"465","secure":true,"tls":true,"name":"micuenta@gmail.com","dname":"manda email alerta","x":410,"y":580,"wires":[]},{"id":"fc4c30da.caea3","type":"inject","z":"45a71fc.1bebde","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":true,"onceDelay":0.1,"topic":"Mi instancia Node-RED deployed","payload":"Mi instancia de Node-RED ha hecho un redeploy o se ha reiniciado.","payloadType":"str","x":210,"y":580,"wires":[["67252650.d05f28"]]}]

Más información: https://programarfacil.com/blog/raspberry-pi/introduccion-node-red-raspberry-pi/

Node-RED y MQTT con Wemos D1 Mini

Capturar los datos mandados por los nodos remotos por 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.

sistema alarma node-red

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

Segundo Flujo

Obtener los datos de los terremotos en el mundo descargando un csv de una web pública.

Pasos:

  • Añade un nodo inject
  • Añade un nodo http request que consulte esta web: https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/significant_month.csv
  • Añade un nodo csv
  • Añade un node debug
  • Únelo todo
  • Añade un nodo switch de forma que saque aquellos datos cuyo valor de magnitud (​​msg.payload.mag) sea mayor o igual que 7
  • Añade un nodo change que ponga en msg.payload el valor PANIC!!!
  • Añade un nodo de debug que muestre el dato del nodo change

Código:

[{"id":"e36406f2.8ef798","type":"inject","z":"f03b57d5.e525f8","name":"","topic":"","payload":"","payloadType":"str","repeat":"300","crontab":"","once":false,"x":130,"y":900,"wires":[["c3c50023.3bbed"]]},{"id":"c3c50023.3bbed","type":"http request","z":"f03b57d5.e525f8","name":"Recent Quakes","method":"GET","url":"https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/significant_month.csv","tls":"","x":300,"y":900,"wires":[["8afc6cac.e0812"]]},{"id":"8afc6cac.e0812","type":"csv","z":"f03b57d5.e525f8","name":"","sep":",","hdrin":true,"hdrout":"","multi":"one","ret":"\\n","temp":"","x":470,"y":900,"wires":[["44779781.4190f8","6f0eb546.9e208c"]]},{"id":"44779781.4190f8","type":"debug","z":"f03b57d5.e525f8","name":"","active":true,"complete":false,"x":630,"y":900,"wires":[]},{"id":"6f0eb546.9e208c","type":"switch","z":"f03b57d5.e525f8","name":"","property":"payload.mag","propertyType":"msg","rules":[{"t":"gte","v":"7","vt":"num"}],"checkall":"true","outputs":1,"x":510,"y":960,"wires":[["d78d4aa8.8c8208"]]},{"id":"d78d4aa8.8c8208","type":"change","z":"f03b57d5.e525f8","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"PANIC!","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":650,"y":1020,"wires":[["72fddece.fac0d"]]},{"id":"72fddece.fac0d","type":"debug","z":"f03b57d5.e525f8","name":"","active":true,"complete":false,"x":750,"y":960,"wires":[]}]