ESP32-S3-BOX-3

hardware podporující Assist Probouzecí slovo pro hlasové ovládání Home Assistant
kiklhorn
Moderátor
Moderátor
Příspěvky: 738
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 84 poděkování
Dostal poděkování: 175 poděkování

Re: ESP32-S3-BOX-3

Příspěvek od kiklhorn »

Super, jak máš nastaveného asistenta? Konkrétně jaké TTS?

Snad za chvíli dodám upravený yaml s funkčním displejem, displej má reset na GPIO48, ale vypadá to že opravdu v obrácené polaritě. Ještě ladím.
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

janchan
Aktivní autor
Aktivní autor
Příspěvky: 66
Registrován: 11. květen 2022, 18:54
Dal poděkování: 61 poděkování
Dostal poděkování: 8 poděkování

Re: ESP32-S3-BOX-3

Příspěvek od janchan »

TTS - Nabu Casa

kiklhorn
Moderátor
Moderátor
Příspěvky: 738
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 84 poděkování
Dostal poděkování: 175 poděkování

Re: ESP32-S3-BOX-3

Příspěvek od kiklhorn »

Dávám pracovní verzi s displejem. Nejsem grafik, takže gradient pozadí je asi maximum.
Ještě upravuji aby to trochu vypadalo, aby se tam texty vešly celé. Jak se mi to povede tak kód opět dám sem do tématu.

Jak psal janchan tak zvukový výstup by měl být funkční při použití TTS Nabu Casa a funguje mi i přes piper
Snímek obrazovky 2023-11-11 145737.jpg
Při výskytu některých chyb o kterých si myslím že by se mohl vzpamatovat sám - se snažím o restart voice assistenta - posílám "start_continuous"
Viz podmínky v lambda pověšené na on_error komponenty.
To si myslím že v průběhu vývoje komponenty voice_assistant bude nadbytečné a možná i kontraproduktivní. Očekávám chování že pokud nastane nějaká recoverable chyba tak komponenta to udělá sama, jen zaloguje a zkusí obnovit. Tak jako je to dávno třeba u I2C sběrnice.


Kód: Vybrat vše

esphome:
  name: s3box3
  friendly_name: S3box3
  platformio_options:
    board_build.flash_mode: dio

esp32:
  board: esp32s3box
  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"

# Enable logging
logger:
  hardware_uart: USB_SERIAL_JTAG
  level: DEBUG
  logs:
    component: ERROR

# Enable Home Assistant API
api:
  encryption:
    key: "jgVfSe0zIPTlfAEeM2zt5k2exvNL+6LK10sqsQ9qS3k="

ota:
  password: "94431478a5e4b99a956cb61f1a9dcda8"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "S3Box3 Fallback Hotspot"
    password: "sDHiUghr0220"

captive_portal:

time:
  - platform: homeassistant
    id: hatime
    timezone: Europe/Prague

# dashboard_import:
#   package_import_url: github://esphome/firmware/voice-assistant/esp32-s3-box.yaml@main


binary_sensor:
  - platform: gpio
    pin:
      number: GPIO1
      inverted: true
    name: "Mute"

  - platform: gpio
    pin:
      number: GPIO0
      mode: INPUT_PULLUP
      inverted: true
    name: Top Left Button
    disabled_by_default: true
    on_click:
      - if:
          condition:
            switch.is_off: use_wake_word
          then:
            - if:
                condition: voice_assistant.is_running
                then:
                  - voice_assistant.stop:
                  - script.execute: reset_led
                else:
                  - voice_assistant.start:
          else:
            - voice_assistant.stop
            - delay: 1s
            - script.execute: reset_led
            - script.wait: reset_led
            - voice_assistant.start_continuous:
  - platform: status
    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:

output:
  - platform: ledc
    pin: GPIO47
    id: backlight_output

light:
  - platform: monochromatic
    output: backlight_output
    name: LCD Backlight
    id: led
    restore_mode: ALWAYS_OFF
    disabled_by_default: true
    default_transition_length: 0s
    effects:
      - pulse:
          name: "Slow Pulse"
          transition_length: 250ms
          update_interval: 250ms
      - pulse:
          name: "Fast Pulse"
          transition_length: 50ms
          update_interval: 50ms

microphone:
  - platform: esp_adf
    id: box_mic

speaker:
  - platform: esp_adf
    id: box_speaker

