Creando una alarma con Raspberry Pi: Videovigilancia y remoto con Telegram
Vamos a empezar con la creación de un sistema de videovigilancia y alarma a través de Raspberry Pi, una cámara y control remoto con Telegram.
Café en mano y al grano!
En primer lugar vamos a preparar telegram en raspbian:
Partiendo de que ya tenemos la imagen de raspbian grabada, comenzamos instalando dependencias que nos harán falta:
1 |
sudo apt-get install libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev make imagemagick libnotify-bin |
Nos descargamos telegram-cli:
1 2 3 4 5 6 7 |
git clone --recursive https://github.com/vysheng/tg.git && cd tg git checkout 4630862924102ce508132296670c7c712bc65ee2 cd tgl/ git checkout 0205b668d3abcf35a348556776d1180439d115d9 cd .. ./configure make |
El paso a un commit anterior es debido a un problema enviando archivos en las últimas versiones de telegram-cli.
En esta primera entrada vamos a configurar tres acciones remotas: foto, gif, o vídeo; las cuales se solicitarán mediante esos mismos comandos.
Para gestionar todo esto, Telegram-cli tiene la opción de trabajar con scripts en lua, los cuales usaremos para permitir las solicitudes y respuestas remotas.
Nota: En mi caso todos los scripts los guardaré en ../tg/scripts
Alarma.lua – Es el programa principal que se encarga de llamar al resto y gestionar solicitudes y respuestas remotas:
Nota: Tenemos que cambiar el USER_ALLOWED = «NAME» por un usuario al que queramos permitir el control remoto (en mi caso para estas pruebas: «Mama»)
Si no se usan las mismas rutas para tg cambiar en las primeras lineas del script.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
SCRIPTS_FOLDER = "/home/pi/workspace/tg/scripts/" TOSEND_FOLDER = "/home/pi/workspace/tg/toSend/" USER_ALLOWED = "NAME" function on_msg_receive (msg) if msg.out then return end -- Allowed only our ID's if (msg.from.print_name == USER_ALLOWED) then if (msg.text=='foto') then os.execute('lua5.2 ' .. SCRIPTS_FOLDER .. 'foto.lua') send_photo(msg.from.print_name, TOSEND_FOLDER.. 'foto.jpg', ok_cb, false) end if (msg.text=='gif') then os.execute('lua5.2 ' .. SCRIPTS_FOLDER .. 'gif.lua') send_video(msg.from.print_name, TOSEND_FOLDER..'gif.gif', ok_cb, false) end if (msg.text=='video') then os.execute('lua5.2 ' .. SCRIPTS_FOLDER .. 'video.lua') send_video(msg.from.print_name, TOSEND_FOLDER..'video.mp4', ok_cb, false) end end end function on_our_id (id) end function on_secret_chat_created (peer) end function on_user_update (user) end function on_chat_update (user) end function on_get_difference_end () end function on_binlog_replay_end () end function ok_cb(extra, success, result) end |
foto.lua – En el podemos configurar las diferentes características que queremos para las fotos (calidad):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
FOLDER = "/home/pi/workspace/tg/media/" TOSEND_FOLDER = "/home/pi/workspace/tg/toSend/" --Quality 0 - 100 QUALITY = 5 name_folder = os.date("%H_%M_%S_%m_%d_%Y") name_picture= os.date("%H_%M_%S_%m_%d_%Y") os.execute('mkdir '..FOLDER..name_folder) os.execute('raspistill -o ' .. FOLDER .. name_folder ..'/' ..name_picture..'.jpg -t 1 -q '.. QUALITY) os.execute('cp ' .. FOLDER .. name_folder ..'/' ..name_picture..'.jpg ' .. TOSEND_FOLDER ..'/foto.jpg') |
gif.lua – Configuración para los gifs ( número de imágenes, tiempo de grabación):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
FOLDER = "/home/pi/workspace/tg/media/" TOSEND_FOLDER = "/home/pi/workspace/tg/toSend/" --Quality 0 - 100 QUALITY = 5 TIME_EACH_PHOTO = 3 name_folder = os.date("%H_%M_%S_%m_%d_%Y") os.execute('mkdir '..FOLDER..name_folder) for i = 1, NUMBER_OF_PICTURES do name_picture= os.date("%H_%M_%S_%m_%d_%Y") os.execute('raspistill -o ' .. FOLDER .. name_folder ..'/' ..name_picture..'.jpg -t 1 -q '..QUALITY..' -h 600 -w 900') os.execute('sleep '..TIME_EACH_PHOTO) end os.execute('convert -delay 100 '.. FOLDER .. name_folder .. '/* -loop 0 ' ..FOLDER..name_folder..'/'..name_picture..'.gif' ) os.execute('cp ' .. FOLDER .. name_folder ..'/' ..name_picture..'.gif ' .. TOSEND_FOLDER ..'/gif.gif') |
video.lua – Configuración para el vídeo (tiempo de grabación, tamaño):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
FOLDER = "/home/pi/workspace/tg/media/" TOSEND_FOLDER = "/home/pi/workspace/tg/toSend/" TIME = 3000 HEIGHT = 600 WIDTH = 900 name_folder = os.date("%H_%M_%S_%m_%d_%Y") os.execute('mkdir '..FOLDER..name_folder) name_video= os.date("%H_%M_%S_%m_%d_%Y") os.execute('raspivid -o ' .. FOLDER .. name_folder ..'/' ..name_video..'.h264 -t '..TIME..' -h '..HEIGHT..' -w '..WIDTH..'') os.execute('cp ' .. FOLDER .. name_folder ..'/'..name_video..'.h264 ' .. TOSEND_FOLDER ..'/video.mp4') |
Creamos la carpeta «toSend» que es donde se guardan los archivos a enviar, en mi caso:
1 |
mkdir /home/pi/workspace/tg/toSend/ |
Una vez descargados los scripts pasamos a arrancar telegram-cli cargando el script principal alarma.lua:
1 |
./bin/telegram-cli -s scripts/alarma.lua |
Nota: En el primer arranque nos solicitará el número que queremos configurar. (El formato es: +34xxxxxxxxx, +34 si es España)
y ya como pruebas de concepto unas caputras de las distintas acciones:
foto: gif: vídeo:
Seguiremos mejorando el sistema, tanto la parte ya implementada como nuevas ideas; por ejemplo detección de movimiento, alarma sonora, grabación de vídeo… pero eso ya lo dejo para entradas posteriores, cuando la taza de café vuelva a estar llena.
Esta bueno pero tengo una duda, asi termina o le agregaras mas cosas?
Buenas,
Actualmente la tengo con más funcionalidades como sensor de movimiento, alarma sonora, los correspondientes avisos, etc. Por falta de tiempo no he podido terminar la segunda parte de esta entrada, pero espero poder tenerla pronto. Saludos.
Hola, esta muy interesante tu aporte, actualmente estoy tratando de hace un proyecto muy parecido, me podrías ayudar en como regresar la salida de un comando en consola por decir la temperatura de la raspberry o algo parecido, ya que no puedo pasar de esta parte, agradecería mucho tu ayuda. Gracias!!!
Muy bueno!! Y quedó a la espera de la segunda parte
Hola Santi.
Tengo una duda que por más que busco en internet no consigo resolver y es referente a la seguridad del control con telegram de la raspberryPI. Si yo conozco el número de teléfono que has registrado en telegram-raspberry (que suele ser el mismo que el del movil) puedo cambiar mi nombre de usuario de telegram a Mama y enviar un mensaje con el texto ‘foto’ y aunque la foto no me la enviaría a mi, imagina si la acción va dirigida al encendido de una luz o a la apertura de una puerta. Y es que la autenticación se realiza por el nombre del contacto y no por el número de teléfono. ¿Cómo se resuelve este problema de seguridad?
Gracias de antemano por la ayuda.
Tienes razón, lo que habría que hacer es filtrar por id en lugar de nombre. Para ello hay que cambiar msg.from.print_name por msg.from.peer_id. El id lo puedes consultar con este bot get_id_bot
Ahora bien, desde que salió la API para crear bots de telegram esta implementación es un poco «ruda» en comparación con lo que se puede hacer gracias a los bots.
Un saludo
Ahora sí funciona!!
La verdad es que aun no me he metido con las bots pero todo llegará…
Muchas gracias