Nel mondo della sicurezza domestica, le telecamere tradizionali hanno sempre sofferto di due enormi limitazioni: sono passive (registrano ciò che è accaduto solo dopo l'evento) e sono stupide (generano decine di falsi allarmi ogni volta che passa una nuvola, si muove una pianta o piove). Ricevere una notifica sul cellulare ogni volta che il vento sposta le fronde di un albero porta presto alla cosiddetta alarm fatigue, spingendoci a disattivare i controlli.
La vera rivoluzione consiste nel trasformare il flusso video in tempo reale in un sensore di presenza ad altissima precisione. In questo articolo vedremo come configurare **Frigate NVR** — un server di registrazione video locale ed estremamente efficiente — integrandolo con **Home Assistant** e accelerando l'elaborazione tramite Intelligenza Artificiale (Edge Object Detection) locale. Esploreremo come fare a meno dei sensori fisici magnetici sulle finestre sfruttando la classificazione video degli stati, e come riconoscere i volti dei familiari per disarmare l'allarme in modo totalmente automatico e locale.
🌟 Oltre la Sicurezza: Il Ventaglio di Possibilità dell'IA Locale
Prima di immergerci nei dettagli tecnici e negli schemi architetturali, esploriamo cosa rende questa combinazione così rivoluzionaria. Trasformando le telecamere da semplici registratori a veri e propri motori di inferenza predittiva in locale, è possibile sbloccare scenari d'uso impensabili con una domotica standard:
- Sicurezza Intelligente e Selettiva: Capacità di discriminare all'istante tra persone sconosciute (potenziali intrusi), animali domestici (da ignorare per prevenire falsi allarmi), robot aspirapolvere (mascherati e filtrati) e familiari registrati.
- Disarmo Biometrico Locale: Riconoscimento biometrico dei familiari all'ingresso per disarmare l'allarme automaticamente quando si rientra a casa con le mani occupate, eliminando la necessità di codici fisici.
- Monitoraggio degli Infissi Senza Sensori Fisici: Classificazione visiva dello stato di finestre, porte e serrande (aperte/chiuse) direttamente dall'inquadratura, risparmiando sull'acquisto e manutenzione di decine di sensori fisici a batteria.
- Routine Predittive Personalizzate: Avvio di scenari intelligenti al primo rilevamento mattutino (apertura tapparelle, controllo Lux della stanza per accendere le luci solo se necessario, e benvenuto vocale TTS con info meteo).
- Massimo Risparmio Energetico: Spegnimento di climatizzatori e termostati nel caso in cui una finestra venga lasciata visivamente spalancata, e spegnimento di TV/luci in stanze rimaste vuote per inattività.
- Privacy Assoluta per Definizione: Tutta l'elaborazione (rilevamento oggetti, classificazione infissi e riconoscimento facciale nativo) avviene offline all'interno del server Frigate locale. Nessun flusso video o dato biometrico sensibile viene mai trasmesso all'esterno o su server cloud.
📐 Architettura del Sistema
Il principio cardine è mantenere tutto locale, privato e velocissimo. Il flusso video RTSP proveniente dalle telecamere IP viene catturato da Frigate, elaborato da un chip dedicato all'IA a bassissimo consumo (Google Coral USB Accelerator), e gli eventi strutturati vengono passati a Home Assistant via MQTT per guidare le automazioni.
🛠️ Step 1: Configurazione di Frigate (`config.yml`)
Frigate sfrutta una configurazione basata su file YAML estremamente potente. Per farlo girare al meglio, la configurazione deve definire accuratamente l'hardware di rilevamento (ad esempio il chip Coral), le telecamere, le zone di tracciamento e i filtri necessari a scremare i falsi allarmi.
Filtrare Animali e Robot Aspirapolvere
Per **escludere in modo infallibile cani, gatti e robot aspirapolvere**, combiniamo tre strategie:
- Dimensioni minime/massime (`min_area` e `max_area`): I robot aspirapolvere e i piccoli animali domestici occupano una porzione di pixel dell'inquadratura molto inferior rispetto a una persona in piedi. Impostando una dimensione minima per l'etichetta `person`, Frigate lo scarterà all'istante.
- Maschere di Filtro Oggetto (`object_filter_mask`): Poiché i robot aspirapolvere operano unicamente sul pavimento, possiamo creare una maschera specifica sul pavimento e associarla esclusivamente a determinate rilevazioni per ignorarle in quella determinata regione.
- Punto di ancoraggio: Frigate valuta l'appartenenza a una zona o maschera basandosi sul punto centrale inferiore del box di delimitazione (i piedi dell'oggetto). Questo rende molto semplice mappare i contorni esatti sul pavimento ed escludere falsi allarmi.
Ecco una configurazione di esempio solida e ottimizzata da inserire nel file config.yml di Frigate:
# config.yml
mqtt:
host: 192.168.1.150 # IP del tuo broker MQTT (solitamente installato su Home Assistant)
user: mqtt_user
password: secure_password
# Definiamo i rilevatori. Se usiamo Google Coral USB Accelerator:
detectors:
coral:
type: edgetpu
device: usb
cameras:
telecamera_salotto:
ffmpeg:
inputs:
- path: rtsp://admin:passwd@192.168.1.60:554/stream1
roles:
- detect
- record
detect:
width: 1280
height: 720
fps: 5
# Gli oggetti che desideriamo tracciare su questa telecamera
objects:
track:
- person
- dog
- cat
filters:
# Evitiamo che un animale domestico o un robot aspirapolvere venga scambiato per una persona
person:
min_area: 5000 # Ignora rilevazioni "person" inferiori a 5000 pixel
min_score: 0.7 # Soglia di confidenza minima
threshold: 0.75 # Soglia per validare la presenza stabile
dog:
min_area: 2500
max_area: 8000 # Evita falsi positivi giganti
cat:
min_area: 1200
max_area: 4000
# Definiamo le zone per il monitoraggio della presenza
zones:
zona_divano:
coordinates: 450,220,720,220,720,480,450,480
objects:
- person
zona_ingresso:
coordinates: 120,300,380,300,380,680,120,680
objects:
- person
# Maschera Oggetto per ignorare le rilevazioni sul pavimento sensibili al robot
motion:
mask:
- 0,720,1280,720,1280,680,0,680 # Copre la parte inferiore dello schermo
# Abilitiamo il riconoscimento facciale nativo (Frigate v0.16+)
face_recognition:
enabled: true
model_size: small # Usa 'small' (FaceNet) per elaborazione CPU o 'large' (ArcFace) per GPU/NPU
🤖 Step 2: Integrazione e Funzionalità AI Avanzate
Una volta configurato Frigate e attivata l'integrazione ufficiale in Home Assistant, le telecamere generano sensori binari del tipo binary_sensor.telecamera_salotto_person_occupancy. But possiamo spingerci molto oltre le semplici sagome, introducendo due capacità spettacolari: **il riconoscimento visivo dello stato delle finestre** (senza sensori fisici magnetici) e **il riconoscimento facciale dei familiari**.
🪟 Classificazione Visiva dello Stato: Finestre Aperte/Chiuse Senza Sensori Fisici
Se non vuoi (o non puoi) installare sensori fisici magnetici Zigbee/Z-Wave su ogni infisso, Frigate introduce una funzionalità nativa straordinaria: la **State Classification (Classificazione degli Stati)**. Invece di rilevare oggetti in movimento, questa logica permette di addestrare un micro-modello locale per valutare l'aspetto visivo di una determinata area ritagliata (crop) della telecamera, distinguendo tra stati mutualmente esclusivi come **"open"** (aperto) e **"closed"** (chiuso).
Ecco come configurarla all'interno di Frigate:
# Aggiunta alla configurazione della camera in config.yml
state_config:
models:
finestra_salotto:
# Ritaglio preciso attorno all'infisso della finestra
crop: 820,140,940,320
states:
- open
- closed
# Esegui la classificazione visiva ogni 10 secondi, o solo quando c'è movimento in quella zona
interval: 10
trigger: motion
Come avviene l'apprendimento (Training) degli Stati:
- Frigate fornisce una comoda procedura guidata (Wizard) direttamente nella Web UI.
- Raccogli un numero limitato ma **estremamente diversificato** di immagini della finestra aperta e chiusa. Non servono centinaia di foto identiche: bastano 15-20 scatti per stato presi in momenti diversi (giorno, notte, sole, pioggia).
- Il modello locale apprende a eccezionali livelli visivi a riconoscere le differenze (la presenza del battente aperto o la luce passante) ed esegue l'inferenza localmente sulla CPU.
- Lo stato viene pubblicato istantaneamente su MQTT sul topic
frigate/telecamera_salotto/classification/finestra_salotto, creando un sensore pulito in Home Assistant.
👤 Riconoscimento Facciale Locale Nativo (Frigate Face Library)
Immagina di rientrare in casa con le mani occupate dalla spesa: l'allarme è inserito e la telecamera dell'ingresso ti inquadra. Frigate rileva una sagoma umana (`person`). Invece di far suonare la sirena, Frigate esegue il riconoscimento facciale locale nativo, identifica che sei tu (un membro registrato della famiglia), assegna il tuo nome come `sub_label` e **disattiva l'allarme automaticamente**, accogliendoti a voce.
A partire dalla versione 0.16, Frigate NVR include il riconoscimento facciale nativo locale, eliminando la necessità di configurare orchestratori esterni (come Double Take) o server di riconoscimento biometrico dedicati (come CompreFace). Frigate include una comodissima scheda "Face Library" direttamente nella Web UI da cui puoi caricare foto e addestrare il modello in pochi istanti.
La bellezza di questo approccio è che l'integrazione ufficiale di Frigate per Home Assistant crea automaticamente un'entità sensore dedicata per ciascuna telecamera: sensor.telecamera_salotto_last_recognized_face. Lo stato di questa entità assume all'istante il nome del familiare riconosciuto (es. Enzo, Maria, Fabio) o "unknown" nel caso di un volto estraneo o non mappato. Non c'è più bisogno di alcun sensore MQTT personalizzato o template complesso!
⚡ Step 3: Le Automazioni Avanzate (Home Assistant YAML)
Vediamo ora come implementare le automazioni richieste per sfruttare al 100% queste potenzialità.
1. Disarmo Automatico e Sicuro dell'Allarme
Questa automazione disattiva l'allarme antintrusione tramite un **sistema a doppio fattore locale (MFA)**: non basta che Frigate identifichi visivamente il volto di un familiare all'ingresso (es. *Enzo*, *Maria* o *Fabio*), ma è necessario che lo smartphone della persona riconosciuta sia fisicamente presente in casa (rilevato tramite GPS con l'entità device_tracker). Questo impedisce a malintenzionati di ingannare il sistema mostrando una foto stampata o uno schermo.
# automations.yaml
- alias: "Sicurezza: Disarmo Automatico con Doppio Fattore (Viso + GPS)"
description: "Disattiva l'allarme se il volto identificato da Frigate appartiene a un familiare e il suo smartphone è fisicamente a casa (GPS)"
trigger:
- platform: state
entity_id: sensor.telecamera_salotto_last_recognized_face
condition:
# Verifichiamo che l'allarme sia effettivamente inserito
- condition: state
entity_id: alarm_control_panel.allarme_casa
state: 'armed_away'
# Verifichiamo il doppio fattore: il volto coincide e lo smartphone associato è in zona 'home'
- condition: template
value_template: >
{% set volto = trigger.to_state.state %}
{% set gps_mappa = {
'Enzo': 'device_tracker.enzo_smartphone',
'Maria': 'device_tracker.maria_smartphone',
'Fabio': 'device_tracker.fabio_smartphone'
} %}
{% if volto in gps_mappa.keys() %}
{{ is_state(gps_mappa[volto], 'home') }}
{% else %}
false
{% endif %}
action:
# Disarma l'allarme domotico
- service: alarm_control_panel.alarm_disarm
target:
entity_id: alarm_control_panel.allarme_casa
data:
code: "1234"
# Invia notifica di log
- service: notify.notify
data:
title: "Allarme Disarmato"
message: "Bentornato {{ trigger.to_state.state }}! Allarme disattivato automaticamente tramite doppio fattore (Riconoscimento Facciale Nativo + GPS del cellulare)."
2. Allarme Intelligente Selettivo (Zero Falsi Allarmi)
Vogliamo far scattare l'allarme solo se viene rilevata una persona estranea nella zona dell'ingresso o del salotto, ignorando completamente gli animali domestici, il robot aspirapolvere e le persone autorizzate di famiglia.
- alias: "Sicurezza: Allarme Intrusione Selettivo"
description: "Fa scattare l'allarme solo se viene rilevata una persona sconosciuta"
trigger:
- platform: state
entity_id: binary_sensor.telecamera_salotto_zona_ingresso_person_occupancy
to: 'on'
condition:
- condition: state
entity_id: alarm_control_panel.allarme_casa
state:
- armed_away
- armed_night
# Controllo ridondante di Frigate: verifichiamo che l'oggetto sia una persona
- condition: template
value_template: "{{ state_attr('camera.telecamera_salotto', 'person') != None }}"
action:
# Aspettiamo 2 secondi per dare tempo al motore di valutare il volto
- delay: "00:00:02"
# Se dopo 2 secondi il volto risulta sconosciuto ("unknown") o non identificato, facciamo scattare l'intrusione
- if:
- condition: state
entity_id: sensor.telecamera_salotto_last_recognized_face
state: 'unknown'
then:
- service: notify.notify
data:
title: "🚨 INTRUSIONE STRANIERA!"
message: "Rilevata presenza umana sconosciuta nella zona d'ingresso."
data:
image: "/api/frigate/notifications/{{ state_attr('camera.telecamera_salotto', 'camera_snapshot_id') }}/thumbnail.jpg"
priority: high
- service: switch.turn_on
target:
entity_id: switch.sirena_allarme
3. Spegnimento Intelligente di TV e Luci
Se nessuna persona è presente nel salotto per più di 15 minuti, spegniamo le luci e la televisione in modo da evitare sprechi energetici.
- alias: "Green: Spegnimento Dispositivi per Inattività"
description: "Spegne TV e luci se la stanza rimane vuota per 15 minuti"
trigger:
- platform: state
entity_id: binary_sensor.telecamera_salotto_person_occupancy
to: 'off'
for:
minutes: 15
condition:
- condition: or
conditions:
- condition: state
entity_id: media_player.smart_tv_salotto
state: 'on'
- condition: state
entity_id: light.luci_salotto
state: 'on'
action:
- service: media_player.turn_off
target:
entity_id: media_player.smart_tv_salotto
- service: light.turn_off
target:
entity_id: light.luci_salotto
4. Blocco ed Eco-Spegnimento Climatizzatori / Riscaldamento su Finestra Aperta
Grazie alla classificazione visiva ad intelligenza artificiale locale di Frigate, Home Assistant controlla lo stato della finestra del salotto. Se la finestra risulta **aperta** e proviamo ad accendere il climatizzatore o il riscaldamento (o se sono già in funzione e la finestra viene aperta), il sistema **spegne immediatamente i condizionatori e le valvole termostatiche**, prevenendo enormi sprechi di energia e proteggendo i macchinari.
- alias: "Green: Blocco Clima su Finestra Aperta Visivamente"
description: "Spegne condizionatore e riscaldamento se Frigate classifica la finestra come aperta"
trigger:
# 1. Scatta se proviamo ad accendere il clima
- platform: state
entity_id: climate.condizionatore_salotto
to: 'cool'
# 2. Scatta se la finestra viene aperta mentre il condizionatore o riscaldamento è già attivo
- platform: state
entity_id: sensor.stato_finestra_salotto_visivo
to: 'open'
condition:
# La finestra deve essere visivamente aperta
- condition: state
entity_id: sensor.stato_finestra_salotto_visivo
state: 'open'
# E il condizionatore deve essere in esecuzione o in procinto di accendersi
- condition: template
value_template: "{{ not is_state('climate.condizionatore_salotto', 'off') }}"
action:
# Spegniamo immediatamente il climatizzatore
- service: climate.set_hvac_mode
target:
entity_id: climate.condizionatore_salotto
data:
hvac_mode: 'off'
# Spegniamo le valvole termostatiche del riscaldamento (se attive)
- service: climate.set_hvac_mode
target:
entity_id: climate.riscaldamento_salotto
data:
hvac_mode: 'off'
# Invio notifica di avviso
- service: notify.notify
data:
title: "🌿 Risparmio Energetico Attivo"
message: "Climatizzatore e riscaldamento spenti automaticamente. La finestra del salotto risulta spalancata (Rilevamento Visivo IA)."
5. Routine del Buongiorno Predittiva (Morning Presence)
Ecco l'automazione predittiva per la routine mattutina. Rileva il tuo ingresso nel salotto la mattina per la prima volta: **apre automaticamente le tapparelle**, **accende le luci solo se la stanza è buia (< 30 Lux)** e **ti dà il benvenuto a voce** fornendoti informazioni utili sul meteo della giornata.
- alias: "Predittivo: Routine del Buongiorno in Salotto"
description: "Avvia la routine mattutina alla prima presenza rilevata nel salotto"
trigger:
- platform: state
entity_id: binary_sensor.telecamera_salotto_person_occupancy
to: 'on'
condition:
# Esegui solo tra le 6:00 e le 10:00 del mattino
- condition: time
after: "06:00:00"
before: "10:00:00"
# Esegui solo una volta al giorno tracciando i secondi dall'ultimo trigger
- condition: template
value_template: "{{ state_attr('automation.predittivo_routine_del_buongiorno_in_salotto', 'last_triggered') == none or (now() - state_attr('automation.predittivo_routine_del_buongiorno_in_salotto', 'last_triggered')).total_seconds() > 43200 }}"
action:
# 1. Alza le tapparelle del salotto
- service: cover.open_cover
target:
entity_id: cover.tapparelle_salotto
# 2. Accendi la luce solo se la luminosità ambientale è bassa (< 30 lux)
- if:
- condition: numeric_state
entity_id: sensor.salotto_sensore_luminosita
below: 30
then:
- service: light.turn_on
target:
entity_id: light.luci_salotto
data:
brightness_pct: 60
# 3. Determina il nome del familiare per un saluto personalizzato (se riconosciuto recentemente)
- variables:
nome_utente: >
{% if states('sensor.telecamera_salotto_last_recognized_face') not in ['unknown', 'unavailable', 'none'] and (now() - states.sensor.telecamera_salotto_last_recognized_face.last_changed).total_seconds() < 300 %}
{{ states('sensor.telecamera_salotto_last_recognized_face') }}
{% else %}
Enzo
{% endif %}
meteo_info: "{{ states('sensor.meteo_casa_temperatura') }} gradi con cielo {{ state_attr('weather.casa', 'forecast')[0].condition }}"
# 4. Buongiorno vocale personalizzato e info meteo tramite altoparlante salotto
- service: tts.speak
target:
entity_id: tts.piper_locale
data:
media_player_entity_id: media_player.cassa_salotto
message: "Buongiorno {{ nome_utente }}! Benvenuto nel salotto. Ho alzato le tapparelle per te. Fuori ci sono {{ meteo_info }}. Ti auguro una splendida giornata!"
6. Notifiche Mobile di Stato dell'Allarme (Attivazione, Disattivazione, Intrusione)
Per mantenere tutta la famiglia costantemente aggiornata sullo stato di sicurezza della casa, possiamo configurare un'unica automazione flessibile basata su template YAML. Questo blocco invia una notifica push istantanea a tutti gli smartphone ogni volta che l'allarme viene attivato (in qualsiasi modalità), disattivato o fatto scattare (intrusione).
# automations.yaml
- alias: "Sicurezza: Notifiche Stato Allarme sul Cellulare"
description: "Invia notifiche push immediate su attivazione, disattivazione o allarme intrusione"
trigger:
- platform: state
entity_id: alarm_control_panel.allarme_casa
action:
- service: notify.notify
data:
title: >
{% if trigger.to_state.state == 'triggered' %}
🚨 ALLARME SCATTATO!
{% elif trigger.to_state.state == 'disarmed' %}
🔓 Allarme Disattivato
{% else %}
🔒 Allarme Attivato
{% endif %}
message: >
{% if trigger.to_state.state == 'triggered' %}
Attenzione! Rilevata intrusione in corso in salotto.
{% elif trigger.to_state.state == 'disarmed' %}
L'allarme di casa è stato spento correttamente.
{% else %}
L'allarme è stato inserito con successo in modalità: {{ trigger.to_state.state }}.
{% endif %}
🎯 Conclusioni
Integrare Frigate NVR con Home Assistant eleva la domotica a un livello di intelligenza superiore. Smettiamo di affidarci a banali sensori di movimento che non distinguono una tenda che si muove da un ladro. La possibilità di addestrare l'IA locale a **classificare lo stato visivo delle finestre** ed eseguire il **riconoscimento facciale dei familiari** a livello locale ci restituisce il controllo completo della nostra privacy (nessun dato viaggia verso server esterni), garantendo al contempo un'affidabilità totale e un tasso di falsi allarmi pari a zero.
Grazie all'accelerazione hardware e all'ottimizzazione YAML dei filtri oggettuali e delle zone, il nostro server di sicurezza è in grado di vegliare su tutta la famiglia in modo discreto, riducendo i consumi e proteggendo i nostri cari da qualsiasi intrusione indesiderata.