ESP32- budowa swojego Atom Echo

Cześć!
Kto śledził na forum walki ze sterowaniem głosowym powinien kojarzyć m.in mój poprzedni projekt: ESP32 smart głośnik v1.5
Obecny projekt jest nieco okrojoną wersją wersji v1.5 bo zrezygnowałem z głośnika na rzecz mniejszego gabarytu.
W między czasie wytestowałem bardzo dużo mikrofonów USB dla add-ona Assist Microphone, ale żaden nie wyróżnił się czymś “nadzyczajnym”, mało tego: uważam że poniższy projekt radził sobie lepiej z przechwytywaniem dźwięku.

Nie wprowadziłem żadnych istotnych zmian względem poprzedniego projektu (zmiana płytki na WROOM 32U), dlatego nie widzę potrzeby dodawania schematu. Jak jest wszystko zrobione widać na zdjęciach a świeży kod wkleję tu:

  name: esp5-assist
  friendly_name: esp5-assist

esp32:
  board: esp32dev
  framework:
    type: arduino


# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "XXX"

ota:
  - platform: esphome
    password: "XXX"

wifi:
  ssid: "XXX"
  password: "XXX"
  fast_connect: on
  on_connect:
    - script.execute: start
    - delay: 3s
    - script.execute: restarter



web_server:
   port: 80

  # Enable fallback hotspot (captive portal) in case wifi connection fails
#  ap:
#    ssid: "Esp5-Assist Fallback Hotspot"
#    password: "XXX"

captive_portal:
button:
  - platform: restart
    name: Reboot


output:
  - platform: ledc
    pin: GPIO18
    id: rtttl_out

rtttl:
  output: rtttl_out
  id: my_rtttl  

light:
  - platform: fastled_clockless
    default_transition_length: 0.5s
    id: ring
    chipset: WS2811
    pin: GPIO19
    num_leds: 16
    rgb_order: GRB
    name: "FastLED WS2811 Light"


i2s_audio:
  - id: i2s_mic
    i2s_lrclk_pin: GPIO26  #WS
    i2s_bclk_pin: GPIO25   #SCK


microphone:
  - platform: i2s_audio
    id: mikrofon
    adc_type: external 
    channel: right
    bits_per_sample: 32bit
    i2s_audio_id: i2s_mic
    i2s_din_pin: GPIO27   #DIN,SDIN,SD,SDATA
    pdm: false


voice_assistant:
  id: va
  microphone: mikrofon
  use_wake_word: true
  noise_suppression_level: 3
  auto_gain: 31dBFS
  on_listening:
    - light.turn_on:
        id: ring
        red: 0%
        green: 0%
        blue: 100%
        brightness: 80%
    - rtttl.play: 'two_short:d=4,o=5,b=100:16e6,16e6'
    - delay: 3s
    - light.turn_off:
        id: ring


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);


interval:
  - interval: 150s
    then:
     - script.execute: restarter

script:
  - id: start
    then:
    - wait_until:
       wifi.connected:
    - logger.log: "polaczono"
    - light.turn_on:
        id: ring
        red: 0%
        green: 100%
        blue: 0%
        brightness: 80%
    - delay: 3s
    - light.turn_off:
        id: ring

  - id: restarter
    then:
     - switch.turn_off: use_wake_word     
     - delay: 80ms
     - switch.turn_on: use_wake_word

Pliki do wydrukowania w .STL:
obudowa.zip (339,8 KB)

No i kilka fotek jak to się prezentuje:








Nie przez przypadek zrobiłem taką obudowę którą można postawić też w pionie :wink: Ukierunkowanie mikrofonu jest bardzo istotne dla sprawnego działania asystenta. Zasilanie podłączone bezpośrednio do płytki przez gniazdo usb które znajduje się głęboko w obudowie przez co trochę trudniej je podłączyć.
Wiemy jak jest z dostępnością Atomów Echo a jeśli lubisz się trochę pobawić w DIY to zapraszam do wspólnego majsterkowania :grinning:

3 polubienia

Hej, bardzo ciekawy projekt, zaczynam też działać ze swoim. Plan jest taki żeby mieć takie urządzenia w każdym pomieszczeniu w domu.

Mam u siebie wersje z głośnikiem ale napotykam problemy, mikrofon działa całkiem spoko ale odpowiedz na głośniku jest tylko częściowo i nie wiem co moze być powodem. Polecenia wykonuje poprawnie.

