Sistema de videovigilancia con Frigate y Home Assistant

Si tenéis Home Assistant y queréis montar un sistema de videovigilancia cojxnudo (para casa o la empresa), pues no queda otra que montar Frigate, que es open source. Podremos recibir en mensajes de Telegram (con fotos y videos), cuando las cámaras detecten personas, perros, gatos, pájaros, caballos…

 

Bueno, la idea es sencilla, tenemos o queremos tener unas cámaras de seguridad, de videovigilancia, cámaras IP de buena calidad pero baratas y gestionarnos nosotros mismos el sistema. Donde Frigate nos ayudará a centralizar cada cámara y a configurar lo que necesitemos. Frigate se encargará de detectar los objetos que hayamos dicho, como sea la detección de personas, cualquier tipo de animal, coches, matriculas… almacenará si queremos los clips y los videos durante el tiempo que le indiquemos. Y luego esos eventos que se generan podemos enviarlos a Home Assistant y dependiendo de una serie de factores (estamos fuera de casa, estamos durmiendo…) que nos alerte vía Telegram o lo que nos de la gana.

Frigate correrá en un contenedor de Docker, y depende del número de cámaras que dispongamos necesitará usar mucha CPU e incluso es recomendable usar un hardware acelerador que mejore el rendimiento de las detecciones. Dependerá todo de muchos factores, si hay muchos píxeles que cambian en las cámaras siempre podremos crear zonas para evitar su análisis; el número de cámaras o el cómputo que le demos, ya que puede correr en una Raspberry Pi. Para 4-5 cámaras con el Google Coral USB Accelerator vamos bien, es un co-procesador, una TPU externa que nos ayudará a mover la carga.

 

Coral USB Accelerator,

Bueno, pues con esto más o menos el pescado está vendido, vamos empezando si os parece 🙂 Lo primero será tener una máquina con Docker, este post está basado en una Raspberry Pi 4, y lo segundo instalar los drivers del Google Coral USB Accelerator (o el que usemos). Para ello, descargamos el repositorio de Google:

echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | sudo tee /etc/apt/sources.list.d/coral-edgetpu.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update

 

Instalamos el runtime y la librería de PyCoral:

sudo apt-get install libedgetpu1-std
#Para máximo rendimiento --> sudo apt-get install libedgetpu1-max

sudo apt-get install python3-pycoral -y

 

Ya estamos listos para probar si la Raspberry Pi ya reconoce al dispositivo, podremos bajarnos un modelo de ejemplo y validarlo:

mkdir coral && cd coral
git clone https://github.com/google-coral/pycoral.git
cd pycoral
bash examples/install_requirements.sh classify_image.py
python3 examples/classify_image.py \
--model test_data/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite \
--labels test_data/inat_bird_labels.txt \
--input test_data/parrot.jpg

 

Y si va todo bien recibiremos algo como esto:

----INFERENCE TIME----
Note: The first inference on Edge TPU is slow because it includes loading the model into Edge TPU memory.
11.8ms
3.0ms
2.8ms
2.9ms
2.9ms
-------RESULTS--------
Ara macao (Scarlet Macaw): 0.75781

 

Desplegar Frigate,

Como hemos comentado anteriormente Frigate no se instala, lo desplegaremos en un contenedor, así que recordar que necesitamos tener instalado Docker previamente. Y antes de comenzar necesitamos un crear el archivo de configuración de Frigate. En mi caso lo dejaré en ‘/mnt/config.yml’ y este es un ejemplo mínimo, donde le indico quien es el servidor de MQTT para enviar los eventos, el path de la BD, LOGs, (opcionalmente) indicamos si tenemos un acelerador de Coral y luego añadimos las cámaras, insisto ejemplo mínimo:

mqtt:
  host: DIRECCIÓN_IP_MQTT
  port: 1883
  user: USUARIO_MQTT
  password: CONTRASEÑA_MQTT

database:
  path: /media/frigate/frigate.db

logger:
  default: info
  logs:
    frigate.event: debug

