Controla tu Raspberry Pi mediante Telegram (Actualización)

Buenos dias a tod@s.

Después de un tiempo sin escribir por motivos familiares y siguiendo un poco con el tema de los scritps en Python, hoy traigo la actualización del bot de Telegram que vimos en la entrada “Controla tu Raspberry Pi mediante Telegram”. He recibido varios comentarios en dicha entrada preguntando como añadir algunas funciones al bot y he decidido compartir el mio tal cual lo tengo a día de hoy. — GitHub —

Siguiendo un poco el orden del menú, iremos viendo las nuevas opciones introducidas. En esta ocasión no voy a explicar el código de cada una de ellas puesto que ya se vio lo básico en la otra entrada y es un poco mas de lo mismo.

 

Menú Principal.

 

RPInfo: menú de información sobre la Raspberry.

  • Status: existe un panel de monitorización para Raspberry creado por Mario Pérez Esteso en node.js que nos muestra de una manera muy gráfica el estado de la misma (temperatura, memoria, cpu, etc). Con esta opción ejecutamos dicho panel para posteriormente poder visualizarlo con un navegador en el puerto 8000. Su instalación es muy sencilla, basta con seguir las instrucciones en su Github. Decir que debemos guardar la carpeta con el nombre Raspberry-Pi-Status en el mismo directorio que se encuentre el bot para que funcione (siempre podéis cambiar la dirección por la que mas os convenga).

 

Panel de Monitorización.

 

Logs Auth y Fail2Ban.

Los logs auth y fail2ban no están completos, sino que he extraído las lineas de los ataques recibidos e ips baneadas respectivamente para ahorrar tiempo en el envío y espacio.En fail2ban vemos las ips y el nº de veces que han sido baneadas, mientras que en el log auth muestra la fecha, hora, usuario, ip, puerto y servicio atacado.

 

Hasta aquí la parte del menú RPInfo, en la cámara no he añadido nada nuevo pero si he hecho un cambio, ahora guarda las fotos tomadas con la cam en la carpeta «fotos» que se encuentra en el mismo directorio que el bot y las fotos tomadas por motion en la carpeta motion también en el mismo directorio. Estas carpetas deben estar creadas sino el bot no podrá guardar dichas fotos.

Continuamos con una nueva sección, la parte de Arduino. Como podéis imaginar, he conectado un Arduino (Nano) a la Raspberry por el puerto usb, dejaré el archivo que hay que cargar en el Arduino junto con el bot en Github. Por si alguien no está familiarizado con Arduino, un pequeño tutorial de como cargar el archivo.

    1. Descargamos el ide de Arduino desde su web.
    2. Descomprimimos el archivo, entramos en la carpeta resultante y ejecutamos: ./arduino
    3. Con el arduino enchufado por usb al ordenador, vamos al menú Herramientas, seleccionamos el tipo de placa y comprobamos que haya un puerto activo.
    4. Abrimos el archivo .ino y pinchamos en el primer botón de la barra superior para verificar que el código no tenga fallos.
    5. Si todo ha ido bien, pinchamos en el segundo botón para cargar el archivo en el arduino.

 

Menú de botones.

Tenemos el Arduino listo para recibir y ejecutar ordenes. Dejo un esquema de las conexiones.

Circuito.

Un led conectado al pin d13 y un buzzer (o altavoz en su defecto) conectado al pin 3.

El cable marrón es el negativo (GND) del arduino al negativo de la protoboard para después conectar el negativo del led y buzzer.

Ahora si vamos a ver las opciones disponibles.

Menú Arduino.

  • LED ON/OFF: enciende y apaga el led conectado. No le doy ninguna utilidad en concreto, es lo primero que conecte para probar raspberry, arduino y bot todo junto. Podia utilizarse de lamparita (tipo usb) o para iluminar la zona donde está apuntando la cam (si hay poca luz).
  • Efectos de Sonido: se me ocurrió que estaría bien poder reproducir algunos sonidos como alarmas para espantar a los intrusos, sicofonias, etc. Para ello necesitamos tener un altavoz conectado al puerto de los cascos de la Raspberry y el módulo o librería pygame instalado (pip install Pygame). También es posible reproducir sonidos con un buzzer o zumbador conectado al Arduino jugando con las frecuencias y el tiempo, es el caso del Mario.