Używam Whisper,Piper i openWakeWord do voice assistant

Rozważam też osobny mały serwerek dla LLM na container linux, żeby nie zabierać zasobów dla HA.

Myslicie że to może być problem z hardware i za wysokim ustawionym modelem Whisper ?

Logi:

DEBUG:wyoming_faster_whisper.handler:Sent info
DEBUG:wyoming_faster_whisper.handler:Sent info
DEBUG:wyoming_faster_whisper.handler:Language set to pl
DEBUG:wyoming_faster_whisper.handler:Audio stopped. Transcribing with initial prompt=null
INFO:faster_whisper:Processing audio with duration 00:03.220
DEBUG:faster_whisper:Processing segment at 00:00.000
INFO:wyoming_faster_whisper.handler: Opowiedz mi żart.
DEBUG:wyoming_faster_whisper.handler:Completed request
DEBUG:wyoming_faster_whisper.handler:Sent info
DEBUG:wyoming_faster_whisper.handler:Sent info
DEBUG:wyoming_faster_whisper.handler:Language set to pl
DEBUG:wyoming_faster_whisper.handler:Audio stopped. Transcribing with initial prompt=null
INFO:faster_whisper:Processing audio with duration 00:03.270
DEBUG:faster_whisper:Processing segment at 00:00.000
INFO:wyoming_faster_whisper.handler: Która jest godzina?
DEBUG:wyoming_faster_whisper.handler:Completed request

Hardware:

  • Dell Optiplex 3020 (I3 4360T, 8GB Ram) jak będzie za mało to zmienie na Xeon E3-1271 v3 i 16 GB RAM ale mam ustawiony model “base-int8
  • ESP WROOM 32
  • MAX98357A
  • Teyleten Robot INMP441 I2S
  • speaker 1w
esphome:
  name: ha-voice-1
  friendly_name: HA_Voice_1
  on_boot:
     - priority: -100
       then:
         - wait_until: api.connected
         - delay: 1s
         - if:
             condition:
               switch.is_on: use_wake_word
             then:
               - voice_assistant.start_continuous:

esp32:
  board: esp32dev
  framework:
    type: esp-idf
    version: recommended

# Enable logging
logger:

# Enable Home Assistant API
api:

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "xxxxxxxx"
    password: "xxxxxxxxx"

i2s_audio:
  i2s_lrclk_pin: GPIO27
  i2s_bclk_pin: GPIO26

microphone:
  - platform: i2s_audio
    id: mic
    adc_type: external
    i2s_din_pin: GPIO13
    pdm: false

speaker:
  - platform: i2s_audio
    id: big_speaker
    dac_type: external
    i2s_dout_pin: GPIO25
    mode: mono

voice_assistant:
  microphone: mic
  use_wake_word: false
  noise_suppression_level: 2
  auto_gain: 20dBFS
  volume_multiplier: 1.0
  speaker: big_speaker
  id: assist

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(assist).set_use_wake_word(true);
      - if:
          condition:
            not:
              - voice_assistant.is_running
          then:
            - delay: 500ms
            - voice_assistant.start_continuous
    on_turn_off:
      - voice_assistant.stop
      - lambda: id(assist).set_use_wake_word(false);

Finalnie myślałem o obudowie w takim stylu, ale dostosowane do puszki 60mm i zasilaniem 230:

2 polubienia

Z reguły jest to wina opóźnienia do głośnika co przekłada się na obcięcie wiadomości,
nie znam kodu ale zobacz czy nie trzeba dać dłuższego delay zanim pójdzie to na głośnik.

Ja zrezygnowałem już z tego w fazie testów bo opóźnienie było okropne względem Nabu Casy. Teraz po najnowszych aktualizacjach asystent Nabu też dostał spowolnienia ale jeszcze nie miałem czasu przyglądnąć się głębiej w czym tkwi problem.
Jak zaczynasz projekt od początku to zainteresuj się jeszcze płytką ESP32-S3 na której można odpalić Micro Wake Word — ESPHome
Żałuje że tego projektu nie zrobiłem na tej płytce ale też dzięki temu znowu będę mógł coś pomajstrować :wink:

Właśnie dlatego chciałem postawić swój lekki model LLM na innym serwerze niż HA → https://localai.io/, ale chciałem też potestować gotowe rozwiązania. Ja mam dostęp do bramki po stałym IP bez żadnej chmury.

