Aggiungiamo un led di stato al nostro Voice Assist basato su ESPHome!

Home Assistant

Scritto da Vincenzo Caputo

Gli ultimi contenuti pubblicati sul nostro Blog e sul canale collegato YouTube MissingTech, hanno riscosso un notevole successo.

Sto parlando esattamente dell'argomento "voce" di Home Assistant, cioè tutto quello che riguarda in qualche modo i comandi vocali e le domande che possiamo porre al nostro assistente domestico.

Proprio qualche settimana fa mi sono occupato di effettuare una prima prova del dispositivo ufficiale che il team di Open Home Foundation, la fondazione che ha creato appunto Home Assistant, ha realizzato in versione preview.

Potete leggere l'articolo dedicato al seguente link:

Home Assistant Voice - installazione e prima prova di funzionamento

Prima ancora Luigi Duchi aveva proposto, sul nostro canale YouTube MissingTech, un interessantissimo contenuto sempre incentrato sui comandi vocali in ambiente Home Assistant.

Qui di seguito il link a quel video:

https://youtu.be/sAwnQGCCAO8

Dopo queste prime esperienze ho iniziato a provare a spingermi maggiormente con il fai da te, complice una recente passione per l'argomento ESPHome.

Ho pubblicato infatti una guida su come realizzare un assistente vocale basato proprio su Assist, di Home Assistant, utilizzando un semplice esp32 e un piccolo microfono digitale.

diymore 1 Pezzo ESP32 WROOM 32 Scheda di Sviluppo ESP32 NodeMCU Moduli 2.4GHz Dual Core WLAN WiFi Bluetooth CP2102 Chip ESP32 WROOM
Prezzo intero: 8,99€
Prezzo scontato: 8,99€

ARCELI 3PCS INMP441 Modulo microfono omnidirezionale, interfaccia I2S MEMS, alta precisione e bassa potenza compatibile con ESP32
Prezzo intero: 11,99€
Prezzo scontato: 11,99€

Il tutto mosso da ESPHome.

Nel caso vi serva un recap, potete rileggere quell'articolo al seguente link:

Voice Assist realizzato con un ESP32 e ESPHome con risposta su speaker esterno!

Il risultato per quanto mi riguarda è stato eccezionale! Ottenere un assistente vocale connesso e a basso costo, mi permetterà di distribuire in casa una serie di questi dispositivi per avere il controllo totale del mio personal hub.

E di ottenere risposta direttamente negli altoparlanti che ho in giro per casa collegati agli amplificatori Arylic compatibili con il protocollo LinkPlay, nativamente compatibile con Home Assistant e dei quali abbiamo ampiamente parlato in passato su questo Blog e sul nostro canale YouTube.

Un esempio qui di seguito:

https://youtu.be/nJE4LcLLWxY

Successivamente mi sono spinto oltre, andando oltre i semplici comandi vocali per la mia domotica, integrando una vera e propria Intelligenza Artificiale (basata sul famisissimo ChatGPT) con cui poter dialogare in Home Assistant.

Potete leggere la guida al seguente link:

ChatGPT in Home Assistant per un assistente vocale con AI

Sono dunque pronto per costruire una manciata di questi dispositivi da distribuire nei vari ambianti della mia abitazione così da avere a portata di voce tutto quello che mi serve ogni volta che voglio, semplicemente parlando (con la mia casa).

Cioè, Tony Stark, scansati proprio!

Vi avevo lasciati però con la promessa di un'ultima modifica al mio progettino:

In effetti alla mia realizzazione mancava una notifica visiva che indicasse la corretta attivazione dell'assistente via hotword (hei Jarvis!) e il relativo stato di messa in ascolto.

Sappiamo tutti quanto sia facile che l'attivazione fallisca perché non abbiamo pronunciato bene la parola chiave o perché c'è del rumore di sottofondo ecc..

Lo stato di attivazione dell'assistente vocale viene correttamente segnalato dentro Home Assistant e, quando siamo davanti al PC, non c'è nessun problema. Ma essendo i dispositivi esp32 (e mic) sparsi in casa, non è possibile sapere se in un dato momento sono in ascolto o meno.

Ho deciso quindi di dotarli di un led luminoso che cambia di stato in base a quello che l'assistente sta facendo.

Ho usato un LED circolare basato su controller WS2812B

AZDelivery 3 x Anello LED RGB compatibile con WS2812B da 5 V 12-Bit compatibile con Arduino incluso un E-Book!
Prezzo intero: 10,99€
Prezzo scontato: 10,99€

L'effetto durante l'uso è più o meno quello che potete osservare nella seguente foto:

Nel video in coda all'articolo potrete osservare meglio il funzionamento perché ho implementato diversi colori ed effetti che richiamano i vari stati.

Prima di tutto vi mostro i collegamenti.

Ho saldato 3 cavetti jumper ai 3 pin che vedete sulla parte posteriore della stripled.

Rosso e nero vanno rispettivamente su 5V e su GND e non sono altro che il positivi e il negativo dell'alimentazione della striscia.

