Añadir Coral IA USB a Frigate

Después de probar , configurar y optimizar Frigate me daba bastantes falsos positivos , esto venia dado por el valor de interferencia que era de 34,7 ms , este valor hay que multiplicarlo por 5 fps por cámara y dividir 1000 ms para saber el numero de cámaras que puede manejar con soltura , en este caso seria 177,35 ms por cámara , que al dividirlo 1000 entre el valor resultante nos da que podria manejar 5,638 cámaras , no muy lejos de las seis cámaras instaladas , pero si bastante justo.

Adema del valor de interferencia el consumo de CPU era un poco alto.

Por ello decidí añadirle un Coral USB para añadir un coprocesador Edge TPU al NAS

El tamaño es minúsculo y nada mas conectarlo al NAS lo reconoce perfectamente

Estas son las estadísticas cámara a cámara antes de instalar el coprocesador Edge TPU

Y este el consumo del docker respecto al total de CPU del NAS , no bajaba del 20% del total llegando al 40%

Después de conectar Coral al USB de NAS tendremos que añadirlo en las sección detectors del fichero de configuración

detectors:
  coral:
    type: edgetpu
    device: usb

Tendremos que añadir esta linea en la creación del docker para que haga el Passthrough y Frigate tenga acceso al Coral instalado en el host.

  --device=/dev/bus/usb:/dev/bus/usb # Passthrough of Coral USB TPU

Quedaria tal cual como este

docker run \
  --name=frigate \
  --shm-size=800m \
  --restart=always \
  --env=TZ='Europe/Madrid' \
  --device=/dev/bus/usb:/dev/bus/usb \
  --volume=/share/camaras/frigate/config:/config:rw \
  --volume=/share/camaras/frigate/media:/media/frigate:rw \
  --network=bridge \
  --privileged \
  --workdir=/opt/frigate \
  -p 1935:1935 \
  -p 15100:5000 \
  -p 8554:8554 \
  -p 8555:8555 \
  -p 8555:8555/udp \
  --label='com.qnap.qcs.network.mode=nat' \
  --label='com.qnap.qcs.gpu=False' \
  --memory="6g" \
  --cpus="6" \
  --detach=true \
  ghcr.io/blakeblackshear/frigate:stable

Al arrancar el docker buscaremos en el log como lo ha encontrado y como lo ha activado

[2024-04-08 21:02:13] frigate.detectors.plugins.edgetpu_tfl INFO    : Attempting to load TPU as usb
[2024-04-08 21:02:15] frigate.detectors.plugins.edgetpu_tfl INFO    : TPU found

Ahora vemos que nuestro valor de interferencia ha bajado de 35,47 ms a 7,59 ms casi cinco veces menos , y el consumo de CPU ha bajado de 239,9 a 10.9% casi 22 veces menos que sin Coral , por lo que los datos no tienen discusión alguna.

Con este valor de interferencia actual , haciendo los cálculos de 1000 ms / ( 7.59 ms x 5 fps ) = 26,35 cámaras que podria manejar a la vez sin despeinarse

Estas serian las estadísticas de cada cámara con Coral instalado

Y donde también se ve perfectamente es en el impacto de consumo de este docker respecto a la CPU total del sistema , ha bajado a una media del 4% , que son cifras impresionantes para un NVR con seis cámaras y detección de movimiento activada

En resumen , la inversión esta mas que justificada

Y con esto y un bizcocho …….

Integrar Frigate en Home Assistant

Una vez instalado y configurado Frigate el siguiente paso lógico es integrarlo en nuestro Home Assistant.

Lo primero será crea una serie de cámaras MQTT

mqtt:
    
  camera:
  
    - name: mqtt_foscam_1
      unique_id: mqtt_foscam_1
      topic: frigate/foscam_1/person/snapshot
    
    - name: mqtt_foscam_2
      unique_id: mqtt_foscam_2
      topic: frigate/foscam_2/person/snapshot

    - name: mqtt_foscam_3
      unique_id: mqtt_foscam_3
      topic: frigate/foscam_3/person/snapshot

    - name: mqtt_hikvision_1
      unique_id: mqtt_hikvision_1
      topic: frigate/HIKVISION_1/person/snapshot
      
    - name: mqtt_hikvision_2
      unique_id: mqtt_hikvision_2
      topic: frigate/HIKVISION_2/person/snapshot
      
    - name: mqtt_ic_3116w
      unique_id: mqtt_ic_3116w
      topic: frigate/IC-3116W/person/snapshot   