Co do :ESP32-S3 super sugestia !!! Dzięki

Używam głównie HA z domu (home office) więc na jakiejś mega szybkości mi nie zależy zdalnie ale lokalnie musi smigać baja.

Sprawdze z tym opóźnieniem na 3s.
Chcę dodać też kilka modyfikacji:

  • dodać jakiś Led jak mówi lub przyjmuje komende
  • mały wzmacniacz do większego głośnika (np 12w)
  • no i zasilanie 230 z puszki 60 mm

Dziękuję za podpowiedzi dam znać jak poszło.

Jeśli ktoś ma już podobne rozwiązanie chętnie poznam wasze opinie i opis jak to u was działa.

Po wszystkim pochwal się gotowym projektem :grin:

A i jeszcze jedna sprawa odnośnie mikrofonu INMP441. Jak chcesz swojego asystenta zabudować w puszcze to postaraj się dobrze go zlokalizować. Mikrofon działa “przyzwoicie” pod warunkiem że fale dźwiękowe wpadają do niego prostopadle (wąski kąt działania) i w pobliżu nie ma żadnych urządzeń typu radio, tv a nawet wentylator.
Mam nadzieje że kiedyś doczekamy się możliwości zbudowania mikrofonu stereo a póki co musi nam wystarczyć tryb mono.

1 polubienie

To projektu ciąg dalszy, postaram się opisywać jak to przebiega na tej płytce.

Po wgraniu wszystkiego i podłaczeniu działa do pierwszej komendy z odpowiedzią.

Jak dobrze rozumiem brakuje pamięci dla tego modelu.
Muszę zmienić GPIO3 na jakiś inny

[20:29:22][D][voice_assistant:504]: State changed from STOPPING_MICROPHONE to AWAITING_RESPONSE
[20:29:24][D][voice_assistant:627]: Event Type: 4
[20:29:24][D][voice_assistant:655]: Speech recognised as: " Jaka jest temp biuro?"
[20:29:24][D][light:036]: 'On board light' Setting:
[20:29:24][D][light:047]:   State: OFF
[20:29:24][D][light:085]:   Transition length: 1.0s
[20:29:24][D][light:091]:   Effect: 'None'
[20:29:24][D][light:036]: 'Led Strip' Setting:
[20:29:24][D][light:047]:   State: OFF
[20:29:24][D][light:085]:   Transition length: 1.0s
[20:29:24][D][light:091]:   Effect: 'None'
[20:29:24][D][voice_assistant:627]: Event Type: 5
[20:29:24][D][voice_assistant:660]: Intent started
[20:29:24][D][voice_assistant:627]: Event Type: 6
[20:29:24][D][voice_assistant:627]: Event Type: 7
[20:29:24][D][voice_assistant:683]: Response: "Brak urządzenia lub encji o nazwie temp biuro?"
[20:29:24][D][i2s_audio.speaker:211]: Starting I2S Audio Speaker
[20:29:24][D][i2s_audio.speaker:214]: Started I2S Audio Speaker
[20:29:24][D][voice_assistant:627]: Event Type: 98
[20:29:24][D][voice_assistant:770]: TTS stream start
[20:29:24][D][voice_assistant:627]: Event Type: 8
[20:29:24][D][voice_assistant:705]: Response URL: "http://192.168.88.126:8123/api/tts_proxy/2f046d9e86f4d57600d1c18f754bd625c0b21ccf_pl-pl_8205d7d9f0_tts.piper.wav"
[20:29:24][D][voice_assistant:504]: State changed from AWAITING_RESPONSE to STREAMING_RESPONSE
[20:29:24][D][voice_assistant:510]: Desired state set to STREAMING_RESPONSE
[20:29:24][D][voice_assistant:627]: Event Type: 2
[20:29:24][D][voice_assistant:719]: Assist Pipeline ended
[20:29:24][D][light:036]: 'On board light' Setting:
[20:29:24][D][light:085]:   Transition length: 1.0s
[20:29:24][D][light:036]: 'Led Strip' Setting:
[20:29:24][D][light:085]:   Transition length: 1.0s
[20:29:24][D][esp-idf:000][speaker_task]: I (60312) I2S: DMA queue destroyed