voice_assistant:
  id: va
  microphone: box_mic
  speaker: box_speaker
  use_wake_word: true
  noise_suppression_level: 2
  auto_gain: 31dBFS
  volume_multiplier: 2.0
  vad_threshold: 3
  on_listening:
    - light.turn_on:
        id: led
        brightness: 100%
        effect: "Slow Pulse"
  on_tts_start:
    - light.turn_on:
        id: led
        brightness: 75%
        effect: "Slow Pulse"
    - text_sensor.template.publish: 
        id: line2
        state: !lambda return x;
  on_end:
    - delay: 100ms
    - wait_until:
        not:
          speaker.is_playing:
    - script.execute: reset_led
  on_error:
    - light.turn_on:
        id: led
        brightness: 50%
        effect: "Fast Pulse"
    - delay: 1s
    - script.execute: reset_led
    - script.wait: reset_led
    - lambda: |-
        if (code == "wake-provider-missing" || code == "wake-engine-missing") {
          id(use_wake_word).turn_off();
        }
        if (message == "Could not request start.") {
          id(restart_script).execute();
        } 
        if (message == "Unexpected error during wake-word-detection") {
          id(restart_script).execute();
        } 
    - text_sensor.template.publish: 
        id: line4
        state: !lambda return code;
    - text_sensor.template.publish: 
        id: line5
        state: !lambda return message;
  on_stt_end:
    - text_sensor.template.publish: 
        id: line1
        state: !lambda return x;
  on_tts_end:
    - text_sensor.template.publish: 
        id: line3
        state: !lambda return x;
  on_client_connected:
    - if:
        condition:
          switch.is_on: use_wake_word
        then:
          - voice_assistant.start_continuous:
          - script.execute: reset_led
  on_client_disconnected:
    - if:
        condition:
          switch.is_on: use_wake_word
        then:
          - voice_assistant.stop:
          - light.turn_off: led  

script:
  - id: reset_led
    then:
      - if:
          condition:
            switch.is_on: use_wake_word
          then:
            - light.turn_on:
                id: led
                brightness: 25%
                effect: none
          else:
            - light.turn_off: led

  - id: restart_script
    then:
      - voice_assistant.stop
      - delay: 1s
      - text_sensor.template.publish: 
          id: line4
          state: " "
      - text_sensor.template.publish: 
          id: line5
          state: " "
      - voice_assistant.start_continuous

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
      - script.execute: reset_led
    on_turn_off:
      - voice_assistant.stop
      - lambda: id(va).set_use_wake_word(false);
      - script.execute: reset_led

external_components:
  # - source: github://pr#5230
    source: github://kiklhorn/esphome
    components: esp_adf
    refresh: 0s

esp_adf:
  # board: esp32s3box3
  board: esp32s3box

psram:
  mode: octal
  speed: 120MHz



font:
  - file: "gfonts://Roboto Condensed"
    glyphs: "!%()+,-/_.:°0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZŽŠČŘĎŤŇĚÁÍÉÓÚŮÝ abcdefghijklmnopqrstuvwxyzμžščřďťňáěíóúůý₂³"
    id: font1
    size: 20

text_sensor:
  - id: line0
    platform: template
    on_value: 
      then:
        - component.update: my_display
  - id: line1
    platform: template
    on_value: 
      then:
        - component.update: my_display
  - id: line2
    platform: template
    on_value: 
      then:
        - component.update: my_display
  - id: line3
    platform: template
    on_value: 
      then:
        - component.update: my_display
  - id: line4
    platform: template
    on_value: 
      then:
        - component.update: my_display      
  - id: line5
    platform: template
    on_value: 
      then:
        - component.update: my_display      


spi:
  clk_pin: GPIO7
  mosi_pin: GPIO6
  

display:
  - platform: ili9xxx
    model: S3BOX
    update_interval: 30s
    id: my_display
    # backlight_pin: GPIO4 #tento parametr mohu vynechat, a na GPIO4 pověsit PWM a řídit jas 
    cs_pin: GPIO5
    dc_pin: GPIO4
    # reset_pin: GPIO48 #Negation needed... ignore 

    # https://esphome.io/api/light__state_8cpp_source
    lambda: |-
      for(auto i = 0; i<240; i++) {it.horizontal_line(0,i,320, my_blue.fade_to_white(i));}
      it.rectangle(0, 0, it.get_width(), it.get_height(),color_red);
      it.printf(60, 10, id(font1), "ESP32-S3-BOX-3");
      it.strftime(it.get_width()-2, 10, id(font1), color_green, TextAlign::TOP_RIGHT, "%H:%M", id(hatime).now());
      auto ledcolor = Color(id(led).remote_values.get_red()*255, id(led).remote_values.get_green()*255, id(led).remote_values.get_blue()*255);
      bool ledstatus = id(led).remote_values.get_state();
      int x = 2, y = 43, offs = 34;
      it.filled_circle(25, 25, 15, ledstatus ? ledcolor : color_black);
      it.printf(30, 0, id(font1), "%s", id(line0).state.c_str());
      it.printf(x, y, id(font1), "%s", id(line1).state.c_str());
      it.printf(x, y=y+offs, id(font1), "%s", id(line2).state.c_str());
      it.printf(x, y=y+offs, id(font1), "%s", id(line3).state.c_str());
      it.printf(x, y=y+offs, id(font1), color_red, "%s", id(line4).state.c_str());
      it.printf(x, y=y+offs, id(font1), color_red, "%s", id(line5).state.c_str());

