Cześć!
Bardzo dużo pomysłów i projektów zaczerpnąłem z forum i z internetu dlatego też chciałbym zostawić coś od siebie. Od dłuższego czasu walczyłem ze sterowaniem głosowym w swoim domu, testowałem różne rozwiązania i różnych asystentów ale ciągle mi czegoś brakowało. Oliwy do ognia dolał mój terminal w którym padło gniazdo jack i musiałem zrezygnować z odtwarzacza VLC. Zakupiłem głośnik bluetooth LECKIE DJ Roxx dosłownie za pare groszy i wymyśliłem że go przerobie na głośnik który zagada z HA.
Przejdźmy do konkretów:
Projekt jest bardzo prosty i możesz go zamknąć w kilkudziesięciu złotych a funkcjonalność jak przynajmniej za 200zł Nie jestem elektronikiem, tym bardziej programistą więc istnieje prawdopodobieństwo że czegoś w układzie brakuje, dlatego też zostawie tutaj ten projekt jako otwarty (z możliwością nieskończonej rozbudowy). Co potrzebujemy:
- głośnik 3-5W
- ESP32 lolin32
- buzzer
- moduł MAX98357A
- mikrofon INMP441 MEMS I2S
- asystenta głosowego w HA (ja korzystam z Nabu Casy bo wg mnie działa najlepiej)
- postawionego Wake Worda w HA
- umiejętność lutowania
Swój głośnik wybebeszyłem i dodrukowałem dodatkową część obudowy żeby trochę zwiększyć głośnik i miejsce na kable. Mój układ zbudowałem na płytce prototypowej bo akurat w obudowie miałem miejsce gdzie się idealnie wkomponowała.
Schemat prezentuje się tak:
YAML:
name: esp-remote
friendly_name: esp-remote
esp32:
board: esp32dev
framework:
type: arduino
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "XXXXXXXXXX"
ota:
password: "XXXXXXXXX"
wifi:
ssid: "XXXXXXx"
password: "XXXXXXXX"
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "Esp-Remote Fallback Hotspot"
password: "XXXXX"
captive_portal:
output:
- platform: ledc
pin: GPIO15
id: rtttl_out
rtttl:
output: rtttl_out
id: my_rtttl
i2s_audio:
- id: i2s_mic
i2s_lrclk_pin: GPIO25 #LRCLK,WS
i2s_bclk_pin: GPIO33 #BLCK,SCK
- id: i2s_out
i2s_lrclk_pin: GPIO14 #LRCLK,WS
i2s_bclk_pin: GPIO12 #BLCK,SCK
microphone:
- platform: i2s_audio
id: mikrofon
adc_type: external
i2s_audio_id: i2s_mic
i2s_din_pin: GPIO32 #DIN,SDIN,SD,SDATA
pdm: false
voice_assistant:
id: va
microphone: mikrofon
use_wake_word: true
on_listening:
- rtttl.play: 'two_short:d=4,o=5,b=100:16e6,16e6'
media_player:
- platform: i2s_audio
id: player
name: ESP Media Player
dac_type: external
i2s_audio_id: i2s_out
i2s_dout_pin: GPIO18 #DIN,SDIN,SD,SDATA
on_play:
- logger.log: "playing"
- switch.turn_off: use_wake_word
on_pause:
- logger.log: "paused"
- switch.turn_on: use_wake_word
on_idle:
- logger.log: "idle"
- switch.turn_on: use_wake_word
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);
Projekt nie jest doskonały ale działa. Generalnie głośnik służy mi jako radio z możliwością głosowego sterowania domem i to stwarza największy problem którego nie pokonałem. Asystent działa poprawnie gdy media player jest w stanie IDLE a stan PLAY wyłącza Wake Worda. Przy działającym ciągle nadsłuchiwaniu głośnik trzeszczy (możecie to sprawdzić usuwając daną linijkę kodu). Zachęcam was do zabawy i rozwijania projektu! POWODZENIA