jueves, julio 25, 2019

Cómo construir un medidor ambiental para el CPD con Raspberry Pi [Parte 2 de 2] #RaspberryPi

Tras terminar todo el proceso descrito en la primera parte de este artículo, ya tendremos una versión funcional de la plataforma de BBDD que podremos administrar desde la web. Vamos a ver en esta parte del artículo cómo terminar la configuración, y cómo explotar los datos.

Figura 9: Cómo construir un medidor ambiental para el CPD con Raspberry Pi [Parte 2 de 2]

Si todo el proceso que hemos descrito en el artículo anterior ha ido bien, podremos ir al apartado “Admin” (icono de la corona) y nos deberá listar nuestra BBDD recién creada, que en este caso se llama “sensor_data”.

Figura 10: Administración de la base de datos 

Desde aquí podemos administrar la BBDD y si nos interesa cambiar la política de retención de datos también podemos hacerlo. Por defecto viene en “INF” o "infinito", representado por su símbolo correspondiente (∞). En mi caso, le he establecido una política de retención de 7 días (7d), tras los cuales, los datos anteriores serán descartados.

Llegados a este punto, ya podemos comenzar a almacenar las métricas obtenidas con nuestra Raspberry Pi y el sensor conectado. Para ello, volvemos a la consola de nuestra RPi e importamos las librerías necesarias para poder almacenar los datos en InfluxDB:
sudo pip install influxdb
sudo pip install urllib3
Ahora procedemos a crearnos nuestro script en Python para la lectura del sensor y volcado de los datos obtenidos al InfluxDB. Para ello creamos un archivo con el nombre que deseemos. Yo lo he llamado sensor_data_logger.py. El script contendrá el siguiente código:
Import urllib3
import time
import sys
import datetime
import Adafruit_DHT
###OPCIONAL###
#Hemos añadido un extra de conectar un “buzzer” al GPIO 24 para hacerlo sonar si la temperatura sube de 28º
import RPi.GPIO as GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(24, GPIO.OUT, initial=0)
######
from influxdb import InfluxDBClient
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) #Necesario si el certificado que asignamos no es de confianza

#Variables de conexión con InfluxDB
host = "" #Nuestro host con InfluxDB
port =  #El Puerto configurado (Yo usé el 8886)
user = "" #El usuario que creamos para que la RPi se conectase (“rpi-3”)
password = "" #El password que creamos para que la RPi se conectase
dbname = "sensor_data" #La BB.DD. que creamos en su momento en InfluxDB
interval = 1 #El período de tiempo que queremos que lea el sensor en segundos>

#Creación del objeto conector con InfluxDB
client = InfluxDBClient(host, port, user, password, dbname, verify_ssl=False, ssl=True)

#Detalles del sensor (Modelo y GPIO al que está conectado)
sensor = Adafruit_DHT.DHT22
sensor_gpio = 4

#Idetificamos el sensor 
measurement = "rpidht22"
#Identificamos el lugar
location = "" #(Robayna)

# Bucle hasta pulsar crtl+c
try:
    while True:
        # Leemos los datos del sensor
        humidity, temperature = Adafruit_DHT.read_retry(sensor, sensor_gpio)
        #Hemos añadido un extra de conectar un “buzzer” al GPIO 24 para hacerlo sonar si la temperatura sube de 28º
        If temperature > 28:
                GPIO.output(24, 1)
        Else:
                GPIO.output(24, 0)
        iso = time.ctime()
        #Si lanzamos el script al arrancar la RPi, comentar la siguiente línea. Solo dejarlo sin comentar para tests
        # print("[%s] Temp: %s, Humidity: %s" % (iso, temperature, humidity)) 
        #Creamos la estructura JSON con los datos a mandar a InfluxDB
        data = [
        {
          "measurement": measurement,
              "tags": {
                  "location": location,
              },
              "time": iso,
              "fields": {
                  "temperature" : temperature,
                  "humidity": humidity
              }
          }
        ]
        #Enviamos los datos a InfluxDB
        client.write_points(data)
        #Esperamos el tiempo establecido en la variable “interval”.
        time.sleep(interval)
 
except KeyboardInterrupt:
    pass
Una vez guardado el archivo y cerrado, lo ejecutamos para que se ponga a hacer su trabajo.
sudo python sensor_data_logger.py
Si todo va bien no veremos errores y si hemos dejado descomentada la línea para las pruebas de test, veremos la medición al tiempo que es mandada a InfuxDB.

El siguiente paso es lanzar este script en el proceso de arranque. Para ello detenemos  el script con CTRL+C y editamos el script para comentar la línea del test. Después editamos el archivo /etc/rc.local agregando la siguiente línea justo antes de “exit 0” para que se ejecute junto con todos los demás daemons de arranque.
sudo python sensor_data_logger.py
Con esto, tras reiniciar nuestra Raspberry Pi, el script se lanzará automáticamente y comenzará a almacenarse la información capturada por los sensores en la base de datos que hemos creador en InfluxDB. Podemos acceder y verificar que los datos están almacenándose usando el CLIinflux” o Chronograf. Para usar el CLI ejecutamos:
influx
>auth
username: admin
password:
>
>
>
> use sensor_data

Using database sensor_data
>SELECT * FROM "sensor_data"."autogen"."rpidht22" WHERE "location"='' (‘Robayna’)
Con ese comando SQL se nos mostrará todas las entradas registradas en la base de datos de nuestro medidor ambiental. Ahora vamos a usarlas.

Explotación de datos y monitoreo de métricas

