Que el calor no te haga salir de la piscina. Parte II

Hace una semana os contaba en la Primera Parte de este Articulo, como diseñar y poner en producción a través de una Raspberry Pi y unos sensores de temperatura y humedad DHT11, para que a través de una página web desplegada en la propia RPi, poder controlar la temperatura de nuestro datacenter de una forma muy económica y eficaz.

El problema que tiene la primera versión de este sistema (la que os contaba en la primera parte de este articulo) es que si nos encontrábamos fuera de la red local en la que estaba publicado el servidor web, no podíamos conocer el estado del CPD, cierto es que se podría desplegar una VPN para acceder remotamente a esta red y así poder monitorizar la temperatura desde cualquier parte del mundo, pero esto me parecía un poco desproporcionado, y más si la RPi la tenemos desplegada en una VLAN aislada del resto de la red. La opción que me pareció más adecuada fue la de montar un bot de Telegram, para que a través de una serie de comandos predefinidos poder consultar en cualquier momento el estado de nuestro CPD, consulta que podremos realizar desde nuestro propio teléfono móvil, y lo más importante, desde cualquier parte del mundo. Pero claro, no vamos a estar cada dos por tres preguntándole a nuestro BOT por el estado del CPD, lo suyo es que exista un sistema autónomo que compruebe cada cierto tiempo el estado de la temperatura y que si detecta algún tipo de incidencia, nos avise a través de Telegram automáticamente. De este modo, nos podemos despreocupar completamente de el estado de la temperatura. En esta segunda parte del artículo, describiré como añadir la funcionalidad de un Bot de Telegram, a nuestra RPi de gestión de temperatura.

Fig. 1 Logotipo de Telegram.

 

En primer lugar, para poder desplegar nuestro BOT de Telegram en la RPi, tan solo tendremos que instalar el API de Telegram: https://github.com/eternnoir/pyTelegramBotAPI.git. Una vez instalada, ya podremos controlar desde otro script, en Python la actividad del bot. En mi caso, he decidido dividir la tarea en dos hilos: el primer hilo sería el BOT propiamente dicho, su función sería estar escuchando continuamente los mensajes que recibe, y si alguno coincide con los comandos que se le han indicado, que actúe en consecuencia respondiendo con la información solicitada. El segundo hilo, se encarga de comprobar cada cierto tiempo el log de la temperatura del CPD, si detecta una temperatura más alta de lo normal, automáticamente enviará un mensaje a través del grupo de Telegram que se le ha indicado, para notificar la incidencia al departamento de TI y que estos actúen en consecuencia.

Fig. 2 Extracto del código Python que ejecuta el primer hilo del bot.

 

Fig. 3 Extracto del código Python que ejecuta el segundo hilo para las alertas.

 

Para que no tengáis que escribir el código Python que gestiona los dos hilos, os lo dejo por Aquí y así os lo podéis Descargar tranquilamente. Como ya dije en la primera parte del artículo, no soy desarrollador, así que si encontráis en el código partes que sean mejorables, bienvenidas serán esas modificaciones, eso sí, no me digáis que defina las variables al inicio, que de eso ya se encargan mis compañeros 😉 Aunque el código que os paso es totalmente funcional, tendréis que definir una serie de variables para poder hacerlo funcionar. Estas son:

Fig. 4 Extracto del código Python dónde se definen las variables: Token, CIDID y temperatura.

 

TOKEN: El identificador único que Telegram nos proporciona para que nuestro BOT se pueda conectar a su red. Si todavía no tenéis ningún bot creado, le podéis solicitar a la cuenta de Telegram @BotFather un bot personalizado con su correspondiente token de acceso a la red. Interactuar con @BotFather es muy sencillo: abrís un chat con @BotFather a través de Telegram y le enviáis el comando /newbot, automáticamente este os responderá pidiendo que le indiques el nombre de vuestro bot, se lo envías, los volvéis a confirmar, y @BotFather os enviará el token de vuestro bot personal. Eso sí, ese token es lo que os da la propiedad del bot, si alguien os roba ese código se podría hacer con el control del bot, así que guardar ese código a buen recaudo. Como el código del token lo hay que copiar dentro del script de Python que gestiona el bot, acordaros de establecer los permisos correspondientes de lectura, escritura para el fichero.