Il segnali di input invece da su DI ed è rappresentato dal cavetto giallo.

Sull'esp32 molto semplicemente collegato il rosso sul pin 5V, il nero sul pin GND e il giallo su un pin a piacere (io ho usato il 18).

A questo punto non vi resterà altro da fare che caricare in Home Assistant, alla sezione ESPHome Builder, il codice che trovate incollato qui di seguito.

light:
  - platform: fastled_clockless
    chipset: WS2812B
    pin: 18
    num_leds: 12
    rgb_order: GRB
    name: "round"
    id: led_cerchio
    effects:
      - pulse:
          transition_length: 250ms
          update_interval: 250ms

i2s_audio:
  - id: i2s_in
    i2s_lrclk_pin: GPIO26   #WS / LRC
    i2s_bclk_pin: GPIO25    #SCK /BCLK

microphone:
  - platform: i2s_audio
    adc_type: external
    pdm: false
    id: mic_i2s
    channel: right
    bits_per_sample: 32bit
    i2s_audio_id: i2s_in
    i2s_din_pin: GPIO32

speaker:
  - platform: i2s_audio
    id: my_speaker
    dac_type: external
    i2s_dout_pin: GPIO27   #DIN
    i2s_mode: primary
    i2s_audio_id: i2s_in


voice_assistant:
  microphone: mic_i2s
  id: va
  noise_suppression_level: 2
  auto_gain: 31dBFS
  volume_multiplier: 4.0
  use_wake_word: false
  speaker: my_speaker

  on_listening:
    - light.turn_on:
        id: led_cerchio
        blue: 100%
        red: 100%
        green: 100%
        brightness: 100%

  #on_end:
    #- light.turn_off:
        #id: led_cerchio

  on_tts_start:
    - homeassistant.service:
        service: tts.cloud_say
        data:
          entity_id: media_player.soggiorno_4
        data_template:
          message: "{{ my_stt }}"
        variables:
          my_stt: return x;
    - light.turn_on:
        id: led_cerchio
        blue: 0%
        red: 0%
        green: 100%
        brightness: 100%
        effect: pulse

  on_end:
    - delay: 3s
    - light.turn_off:
        id: led_cerchio

  on_error:
   - if:
        condition:
          switch.is_on: use_wake_word
        then:
          - switch.turn_off: use_wake_word
          - switch.turn_on: use_wake_word

  on_client_connected:
    - if:
        condition:
          switch.is_on: use_wake_word
        then:
          - voice_assistant.start_continuous:

  on_client_disconnected:
    - if:
        condition:
          switch.is_on: use_wake_word
        then:
          - voice_assistant.stop:


binary_sensor:
  - platform: status
    name: API Connection
    id: api_connection
    filters:
      - delayed_on: 1s
    on_press:
      - if:
          condition:
            switch.is_on: use_wake_word
          then:
            - voice_assistant.start_continuous:
    on_release:
      - if:
          condition:
            switch.is_on: use_wake_word
          then:
            - voice_assistant.stop:


switch:
  - platform: template
    name: Use wake word
    id: use_wake_word
    optimistic: true
    restore_mode: RESTORE_DEFAULT_ON
    entity_category: config
    on_turn_on:
      - lambda: id(va).set_use_wake_word(true);
      - if:
          condition:
            not:
              - voice_assistant.is_running
          then:
            - voice_assistant.start_continuous

    on_turn_off:
      - voice_assistant.stop
      - lambda: id(va).set_use_wake_word(false);

Il codice lo dovrete incollare dopo la riga captive_portal:

Nella parte precedente infatti ci sono le informazioni di base del vostro esp32 come i dati della rete WiFi a cui vi collegate, ecc...

Per le istruzioni di caricamento del codice fate riferimento alla guida precedente dove ho spiegato tutto nel dettaglio sia nel caso in cui siate al primo flash di ESPHome su un nuovo dispositivo, sia che siate ad aggiornare come in questo mio caso.

4 Canali a contatto pulito a meno di 5 euro con ESPHome!

 Il codice comprende anche la configurazione già vista nel precedente articolo dove abbiamo integrato il microfono e configurato la risposta su uno speaker esterno. 

Dunque andate a riguardare cosa dovrete personalizzare di quella parte di codice al seguente link:

Voice Assist realizzato con un ESP32 e ESPHome con risposta su speaker esterno!

Per ulteriori dettagli sull'integrazione del led e sulla parte personalizzazione della luce ho fatto riferimento alla seguente documentazione ufficiale:

  • Componente FastLED Light:

https://esphome.io/components/light/fastled#fastled-clockless-chipsets

  • Light Component:

https://esphome.io/components/light/index.html#light-turn-on-action

Se tutto è andato per il verso giusto ora all'attivazione della hotword il led circolare si dovrebbe illuminare di bianco e subito dopo (mentre elabora la risposta) dovrebbe iniziare a lampeggiare di verde.

I colori sono facilmente personalizzabili tramite modifica nel codice.

Non mi resta che mostrarvi il risultato dal vivo al seguente link direttamente dal nostro canale YouTube MissingTech.

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