En este apartado instalaremos y configuraremos Grafana, que será el software encargado de leer los datos, mostrarlos “bonitos” e incluso podremos crearle alertas. Para ello, volvemos al servidor donde tenemos instalados InfluxDB y Chronograf. Abrimos una línea de comandos e instalamos Grafana:
echo "deb https://packagecloud.io/grafana/stable/debian/ stretch main" | sudo tee /etc/apt/sources.list.d/grafana.list
curl https://packagecloud.io/gpg.key | sudo apt-key add -
sudo apt-get update
sudo apt-get install grafana
Grafana corre por defecto en el puerto 3000 con el usuario por defecto “admin” y la passwordadmin” - lo que es una cagada de seguridad que no vas a dejar si quieres tener el dispositivo seguro que ya sabes lo malas las que son las passwords por defecto, y lo que pueden ser utilizadas en el Hacking de Web Technologies -.

Figura 11: Libro de Hacking Web Technologies de 0xWord
(Estos días con 10% descuento con el cupón VERANO2019)

Lo que queremos hacer ahora es configurar el canal HTTP para que sea seguro y un conector SMTP para que nos envíe alertas. Abrimos el archivo /etc/grafana/grafana.ini. En el apartado [smtp] establecemos los siguientes valores:
enabled = true
host =  (hostname.midominio.net:25)
# Si require autentificación, descomentar las líneas y establecerlos
;user = username
;password = Password!
# Si require certificados, descomentar las líneas y establecerlos
;cert_file =
;key_file =
;skip_verify = true
from_address = 
from_name =  (Grafana)
En el apartado [server], establecemos:
protocol = https
http_addr =
http_port =  (3000)
root_url = https://: (https://:3000)
cert_file =  #Path al certificado
cert_key =  #Path a la clave privada del certificado
Ahora como queremos que el servicio corra con los máximos privilegios, abrimos el archivo /etc/default/grafana-server y modificamos los siguientes valores:

Guardamos, salimos del fichero y reiniciamos el servicio:
GRAFANA_USER=[usuario_con_privilegios]
GRAFANA_GROUP=[Grupo_con_privilegios]
Ya podemos acceder a nuestro servicio grafana usando la URL https://[host_FQDN]:[Puerto]. Lo primero que haremos será cambiar la contraseña de “admin” - como ya se anticipaba antes - y crear tantos usuarios como requiramos, estableciéndoles correctamente si son usuarios con privilegios de administrador (Admin), editor de dashboards (Editor), o solamente de visualización (Viewer).

Una vez concluido, debemos agregar una fuente de datos, que será nuestro InfluxDB, en “Configuration” -> “Data Sources”. Establecemos los parámetros que ya conocemos, activando “Basic Auth” y si es necesario “Skip TLS Verification (Insecure)”.

Figura 12: Icono de campana

Debemos configurar también el sistema de alertas en el menú de la "campana" (Figura superior). Le pondremos un nombre descriptivo, el tipo, que será por correo (e-mail) y la dirección de correo electrónico donde queremos que nos lleguen las alertas.

Figura 13: Icon de gráficas

Ahora podemos comenzar a crear los paneles. Crearemos uno para la temperatura y otro para la humedad. Lo realizamos usando el botón de "graficas" . Nos crea un panel nuevo y ponernos sobre el nombre nos aparece una flecha indicando que hay un menú desplegable, lo pulsamos, editamos y comenzamos a agregarle contenido:

Figura 14: Edición de gráficas en el dashboard

Pulsando sobre cada variable/campo podemos modificarla, añadirle, indicarle que tipo de valor queremos (media, último, máximo, etcétera). Para establecer la alerta, lo hacemos en la pestaña alert. Cuando la completemos, se nos marcará en el gráfico una área roja semitransparente con la zona de alerta.

Figura 15: Configuración de alertas

Como yo he montado la Raspberry Pi con una TouchScreen de 7” y su caja correspondiente, he añadido un dashboard para la visualización de los datos dentro del mismo CPD:

Figura 16: El medidor ambiental funcionando en el CPD

Es importante saber que, cuando accedemos a visualizar los paneles en Grafana, hay que indicarle la tasa de refresco. Esto lo tenemos arriba a la derecha, pulsando sobre “Refresh every…

Figura 17: Configuración del refresco de las gráficas

Una vez concluido tendremos una monitorización con alertas incluidas de la temperatura y humedad de nuestro CPD. A partir de aquí podéis modificar el proyecto y meterle más sensores y/o relés, que ya con esto tenéis la base para comenzar.

Saludos,

Autor: Jesús Suárez

******************************************************************************************************
Cómo construir un medidor ambiental para el CPD con Raspberry Pi [Parte 1 de 2]
Cómo construir un medidor ambiental para el CPD con Raspberry Pi [Parte 1 de 2]
******************************************************************************************************

4 comentarios:

spike_spiegel dijo...

Esta brutal este proyecto y se puede implementar en infinidad de casos, de hecho me parece genial implementar esta demo en un datacenter, le comentare a mi jefe a ver que le parece... Saludos Malignos!!!

Quano dijo...

Buenas, hace un tiempo tuve un dilema entre esto o usar adafruit.io (python+mqtt).

¿No es Grafana+Chronograf mucha carga para la PI?

Jesús Suárez Gálvez dijo...
Este comentario ha sido eliminado por el autor.
Jesús Suárez Gálvez dijo...

Hola Quano. Grafana y Chronograf no corren sobre la PI.

Entrada destacada

MyPublicInbox: Perfiles destacados por categorías #MyPublicInbox @mypublicinbox1

Cuando se conceptualizó la plataforma de MyPublicInbox se pensó en un entorno que permitiera que los perfiles públicos recibieran comunica...

Entradas populares