Fig. 5 Obtención del Token para el bot.

 

CIDID: El identificador único del usuario o grupo al que permitiremos interactuar con nuestro BOT, los números de ID positivos corresponden a usuarios y los números de ID negativos corresponden a grupos. La idea de establecer esta variable, es para poder dotar de seguridad a nuestro BOT, y de este modo impedir que cualquier persona no autorizada se pueda poner en contacto con el BOT y que este le envíe información sobre nuestro CPD. En este caso, añadí el BOT a un grupo privado de Telegram, y la ID que le paso como variable CIDID al BOT es la del grupo, de este modo, el BOT solo responde a mensajes enviados a través de ese grupo PRIVADO. Además, al establecer la variable de este modo, también la podemos aprovechar para el segundo hilo en el que le tenemos que indicar el destinatario de los mensajes que el BOT enviará en caso de que la temperatura suba por encima del limite establecido. Como se trata de un grupo, todos los integrantes del grupo podrán enviar comandos al BOT y en caso de que la temperatura suba por encima del limite establecido también les llegará la alerta a través del mismo grupo. Para obtener el ID de un usuario o grupo, existen bots en Telegram creados para tal fin, como por ejemplo el bot: @myidbot al cual si le envías el comando: /getid te dirá tu ID de usuario de Telegram, también le puedes enviar enviar: /getgroupid para que el bot te diga el ID de un grupo. Aunque yo el método que utilizo, es activar mi propio bot, enviarle un mensaje, y por pantalla ya me aparece el ID del usuario o grupo que le ha enviado el mensaje, recordad: para grupos el ID será un número negativo y para usuarios el ID será un número positivo.

Fig. 6 Obtención de nuestros UserID (azul) y GroupID (rojo) de Telegram.

 

temperatura_max: Con esta variable simplemente le indicaremos cual es la temperatura máxima que puede haber en el CPD. Si esta temperatura sobrepasa el limite establecido, el bot se activará automáticamente y comenzará a enviar mensajes de alertas, en mi caso, he definido esta variable a 28 grados, como ya dije anteriormente, tener nuestros CPD a 22 grados, ya no se lleva, incluso en función del tipo de instalación que sea, esta temperatura puede ser todavía superior. Si habéis llegado hasta este punto, significa que ya tenéis vuestra RPi preparada para poder monitorizar la temperatura de vuestro CPD de una forma un tanto peculiar. ¡Enhorabuena!.

Así es como se vería el BOT en funcionamiento:

Fig. 7 Bot despertándose de la siesta.

 

Fig. 8 Respuesta del bot a los comandos enviados.

 

Fig. 9 Bot alertando de una temperatura crítica.

 

Además, como hemos programado nuestro bot para que solamente responda a mensajes enviados desde un grupo en concreto, si le enviamos un mensaje desde cualquier otro lugar, el bot simplemente no responderá nada. Si os fijáis en esa parte del código Python, existe un “else”, por si deseamos que el bot responda algo a los usuarios no autorizados, del tipo: “Usuario no autorizado…” o similar, aunque desde mi punto de vista, cuando mas desapercibido pase el bot mejor, por eso mismo, lo tengo programado para que no responda a ningún otro mensaje. Para lo que si podríamos aprovechar este “else” es, por ejemplo, para guardar en un log, todos los intentos de comunicación no autorizado que se establezcan con el bot.

Fig. 10 Mi consejo es que vuestro Bot sea como un ninja, invisible.

 