[20:29:24][D][i2s_audio.speaker:230]: Stopped I2S Audio Speaker
[20:29:24][I][safe_mode:041]: Boot seems successful; resetting boot loop counter
[20:29:24][D][esp32.preferences:114]: Saving 1 preferences to flash...
[20:29:24][D][esp32.preferences:143]: Saving 1 preferences to flash: 0 cached, 1 written, 0 failed
[20:29:24][D][esp-idf:000][speaker_task]: I (60669) I2S: DMA Malloc info, datalen=blocksize=512, dma_buf_count=8

[20:29:24][D][i2s_audio.speaker:214]: Started I2S Audio Speaker
[20:29:27][D][voice_assistant:627]: Event Type: 99
[20:29:27][D][voice_assistant:778]: TTS stream end
[20:29:27][D][voice_assistant:375]: End of audio stream received
[20:29:27][D][voice_assistant:504]: State changed from STREAMING_RESPONSE to RESPONSE_FINISHED
[20:29:27][D][voice_assistant:510]: Desired state set to RESPONSE_FINISHED
[20:29:28][D][i2s_audio.speaker:218]: Stopping I2S Audio Speaker
[20:29:28][D][i2s_audio.speaker:230]: Stopped I2S Audio Speaker
[20:29:28][D][voice_assistant:407]: Speaker has finished outputting all audio
[20:29:28][D][voice_assistant:504]: State changed from RESPONSE_FINISHED to IDLE
[20:29:28][D][voice_assistant:510]: Desired state set to IDLE
[20:29:28][E][micro_wake_word:032]: Could not allocate the streaming model's tensor arena.
[20:29:28][E][micro_wake_word:268]: Failed to initialize a wake word model.
[20:29:28][E][micro_wake_word:161]: Failed to load the wake word model(s) or allocate buffers
[20:29:28][E][component:164]: Component micro_wake_word set Error flag: unspecified
[20:29:28][W][micro_wake_word:168]: Wake word component has an error. Please check logs

dodatkowo po odłączeniu zasilania i podłaczeniu podnownie już nie może sie połaczyć z HA, i tzreba wgrać OTA od nowa.

INFO ESPHome 2024.8.1
INFO Reading configuration /config/esphome/esphome-web-228a78.yaml...
WARNING GPIO3 is a strapping PIN and should only be used for I/O with care.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See https://esphome.io/guides/faq.html#why-am-i-getting-a-warning-about-strapping-pins
INFO Starting log output from 192.168.88.116 using esphome API
INFO Successfully connected to esphome-web-228a78 @ 192.168.88.116 in 0.076s
WARNING esphome-web-228a78 @ 192.168.88.116: Connection error occurred: esphome-web-228a78 @ 192.168.88.116: The connection dropped immediately after encrypted hello; Try enabling encryption on the device or turning off encryption on the client (ESPHome Logs 2024.8.1).
WARNING Can't connect to ESPHome API for esphome-web-228a78 @ 192.168.88.116: esphome-web-228a78 @ 192.168.88.116: The connection dropped immediately after encrypted hello; Try enabling encryption on the device or turning off encryption on the client (ESPHome Logs 2024.8.1). (HandshakeAPIError)

YAML

substitutions:
  name: esphome-web-228a78
  friendly_name: HA_Voice_Office

esphome:
  name: ${name}
  friendly_name: ${friendly_name}
  min_version: 2024.6.0
  name_add_mac_suffix: false
  platformio_options:
    board_build.flash_mode: dio
  project:
    name: esphome.web
    version: dev
  on_boot:
    - light.turn_on:
        id: led_ww
        blue: 100%
        brightness: 60%
        effect: fast pulse

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: esp-idf
    sdkconfig_options:
      CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240: "y"
      CONFIG_ESP32S3_DATA_CACHE_64KB: "y"
      CONFIG_ESP32S3_DATA_CACHE_LINE_64B: "y"
      CONFIG_AUDIO_BOARD_CUSTOM: "y"

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: !secret esphome_encryption_key
  on_client_connected:
        then:
          - delay: 50ms
          - light.turn_off: led_ww
          - micro_wake_word.start:
  on_client_disconnected:
        then:
          - voice_assistant.stop:

# Allow Over-The-Air updates
ota:
- platform: esphome

# Allow provisioning Wi-Fi via serial
improv_serial:

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  # Set up a wifi access point
  ap: {}

# In combination with the `ap` this allows the user
# to provision wifi credentials to the device via WiFi AP.
captive_portal:

dashboard_import:
  package_import_url: github://esphome/firmware/esphome-web/esp32s3.yaml@main
  import_full_config: true

