La tua casa ti riconosce: Riconoscimento Facciale e Benvenuto Vocale su Home Assistant con l'AI

Home Assistant

Scritto da Vincenzo Caputo

 Bentornati sul blog! Di recente abbiamo visto come l’integrazione di Google Gemini possa trasformare le nostre telecamere in veri e propri sensori evoluti nella mia Guida all'Analisi Video AI per Telecamere IP.

Oggi facciamo un enorme passo avanti: passiamo dalla semplice descrizione della scena al riconoscimento delle persone. Vedremo come far sì che la casa non solo "veda" un movimento, ma riconosca chi è entrato e ci accolga con una routine personalizzata, gestendo musica e volume in modo fluido e professionale.

Il Concetto: Few-Shot Learning

Non avrete bisogno di hardware costosi (come i Google Coral) o di addestrare complessi modelli locali. Useremo una tecnica chiamata Few-Shot Learning: invieremo a Gemini lo scatto attuale della telecamera insieme a una foto di riferimento (una sorta di "legenda") chiamata family_reference.jpg.

Come preparare la foto: Caricate nella cartella /config/www/ un'immagine che contenga i volti chiari dei membri della famiglia, con il rispettivo nome scritto subito sotto. Gemini userà questa foto come termine di paragone per identificare chi ha davanti.

La foto precedente è l'esatto esempio di quella che ho caricato io nel mio sistema.

Ho sfuocato i volti per motivi di privacy sul Blog naturalmente, la foto che dovrete caricare dovrà essere il più chiara possibile.

Un ultimo suggerimento: se la vostra cam riprende i soggetti ad una certa distanza, quindi a figura intera, sarà conveniente caricare foto a figura intera (da testa a piedi), viceversa se avete la cam in una posizione tale che i soggetti vengono inquadrati a mezzo busto allora converrà caricare foto a mezzo busto. L'AI dovrà comparare le immagini quindi cercate di fornire un metro di paragone più simile possibile a quello che vedranno le camere.

In ogni caso fate diverse prove finché non troverete il miglior compromesso.

Al fine di mostrare il potenziale di questa soluzione ho deciso di portare un caso d'uso possibile che ho replicato nella mia abitazione (e che potete vedere in azione nel video in coda all'articolo)

Un saluto di benvenuto, quando torniamo a casa, personalizzato in base al soggetto della famiglia rilevato dalle telecamere.

Vi ricordo a tal proposito una guida pubblicata su questo Blog nel lontano 2018 a cura di Luigi Duchi dove mostravamo come impostare un messaggio di benvenuto su Home Assistant.

Google Home - impostiamo un saluto di benvenuto al nostro ingresso in casa

All'epoca, il massimo che potevamo fare era impostare un messaggio generico di benvenuto, valido per tutti i familiari, oppure al massimo legare l'automazione al rientro di uno smartphone a casa, nel caso fosse monitorato.

1. Lo Script: Una "Regia Audio" Universale

Qui di seguito lo script che esegue il messaggio di benvenuto, al quale ho aggiunto una piccola chicca!

Per rendere questa guida utile a tutti, ho creato uno script generico che potete adattare a qualsiasi media player (Google Home, Alexa, Sonos o casse integrate). Lo script salva il volume attuale, mette in pausa l'eventuale musica, alza il volume per l'annuncio e ripristina tutto alla fine. La vostra musica riprenderà esattamente dove si era interrotta!