Menú Sonidos.

  • Mensaje de voz: nos permite enviar un mensaje de texto que posteriormente va ser reproducido con una voz a elegir entre hombre, mujer o espectro. Tenemos que tener instalado espeak (http://espeak.sourceforge.net/index.html) que es el encargado de pasar el texto a voz, dispone de varios tipos de voces para elegir y editar cambiando velocidad, volumen, tono, etc.
    • Algunos comandos de uso para espeak:
      • Idiomas: espeak –voices -> espeak -ves (español)
      • Voces: espeak –voices=variant -> espeak -ves+m7 (voz hombre)
      • Tono: por defecto 50 -> -p80
      • Volumen: -a 100

 

Vamos con la última parte del menú principal, Seguridad, desde aquí vamos a poder controlar las funciones de la cámara de “seguridad”, que no es mas que una webcam conectada usb a la Raspberry junto con el software Motion.

Menú Seguridad.

  • LiveCam: Motion nos permite ejecutarlo en modo cámara normal para poder verlo luego a través del navegador por el puerto 8080.
  • Move: pero también podemos ejecutarlo de modo que tome una foto cada vez que detecta movimiento.
  • Alarma: activa y desactiva una alarma, en caso de estar activada, suena cada vez que motion detecta movimiento gracias a una opción que veremos mas adelante.
  • Descargar: descargará las fotos, en un archivo comprimido, tomadas por Motion en ambos modos.

Para instalar Motion basta con un apt-get install motion. Vamos a configurar algunas opciones editando el archivo /etc/motion/motion.conf.

  • Opciones a editar:
    • daemon: on
    • width: 640
    • height: 480
    • threshold: 1500 -> mediante esta opción indicamos el número de píxeles que deben cambiar para que capture la foto, ajustarla a vuestras necesidades.
    • quality: 100 -> calidad de la foto.
    • target_dir: directorio donde va guardar las fotos.
    • stream_port: puerto a la escucha para la cámara online.
    • stream_quality: calidad del stream.
    • stream_localhost: si vais a acceder al stream desde fuera de la red local ponerlo en off.
    • stream_auth_method: método de autenticación para acceder al stream, lo recomendado es usar MD5.
    • on_event_detected: esta opción es  muy interesante, nos permite ejecutar un comando o script cuando Motion detecta movimiento. En mi caso ejecuto un script en Python que envía un aviso al bot y hace sonar la alarma en caso de estar activada (lo dejaré junto con los demás). La linea quedaría de la siguiente manera: on_event_detected python /path/to/alarm.py move . El problema de ejecutarlo cada vez que detecta movimiento es que puede ser demasiado repetitivo, es posible ejecutarlo solo al comienzo del evento mediante la opción on_event_start o cuando el movimiento se detecte en una zona concreta on_area_detected (a gusto del consumidor).
    • on_camera_lost: ejecutará el script antes visto en caso de detectar la webcam, así sabremos si hay algún problema: on_camera_lost python /path/to/alarm.py cam .
  • HTTP Based Control: podemos editar este archivo de configuración accediendo con un navegador al puerto 8081. Con las siguientes opciones configuramos este servicio.
    • webcontrol_port: 8081
    • webcontrol_localhost: igual que con stream, si queremos acceder desde fuera de la red local ponerlo en off.
    • webcontrol_authentication: activarlo para que pida usuario y contraseña eliminando el punto y coma del principio de linea.

Estas son solo algunas de las opciones disponibles y que yo he editado pero tiene muchas mas, echarles un vistazo.

Por último veamos por encima el funcionamiento del script alarm.py.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import telebot
import sys
import pygame
import time
import os


TOKEN = "TOKEN" # Cambiar por token
cid = "Nº CID" # Cambiar por numero cid
bot = telebot.TeleBot(TOKEN)


def play(fname, seg):
    pygame.mixer.init()
    pygame.mixer.init(44100)
    pygame.mixer.music.load(fname)
    pygame.mixer.music.play()
    time.sleep(seg)
    pygame.mixer.music.stop()


if len(sys.argv) < 2:
    print("Uso: %s [cam/move]" % sys.argv[0])
elif sys.argv[1] == "cam":
    bot.send_message(cid, "¡¡Camara no disponible!!")
elif sys.argv[1] == "move":
    bot.send_message(cid, "¡¡Movimiento Detectado!!")
    with open('alarm.txt', 'r') as f:
        state = f.readline().strip('\n')
    if state == "1":
        play('Sonidos/alarma.mp3', 15)
        os.system('espeak -ves+m7 -s165 -p30 \"Intruso detectado\"')
else:
    print(" ¡¡ERROR!!")

Declaramos unas variables con el token del bot y el número cid (debéis introducir los vuestros).

La función play() se encarga de reproducir el archivo de sonido indicado, le pasamos dos argumentos: fname (ruta del archivo a reproducir) y seg (segundos que va a estar reproduciéndose).

El bloque if comprueba si le hemos pasado el argumento necesario (cam o move) y muestra la ayuda de no ser así. Para la cam simplemente enviamos un mensaje al bot informando. En el caso de move envía el mensaje de movimiento detectado y comprueba si la alarma está activada o no leyendo un archivo de texto, si hay un 1 (activada) reproduce el sonido de alarma y suena el mensaje «Intruso detectado» mediante espeak.

 

Hasta aquí la entrada de hoy, espero que os sirva de inspiración para los vuestros.

Un saludo, vasco.