Ignore everything below! I tried the installation via $13 voice assistant for Home Assistant - Home Assistant and it just worked. No encryption key prompt, it smoothly added to HA without issue. 
Eight months on and the installation process is still no easier.
All I would like to do is install the latest voice Assist via Ready-Made Projects — ESPHome onto my M5Stack Atom Echo and easily import it into Home Assistant, but as you’ll see below I end up having to re-compile the firmware via ESPHome just to add it into HA.
As before I have a separate ESPHome Docker instance that is connected to Home Assistant. I have deleted all references to M5Stack on HA and ESP.
I am able to install 25.2.1 from the page linked above via a USB cable connected between my computer and the Atom. After installing it asks for my wifi password and then I’m prompted to Add to Home Assistant:
After pressing Add to Home Assistant, it asks to open the page in HA:
It then asks if I want to set up ESPHome:
Pressing Ok now gives me the choice of adding a discovered device, which is better than my earlier post where it always wanted to install a new ESPHome add-on.
Pressing the discovered Atom, it then asks me for an Encryption key…
Where am I meant to get this from? It says you can find it in the ESPHome Dashboard or device configuration. Ok, I don’t know how to find device configuration so I go to my ESPHome web GUI.
Along the top it says “Discovered 1 device” and “Show”.
Pressing Show results in this:
Ok, I still need the encryption key, so I press “Take Control”.
It now tells me a new configuration needs to be installed on the device, but I thought this had already been done during the install via Ready-Made Projects — ESPHome
I try copying this encryption key into the earlier prompt asking for a key, but as expected it doesn’t work because this is a new key for a new firmware install.
I click Install and it proceeds to compile and build a new image. Why? I’ve already installed the firmware, I just want to adopt the device so that I can find the Encryption key to add it to Home Assistant…
I suspect this is installing firmware over the air because even though the Atom is still connected via USB, my ESPHome web GUI didn’t bring up any device connection window.
At this point the logs look promising, but it’s failing to connect to my HA instance.
Linking .pioenvs/home-assistant-voice-09e114/firmware.elf
RAM: [= ] 11.9% (used 39132 bytes from 327680 bytes)
Flash: [=== ] 32.9% (used 2674721 bytes from 8126464 bytes)
Building .pioenvs/home-assistant-voice-09e114/firmware.bin
Creating esp32s3 image...
Successfully created esp32s3 image.
esp32_create_combined_bin([".pioenvs/home-assistant-voice-09e114/firmware.bin"], [".pioenvs/home-assistant-voice-09e114/firmware.elf"])
Wrote 0x29d190 bytes to file /config/.esphome/build/home-assistant-voice-09e114/.pioenvs/home-assistant-voice-09e114/firmware.factory.bin, ready to flash to offset 0x0
esp32_copy_ota_bin([".pioenvs/home-assistant-voice-09e114/firmware.bin"], [".pioenvs/home-assistant-voice-09e114/firmware.elf"])
======================== [SUCCESS] Took 466.31 seconds ========================
INFO Successfully compiled program.
INFO Connecting to 192.168.199.155 port 3232...
INFO Connected to 192.168.199.155
INFO Uploading /config/.esphome/build/home-assistant-voice-09e114/.pioenvs/home-assistant-voice-09e114/firmware.bin (2675088 bytes)
Uploading: [============================================================] 100% Done...
INFO Upload took 8.24 seconds, waiting for result...
INFO OTA successful
INFO Successfully uploaded program.
INFO Starting log output from 192.168.199.155 using esphome API
INFO Successfully connected to home-assistant-voice-09e114 @ 192.168.199.155 in 15.798s
INFO Successful handshake with home-assistant-voice-09e114 @ 192.168.199.155 in 0.072s
[19:14:14][I][app:100]: ESPHome version 2025.2.2 compiled on Mar 14 2025, 19:08:25
[19:14:14][C][wifi:600]: WiFi:
[19:14:14][C][wifi:428]: Local MAC: 20:F8:3B:09:E1:14
[19:14:14][C][wifi:433]: SSID: [redacted]
[19:14:14][C][wifi:436]: IP Address: 192.168.199.155
[19:14:14][C][wifi:439]: BSSID: [redacted]
[19:14:14][C][wifi:441]: Hostname: 'home-assistant-voice-09e114'
[19:14:14][C][wifi:443]: Signal strength: -49 dB ▂▄▆█
[19:14:14][C][wifi:447]: Channel: 6
[19:14:14][C][wifi:448]: Subnet: 255.255.255.0
[19:14:14][C][wifi:449]: Gateway: 192.168.199.246
[19:14:14][C][wifi:450]: DNS1: 192.168.199.35
[19:14:14][C][wifi:451]: DNS2: 192.168.199.35
[19:14:14][C][logger:177]: Logger:
[19:14:14][C][logger:178]: Max Level: DEBUG
[19:14:14][C][logger:179]: Initial Level: DEBUG
[19:14:14][C][logger:181]: Log Baud Rate: 115200
[19:14:14][C][logger:182]: Hardware UART: USB_SERIAL_JTAG
[19:14:14][C][logger:186]: Level for 'sensor': WARN
[19:14:14][C][i2c.idf:079]: I2C Bus:
[19:14:14][C][i2c.idf:080]: SDA Pin: GPIO5
[19:14:14][C][i2c.idf:081]: SCL Pin: GPIO6
[19:14:14][C][i2c.idf:082]: Frequency: 400000 Hz
[19:14:14][C][i2c.idf:088]: Recovery: bus successfully recovered
[19:14:14][I][i2c.idf:098]: Results from i2c bus scan:
[19:14:14][I][i2c.idf:104]: Found i2c device at address 0x18
[19:14:14][I][i2c.idf:104]: Found i2c device at address 0x42
[19:14:14][C][power_supply:018]: Power Supply:
[19:14:14][C][power_supply:019]: Pin: GPIO45
[19:14:14][C][power_supply:020]: Time to enable: 20 ms
[19:14:14][C][power_supply:021]: Keep on time: 10.0 s
[19:14:14][C][switch.gpio:068]: GPIO Switch 'Internal speaker amp'
[19:14:14][C][switch.gpio:090]: Restore Mode: always OFF
[19:14:14][C][switch.gpio:031]: Pin: GPIO47
[19:14:14][C][esp32_rmt_led_strip:250]: ESP32 RMT LED Strip:
[19:14:14][C][esp32_rmt_led_strip:251]: Pin: 21
[19:14:14][C][esp32_rmt_led_strip:253]: RMT Symbols: 192
[19:14:14][C][esp32_rmt_led_strip:281]: RGB Order: GRB
[19:14:14][C][esp32_rmt_led_strip:282]: Max refresh rate: 15000
[19:14:14][C][esp32_rmt_led_strip:283]: Number of LEDs: 12
[19:14:14][C][gpio.binary_sensor:015]: GPIO Binary Sensor 'hardware_mute_switch'
[19:14:14][C][gpio.binary_sensor:016]: Pin: GPIO3
[19:14:14][C][gpio.binary_sensor:015]: GPIO Binary Sensor 'center_button'
[19:14:14][C][gpio.binary_sensor:016]: Pin: GPIO0
[19:14:14][C][gpio.binary_sensor:015]: GPIO Binary Sensor 'jack_plugged'
[19:14:14][C][gpio.binary_sensor:016]: Pin: GPIO17
[19:14:14][C][light:092]: Light 'leds_internal'
[19:14:14][C][light:094]: Default Transition Length: 0.0s
[19:14:14][C][light:095]: Gamma Correct: 2.80
[19:14:14][C][light:092]: Light 'voice_assistant_leds'
[19:14:14][C][light:094]: Default Transition Length: 0.0s
[19:14:14][C][light:095]: Gamma Correct: 2.80
[19:14:14][C][light:092]: Light 'LED Ring'
[19:14:14][C][light:094]: Default Transition Length: 0.0s
[19:14:14][C][light:095]: Gamma Correct: 2.80
[19:14:14][C][voice_kit:040]: Voice Kit:
[19:14:14][C][voice_kit:041]: Address: 0x42
[19:14:14][C][voice_kit:042]: Reset Pin: GPIO4
[19:14:14][C][voice_kit:044]: XMOS firmware version: 1.3.1
[19:14:14][C][template.switch:068]: Template Switch 'Wake sound'
[19:14:14][C][template.switch:070]: Icon: 'mdi:bullhorn'
[19:14:14][C][template.switch:090]: Restore Mode: restore defaults to ON
[19:14:14][C][template.switch:057]: Optimistic: YES
[19:14:14][C][template.switch:068]: Template Switch 'Mute'
[19:14:14][C][template.switch:070]: Icon: 'mdi:microphone-off'
[19:14:14][C][template.switch:090]: Restore Mode: restore defaults to OFF
[19:14:14][C][template.switch:057]: Optimistic: NO
[19:14:14][C][template.switch:068]: Template Switch 'timer_ringing'
[19:14:14][C][template.switch:090]: Restore Mode: always OFF
[19:14:14][C][template.switch:057]: Optimistic: YES
[19:14:14][C][psram:020]: PSRAM:
[19:14:14][C][psram:021]: Available: YES
[19:14:14][C][psram:028]: Size: 8192 KB
[19:14:14][C][rotary_encoder:164]: Rotary Encoder 'dial'
[19:14:14][C][rotary_encoder:164]: State Class: ''
[19:14:14][C][rotary_encoder:164]: Unit of Measurement: 'steps'
[19:14:14][C][rotary_encoder:164]: Accuracy Decimals: 0
[19:14:14][C][rotary_encoder:164]: Icon: 'mdi:rotate-right'
[19:14:14][C][rotary_encoder:165]: Pin A: GPIO16
[19:14:14][C][rotary_encoder:166]: Pin B: GPIO18
[19:14:14][C][rotary_encoder:180]: Restore Mode: Restore (Defaults to zero)
[19:14:14][C][rotary_encoder:187]: Resolution: 2 Pulses Per Cycle
[19:14:14][C][speaker_mixer:288]: Speaker Mixer:
[19:14:14][C][speaker_mixer:289]: Number of output channels: 2
[19:14:14][C][speaker_mixer:046]: Mixer Source Speaker
[19:14:14][C][speaker_mixer:047]: Buffer Duration: 100 ms
[19:14:14][C][speaker_mixer:051]: Timeout: never
[19:14:14][C][speaker_mixer:046]: Mixer Source Speaker
[19:14:14][C][speaker_mixer:047]: Buffer Duration: 100 ms
[19:14:14][C][speaker_mixer:051]: Timeout: never
[19:14:14][C][aic3204:112]: AIC3204:
[19:14:14][C][aic3204:113]: Address: 0x18
[19:14:14][C][factory_reset.button:011]: Factory Reset Button 'Factory Reset'
[19:14:14][C][factory_reset.button:011]: Icon: 'mdi:restart-alert'
[19:14:14][C][restart.button:017]: Restart Button 'Restart'
[19:14:14][C][restart.button:017]: Icon: 'mdi:restart'
[19:14:15][C][mdns:116]: mDNS:
[19:14:15][C][mdns:117]: Hostname: home-assistant-voice-09e114
[19:14:15][C][esphome.ota:073]: Over-The-Air updates:
[19:14:15][C][esphome.ota:074]: Address: home-assistant-voice-09e114.local:3232
[19:14:15][C][esphome.ota:075]: Version: 2
[19:14:15][C][safe_mode:018]: Safe Mode:
[19:14:15][C][safe_mode:019]: Boot considered successful after 60 seconds
[19:14:15][C][safe_mode:021]: Invoke after 10 boot attempts
[19:14:15][C][safe_mode:022]: Remain in safe mode for 300 seconds
[19:14:15][C][api:140]: API Server:
[19:14:15][C][api:141]: Address: home-assistant-voice-09e114.local:6053
[19:14:15][C][api:143]: Using noise encryption: YES
[19:14:15][C][micro_wake_word:072]: microWakeWord:
[19:14:15][C][micro_wake_word:073]: models:
[19:14:15][C][micro_wake_word:015]: - Wake Word: Okay Nabu
[19:14:15][C][micro_wake_word:016]: Probability cutoff: 0.85
[19:14:15][C][micro_wake_word:017]: Sliding window size: 5
[19:14:15][C][micro_wake_word:015]: - Wake Word: Hey Jarvis
[19:14:15][C][micro_wake_word:016]: Probability cutoff: 0.97
[19:14:15][C][micro_wake_word:017]: Sliding window size: 5
[19:14:15][C][micro_wake_word:015]: - Wake Word: Hey Mycroft
[19:14:15][C][micro_wake_word:016]: Probability cutoff: 0.95
[19:14:15][C][micro_wake_word:017]: Sliding window size: 5
[19:14:15][C][micro_wake_word:015]: - Wake Word: Stop
[19:14:15][C][micro_wake_word:016]: Probability cutoff: 0.50
[19:14:15][C][micro_wake_word:017]: Sliding window size: 5
[19:14:15][C][micro_wake_word:021]: - VAD Model
[19:14:15][C][micro_wake_word:022]: Probability cutoff: 0.50
[19:14:15][C][micro_wake_word:023]: Sliding window size: 5
[19:14:15][C][debug:021]: Debug component:
[19:14:15][D][debug:035]: ESPHome version 2025.2.2
[19:14:15][D][debug:039]: Free Heap Size: 133332 bytes
[19:14:15][D][debug:284]: Chip: Model=ESP32-S3, Features=WIFI_BGN,BLE, Cores=2, Revision=2
[19:14:15][D][debug:299]: Framework: ESP-IDF
[19:14:15][D][debug:306]: ESP-IDF Version: 5.1.5
[19:14:15][D][debug:311]: EFuse MAC: 20:F8:3B:09:E1:14
[19:14:15][D][debug:204]: Reset Reason: Software reset via esp_restart
[19:14:15][D][debug:359]: Wakeup Reason: Unknown
[19:14:15][C][debug:033]: Partition table:
[19:14:15][C][debug:034]: Name Type Subtype Address Size
[19:14:15][C][debug:038]: otadata 1 0 0x00009000 0x00002000
[19:14:15][C][debug:038]: phy_init 1 1 0x0000B000 0x00001000
[19:14:15][C][debug:038]: app0 0 16 0x00010000 0x007C0000
[19:14:15][C][debug:038]: app1 0 17 0x007D0000 0x007C0000
[19:14:15][C][debug:038]: nvs 1 2 0x00F90000 0x0006D000
[19:14:36][D][esp32.preferences:114]: Saving 3 preferences to flash...
[19:14:36][D][esp32.preferences:142]: Saving 3 preferences to flash: 2 cached, 1 written, 0 failed
[19:14:58][I][safe_mode:041]: Boot seems successful; resetting boot loop counter
[19:14:58][D][esp32.preferences:114]: Saving 1 preferences to flash...
[19:14:58][D][esp32.preferences:142]: Saving 1 preferences to flash: 0 cached, 1 written, 0 failed
[19:15:09][D][api:103]: Accepted 192.168.199.40
[19:15:09][W][api.connection:092]: : Socket operation failed: BAD_INDICATOR errno=11
[19:15:09][D][light:036]: 'voice_assistant_leds' Setting:
[19:15:09][D][light:051]: Brightness: 66%
[19:15:09][D][light:058]: Red: 10%, Green: 77%, Blue: 100%
[19:16:09][D][api:103]: Accepted 192.168.199.40
[19:16:09][W][api.connection:092]: : Socket operation failed: BAD_INDICATOR errno=11
[19:16:09][D][light:036]: 'voice_assistant_leds' Setting:
[19:16:09][D][light:051]: Brightness: 66%
[19:16:09][D][light:058]: Red: 10%, Green: 77%, Blue: 100%
[19:16:10][D][api:103]: Accepted 192.168.199.40
[19:16:10][W][api.connection:092]: : Socket operation failed: BAD_INDICATOR errno=11
[19:16:10][D][light:036]: 'voice_assistant_leds' Setting:
[19:16:10][D][light:051]: Brightness: 66%
[19:16:10][D][light:058]: Red: 10%, Green: 77%, Blue: 100%
Looking at my HA logs I see the following:
2025-03-14 19:14:06.527 WARNING (MainThread) [aioesphomeapi.connection] home-assistant-voice-09e114 @ 192.168.199.155: Connection error occurred: home-assistant-voice-09e114 @ 192.168.199.155: Connection requires encryption
2025-03-14 19:14:06.528 WARNING (MainThread) [aioesphomeapi.reconnect_logic] Can't connect to ESPHome API for home-assistant-voice-09e114 @ 192.168.199.155: home-assistant-voice-09e114 @ 192.168.199.155: Connection requires encryption (RequiresEncryptionAPIError)
2025-03-14 19:14:06.555 WARNING (MainThread) [aioesphomeapi.connection] 192.168.199.155: Connection error occurred: 192.168.199.155: Connection requires encryption
2025-03-14 19:14:07.161 WARNING (MainThread) [aioesphomeapi.connection] home-assistant-voice-09e114 @ 192.168.199.155: Connection error occurred: home-assistant-voice-09e114 @ 192.168.199.155: Connection requires encryption
2025-03-14 19:14:08.294 WARNING (MainThread) [aioesphomeapi.connection] home-assistant-voice-09e114 @ 192.168.199.155: Connection error occurred: home-assistant-voice-09e114 @ 192.168.199.155: Connection requires encryption
2025-03-14 19:14:09.335 WARNING (MainThread) [aioesphomeapi.connection] home-assistant-voice-09e114 @ 192.168.199.155: Connection error occurred: home-assistant-voice-09e114 @ 192.168.199.155: Connection requires encryption
I see that it needs an encryption key, so I look at my HA GUI and see this:
Back to ESPHome I see the device is now appearing ok
I click Edit and find the encryption key:
I copy this, go back to HA, and paste in the Window.
Finally, it works!!
Within my ESPHome Integration, I now see it has discovered the device, so I press Add.
Looking good:
Yay, I can talk to it and control lights.
So, my big question is, why does ESPHome insist on reinstalling the Assist firmware when it had already been done via the website? Is there a better way to adopt such a device? Did I do something wrong, and if so at which step above? Why can’t the installation process on Ready-Made Projects — ESPHome present the encryption key? Is there a way to find it from the Logs or Console shown below? It seems crazy that you have to go through the whole firmware re-compile process just to get an encryption key!
Anyways, hopefully my detailed installation process above at least helps someone else…