De esta manera, no solo tendremos controlada la temperatura y humedad de nuestro CPD, si no que aunque nos encontremos de viaje podremos consultar la temperatura y el estado de las instalaciones, además podremos estar tranquilos sabiendo que si la temperatura sube en exceso, nuestro BOT nos enviará un mensaje por Telegram para avisarnos de lo que está ocurriendo, y todo esto sin tener que abrir puertos NAT de entrada a nuestros sistemas, ni contratar ningún tipo de servicio de pago. Ademas, al ser un BOT que funciona en un grupo privado de Telegram, podemos añadir y expulsar a quien queramos del grupo, sin tener que modificar una sola linea del código del BOT, en tiempo de vacaciones podremos añadir otras personas al grupo para que se queden pendientes del estado del CPD. Otra ventaja de este sistema, es que es altamente ampliable. Al quedarme un articulo tan largo, ya no me he metido en mas funcionalidades, pero perfectamente se puede añadir un comando al BOT para que tome una fotografía de las instalaciones y así poder comprobar su estado, para por ejemplo ver que tal va la cabina de discos y si hace falta remplazar algún disco sin tener que bajar a la fría y ruidosa cueva de nuestro CPD. Incluso, si os fiáis de las capacidades de vuestra RPi, se pueden añadir actuadores, tipo relés, para que de forma automática o manual, sea la propia RPi quien conecte o desconecte sistemas. Por ejemplo, programarla, para que si la temperatura pasa de 30 grados, conecte los motores de la impulsión de aire, o incluso si queremos activar la cámara para tomar una foto, y es de noche, que automáticamente encienda todas las luces de la sala de servidores y poder sacar una foto en condiciones. En este punto ya nos estamos metiendo en el mundo del “Internet of things”, es decir, un cacharro conectado a Internet que puede realizar una tarea visible en el mundo físico, así que cuidado con venirnos arriba dándole ese poder de ejecución a nuestra RPi dentro de un CPD o nuestro domicilio.

Fig. 11 Grupo de relés para acoplar al Bot.

 

Otra funcionalidad que podemos añadir, para los que tienen IP públicas dinámicas y no quieren instalar cosas raras en sus máquinas: una simple orden al BOT para que por ejemplo ejecute el comando “curl ipinfo.io” y nos diga la IP pública que tenemos asignada y así poder conectarnos remotamente. Como veis existen una infinidad de funcionalidades que podemos añadir a nuestra RPi, y en las que el limite está en nuestra imaginación. La idea del artículo era esta, mostrar que aunque a veces existen sistemas o equipos ya montados y listos para usar, los que solo los tenemos que comprar y conectar, con un poco de imaginación y “cacharreo” podemos crear con nuestras propias manos sistemas tan interesantes como el que hoy he mostrado. Eso sí, si vuestro CPD tiene una certificación Tier III o Tier IV y montáis un sistema de medición de temperatura con una RPi y un sensor DHT11, por favor, avisadme que eso se merece un café (pero mejor que sea un café con hielo, que buena falta nos hará 😉 )

Salu2

Manuel Guerra

Manuel Guerra

Mi nombre es Manuel Guerra. Investigador especializado en: [eCrime] | [Forensic] && [Hacking]. Editor de GLIDER.es

Navegación de la entrada


Comentarios

  • Sergio R.-Solís

    No es un control de temperatura lo que yo tenía en mente, pero si otro script de registro y control. Con lo del bot de telegram me has apañado la solución para ese proyecto que lleva tiempo en el cajón esperando su momento (y lo que le queda, que de momento sólo tengo la servilleta). ¡Muchas gracias! Gran explicación, como siempre.

    • Manuel Guerra

      Manuel Guerra

      Me alegro que te sirva para algo este post!!. Un saludo Sergio.

  • Oscar

    Bueno, pues gracias por tus dos artículos, me han venido muy bien para poder montarlo para el control de temperatura de nuestras impresoras 3D. Me ha constado un poquito teniendo en cuenta que el C lo tenía olvidado desde hace 2 décadas y lo he implementado en un Rpi 3 teniendo que meter un retardo ya que sino no me cogía bien las medidas.
    Lo acabo de terminar de probar . Y nos va a venir muy bien para el próximo verano.

    • Manuel Guerra

      Manuel Guerra

      Buenas tardes Oscar, me alegra mucho ver que ha servido para algo la explicación del articulo!!! Ya pasarás una foto para ver como te ha quedado el invento 😉

      Un saludo

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puede usar las siguientes etiquetas y atributos HTML:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>