Domotizando la casa - Cámaras

in ipcam •  6 years ago  (edited)

¡Buenas!
Este es el que espero sea el primero de muchos artículos.

Puede que no sea un sentimiento compartido con todo el mundo, pero al menos a mi, me preocupa saber el estado de mi vivienda mientras no estoy en ella y sobretodo que en caso de que pasara algo, tuviera alguna prueba/constancia de ello para el seguro/la policía.

Así pues, para tranquilizar mi yo interior me decidí a montar un sistema de ipcams casero que registrase todo movimiento en cuanto este se produciera.

Quiero recalcar la palabra casero.

El artículo lo he separado en:

  • Fase 1: Trazando el plan de ataque

  • Fase 2: Eligiendo el material

  • Fase 3: Montaje

Comencemos.

Fase 1: Trazando el plan de ataque

Tras un par de búsquedas me queda claro que las opciones que hay son:


Tirar por un sistema DVR/NVR:
Podríamos decir que es lo más acertado si tienes un negocio/quieres montar un sistema profesional. Suele ser un pack de cámaras que se cablean hasta un dispositivo propietario donde metes los discos duros que quieras y este ya se encarga de todo lo demás.
Contras:
Caro, uno bueno no baja de los 200€
Propietario, si le dejan de dar soporte estás jodido y nunca sabes muy bien qué está haciendo por detrás.

Sólo por el primer punto en mi caso ya perdí todo el interés. No puedo permitirme nada demasiado caro, así que esta opción queda descartada.


Nest Cam / Amazon Cloud Cam:
Uno bastante sencillito. Compras las cámaras, las pones donde quieras y te sangran mensualmente a base de una suscripción de hasta 30€/mes pues las grabaciones se guardan en la nube y hacen un montón de cosas muuy inteligentes o eso dicen. Como ya he indicado en el sistema DVR, quedan descartado por caro.


Cámaras chinorris + NAS local:
Se trata de tener un minipc enchufado las 24hrs que reciba el vídeo de las cámaras. Lo bueno es que se le puede dar más usos.

Como es de suponer, elegí la 3era opción. Cámaras chinorris + NAS local.


La idea sería tener las cámaras y el minipc cableados hasta el router y luego el NAS tenerlo conectado al minipc en vez de a la red.

Probablemente ahora hayas pensado “pero qué demonios?”, pues si recordamos el significado de NAS, es Network Attached Storage. Es decir, tener discos duros accesibles desde la red, no en un pc. Y yo los estoy enchufando a un pc.
El motivo no es otro que nuevamente la seguridad.

Tener el NAS enchufado directamente a la red significaría que cualquier invitado podría acceder al mismo y en consecuencia ver todas los fotos, vídeos y demás contenido que guarde en él. Lo mismo ocurriría con un atacante externo, una vez salteado el router ya tendría barra libre.
Poniendo un pc por delante hago que mi NAS no sea visible a simple vista para nadie que no sepa que lo tengo.

Con esto ya tengo un plan general trazado. Ahora toca elegir los componentes a usar.

Fase 2: Eligiendo el material

Como lo mío son los pcs, empecé la elección del material por esta parte. Mi intención a medio plazo es darle más usos que ser un simple grabador de streams, así que quiero algo potentillo pero que se siga ajustando en precio.

Unos minipcs interesantes son los Intel NUC (Next Unit of Computing):

Pero de nuevo eran muy caros para mi propósito, así que seguí mirando y encontré la versión china de dichos dispositivos.


Concretamente me agencié un XCY X32 por unos 70€.
Estos cacharretes tienen de CPU un Intel Celeron y de gráfica una Intel Integrated HD 610. Las mismas prestaciones que los portátiles baratos como https://www.kilaptop.com/es/laptop/f5 . Que si lo revisamos (https://es.wikipedia.org/wiki/Intel_HD_Graphics) pueden mover 4k sín problemas así como tienen aceleración por hardware de códecs como el VP9 que usa Youtube por ejemplo. Algo que me interesa bastante para un futuro proyecto ;)

Lo siguiente, el NAS. La elección fué bastante fácil porque encontré una persona que vendía de segunda mano un WD My Book Duo muy barato:


Un monstruito con 8TB de espacio repartido en 2 bahías. Más que suficiente para un par de cámaras.

Mientras me llegaban decidí ir comprar cable CAT6 e ir cableando toda la casa para llevar internet allí donde estaría el minipc.

Por si no sabes qué es. Con CAT6 me refiero al cable de Ethernet de categoría 6. Hay múltiples categorías, cada una soporta una tasa de transferencia distinta.

CAT6 te permite hasta 1Gb/s hoy por hoy más que suficiente para un domicilio.

Tras realizar un cableado profesional y que para nada podría ser tachado de ñapa, procedí a mirar qué cámaras comprar.

Foto del cableado pofesional.

El tema cámaras era terreno desconocido para mi, así que para empezar mi aventura compré una Sricam SP009 por unos 10€.


Lo más barato que puedas echarte en cara y con una calidad de 720p y que se conecta vía WiFi.