color:
  - id: color_red
    red: 1
    green: 0
    blue: 0
  - id: color_green
    red: 0
    green: 1
    blue: 0
  - id: color_black
    red: 0
    green: 0
    blue: 0  
  - id: my_blue
    blue: 100%
  - id: my_red
    red: 100%
  - id: my_green
    green: 70%
  - id: my_white
    red: 100%
    blue: 100%
    green: 100%
  - id: my_yellow
    hex: ffff00
      
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

janchan
Aktivní autor
Aktivní autor
Příspěvky: 66
Registrován: 11. květen 2022, 18:54
Dal poděkování: 61 poděkování
Dostal poděkování: 8 poděkování

Re: ESP32-S3-BOX-3

Příspěvek od janchan »

Ahoj díky.
Nahrán nový yaml.
Hlasové příkazy funkční.
Nyní se ale zadrhává při odpovědi stavu příkazu.
Místo zhasnuto vysloví jen "Z" a dál nic
U příkazu rozsviť odpoví jen "R", místo rozsvíceno
Místo Omlouvám se, ale nerozumím, vysloví "O .. ale nerozumím"
Na začátku věty se pokaždé na malou chvilku zadrhne.
V předchozí verzi tento problém nebyl.

Nevím jestli to má souvislost, ale v logu ESP se mi ukazuje info o "pipeline". To však nepoužívám, a nemám ani nainstalováno.

Kód: Vybrat vše

[17:33:23][D][voice_assistant:159]: Starting Microphone
[17:33:23][D][voice_assistant:395]: State changed from START_MICROPHONE to STARTING_MICROPHONE
[17:33:24][D][esp-idf:000]: W (1657801) AUDIO_PIPELINE: There are no listener registered

[17:33:24][D][esp-idf:000]: I (1657805) AUDIO_PIPELINE: audio_pipeline_unlinked

[17:33:24][D][esp-idf:000]: W (1657811) AUDIO_ELEMENT: [i2s] Element has not create when AUDIO_ELEMENT_TERMINATE

[17:33:24][D][esp-idf:000]: I (1657817) I2S: DMA queue destroyed

[17:33:24][D][esp-idf:000]: W (1657826) AUDIO_ELEMENT: [filter] Element has not create when AUDIO_ELEMENT_TERMINATE

[17:33:24][D][esp-idf:000]: W (1657832) AUDIO_ELEMENT: [raw] Element has not create when AUDIO_ELEMENT_TERMINATE

[17:33:24][D][esp-idf:000]: I (1657846) I2S: DMA Malloc info, datalen=blocksize=512, dma_buf_count=8

[17:33:24][D][esp-idf:000]: I (1657852) I2S: I2S0, MCLK output by GPIO2

[17:33:24][D][esp-idf:000]: I (1657858) ESP32_S3_BOX: I2S0, MCLK output by GPIO0

[17:33:24][D][esp-idf:000]: I (1657867) AUDIO_PIPELINE: link el->rb, el:0x3d036e04, tag:i2s, rb:0x3d037218

[17:33:24][D][esp-idf:000]: I (1657873) AUDIO_PIPELINE: link el->rb, el:0x3d036f78, tag:filter, rb:0x3d039258

[17:33:24][D][esp-idf:000]: I (1657879) AUDIO_ELEMENT: [i2s-0x3d036e04] Element task created

[17:33:24][D][esp-idf:000]: I (1657885) AUDIO_THREAD: The filter task allocate stack on external memory

[17:33:24][D][esp-idf:000]: I (1657892) AUDIO_ELEMENT: [filter-0x3d036f78] Element task created

[17:33:24][D][esp-idf:000]: I (1657899) AUDIO_ELEMENT: [raw-0x3d0370a8] Element task created

[17:33:24][D][esp-idf:000]: I (1657905) AUDIO_PIPELINE: Func:audio_pipeline_run, Line:359, MEM Total:16619827 Bytes, Inter:84924 Bytes, Dram:84924 Bytes