detectors:
coral:
type: edgetpu
    device: usb
cameras: NOMBRE_DE_LA_CAMARA: ffmpeg: inputs: - path: rtsp://USUARIO_RTS:CONTRASEÑA@DIRECCION_IP_CAMARA:554/av_stream/ch0 detect: width: 1280 height: 720

 

Actualmente esta Frigate en la versión 0.10.1, y estas son las distintas imágenes que nos dan dependiendo la máquina que tengamos:

  • x86: blakeblackshear/frigate:0.10.1-amd64
  • x86 w/ nvidia (for ffmpeg only): blakeblackshear/frigate:0.10.1-amd64nvidia
  • Raspberry Pi 3/4 (32bit): blakeblackshear/frigate:0.10.1-armv7
  • Raspberry Pi 4 (64bit): blakeblackshear/frigate:0.10.1-aarch64

 

Tenemos que crear y arrancar el contenedor, le pasaremos el dispositivo USB, incrementamos el tamaño de la memoria compartida, le pasamos el directorio donde nos guardará todos los datos que Frigate necesite (clips, grabaciones…), le pasamos el fichero de configuración, hora, contraseña de RTSP y el puerto que usaremos para su gestión (5000tcp), seguido de eso, la imagen que queremos; desde una Raspberry Pi 4 ejecutaremos:

sudo docker run -d --name frigate --restart=unless-stopped --mount type=tmpfs,target=/tmp/cache,tmpfs-size=1000000000 --device /dev/bus/usb:/dev/bus/usb --shm-size=128m -v /media/frigate:/media/frigate -v /mnt/config.yml:/config/config.yml:ro -v /etc/localtime:/etc/localtime:ro -e FRIGATE_RTSP_PASSWORD='CONTRASEÑA' -p 5000:5000 -p 1935:1935 blakeblackshear/frigate:0.10.1-aarch64

 

Y tras unos minutos que se descargue todo y arranque el contenedor ya podremos conectar a Frigate, mediante un navegador accedemos a http://DIRECCION_IP_DOCKER:5000 y tendremos algo como esta imagen superior.

 

Permitirme que os deje unos comandos de Docker que a lo mejor necesitáis para i+D:

sudo docker ps -a		# Lista contenedores
sudo docker stop ID_CONT	# Apaga contenedor
sudo docker start ID_CONT	# Arranca contenedor
sudo docker restart ID_CONT	# Reinicia contenedor
sudo docker rm ID_CONT		# Elimina contenedor
sudo docker system prune -a 	# Elimina caches y demás morrallas ¡ojo!
sudo docker logs ID_CONT -f	# Ver logs generados por el contenedor

 

Y luego ya cada uno tendrá que desarrollar su Frigate a su gusto, os dejo el link con el fichero de configuración y todas sus posibilidades. Podremos ver todas las cámaras desde Frigate, o usar el Birdeye, que es una pantalla apagada y se enciende cuando hay movimiento en alguna cámara, o ver los eventos que ha recopilado…

 

Tenemos muchísimas posibilidades, en cada cámara podemos crear máscaras para evitar que escanee zonas no interesantes y que quizá tengan algún movimiento, para minimizar falsos positivos, porque de nada sirve que detecte a una persona fuera, en la calle, o un tiesto que se mueve que genere cómputo innecesario… O crear zonas para unificar distintas cámaras… tiene bastantes posibilidades. Os dejo por si os sirve de orientación la configuración que estoy usando con mis cámaras, y podáis ver los roles de cada cámara, qué tipo de objetos trackear, la resolución, FPS, tiempo de almacenamiento para las imágenes, los videos… :