# Sets up Bluetooth LE (Only on ESP32) to allow the user
# to provision wifi credentials to the device.
esp32_improv:
  authorizer: none

# To have a "next url" for improv serial
web_server:

button:
  - platform: restart
    name: "Restart"
    id: but_rest

switch:
  - platform: template
    id: mute
    name: mute
    optimistic: true
    on_turn_on: 
      - micro_wake_word.stop:
      - voice_assistant.stop:
      - light.turn_on:
          id: led_ww           
          red: 100%
          green: 0%
          blue: 0%
          brightness: 60%
          effect: fast pulse 
      - light.turn_on:
          id: led_strip           
          red: 100%
          green: 0%
          blue: 0%
          brightness: 60%
          effect: fast pulse 
          
      - delay: 2s
      - light.turn_off:
          id: led_ww
      - light.turn_off:
          id: led_strip

      - light.turn_on:
          id: led_ww          
          red: 100%
          green: 0%
          blue: 0%
          brightness: 30%
      - light.turn_on:
          id: led_strip           
          red: 100%
          green: 0%
          blue: 0%
          brightness: 30%

    on_turn_off:
      - micro_wake_word.start:
      - light.turn_on:
          id: led_ww           
          red: 0%
          green: 100%
          blue: 0%
          brightness: 60%
          effect: fast pulse 
      - light.turn_on:
          id: led_strip  
          red: 0%
          green: 100%
          blue: 0%
          brightness: 60%
          effect: fast pulse 
      - delay: 2s
      - light.turn_off:
          id: led_strip
      - light.turn_off:
          id: led_ww

binary_sensor:
  - platform: gpio
    id: button01
    name: "Mute Button" # Physical Mute switch
    pin:
      number: GPIO10  #Physical Button connected to this pin.
      inverted: True
      mode:
        input: True
        pullup: True
    on_press: 
      then:
        - switch.toggle: mute
   
light:
  - platform: esp32_rmt_led_strip
    id: led_ww
    rgb_order: GRB
    pin: GPIO48
    num_leds: 1
    rmt_channel: 0
    chipset: ws2812
    name: "On board light"
    effects:
      - pulse:
      - pulse:
          name: "Fast Pulse"
          transition_length: 0.5s
          update_interval: 0.5s
          min_brightness: 0%
          max_brightness: 100%

  - platform: esp32_rmt_led_strip
    id: led_strip
    rgb_order: GRB
    pin: GPIO09
    num_leds: 20
    rmt_channel: 1
    chipset: ws2812
    name: "Led Strip"
    effects:
      - pulse:
      - pulse:
          name: "Fast Pulse"
          transition_length: 0.5s
          update_interval: 0.5s
          min_brightness: 0%
          max_brightness: 100%
      - addressable_scan:
          name: "Scan Effect With Custom Values"
          move_interval: 5ms
          scan_width: 10

          
          
 # Audio and Voice Assistant Config          
i2s_audio:
  - id: i2s_in # For microphone
    i2s_lrclk_pin: GPIO3  #WS 
    i2s_bclk_pin: GPIO2 #SCK

  - id: i2s_speaker #For Speaker
    i2s_lrclk_pin: GPIO6  #LRC 
    i2s_bclk_pin: GPIO7 #BLCK

microphone:
  - platform: i2s_audio
    id: va_mic
    adc_type: external
    i2s_din_pin: GPIO4 #SD
    channel: left
    pdm: false
    i2s_audio_id: i2s_in
    bits_per_sample: 32bit
    
speaker:
    platform: i2s_audio
    id: va_speaker
    i2s_audio_id: i2s_speaker
    dac_type: external
    i2s_dout_pin: GPIO8   #  DIN Pin of the MAX98357A Audio Amplifier
    mode: mono

micro_wake_word:
  on_wake_word_detected:
    
    - voice_assistant.start:
        wake_word: !lambda return wake_word;
        silence_detection: true
    - light.turn_on:
        id: led_ww           
        red: 30%
        green: 30%
        blue: 70%
        brightness: 60%
        effect: fast pulse 
    - light.turn_on:
        id: led_strip
        effect: "Scan Effect With Custom Values"
        red: 80%
        green: 0%
        blue: 80%
        brightness: 80%
  models:
    - model: hey_jarvis
    