Lo siguiente crear los sensores de deteccions de movimiento.

  ####################################################################
  # Sensores camaras frigate
  ####################################################################

    - name: "Frigate NVR"
      icon: hass:cctv
      state_topic: "frigate/available"
      payload_on: "online"
      payload_off: "offline"
      device_class: connectivity
                       
    - name: movimiento_foscam_1
      device_class: motion
      off_delay: 10
      state_topic: "frigate/events"
      value_template: >
        {% if (value_json['after']['camera'] == 'foscam_1') and (value_json['after']['label'] == 'person') and (value_json['after']['stationary'] == false) 
         and (value_json['after']['has_snapshot'] == true ) %}
          ON
        {% else %}
          OFF
        {% endif %}            
            
    - name: movimiento_foscam_2
      device_class: motion
      off_delay: 10
      state_topic: "frigate/events"
      value_template: >
        {% if (value_json['after']['camera'] == 'foscam_2') and (value_json['after']['label'] == 'person') and (value_json['after']['stationary'] == false) 
         and (value_json['after']['has_snapshot'] == true ) %}
          ON
        {% else %}
          OFF
        {% endif %}               

    - name: movimiento_foscam_3
      device_class: motion
      off_delay: 10
      state_topic: "frigate/events"
      value_template: >
        {% if (value_json['after']['camera'] == 'foscam_3') and (value_json['after']['label'] == 'person') and (value_json['after']['stationary'] == false) 
         and (value_json['after']['has_snapshot'] == true ) %}
          ON
        {% else %}
          OFF
        {% endif %}  

    - name: movimiento_hikvision_1
      device_class: motion
      off_delay: 10
      state_topic: "frigate/events"
      value_template: >
        {% if (value_json['after']['camera'] == 'HIKVISION_1') and (value_json['after']['label'] == 'person') and (value_json['after']['stationary'] == false) 
         and (value_json['after']['has_snapshot'] == true ) %}
          ON
        {% else %}
          OFF
        {% endif %}  

    - name: movimiento_hikvision_2
      device_class: motion
      off_delay: 10
      state_topic: "frigate/events"
      value_template: >
        {% if (value_json['after']['camera'] == 'HIKVISION_2') and (value_json['after']['label'] == 'person') and (value_json['after']['stationary'] == false) 
         and (value_json['after']['has_snapshot'] == true ) %}
          ON
        {% else %}
          OFF
        {% endif %}

    - name: movimiento_ic_3116w
      device_class: motion
      off_delay: 10
      state_topic: "frigate/events"
      value_template: >
        {% if (value_json['after']['camera'] == 'IC-3116W') and (value_json['after']['label'] == 'person') and (value_json['after']['stationary'] == false) 
         and (value_json['after']['has_snapshot'] == true ) %}
          ON
        {% else %}
          OFF
        {% endif %}

Una vez creados y funcionando ya podemos empezar con las automatizaciones , en este caso por ejemplo automatizaciones que guardan en jpg el snapshot que nos ha llegado por mqtt en función de cada cámara y lo envia por Telegram dando aviso por texto y añadiendo la imagen

- id: 'nuevo snapshot recibido camara 1'
  alias:  'nuevo snapshot recibido camara 1'
  variables:
    filepath: /config/www/cam_captures/1_{{now().year}}_{{now().month}}_{{now().day}}_{{now().hour}}_{{now().minute}}_{{now().second}}.jpg   
  trigger:
    - platform: state
      entity_id:  binary_sensor.movimiento_foscam_1
      from: 'off'
      to: 'on'    
  action:
    - service: camera.snapshot
      data:
        entity_id: camera.mqtt_foscam_1
        filename: '{{ filepath }}'
    - delay: 00:00:05
    - service: notify.notif_telegram_ha_camaras
      data:
        title: Enviar imagenes
        message: Cam. 1 {{now().strftime("%d/%m %H:%M:%S")}}
        data:
          photo:
          - file: '{{ filepath }}'
            capture: Snapshoot
            caption: Cam. 1 {{now().strftime("%d/%m %H:%M:%S")}}      
            
- id: 'nuevo snapshot recibido camara 2'
  alias:  'nuevo snapshot recibido camara 2'
  variables:
    filepath: /config/www/cam_captures/2_{{now().year}}_{{now().month}}_{{now().day}}_{{now().hour}}_{{now().minute}}_{{now().second}}.jpg   
  trigger:
    - platform: state
      entity_id:  binary_sensor.movimiento_foscam_2
      from: 'off'
      to: 'on'    
  action:        
    - service: camera.snapshot
      data:
        entity_id: camera.mqtt_foscam_2
        filename: '{{ filepath }}'
    - delay: 00:00:05
    - service: notify.notif_telegram_ha_camaras
      data:
        title: Enviar imagenes
        message: Cam. 2 {{now().strftime("%d/%m %H:%M:%S")}}
        data:
          photo:
          - file: '{{ filepath }}'
            capture: Snapshoot
            caption: Cam. 2 {{now().strftime("%d/%m %H:%M:%S")}}                


