Wednesday, February 20, 2008

Cómo miraban al cielo los antiguos y los niños


Actualización: Stage 6 ha parado de dar alojamiento de videos, así que el documental, ya no se puede ver :-(

Ya que Eduardo Punset sigue con nosotros y sigue a esas horas tan difíciles para uno de los pocos programas que merecen la pena, he decido que pondré por aquí los enlaces a los programas para que podamos disfrutarlos. Todo ello servido gracias a la gran calidad de stage 6, y sin la necesidad de dividir el video en varias partes. Disfrútenlo ;-)


Saturday, February 02, 2008

Sistema de videovigilancia casero

Tenía pendiente desde hace algún tiempo este tema y finalmente me he puesto para completarlo.
El sistema de vigilancia implantado está realizado totalmente con herramientas de software libre y con el menor coste posible.

El software detecta si hay movimiento en un espacio determinado mediante una webcam conectada a un Ubuntu 7.10. Si el programa está activado, éste se encargará de detectar la presencia de un extraño y capturar tanto vídeo como imágenes del intruso, las almacenará en el disco duro y enviará dos emails, uno con las imágenes adjuntas y otro con el vídeo captado. Además también generará un evento en google calendar y enviará un aviso inmediatamente al móvil asociado a la cuenta de google. También he añadido que en el momento en el que el intruso genere el evento se escuchen sonidos de sirenas de policía por los altavoces del equipo.

La parte de detección de movimiento se realiza gracias al maravilloso programa Motion, el cual es totalmente configurable desde /etc/motion/motion.conf.
Para la parte de envío de emails con adjunto he utilizado la herramienta Mutt, instalando previamente la mta de sendmail para el envío de correos al exterior.

sudo apt-get install motion sendmail mutt

El envío de mensajes a móviles viene gracias a Iván Lopez y el código que he utilizado es exactamente el que publicó en su blog, por cierto gran blog ;-), éste código consiste en un programa Java que utiliza las librerías de la API de Google Calendar para generar un evento en nuestro calendario y enviar un mensaje de texto a nuestro móvil con el evento.

El sistema puede ser ejecutado de manera manual o bien programando su ejecución y parada desde el cron de linux.
Yo me he puesto dos iconos en el escritorio, uno llamado "conecta_alarma" y otro "apaga_alarma".

conecta_alarma nos lleva al lanzador:

sh /home/daniel/src/ejecuta_motion_retardo.sh


El lanzador de apaga_alarma:

killall motion


conecta_alarma llama al script ejecuta_motion_retardo:

daniel@miequipo:~/src$ more ejecuta_motion_retardo.sh
sleep 60s
motion -c /home/daniel/src/motioncas.conf -n


El cual realiza una pausa de 60 segundos antes de ejecutar motion, más que nada para que de tiempo a retirarse del campo de visión de la cámara y no generar falsas alarmas.
Una vez pasados los 60 segundos se ejecuta motion con una configuración personalizada que a continuación adjunto:


daniel@miequipo:/$ more /home/daniel/src/motioncas.conf
# Minimal motion example config file provided by the
# Debian motion package - for basic webcam operation.
#
# You most certainly want to investigate
# /usr/share/doc/motion/examples/motion-dist.conf.gz
# for further configuration options. Also, refer to the
# motion man page and /usr/share/doc/motion/motion_guide.html
# for detailed information on configuration options.

daemon on
quiet on

# You may very well need to change this (check with 'dmesg'
# after plugging in your webcam).
videodevice /dev/video1

# Image size in pixels (valid range is camera dependent).
width 640
height 480

framerate 25
quality 85
auto_brightness off

# General threshold level and noise threshold
# level (for distinguishing between noise and motion).
threshold 4500
noise_level 64

# Initial brightness, contrast, hue (NTSC), and saturation.
# 0 = disabled (valid range 0-255).
brightness 0
contrast 0
saturation 0
hue 0

# Encode movies in real-time (install ffmpeg before enabling).
ffmpeg_cap_new on

# Codec to be used by ffmpeg for the video compression.
# Supported formats: mpeg4, msmpeg4.
ffmpeg_video_codec msmpeg4

# Target base directory for pictures and films (you may need
# to change this (or change its permissions) depending on
# which system user runs motion).
target_dir /home/daniel/Desktop/Video_vigilancia

# Define a port number (e.g. 8000) to enable the mini-http server.
# 0 = disabled.
webcam_port 4000

# Set to 'off' to allow anybody (not just localhost) to view the
# webcam via the mini-http server (http://hostname:port).
webcam_localhost on

webcam_quality 50
webcam_maxrate 8
#time between to generate new event and new video
gap 20
on_event_start sh /home/daniel/src/control.sh


En el archivo de configuración he realizado algunos cambios, habilito el servidor de video webcam_port en el puerto 4000, selecciono mi dispositivo de webcam videodevice /dev/video1, establezco un gap para especificar que un nuevo evento se produzca sólo si pasan 20 segundos sin cambios de video, y realizo la llamada a un script llamado control.sh cuando se genere on_event_start,

"An event starts at first motion detected after a period of no motion defined by gap. You can use ConversionSpecifiers and spaces as part of the command"


Finalmente control.sh hace lo siguiente:

daniel@miequipo:/$ cat /home/daniel/src/control.sh
#!/bin/bash
sh /home/daniel/src/enviaSMS.sh micorreo@gmail.com miclave "INTRUSO EN CASA,llama al 112" &

vlc /home/daniel/Music/sirena_policia.mp3 &

date > /home/daniel/Desktop/Video_vigilancia/snapshot.txt

sleep 8

tar -cvvf /home/daniel/Desktop/pillado_imagen.tar /home/daniel/Desktop/Video_vigilancia/*.jpg --after-date /home/daniel/Desktop/Video_vigilancia/snapshot.txt

tar -cvvf /home/daniel/Desktop/pillado_video.tar /home/daniel/Desktop/Video_vigilancia/*.avi --after-date /home/daniel/Desktop/Video_vigilancia/snapshot.txt

date > /home/daniel/Desktop/Video_vigilancia/snapshot.txt

mutt -a /home/daniel/Desktop/pillado_imagen.tar -s "Imagenes del intruso" micorreo@gmail.com < /dev/null
mutt -a /home/daniel/Desktop/pillado_video.tar -s "Video del intruso" micorreo@gmail.com < /dev/null


Este script se ejecuta generado por un evento en motion y lo primero que hace es mandarnos un mensaje al móvil diciéndonos que algo o alguien está moviéndose delante de nuestra cámara, luego lanza las sirenas de policía a todo trapo y en segundo plano para no perder tiempo. Luego almacena la fecha y hora en el fichero snapshot.txt, esto lo hago para controlar qué archivos voy a comprimir y enviar por email, descartando así los vídeos e imágenes de anteriores alarmas.
Para no demorar el envío de los emails, establezco un retardo de 8 segundos antes de comprimir y enviar los correos con esos 8 segundos de capturas.

Nota: para que el montaje se ajuste a tus necesidades es muy importante afinar el archivo de configuración de motion a las características de tu cámara. Y la única manera de hacerlo es prueba y error, deja el sistema encendido cuando no estés en casa y no te asustes si te llegan alarmas, estas primeras alarmas te servirán para afinar tu sistema.
Si a alguien se le ocurriera alguna forma de mejorarlo, todos agradeceríamos los comentarios ;-)

 

Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.