voice_assistant:
  id: va
  microphone: va_mic
  auto_gain: 31dBFS
  noise_suppression_level: 2
  volume_multiplier: 4.0
  speaker: va_speaker
  on_stt_end:
       then: 
         - light.turn_off: led_ww
         - light.turn_off: led_strip
  on_error:
          - micro_wake_word.start:  
  on_end:
        then:
          - light.turn_off: led_ww
          - light.turn_off: led_strip
          - wait_until:
              not:
                voice_assistant.is_running:
          - micro_wake_word.start:

To jest błędny zapis - błędne wcięcia.

1 polubienie

Są jakieś sukcesy z projektem? Jakby Ci wypaliło i chciałbyś robić kilka sztuk to mam jeszcze sporo mikrofonów nie odpakowanych :stuck_out_tongue_winking_eye:

bardzo dziwne, w ogóle bez sensu to co napisałeś - skoro MCU nie startuje to nie wgrasz żadnego OTA, co najwyżej zwykłe flaszowanie po kabelku, kwestię konfiguracji OTA już poruszył @macek - przy niepoprawnej konfiguracji OTA nie będzie raczej działać…

ale tak do głowy mi przyszło - ten import możesz zrobić tylko raz, a potem to musisz wywalić, bo twój nowy projekt nie ma już nic wspólnego z tym importowanym