Seguí el tutorial de instalación e hice que funcionara, pudiendo ver el stream desde el móvil. Pero eso no era lo que quería. La intención es tomar el control de la cámara y para ello existe el estándar “ONVIF”, que no deja de ser un miniservidor web dentro de la cámara que responde a ciertas llamadas como a la de “dame tu stream”.

Resulta que la Sricam tenía una implementación “parcial”, las llamadas que más me interesaban no funcionaban pero... entonces….. ¿Cómo podía estar funcionando desde el móvil?
Descargué el apk (es como el .exe de Windows pero para Android, https://play.google.com/store/apps/details?id=com.xapcamera&hl=es), lo descompilé y empecé a buscar.
Para mi sorpresa la cámara se conectaba vía P2P a servidores como http://openapi.xg.qq.com o http://www.baidu.com y desde allí recibía las órdenes que dabas desde el cliente…

Conectarse a una red p2p para recibir órdenes es casi la definición de botnet. Si el fabricante quisiera podría conectarse a mi cámara y empezar a grabar o usar la cámara como punto de acceso a toda mi red local y ver que hay o bien escuchar/intervenir toda mi navegación por internet.

Usar la cámara con el firmware oficial estaba completamente descartado tras ver que no era más que un backdoor. Así que me puse a buscar por github si alguien había hecho uno custom.
Por desgracia para mi no es así, de modo que terminé por descartar la cámara entera. Al menos me había salido barata la prueba y me había encarrilado hacia lo que debía hacer. Construir la casa empezando por el techo.

Busqué cámaras chinas a las que alguien se hubiera dedicado a “violar” para meterle un firmware propio para evitar las conexiones hacia servidores chinos. Y así fué. Resulta que Xiaomi también hace cámaras y tienen bastante éxito.


(A raíz de esta búsqueda descubrí el canal Xiaomify que recomiendo bastante a cualquiera que le guste los productos de Xiaomi -> https://www.youtube.com/channel/UCkTuQn6fQ_cmnWoXfjQ6thw)

Como todo lo que triunfa, dichas cámaras fueron toqueteadas por gente infinitamente más sabia que yo y que hicieron esto: https://github.com/EliasKotlyar/Xiaomi-Dafang-Hacks
Por definición las cámaras de Xiaomi también se conectan a sus servidores. Algunas de ellas ni funcionan a menos que te conectes a sus servidores de china donde el gobierno chino tiene vía libre para hacer lo que quiera con tus datos.
Con este custom firmware pasabas a tener una cámara con un linux “light” y los servicios mínimos como rtsp (streaming de vídeo), ssh y ftp.

Era perfecto, justo lo que andaba buscando, tener control total sobre las cámaras y evitar que se conecten directamente a internet.

Dicho y hecho, compré 2 Xiaomi Dafangs.

Las Dafang tienen visión nocturna, una resolución máxima de 1080p, se pueden rotar y tienen altavoces/micrófono.

Con esto ya tengo el material necesario para iniciar la siguiente fase, el montaje.

Fase 3: Montaje

El primer día de esta fase lo dediqué a la instalación del minipc y el NAS en su sitio así como toda la parte de software.

Y luego a colocar las cámaras donde quería. No pongo foto de donde las he instalado realmente ;)

Hecho esto quedaba la parte más dura, programar el sistema para que al detectar movimiento, se empiece a guardar el vídeo en el NAS automáticamente.

Si vuelves a la imagen del plan en la Fase 1. Recordarás que el NAS no está conectado directamente a la red, de modo que las cámaras tendrán que coordinarse con el minipc para poder grabar en él.

Antes de entrar al lio hay que asegurarse de que dentro de la red local, los dispositivos no cambian de IP.

La IP es más o menos como nuestro DNI, un seguido de números que nos identifican ante los demás. Aunque en el caso de las IPs el número suele ser dinámico. Me explico: El router es el encargado de asignar una IP a cada dispositivo y lo hace por orden de entrada. Si se va la luz y cuando vuelve los dispositivos no piden su ip en el mismo orden que anteriormente, recibirán la primera que esté disponible/será distinta.
Una IP tiene esta forma: 192.168.0.1

Como queremos que las cámaras se comuniquen con el minipc, necesitamos que este tenga siempre la misma IP, sino todo dejaría de funcionar.

Hay distintas formas de hacerlo, pero para mi lo más fácil fué ir al router y decirle que por favor, mantuviera la misma ip (estática) para el miniservidor. La mayoría de routers modernos tienen esta opción.

Ahora lo que necesitamos es lo más importante, una aplicación que en cuanto se detecte movimiento en alguna de las cámaras, empiece a grabar.
Me gustaría que fuera lo más ligera posible, que hiciera lo mínimo indispensable e ya. De modo que me toca programarla a mi.

Las Dafang ya tienen detector de movimiento “nativo” y gracias al custom firmware que le hemos metido, podremos aprovecharlo y así sólo deberemos crear un script (=programita) que notifique al minipc cuando se detecte movimiento.

En el repositorio del firmware hay un ejemplo muy claro de un script que te manda un mail en cuanto detecta movimiento: https://github.com/EliasKotlyar/Xiaomi-Dafang-Hacks/blob/master/integration/custom/motiondetection.md

Partiendo de esa base he hecho el mío:

Super simple, en cuanto se activa el sensor, envía un aviso a minipc diciendo que empiece a grabar y cuando deja de haber movimiento igual.
Este script lo pongo dentro del firmware de las cámaras en “config/userscripts/motiondetection/”

Para terminar con la parte de las cámaras, entro en la ip de cada una y les configuro los detalles como la hora, activo el streaming de audio y cambio la contraseña inicial por una más segura.

Bien, llegados a este punto, ya tenemos las cámaras enviando peticiones al minipc cuando hay movimiento, pero no hay nadie recibiéndolas aún.

En el minipc montaremos ahora la aplicación que las reciba y las interprete. El lenguaje que he escogido es javascript por su simplicidad básicamente.

Dado que la aplicación tramitará las peticiones derivadas de la detección de movimiento, he decidido llamarla “Motion Broker”.
Con lo anterior tenemos un pequeño servidor web que recibe las peticiones de /start | /stop pero que aún no hace nada más.
Un correteo rápido por delante de la cámara y un posterior vistazo a los sus logs me permite verificar que la parte de las cámaras está funcionando correctamente:

Podemos ver como se ha ejecutado nuestro script y como ha recibido respuesta del minipc.

Para que Motion Broker grabe el stream (vídeo) de las cámaras he decidido usar VLC, el famoso reproductor de contenidos nos permitirá grabar el stream desde la línea de comandos.

Esta parte ha sido la más sufrida para mi pese a que el resultado sea 1 simple línea, es lo que más me ha costado pues no entendía cómo dar la orden que quería a VLC.

Con esto le decimos a VLC que durante 60 segundos grabe lo que salga de una de las cámaras y lo guarde en la carpeta D:/cams que se encuentra dentro del NAS.

Procedo a aplicarlo al Motion Broker:

¡En cuanto se detecta movimiento empieza la grabación!

  • ¡Pues ya está! ¿Verdad?
  • No tan rápido…..

Es posible que la misma cámara deje de detectar movimiento mientras ya se está grabando y vuelva a detectarlo. De modo que tendremos que poner un “semáforo” para evitar grabar cuando ya estamos grabando.


  • Vaale. ¡¿Ahora sí, no?!
  • Casi. si lo dejáramos así, ¿Qué pasaría tras 1 mes funcionando?
  • A mi que me cuentas, es tu proyecto.
  • Que el NAS, los 8TB, estarían llenos de grabaciones.

Hay que hacer que periódicamente borre las grabaciones más antiguas.

Con esto cada día se borrarán las grabaciones de hace más de 7 días por ejemplo, o lo que querramos.

  • ¡¡Bieen!! Esta vez sí terminaste ¿no?
  • Casi, casi
  • Joer con el pesao este, como se nota que le gusta picar teclas.

Para terminar de asegurarnos que con el tiempo no “se lía parda”, habrá que revisar después de cada grabación si hemos superado el límite de espacio máximo que permitamos ocupar al conjunto de grabaciones.
1 minuto de grabación a 1080p con audio sale a unos 25mb. Así que 1 hora de grabación rondaría los 2GB.
En mi caso le voy a poner un límite de 15GB unas 7 horas, que es más o menos el tiempo que estoy fuera de casa.

  • PERO SI TE HAS COMPRADO 8TB DE ESPACIO CACHO RATA
  • Ya bueno, he pensado en otro uso para la mayoría de ese espacio ;)