alias: "Routine Benvenuto Universale (Blog Version)"
description: "Gestisce volume, annuncio vocale e ripristino musica."
sequence:
  - variables:
      # --- SEZIONE PERSONALIZZABILE ---
      # Inserite qui l'entità del vostro speaker (es. media_player.google_home)
      player_target: media_player.vostro_speaker_smart
      # Inserite qui il volume desiderato per la voce (da 0.1 a 1.0)
      volume_annuncio: 0.6
      # -------------------------------

      # LOGICA AUTOMATICA (Non toccare)
      # Memorizza il volume attuale per poterlo ripristinare dopo
      volume_precedente: "{{ state_attr(player_target, 'volume_level') | default(0.3, true) }}"
      # Controlla se c'era musica in riproduzione
      stava_riproducendo: "{{ is_state(player_target, 'playing') }}"

  # 1. Mettiamo in pausa la musica (se attiva) per non sovrapporsi alla voce
  - if: "{{ stava_riproducendo }}"
    then:
      - action: media_player.media_pause
        target:
          entity_id: "{{ player_target }}"

  # 2. Impostiamo il volume per l'annuncio
  - action: media_player.volume_set
    target:
      entity_id: "{{ player_target }}"
    data:
      volume_level: "{{ volume_annuncio }}"

  # 3. Annuncio Vocale (Usiamo TTS Cloud per la voce naturale 'Diego')
  # Se non avete Nabu Casa, usate 'tts.google_translate_say'
  - action: tts.cloud_say
    target:
      entity_id: "{{ player_target }}"
    data:
      message: "Bentornato a casa! Ho rilevato la tua presenza."
      options:
        voice: it-IT-DiegoNeural

  # 4. Attesa necessaria per far finire la frase prima di abbassare il volume
  # Aumentate i secondi se la frase è più lunga
  - delay: "00:00:06"

  # 5. Ripristino del volume originale
  - action: media_player.volume_set
    target:
      entity_id: "{{ player_target }}"
    data:
      volume_level: "{{ volume_precedente }}"

  # 6. Facciamo ripartire la musica (solo se stava suonando prima)
  - if: "{{ stava_riproducendo }}"
    then:
      - action: media_player.media_play
        target:
          entity_id: "{{ player_target }}"

2. L'Automazione: Il Cervello AI

L'automazione si occupa di scattare lo snapshot, inviarlo a Gemini insieme alla legenda e, se l'AI risponde trovando il nome desiderato, attivare il nostro script di benvenuto.