w ogóle to nie jestem przekonany czy masz właściwe opcje uruchamiające odpowiednie zasoby na tej płytce (sprawdziłeś to “na sucho” -* na gołym projekcie lub “na mokro” na projekcie z funkcjonalnościami uruchamiając debug jak proponowałem w wątku gdzie linkuję jak uruchomić PSRAM i całego flasha?

Aha jeszcze jedno - jeśli zmieniasz tablicę partycji na flashu albo framework, to nie możesz flaszować przez OTA przy takiej zmianie!!
A zmieniasz, konkretnie z arduino na esp-idf, bo importujesz właśnie taką konfigurację (warto mieć świadomość tego co się robi) konkretnie z tego pliku

po czym w twoim YAMLu widzę inny framework niż domyślny

1 polubienie

Dzięki !!! słuszne uwagi.

Poprawiłęm OTA, dashboard_import: wywalony.

Odnośnie flashowania to rzeczywiście nie można tego zrobić przez ota.
Popracuje nad tym i się dokształce żeby to zrozumieć.

Obecnie mam tak i powiem że działa spoko na modelu small (odpowiedz mam do 3s) ale musze popracować nad aliasami zeby wiedział o jakie urządzenia czy integracje, serwisy mi chodzi.

projekt narazie na blacie

substitutions:
  name: esphome-web-228a78
  friendly_name: HA_Voice_Office

esphome:
  name: ${name}
  friendly_name: ${friendly_name}
  min_version: 2024.6.0
  name_add_mac_suffix: false
  platformio_options:
    board_build.flash_mode: dio
  project:
    name: esphome.web
    version: dev
  on_boot:
    - light.turn_on:
        id: led_ww
        blue: 100%
        brightness: 60%
        effect: fast pulse

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: esp-idf
    # sdkconfig_options:
    #   CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240: "y"
    #   CONFIG_ESP32S3_DATA_CACHE_64KB: "y"
    #   CONFIG_ESP32S3_DATA_CACHE_LINE_64B: "y"
    #   CONFIG_AUDIO_BOARD_CUSTOM: "y"

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: !secret esphome_encryption_key
  on_client_connected:
        then:
          - delay: 50ms
          - light.turn_off: led_ww
          - micro_wake_word.start:
  on_client_disconnected:
        then:
          - voice_assistant.stop:

# Allow Over-The-Air updates
ota:
  - platform: esphome
    password: !secret esphome_encryption_key

# Allow provisioning Wi-Fi via serial
improv_serial:

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  # Set up a wifi access point
  ap: {}

Dodatkowo jak już mam taki próbny VA to jestem w trakcie uruchamiania → https://localai.io/ na Ubuntu Server. Zobacze jak to zadziała na nie wielkim komputerku. I5 4590T, 16 GB RAM, 512 SSD.

Dam znać jak mi poszło i jakie są efekty,

@szopen ; @macek
Dziękuje za pomoc !!!

1 polubienie

Kwestia jest z grubsza taka - do flaszowania po kabelku musisz wygenerować obraz w formacie “factory” (1).

Natomiast obraz wygenerowany jako obraz OTA (2) można wgrać tylko przez OTA (czyli w sumie tylko jeśli skorzystasz z webserwera w ESP), bo w normalnym wypadku nie musisz kombinować - po prostu flaszowanie OTA jest dostępne z menu wprost w IDE (3) zamiast generować obraz do ręcznego wgrania (4)

Natomiast wgrywanie OTA ma ograniczenie - obraz musi mieć ten sam układ partycji co obraz aktualnie znajdujący się we flashu ESP, więc nie możesz grzebać w konfiguracji w tablicy partycji, ani we frameworku, a obraz musi być prawidłowo zbudowany i mieć włączoną prawidłowo opcję OTA - dyrektywa ota: (czyli nie można sobie ustawiać “na pałę” opcji frameworka, które wpływają na nadpisanie opcji domyślnych, które zazwyczaj są ustawione prawidłowo w danej definicji płytki, no akurat dla S3-N16R8 taka definicja nie istnieje, więc najpierw musisz sobie stworzyć własny “pusty” prawidłowo skonfigurowany obraz by z niego robić sobie OTA do obrazu zawierającego jakieś integracje - tzn. nie ma musu robić tego w ten sposób, ale to ułatwi życie, najpierw budujesz sobie “pusty” YAML z definicjami pasującymi do sprzętu i budujesz sobie bina, testujesz czy działa wszystko, co w obrazie bez integracji umożliwia debug, no i oczywiście sprawdzasz OTA, zachowujesz sobie gdzieś na boku tego YAMLa i bin, a potem bawisz się w dokładanie integracji).

Oczywiście ten “pusty” projekt musi bazować na docelowym frameworku i mieć poustawiane prawidłowe opcję definiujące osprzęt MCU (czyli rozmiar flasha/tablicę partycji, czy zamontowany PSRAM), a to dlatego, że to jego sobie wgrasz po kabelku w formacie factory i już później nie będziesz grzebał w tych życiowych opcjach dla danego modelu płytki, a sądząc tym co teraz napisałeś próbujesz Odrę kijem zawracać (zmieniłeś framework, choć jak sądzę projekt, który uruchamiasz nie bez powodu wymaga esp-idf).
Nie musisz natomiast ustawiać np. zegara procesora, bo S3 ma domyślnie 240MHz (dlatego w tym imporcie masz wymaganą minimalną wersję IDE ESPHome, by znało ono w ogóle MCU S3).

Słowo pusty jest w cudzysłowach, bo oczywiście nic nie jest puste - chodzi o projekt minimalny, czyli zawierający tylko to wszystko co trzeba by prawidłowo zainicjalizować MCU w wersji z danymi peryferiami, ale też raczej nic więcej (no obsługę dodatkowych sensorów dotyczących samego MCU, debuga, czy kontrolki LED może mieć, o ile jest to znana oczywista konfiguracja).

Używam obecnie opcji 2 i wgrywam przez Web.
sdkconfig_options mam zakomentowany i usunę żeby nie wprowadzać w bład.
Musze powiedzieć że działa naprawdę stabilnie, reaguje na każdą komende (nie zawsze odpowiada poprawnie ale reaguje)

właśnie uruchamiam wcześniej wspomnieany localai i postaram się wykorzystać:

(chodzi o koncept i wspomniane prompty)

Dam znać po testach jak to działa

Dobrym testem prawidłowości opcji systemowych frameworka jest zbudowanie obrazu factory i wgranie go po kabelku - on musi prawidłowo bootować, drugim testem jest skorzystanie z OTA (opcja 3 na tych obrazkach powyżej)

Pamiętaj, że niektórych istotnych opcji nie można zmieniać inaczej niż flaszowaniem po kabelku (nie zmienisz rozmiaru flasha wgrywając przez OTA, nie należy też zmieniać frameworka).

Pamiętaj też, że webserver zabiera spore zasoby i w przypadku budowania skomplikowanego projektu jest zalecane jego wyłączenie (i ewentualnie uruchomienie dopiero, gdy masz pewność, że główny projekt już działa stabilnie), więc optymalnie jest używać OTA wbudowanego w IDE.

ESPHome 2024.9.0 wprowadza opcję mikrofonu stereo [i2s_audio] Add more options to speakers and microphones by pyos · Pull Request #7306 · esphome/esphome · GitHub
Jeszcze nie testowane ale jest duża szansa na znaczną poprawę nadsłuchu w asystentach DIY.

1 polubienie