CAMARA03:
  ffmpeg:
    output_args:
      record: -f segment -segment_time 10 -segment_format mp4 -reset_timestamps 1 -strftime 1 -c:v copy -c:a aac
    inputs:
      - path: rtsp://USUARIO_RTSP:CONTRASEÑA@DIRECCION_IP_CAMARA:554//h264Preview_01_main
        roles:
          - detect
          - clips
          - rtmp
          - record
          - snapshots
  motion:
    mask:
      - 1136,79,1045,62,683,33,576,55,484,69,213,114,30,161,129,278,221,370,238,673,145,709,187,834,253,960,0,960,0,0,954,0,1040,0,1280,0,1280,122
      - 1280,402,901,274,708,224,491,191,473,50,503,53,511,159,690,186,692,149,777,156,789,87,893,120,1083,156,1280,224
  detect:
    width: 1280
    height: 960
    fps: 5
  objects:
    track:
      - person
      - cat
      - dog
      #- bird
  record:
    enabled: True
    retain_days: 0
    events:
      retain:
        default: 10
  snapshots:
    bounding_box: true
    enabled: true
    timestamp: true
    retain:
      default: 10

 

 

Integración de Frigate con Home Assistant

Cómo habéis podido ver, no he instalado Frigate en Home Assistant directamente, que se podría hacer, pero creo que depende el entorno y por temas de rendimiento es mejor separar los componentes. Así que Frigate por su lado y Home Assistant por el suyo, sobre todo porque Frigate demanda mucho cómputo.

 

Para instalar la integración de Frigate con Home Assistant lo más cómodo es usar HACKS. “HACKS” > “Integraciones” > “Frigate” >Descargar e instalarlo y reiniciar Home Assistant después. Si no sale en el listado, añadiremos esta repo ‘https://github.com/blakeblackshear/frigate-hass-integration’.

 

Una vez instalada la integración la configuramos, vamos a las Integraciones, y pulsamos en añadir nueva integración, escribimos ‘Frigate’…

 

Y nada, no nos queda más que indicar la URL de Frigate, pulsamos en “Enviar”. Esto ya nos creará todas las Entidades con las cámaras que tengamos definidas en Frigate, y no queda más que hacernos nuestro panel de control!

 

Estoy seguro que en un ratito hacéis algo mejor que yo, este es un ejemplo de 4 cámaras, donde podemos ver en tiempo real qué sucede, si pinchamos en la cámara y tiene micrófono podremos escucharlo también sin problemas. Podemos añadir unos clips con las últimas detecciones que hizo cada cámara, que al pulsar alguno de ellos nos ponga el video…

 

Y aquí os dejo un ejemplo de una automatización de Home Assistant, que si detecta un gato a la noche, le haga una foto, nos la mande por Telegram y un link con el video por si queremos verlo. La automatización escuchará un evento de MQTT y con una plantilla definimos el objeto que esperamos, en este caso un gato. Y luego la acción que nos de la gana, os dejo un ejemplo en YAML que podéis usar para recibir una foto y un link al video:

service: telegram_bot.send_photo
data:
  url: >-
    http://DIRECCION_IP_FRIGATE:5000/api/events/{{trigger.payload_json["after"]["id"]}}/snapshot.jpg?bbox=0&crop=1
  caption: >-
    {{trigger.payload_json["after"]["camera"]|replace("frigate_","") | upper }}
    {{trigger.payload_json["after"]["label"] | upper }} 
    [VIEW VIDEO](https://DIRECCION_IP_FRIGATE/api/events/{{trigger.payload_json["after"]["id"]}}/clip.mp4)
  timeout: 1000

 

 

Si todo ha ido bien, el resultado sería algo como esto, pues en un horario en particular conocer las visitas que recibimos, obviamente esto se puede aplicar a personas u otro tipo de objetos, animales…

 

Como veis es bastante maleable todo lo que podemos hacer, dependerá cada uno sus particularidades o lo que se quiera complicar… Espero que os haya resultado interesante, de verdad que no es muy costoso el montarse un sistema propio, sin sacar imágenes privadas al exterior o un tercero pueda manipularlas. Además estoy seguro que obtenemos mejores prestaciones que con cualquier solución comercial.

 

Frigate es la pera y Home Assistant un Dios todo poderoso, nada, espero que eso, que os haya gustado, intentarlo, ser felices y agradeceros como siempre a los que movéis este tipo de contenido por las redes sociales. Un abrazo a tod@s!