- id: 'nuevo snapshot recibido camara 3'
  alias:  'nuevo snapshot recibido camara 3'
  variables:
    filepath: /config/www/cam_captures/3_{{now().year}}_{{now().month}}_{{now().day}}_{{now().hour}}_{{now().minute}}_{{now().second}}.jpg   
  trigger:
    - platform: state
      entity_id:  binary_sensor.movimiento_foscam_3
      from: 'off'
      to: 'on'    
  action:
    - service: camera.snapshot
      data:
        entity_id: camera.mqtt_foscam_3
        filename: '{{ filepath }}'
    - delay: 00:00:05
    - service: notify.notif_telegram_ha_camaras
      data:
        title: Enviar imagenes
        message: Cam. 3 {{now().strftime("%d/%m %H:%M:%S")}}
        data:
          photo:
          - file: '{{ filepath }}'
            capture: Snapshoot
            caption: Cam. 3 {{now().strftime("%d/%m %H:%M:%S")}}                


- id: 'nuevo snapshot recibido camara 4'
  alias:  'nuevo snapshot recibido camara 4'
  variables:
    filepath: /config/www/cam_captures/4_{{now().year}}_{{now().month}}_{{now().day}}_{{now().hour}}_{{now().minute}}_{{now().second}}.jpg   
  trigger:
    - platform: state
      entity_id:  binary_sensor.movimiento_hikvision_1
      from: 'off'
      to: 'on'    
  action:  
    - service: camera.snapshot
      data:
        entity_id: camera.mqtt_hikvision_1
        filename: '{{ filepath }}'
    - delay: 00:00:05
    - service: notify.notif_telegram_ha_camaras
      data:
        title: Enviar imagenes
        message: Cam. 4 {{now().strftime("%d/%m %H:%M:%S")}}
        data:
          photo:
          - file: '{{ filepath }}'
            capture: Snapshoot
            caption: Cam. 4 {{now().strftime("%d/%m %H:%M:%S")}}                


- id: 'nuevo snapshot recibido camara 5'
  alias:  'nuevo snapshot recibido camara 5'
  variables:
    filepath: /config/www/cam_captures/5_{{now().year}}_{{now().month}}_{{now().day}}_{{now().hour}}_{{now().minute}}_{{now().second}}.jpg   
  trigger:
    - platform: state
      entity_id:  binary_sensor.movimiento_hikvision_2
      from: 'off'
      to: 'on'    
  action:
    - service: camera.snapshot
      data:
        entity_id: camera.mqtt_hikvision_2
        filename: '{{ filepath }}'
    - delay: 00:00:05
    - service: notify.notif_telegram_ha_camaras
      data:
        title: Enviar imagenes
        message: Cam. 5 {{now().strftime("%d/%m %H:%M:%S")}}
        data:
          photo:
          - file: '{{ filepath }}'
            capture: Snapshoot
            caption: Cam. 5 {{now().strftime("%d/%m %H:%M:%S")}}                
 

- id: 'nuevo snapshot recibido camara 6'
  alias:  'nuevo snapshot recibido camara 6'
  variables:
    filepath: /config/www/cam_captures/6_{{now().year}}_{{now().month}}_{{now().day}}_{{now().hour}}_{{now().minute}}_{{now().second}}.jpg   
  trigger:
    - platform: state
      entity_id:  binary_sensor.movimiento_ic_3116w
      from: 'off'
      to: 'on'   
  action:
    - service: camera.snapshot
      data:
        entity_id: camera.mqtt_ic_3116w
        filename: '{{ filepath }}'
    - delay: 00:00:05
    - service: notify.notif_telegram_ha_camaras
      data:
        title: Enviar imagenes
        message: Cam. 6 {{now().strftime("%d/%m %H:%M:%S")}}
        data:
          photo:
          - file: '{{ filepath }}'
            capture: Snapshoot
            caption: Cam. 6 {{now().strftime("%d/%m %H:%M:%S")}}   

También lo añadimos a nuestro panel lovelace

  - type: vertical-stack
    cards:
      - type: entities
        title: Camaras 
        show_name: true
        show_state: false
        show_header_toggle: false
        columns: 3     
        entities:        
          - entity: binary_sensor.frigate_nvr
            name: Frigate NVR  
          - entity: camera.mqtt_foscam_1
            name: Camara 1   
          - entity: camera.mqtt_foscam_2
            name: Camara 2
          - entity: camera.mqtt_foscam_3
            name: Camara 3
          - entity: camera.mqtt_hikvision_1
            name: Camara 4
          - entity: camera.mqtt_hikvision_2
            name: Camara 5
          - entity: camera.mqtt_ic_3116w
            name: Camara 6

      - type: entities
        title: Sensores movimiento Camaras
        show_name: true
        show_state: false
        show_header_toggle: false
        columns: 3     
        entities:        
          - entity: binary_sensor.movimiento_foscam_1
            name: Camara 1   
          - entity: binary_sensor.movimiento_foscam_2
            name: Camara 2
          - entity: binary_sensor.movimiento_foscam_3
            name: Camara 3
          - entity: binary_sensor.movimiento_hikvision_1
            name: Camara 4
          - entity: binary_sensor.movimiento_hikvision_2
            name: Camara 5
          - entity: binary_sensor.movimiento_ic_3116w
            name: Camara 6

Y este seria el resultado al activarse la detección de movimiento

Y con esto y un bizcocho ……..