[17:33:24][D][esp-idf:000]: I (1657911) AUDIO_ELEMENT: [i2s] AEL_MSG_CMD_RESUME,state:1

[17:33:24][D][esp-idf:000]: I (1657917) AUDIO_ELEMENT: [filter] AEL_MSG_CMD_RESUME,state:1

[17:33:24][D][esp-idf:000]: I (1657925) RSP_FILTER: sample rate of source data : 16000, channel of source data : 2, sample rate of destination data : 16000, channel of destination data : 1

[17:33:24][D][esp-idf:000]: I (1657930) AUDIO_PIPELINE: Pipeline started
A pokud to jde, tak prosím aby se na displeji nezobrazovala IP adresa.
ESP32-S3-BOX-3-IP.jpg

kiklhorn
Moderátor
Moderátor
Příspěvky: 738
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 84 poděkování
Dostal poděkování: 175 poděkování

Re: ESP32-S3-BOX-3

Příspěvek od kiklhorn »

IP je stejně jen na LAN... Zakomentuj nebo smaž blok

Kód: Vybrat vše

  on_tts_end:
    - text_sensor.template.publish: 
        id: line3
        state: !lambda return x;
Zvuk:
Zkus si pohrát s

Kód: Vybrat vše

- text_sensor.template.publish: 
- zakomentovat vždy celý blok.

a případně zakomentovat

Kód: Vybrat vše

        if (message == "Could not request start.") {
          id(restart_script).execute();
        } 
        
nebo

Kód: Vybrat vše

        if (message == "Unexpected error during wake-word-detection") {
          id(restart_script).execute();
        } 
A dej vědět jestli a co z toho na ten zvuk pomohlo
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

janchan
Aktivní autor
Aktivní autor
Příspěvky: 66
Registrován: 11. květen 2022, 18:54
Dal poděkování: 61 poděkování
Dostal poděkování: 8 poděkování

Re: ESP32-S3-BOX-3

Příspěvek od janchan »

IP adresa odstraněna.
Se zvukem je to ale stále stejné, nic z toho co jsi mi napověděl nepomohlo.
Ještě jsem zjistil jednu věc. Pokud horním tlačítkem vypnu mic, tak po opětovném zapnutí už box "neslyší".
Musím box ručně bočním tlačítkem resetovat.

kiklhorn
Moderátor
Moderátor
Příspěvky: 738
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 84 poděkování
Dostal poděkování: 175 poděkování

Re: ESP32-S3-BOX-3

Příspěvek od kiklhorn »

Můžeš zkusit...

Nahrát původní kód. vyzkoušet, přidat spi, vyzkoušet, přidat display bez lambda části, vyzkoušet... a zjistit kdy začne problém se zvukem.

Na mute se podívám časem, řeším teď lepší výpisy na displej.
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

janchan
Aktivní autor
Aktivní autor
Příspěvky: 66
Registrován: 11. květen 2022, 18:54
Dal poděkování: 61 poděkování
Dostal poděkování: 8 poděkování

Re: ESP32-S3-BOX-3

Příspěvek od janchan »

Nahraný původní kód, vyzkoušeno - zvuk OK,
Přidáno spi, vyzkoušno - zvuk OK.
Přidán display bez lambda části, vyzkoušeno - začne se v odpovědích zadrhávat.

kiklhorn
Moderátor
Moderátor
Příspěvky: 738
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 84 poděkování
Dostal poděkování: 175 poděkování

Re: ESP32-S3-BOX-3

Příspěvek od kiklhorn »

Super, tak podezření se potvrdilo, tohle já asi nevyřeším. Jedině pokud existuje nějaká jednoduchá cesta jak říct aby se o displej staralo druhé procesorové jádro.
Možná, když už máme url audia (ta line3), tak jej vzít a zavolat nějaký media player v homeassistant a předat mu url k přehrání.
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

Uživatelský avatar
Pete30
Moderátor
Moderátor
Příspěvky: 2901
Registrován: 30. září 2020, 20:33
Dal poděkování: 152 poděkování
Dostal poděkování: 319 poděkování

Re: ESP32-S3-BOX-3

Příspěvek od Pete30 »

Jo to už jsem zmínil v jiném vlákně, hodit pod

Kód: Vybrat vše

 on_tts_start:
předání na jiný media_player, vyzkoušeno a funguje dobře.
A vypnout ten repro v box3.
Také bych chtěl testovat, ale stále jsem čekatel, tak nadcházející týden snad už ano :thx:
Pokud nejsem přítomen tak jsem na rybách ;)

Odpovědět

Zpět na „HW pro Probouzecí slovo“