La verdad es que el código para hacer esa parte es demasiado grande para ponerlo en una sola imagen, pero como tampoco os lo váis a mirar, da igual:

  • ¡¿Ahora ya sí no?!
  • ¡YAY!

Siempre intento publicar todo lo que programo para que otros puedan usarlo, de modo que si alguien está interesado en Motion Broker puede descargarlo o mirar su código gratuitamente aquí:
https://github.com/tetreum/motion-broker

He separado las variables más importantes para que cada uno pueda configurarlo a su gusto:

¡Espero que os haya gustado y que queráis ver otras liadas y proyectos que haga por casa!

¡Cualquier sugerencia o idea para mejorar el montaje, no dudéis en comentarlo!

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

Thank you so much for sharing this amazing post with us!

Have you heard about Partiko? It’s a really convenient mobile app for Steem! With Partiko, you can easily see what’s going on in the Steem community, make posts and comments (no beneficiary cut forever!), and always stayed connected with your followers via push notification!

Partiko also rewards you with Partiko Points (3000 Partiko Point bonus when you first use it!), and Partiko Points can be converted into Steem tokens. You can earn Partiko Points easily by making posts and comments using Partiko.

We also noticed that your Steem Power is low. We will be very happy to delegate 15 Steem Power to you once you have made a post using Partiko! With more Steem Power, you can make more posts and comments, and earn more rewards!

If that all sounds interesting, you can:

Thank you so much for reading this message!