Come potete osservare, nel codice ho inserito diverse condizioni per prevenire i casi limite (come il saluto che parte mentre stai solo andando in cucina o sei uscito a buttare l'immondizia per 5 minuti).

Per gestire la condizione "Assenza prolungata" (es. "ero fuori da più di un'ora") direttamente dentro un'automazione, senza creare sensori extra complessi, la strategia migliore è combinare due fattori:

  1. Finestra di rientro: Ti saluto solo se il tuo stato è passato a "A casa" da meno di 15 minuti.

  2. Cool-down (Anti-Noia): Ti saluto solo se questo script non è già partito nell'ultima ora.

alias: "AI Vision: Riconoscimento e Benvenuto (Blog Version)"
description: "Analisi AI della telecamera con filtri di presenza per il benvenuto."
mode: single

triggers:
  # IL TRIGGER: Il sensore di movimento della telecamera o della stanza
  - trigger: state
    entity_id: binary_sensor.sensore_movimento_ingresso # <-- PERSONALIZZARE
    to: "on"

actions:
  # 1. SCATTO FOTO
  # Scattiamo un'istantanea per analizzarla
  - action: camera.snapshot
    target:
      entity_id: camera.ingresso_principale # <-- PERSONALIZZARE
    data:
      filename: /config/www/snap_ai.jpg

  # 2. PICCOLA PAUSA
  # Diamo tempo al sistema di salvare il file su disco
  - delay:
      seconds: 2

  # 3. ANALISI GEMINI
  # Inviamo a Google la foto scattata e la nostra "Legenda" (family_reference.jpg)
  - action: llmvision.image_analyzer
    data:
      provider: VOSTRO_PROVIDER_ID # <-- INSERIRE IL VOSTRO ID PROVIDER
      image_file: |-
        /config/www/snap_ai.jpg
        /config/www/family_reference.jpg
      message: >
        Confronta la persona in 'snap_ai.jpg' con i volti in 'family_reference.jpg'.
        Se riconosci qualcuno della famiglia, scrivi SOLO: "Ho visto [Nome]".
        Se è un estraneo, scrivi: "Sconosciuto".
        Sii sintetico.
    response_variable: response

  # 4. DECISIONE INTELLIGENTE
  # Questo blocco decide se lanciare il saluto. Devono essere vere TUTTE le condizioni.
  - if:
      - condition: template
        value_template: >
          {# --- CONFIGURAZIONE VARIABILI --- #}
          {# Nome da cercare nella risposta dell'AI #}
          {% set target_name = 'Vincenzo' %}
          {# La vostra entità persona per tracciare la presenza #}
          {% set my_person = states.person.vincenzo %}
          {# Lo script di benvenuto per controllare quando è stato eseguito l'ultima volta #}
          {% set my_script = 'script.routine_benvenuto_universale' %}

          {# --- INIZIO CONTROLLI --- #}

          {# 1. RICONOSCIMENTO: Gemini ha visto proprio me? #}
          {% set visto_dall_ai = target_name in response.response_text %}

          {# 2. PRESENZA: Sono effettivamente segnato come 'a casa'? #}
          {% set sono_a_casa = my_person.state == 'home' %}

          {# 3. RIENTRO RECENTE: Sono rientrato da meno di 15 minuti (900 sec)? #}
          {# Questo evita che il saluto parta se sono in casa da ore e passo davanti alla cam #}
          {% set appena_rientrato = (as_timestamp(now()) - as_timestamp(my_person.last_changed)) < 900 %}

          {# 4. ANTI-NOIA: Lo script NON è stato eseguito nell'ultima ora (3600 sec)? #}
          {# Questo evita saluti doppi se esco a buttare la spazzatura e rientro subito #}
          {% set last_run = state_attr(my_script, 'last_triggered') %}
          {% set tempo_passato = (as_timestamp(now()) - as_timestamp(last_run)) if last_run else 3601 %}
          {% set cooldown_ok = tempo_passato > 3600 %}

          {# RISULTATO FINALE: Tutte le condizioni devono essere VERE #}
          {{ visto_dall_ai and sono_a_casa and appena_rientrato and cooldown_ok }}

    then:
      # Se tutte le condizioni sopra sono vere, lancia lo script
      - action: script.routine_benvenuto_universale

Nel caso vogliate un'automazione "liscia" ideale per telecamere esterne o per chi vuole solo ricevere notifiche intelligenti ("Visto Vincenzo" vs "Visto Sconosciuto") senza attivare routine vocali o audio, potete fare riferimento al codice qui di seguito.

alias: "AI Vision 2.0: Riconoscimento Base (No Audio)"
description: "Scatta foto, riconosce i volti confrontandoli con la legenda e invia notifica."
mode: single

triggers:
  # IL TRIGGER: Il sensore di movimento della telecamera
  - trigger: state
    entity_id: binary_sensor.vostro_sensore_movimento # <-- PERSONALIZZARE QUI
    to: "on"

actions:
  # 1. SCATTO FOTO
  # Salviamo l'immagine in /config/www/ per renderla accessibile a Gemini
  - action: camera.snapshot
    target:
      entity_id: camera.vostra_telecamera # <-- PERSONALIZZARE QUI
    data:
      filename: /config/www/snap_ai_base.jpg

  # 2. PAUSA TECNICA
  # Fondamentale: aspettiamo che il file venga scritto fisicamente sul disco
  - delay:
      seconds: 2

  # 3. ANALISI GEMINI (Il cuore del sistema)
  - action: llmvision.image_analyzer
    data:
      provider: VOSTRO_PROVIDER_ID # <-- INSERIRE IL VOSTRO ID PROVIDER
      # IMPORTANTE: Usiamo il simbolo | per elencare i file senza errori
      # Passiamo sia lo scatto attuale che la foto "Legenda"
      image_file: |
        /config/www/snap_ai_base.jpg
        /config/www/family_reference.jpg
      message: >
        Sei un sistema di sicurezza.
        L'immagine 1 è lo scatto attuale.
        L'immagine 2 ('family_reference.jpg') contiene i volti e i nomi dei familiari per confronto.

        Analizza chi c'è nell'immagine 1:
        - Se riconosci un familiare, scrivi: "Rilevato [Nome]".
        - Se è una persona ma non la riconosci, scrivi: "Rilevato Sconosciuto".
        - Se non c'è nessuno (falso allarme, solo animali o auto), scrivi SOLO: "Nessuno".
        Sii sintetico.
      include_filename: false
      max_tokens: 100
    response_variable: response

  # 4. AGGIORNAMENTO DASHBOARD (Opzionale)
  # Scriviamo il risultato in un helper di testo per vederlo nella Card Lovelace
  - action: input_text.set_value
    target:
      entity_id: input_text.vostro_helper_testo # <-- PERSONALIZZARE (o rimuovere se non usato)
    data:
      value: >-
        {{ as_timestamp(now()) | timestamp_custom('%H:%M') }} - {{ response.response_text | truncate(240, true) }}

  # 5. NOTIFICA INTELLIGENTE
  # Inviamo la notifica SOLO se Gemini ha visto qualcosa di rilevante (ignoriamo "Nessuno")
  - if:
      - condition: template
        value_template: "{{ 'Nessuno' not in response.response_text and response.response_text != '' }}"
    then:
      - action: notify.mobile_app_vostro_smartphone # <-- PERSONALIZZARE QUI
        data:
          title: "Sicurezza AI"
          message: "{{ response.response_text }}"
          data:
            # Alleghiamo la foto dello scatto alla notifica
            image: /local/snap_ai_base.jpg
            clickAction: /lovelace/security

Se tutto è filato per il verso giusto inizierete a ricevere notifiche relative alle rilevazioni movimento con il nome dei vostri familiari oppure con la dicitura di presenza di sconosciuti. Alcuni esempi qui di seguito.

Non solo Saluti: Scenari avanzati di utilizzo

Oltre il "Bentornato": 5 Idee per usare il Riconoscimento Facciale

Il saluto vocale è scenografico, ma il potenziale di sapere chi c'è in casa apre le porte ad automazioni molto più utili. Ecco qualche spunto per scatenare la vostra fantasia:

1. Comfort Personalizzato (Il Termostato Empatico)

Perché scaldare la casa allo stesso modo per tutti?

  • Se entra Vincenzo (che soffre il caldo): Imposta il termostato dello studio a 19°C.

  • Se entra Giovanna (che è freddolosa): Alza la temperatura a 21.5°C e accendi lo scaldasonno.

  • Come si fa: Usate il nome rilevato nell'automazione per attivare scene climate diverse.

2. Sicurezza Selettiva (Basta Falsi Allarmi)

Siete stanchi di ricevere notifiche quando i vostri figli giocano in giardino?

  • La regola: "Se vedi un familiare -> Non fare nulla."

  • L'eccezione: "Se vedi uno Sconosciuto nel retro della casa -> Invia notifica critica + Accendi faretto rosso + Fai abbaiare Alexa."

  • Vantaggio: Ricevete notifiche solo quando serve davvero.

3. Monitoraggio Bambini & Aree Pericolose

Avete una piscina, una stanza degli attrezzi o un cancello che dà sulla strada?

  • Scenario: Se la telecamera vede "Francesca" (bambina) da sola in "Zona Piscina" senza "Vincenzo" o "Giovanna" (adulti).

  • Azione: Lancia un allarme immediato sugli speaker di casa: "Attenzione! Francesca è sola vicino alla piscina!"

4. Privacy Automatica ("Modalità Ospiti")

Non è carino registrare gli amici quando vengono a cena.

  • Scenario: Se Gemini rileva "Sconosciuto" (che in questo caso è un ospite) nel salotto mentre voi siete a casa.

  • Azione: Disabilita temporaneamente la registrazione delle telecamere interne o spegni il monitor che mostra la dashboard di Home Assistant per proteggere la vostra privacy.

5. Il Citofono Intelligente (Chi ha suonato?)

Se avete un campanello smart o una camera sul vialetto.

  • Azione: Quando suonano alla porta, invece del classico "din don", Google Home annuncia: "C'è il corriere" (se riconosciuto dalla divisa/pacco) oppure "C'è Marco alla porta".

  • Utilità: Sapete se alzarvi dal divano o se è solo il postino.

Restiamo Connessi

Se volete ricevere una notifica istantanea ogni volta che pubblico una nuova guida o un aggiornamento su queste integrazioni AI (e altri interessanti contenuti), vi invito a iscrivervi al mio Canale Telegram ufficiale:

Iscriviti al Canale Telegram di Vincenzo Caputo

Guarda il video su MissingTech

Volete vedere questa automazione in azione? Nel video dedicato sul mio canale YouTube MissingTech, vi mostrerò il test dal vivo: dal riconoscimento facciale alla risposta vocale di "Jarvis", con tutti i dettagli sulla configurazione della dashboard.

Buona domotica a tutti!

 

Produrre e aggiornare contenuti su vincenzocaputo.com richiede molto tempo e lavoro. Se il contenuto che hai appena letto è di tuo gradimento e vuoi supportarmi, clicca uno dei link qui sotto per fare una donazione.

Vincenzo Caputo

Nato a Matera, il 1° novembre 1977. Sono da sempre appassionato di tecnologia e ho un'esperienza lavorativa ventennale nel settore IT. Mi piace sperimentare e cercare sempre nuove soluzioni e soprattutto mi piace comunicare le mie esperienze agli altri.


Vai ai commenti