ThiefWatcher, un sistema casero de vigilancia en interiores I
En esta serie de artículos voy a hacer un poco de bricolaje para construir un sistema de video vigilancia y alarma contra robos casero, utilizando materiales relativamente baratos y un programa que nos avisará al móvil en caso de detectar intrusos y nos permitirá obtener fotografías de los mismos para poder avisar inmediatamente a la policía y proporcionárselas. La rápida identificación de los ladrones puede ser determinante para que recuperemos todas nuestras pertenencias rápidamente.
Esta vez la solución consta de bastantes proyectos. Además de la aplicación de escritorio que sirve como centro de control, he utilizado Xamarin para crear una serie de proyectos con las App de los clientes Android, iOS y Windows Phone. También he creado unos cuantos proyectos que implementan los diferentes protocolos que utiliza la aplicación, para controlar las cámaras, avisar al móvil, detectar la presencia de intrusos o almacenar las fotos en la nube.
En este enlace podéis descargar el código fuente de la solución ThiefWatcher, escrita en CSharp con Visual Studio 2015.
El hardware
En primer lugar, vamos a ver el hardware que he utilizado para realizar todo el montaje. Este es el esquema del montaje:
En primer lugar, tenemos un interruptor detector de presencia, que se activará cuando detecte algún intruso, es como cualquier otro interruptor, solo hay que conectarle dos cables desde la toma de corriente a la entrada y tomar su salida para activar el dispositivo que pondrá en marcha todo el sistema.
El dispositivo que yo he utilizado para activar el sistema es un simple relé. El interruptor enciende una fuente de alimentación de 12 voltios, que a su vez activa el relé. Al activarse el relé, cierra un circuito que conecta una entrada de una placa Arduino (en mi caso una placa Arduino Mega) con la alimentación de 5 voltios de la misma placa, y esta envía una señal por el puerto serie USB al ordenador donde está montada la aplicación que controla todo el sistema.
Una vez recibida la señal de activación, el sistema pone en marcha las cámaras de video, que empezarán a tomar fotografías y subirlas a la nube o al medio que tengamos configurado en el sistema. El sistema no trabaja con un canal de video continuo, ya que la subida de imágenes con una conexión ADSL y un servicio en la nube puede ser bastante lenta. Por otra parte, es suficiente con tener fotografías de los intrusos para poder proporcionárselas a la policía para su identificación, y son más manejables que los videos.
Como servicio en la nube he utilizado Dropbox, que es gratuito y muy sencillo de utilizar. Las cámaras ya son otra cosa. En mi caso, tengo dos cámaras, una cámara IP con protocolo cgi NetWave, que es relativamente económica, y una cámara Axis con protocolo cgi VAPIX, que es una cámara profesional con muy buenas prestaciones, pero con un precio bastante elevado. Las dos cámaras tienen la capacidad de tomar imágenes en la oscuridad.
La clave del sistema está en que nos enteremos inmediatamente de que alguien ha entrado en nuestro domicilio, para lo cual lo más sencillo es recibir una llamada en el móvil. Para esto he conectado un modem AT al ordenador y a la línea telefónica y utilizo comandos AT para marcar el número o números de aviso.
Además de todo esto, en mi caso tengo un SAI (fuente de alimentación ininterrumpida) en previsión de cortes de luz. Quedaría el tema de un corte en la línea telefónica, que nos dejaría también sin conexión a internet, que solo puede evitarse utilizando un modem 3G, aunque perderíamos la posibilidad de llamar al móvil con el modem telefónico y habría que implementar otro tipo de aviso, por ejemplo a través de Skype. El sistema permite realizar cualquier combinación de protocolos, como veremos más adelante.
La aplicación ThiefWatcher
En cuanto a la aplicación que controla todo esto, ThiefWatcher, existen una serie de protocolos para cada una de las tareas en las que se dividen los procesos del sistema, y se utiliza la inyección de dependencias para configurar cada una de ellas. Estos protocolos se implementan mediante un interfaz, que está definido en la librería de clases WatcherCommons, en el espacio de nombres Interfaces.
Los distintos protocolos definidos son los siguientes:
- IWatcherCamera: utilizado para comunicarse con las cámaras. He implementado este protocolo para dos tipos de cámara, NetWaveProtocol, para cámaras IP que implementan el protocolo cgi NetWave, y VAPIXProtocol, para cámaras que implementan el protocolo CGI VAPIX.
- ITrigger: utilizado para disparar el sistema de vigilancia. He implementado un disparo a través de un puerto serie en la librería de clases ArduinoSimpleTriggerInterProtocol.
- IAlarmaChannel: se utiliza para avisarnos de que se ha producido una alarma. He implementado dos librerías con este tipo de protocolo, una es para realizar una llamada telefónica utilizanod un modem AT, en la librería de clases ATModemProtocol, y la otra para enviar un aviso a través de Skype, en la librería de clases LyncProtocol.
- IStorageManager: utilizado para enviar las fotografías y los mensajes de control. He implementado dos versiones de este protocolo, una que utiliza Dropbox para intercambiar las imágenes y los ficheros de comandos y respuestas, DropBoxProtocol, y otra que utiliza Azure blob storage para el mismo propósito, AzureBlobProtocol.
Comentaré todos estos protocolos en el siguiente artículo de la serie. Por el momento, vamos a ver como configurarlos en la aplicación ThiefWatcher. Una de las ventanas de la aplicación es el panel de control, que podemos utilizar para seleccionar y configurar los protocolos que vamos a utilizar. El aspecto es el siguiente:
En la parte superior del panel, podemos ver la configuración de la alarma. Un desplegable nos permite seleccionar el protocolo. La cadena de conexión permite definir todos los parámetros necesarios para la configuración. Estos parámetros dependerán del protocolo seleccionado. En el siguiente artículo de la serie explicaré los valores para los protocolos que he implementado.
La fecha de inicio se utiliza para establecer el momento en el que el sistema empieza el proceso de vigilancia. Antes de esta fecha/hora el sistema no enviará alarmas. Si no seleccionamos una fecha de inicio, el sistema empezará a vigilar desde el momento en que lo activemos.
La fecha final indica cuando debe detenerse el sistema y dejar de vigilar. Si no seleccionamos ninguna fecha, nunca se detendrá de manera automática y habrá que detenerlo manualmente.
Podemos indicar al sistema que tome una cantidad determinada de fotografías, separando cada una de ellas una cantidad determinada de segundos de la siguiente. En el momento de activarse el sistema, se tomará la primera fotografía.
La sección de notificaciones nos permite seleccionar el protocolo que vamos a utilizar para avisarnos de un posible problema. Además de la configuración indicada en la cadena de conexión, podemos establecer un mensaje de aviso predeterminado, si el protocolo admite esta funcionalidad. El botón de Test nos permite realizar una prueba del protocolo de aviso sin necesidad de realizar un simulacro.
El protocolo de almacenamiento es el utilizado para la transmisión de imágenes y comandos y respuestas de control, además de la cadena de conexión con los parámetros para inicializarlo, permite definir una ruta relativa para almacenar los datos.
En cuanto a los botones de control, podemos realizar un simulacro del sistema, de cara a probar nuevos protocolos, por ejemplo. La diferencia entre un simulacro y el funcionamiento real del sistema es que en un simulacro no se tiene en cuenta el protocolo de alarma, sino que el sistema comienza directamente en un estado similar al producido después de ser disparada una alarma, pero sin tomar fotografías.
El modo vigilancia real comienza al pulsar el botón Iniciar, y con el botón Guardar podemos guardar los cambios en la configuración.
Para configurar una nueva cámara podemos utilizar el menú Archivo / Nueva Cámara… El programa nos pedirá en primer lugar seleccionar el tipo de protocolo utilizado por la cámara. A continuación, el programa pedirá los datos de acceso, que consisten en la Url para acceder a la cámara, el nombre de usuario y la contraseña para conectarnos, y aparecerá la siguiente ventana:
Con el primer botón, empezando por la izquierda, podemos cambiar los datos de acceso a la cámara. El segundo botón nos mostrará un cuadro de diálogo para configurar los parámetros de la cámara. A continuación tenemos dos botones para iniciar la captura de imágenes y detenerla. Debemos escribir un identificador para la cámara en el cuadro de texto ID, y, por último, tenemos un botón para guardar la configuración de la cámara y otro para eliminar la cámara de la configuración.
Esto es todo por el momento. En el próximo artículo veremos los detalles de la configuración de cada uno de los protocolos y de las cámaras.