lunes, 19 de septiembre de 2016

Controla tu Raspberry Pi mediante Telegram



Buenos días a tod@s.

En ésta ocasión vamos a crear un bot de Telegram en python para controlar nuestra Raspberry Pi desde el móvil, éste va a incluir:
  • Control de una webcam (fotos, timelapse).
  • Información sobre el estado de la Raspberry (ram, hd, temperatura y cpu).
  • Envío de comandos de sistema (como en una terminal).
  • Comprobación de seguridad para restringir el acceso a ciertas partes.

Lo primero de todo será buscar "BotFather" en Telegram para crear y obtener el TOKEN de nuestro bot, basta con escribir @BotFather en el buscador de Telegram.


Pulsamos Iniciar y nos mostrará los comandos disponibles, para ejecutar un comando podemos pulsar en la lista o escribirlo en un mensaje. El primero que usaremos será /newbot, BotFather nos preguntará por este orden:
  • Nombre del bot.
  • Nombre público del bot terminado en "bot" (Ej: PruebaBot)

Una vez introducidos, nos muestra un mensaje satisfactorio con el TOKEN, guardarlo pues nos hará falta. Echarle un vistazo a los demás comandos disponibles para personalizar el bot como la descripción, imagen, comandos disponibles, etc, luego veremos alguno.



Ya estamos listos para empezar a escribir el bot en sí. Creamos un nuevo archivo en python e importamos los módulos necesarios, en mi caso he utilizado pyTelegramBotAPI. También vamos a declarar algunas variables que utilizaremos posteriormente.

Instalación del módulo: sudo pip install pyTelegramBotAPI



Para tener una visión mas clara de lo que sucede en consola, creamos una clase para darle color al texto.


Añadimos una función que comprobará si es un nuevo usuario o no y obtener su id.


Lo siguiente será crear las funciones esenciales del bot, listener (recibe los mensajes que envían los usuarios), comando start(arranca el bot) y la ayuda.



Para que el bot muestre los comandos que tenemos en la ayuda, tenemos que irnos nuevamente a @BotFather y usar la opción /setcommands, elegimos el bot, escribimos los comandos con su respectiva descripción tal como nos muestra @BotFather.


Ahora es turno de los menús del bot: principal, cámara e información de la Raspberry.

  • Menu Principal
Este menú se va a encargar básicamente de enviarnos al menú de la opción seleccionada.



  • Menú RPInfo
Mediante este menú obtenemos información relacionada con la Raspberry como la temperatura de CPU y GPU, espacio en disco, memoria RAM usada y uso de la CPU. Nos enviará un mensaje con la info solicitada además de imprimirla por consola, de esta forma podemos ver los comandos que se ejecutan.




En el caso de la información del disco duro y memoria RAM tenemos dos funciones apartes, éstas son llamadas en el menú anterior.



  • Menú Cámara
En este menú tenemos las opciones sacar foto simple y timelapse (saca un número de fotos indicado por nosotros, una cada 10 segundos). En mi caso he usado de webcam una EyeToy de Playstation 2, no necesita alimentación extra ni ningún tipo de instalación extra, enchufar y usar ;) .

El programa que saca las fotos es fswebcam, para instalarlo basta con un apt-get install fswebcam. Lo usaremos tanto para sacar una foto simple como para el timelapse.


 En este menú hay un pequeño cambio con respecto a los demás, antes de hacer nada, comprueba el id de usuario para saber si somos nosotros los que intentamos acceder, en caso contrario bloquea el acceso y no funcionará. Ésta opción podéis añadirla a cualquier otro menú o función que deseéis bloquear a los demás usuarios o como medida de seguridad.

Para saber cual es vuestro id basta con que ejecutéis cualquiera de las opciones de información, en consola mostrará un número.

Otro detalle a tener en cuenta es en la línea que ejecuta fswebcam (subrayada de amarillo), en el caso que ejecutéis el bot en un portátil, éste ya tendrá su propia webcam, por lo tanto deberéis comprobar los dispositivos de vídeo que tenéis mediante el comando ls /dev/video* . Elegir el dispositivo y modificar dicha línea en caso de que fuera necesario.
Para terminar con la cámara, nos falta la función timelapse y otra encargada de comprimir las fotos obtenidas y enviar el archivo .tar a nuestro móvil.





El enviar las fotos comprimidas puede no ser la mejor opción puesto que luego necesitamos una app en el móvil que las descomprima o esperar a pasar el archivo al pc. Lo he hecho así para el caso en que tenga muchas fotos, solo enviará un archivo además de ahorrar un poco de espacio.

La aplicación que uso yo para descomprimir es "Rar Zip 7Zip File Explorer", que como podéis intuir soporta varios formatos.

También se pueden enviar las fotos según se van sacando modificando la función timelapse, ¡A gusto del consumidor!.


Command Exec

Como última opción tenemos el envío de comandos de sistema, como si de una shell se tratara. Funciona de la siguiente manera: cuando el bot recibe un mensaje que empieza por /exec (podéis poner lo que querais) sabe que el texto que le sigue es un comando a ejecutar.



Es una función sencilla, en primer lugar comprueba el id, si somos nosotros, ejecuta el comando que indiquemos y nos envía un mensaje con la salida del mismo.


Capturas de ejemplo:



Con esto hemos terminado el bot, es muy mejorable, se le pueden añadir opciones, modificar las que ya tiene o utilizarlo como ejemplo para construir uno mejor.

Aquí os dejo el enlace al bot.py.

Un saludo, vasco.


No hay comentarios:

Publicar un comentario

Google Analytics