Aware. Thats not problem. It happens with 2025.12.1 I believe. It’s been a while.
Building without the sendspin additions it works
I did fix the problem. The camera I used was one that I just had laying around that came from and old ESP32 cam board, I assumed that all these boards used a OV2640 camera but this one did not. It used some other type that worked fine but the image was sideways. I put a OV2640 camera on here and it works fine. Thanks for your help.
@Dan333 and all other contributors, thanks so much for getting this working.
I just thought I’d comment and say that I added the bluetooth proxy to the yaml and I’m now able to control a bluetooth only light strip in the same room as my waveshare.
I just added the following:
esp32_ble_tracker:
bluetooth_proxy:
active: True
Thank you for your great work. How to activate and use the onboard Bluetooth functionality? Thank you.
Edit:
I added the following and it works now
Add this to your ESPHome YAML
esp32_ble_tracker:
scan_parameters:
active: true
interval: 1000ms
window: 1000ms
bluetooth_proxy:
active: true
When timer is finished it’s keep ringing in loop.
I have been attempting to use ESP32-S3 AI Smart Speaker Dev Board just to hear announcements from Home Assistant and turn the leds green or red based on an alarm status through Home Assistant. Your YAML is way more than i need could you by any chance post a simplified YAML that would just enable the speaker to recieve HA tts via speaker or media player and allow control of the LED’s
Thanks to @Dan333 for the work here, I have picked up the code and have extended it a bit further here, will PR to original repo once tested further:
Looking for some testing to see if any issues but have completed the majority of the ToDo list from Dan333.
Architecture Refactor
- Modularized into packages - Split monolithic config into 6 separate files:
- audio_hardware.yaml - I2S, ES8311 DAC, ES7210 ADC, microphone, speaker, media player
- voice_assistant.yaml - Voice assistant, wake word detection, sensitivity controls
- led_control.yaml - LED ring effects, status animations, brightness control
- buttons_controls.yaml - Button actions, mic mute, gain controls
- timers_alarms.yaml - Timer and alarm functionality
- presence_detection.yaml - LD2410C mmWave radar integration
New Features
-
ESP-SR Audio Front End - Custom esp_afe component with:
- Dual microphones used
- Beamforming (Not enabled as impacts response time to approx 4s)
- Noise suppression (NS)
- Auto gain control (AGC)
- Lazy initialization for RAM optimization
-
LD2410C Presence Detection - Optional mmWave radar:
- Room presence, moving/still target sensors
- Auto-mute microphone when room empty (privacy feature)
- 30-second debounce to prevent false triggers
- Calibration controls exposed to Home Assistant
-
Configurable Button Actions - Each button (Key1-3) supports:
- Single press, double press, long press
- 10 assignable actions per press type
- Configurable via Home Assistant selects
-
Enhanced LED Effects - Different colors/effects per voice assistant phase:
- Swirl effects for listening/processing/responding
- Volume gradient display
- Pulse effects for errors/connectivity issues
-
BLE disabled - Saves internal RAM for AFE
Bug Fixes
- Fixed LED pulse effect (min/max brightness)
- Fixed logger debug errors
- Reduced log spam with throttle/debounce filters
Will be adding additional sensors for temp/humidity soon to make into an all in one sensor and a new 3d enclosure to hold it all.
Nice work! If you’re interested, I created an external component for the IMU: GitHub - Djelibeybi/esphome-qmi8658: ESPHome external component for the QMI8658C IMU found in Waveshare devices.
I use it on the smaller Waveshare ESP32-S3s to reorient the display if it gets rotated, but it can be useful for motion/tamper detection as well.
Hi, Timer is kept ringing after finish. It’s in a loop. Same issue as in the main fork. Could you please look into this?
When Music assistant is playing audio, mic is not working.
Agreed, I moved the 3 rubber feet from the speaker grill to the clear plate, less likely to tip over
@craigmillard86 Looking through your rework and will be able to test in the next few days but there are a few things that should be sorted first…
- waveshare-s3-audio.yaml stil contains wifi and spi secrets which make loading the package from the network impossible. They should be removed.
- waveshare-s3-audio.yaml shouldn’t pull in packages for components that aren’t actually part of the device like the presence detection. They should be optional like the camera.
- You’ve probably got the esp_afe component source as “local” which I’m guessing is for easy testing but changing it to “git” will make it easier for us to test.
I’ll let you know how real testing goes.
Thanks a lot for this @Dan333 ! I found these devices to be available somewhere couple of months ago. Dared to purchase a few after looking at your repository and this post. This really works like a charm! Thanks again!
Few additions that I made to the YAML so that I can monitor the battery of the device and added bluetooth proxy as well , tracker as well.
Adding battery monitoring details if someone wants to make use of it. Not sure if I have done things correctly, but it seems to work.
Example logs:
[18:29:21.212][D][sensor:129]: 'Battery Level' >> 100.0 %
[18:29:22.181][D][sensor:129]: 'Battery Voltage' >> 6.35 V
[18:30:00.842][D][text_sensor:119]: 'Current device time' >> '13:00'
[18:30:21.222][D][sensor:129]: 'Battery Level' >> 100.0 %
[18:30:22.186][D][sensor:129]: 'Battery Voltage' >> 4.46 V
[18:31:00.847][D][text_sensor:119]: 'Current device time' >> '13:01'
[18:42:21.220][D][sensor:129]: 'Battery Level' >> 100.0 %
[18:42:22.229][D][sensor:129]: 'Battery Voltage' >> 4.65 V
[18:43:21.219][D][sensor:129]: 'Battery Level' >> 100.0 %
[18:43:22.230][D][sensor:129]: 'Battery Voltage' >> 4.66 V
[18:44:00.840][D][text_sensor:119]: 'Current device time' >> '18:44'
[18:44:21.221][D][sensor:129]: 'Battery Level' >> 100.0 %
[18:44:22.241][D][sensor:129]: 'Battery Voltage' >> 4.65 V
Not sure if I am correctly tapping the right gpio or even doing this correctly readings seem off 6.35V on USB C power bank and values are not precise either (some fluctuations are seen in logs even w/o plugging the charger).
Relevant YAML changes:
sensor:
- platform: adc
pin: GPIO3
name: "Battery Voltage"
id: battery_voltage
update_interval: 60s
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
attenuation: 11db
filters:
- multiply: 2.0
- platform: template
name: "Battery Level"
unit_of_measurement: "%"
device_class: battery
lambda: |-
float v = id(battery_voltage).state;
if (v >= 4.2) return 100.0;
if (v <= 3.2) return 0.0;
return (v - 3.2) * 100.0 / (4.2 - 3.2);
#And In Binary sensor section:
binary_sensor:
- platform: template
name: "Battery Charging Status"
device_class: battery_charging
# Infer charging if the voltage is unusually high for a long period
lambda: |-
float v = id(battery_voltage).state;
return (v > 4.25);
#This is to improve my Bermuda triangle
esp32_ble_tracker:
bluetooth_proxy:
active: True
If anyone has suggestions / corrections for the above, kindly let me know.
Cheers!
Anyone has the same issue with timers with recent ESPhome version?
waveshare-s3-audio.yaml: In lambda function:
waveshare-s3-audio.yaml:917:43: error: 'const struct esphome::voice_assistant::Timer' has no member named 'seconds'
waveshare-s3-audio.yaml:919:28: error: 'const struct esphome::voice_assistant::Timer' has no member named 'seconds'
waveshare-s3-audio.yaml:920:28: error: 'const struct esphome::voice_assistant::Timer' has no member named 'second'
waveshare-s3-audio.yaml:921:41: error: 'const struct esphome::voice_assistant::Timer' has no member named 'seconds'
waveshare-s3-audio.yaml: In lambda function:
waveshare-s3-audio.yaml:933:30: error: 'const struct esphome::voice_assistant::Timer' has no member named 'second'
Probably you have updated your firmware. There is a breaking change. Please make changes in the yaml as described here ([voice_assistant] Replace timer unordered_map with vector to eliminate per-tick heap allocation by bdraco · Pull Request #13857 · esphome/esphome · GitHub) and you will be good.
I am wondering if there is a way to limit the number of repetition for timer finished and alarm beep sound?
Thanks, fixed.
Submitted a PR Fix for timers in ESPHOME 2026.2 by indiealexh · Pull Request #14 · sw3Dan/waveshare-s2-audio_esphome_voice · GitHub
Hi - thanks for your efforts on extending Dan’s work. I am in the process of testing this build and adding a 1.3" oled on top of the device.
One immediate issue I had with your script is the listening.flac file doesn’t appear to be in your main branch but rather Personal-settings so I had to amend the url in the yaml config to:
Once I made this change as well as the timer fixes indiealexh links to above it installed fine and is immediately working as well as my other voice satellites (linux voice assistant running on windows and hacked echo shows/spots with view assistant companion app on lineageos)… will report back with any specific issues I encounter
One minor clean-up suggestion is to use the defined i2c_scl / i2c_sda substitutions rather than repeating the GPIO pins
Hi
I tried to start local MP3 media, but they don’t open.
I get following fault response:
[13:11:13.583][D][media_player:092]: Media URL: http://homeassistant.local:8123/api/esphome/ffmpeg_proxy/d90f6f365d86164647676bea22815823/XIXpBXqkjDuhWNm1xlRg6Q.flac
[13:11:13.583][D][speaker_media_player:410]: State changed to PLAYING
[13:11:20.594][D][esp-idf:000][med_read]: E (45463) esp-tls: couldn’t get hostname for :homeassistant.local: getaddrinfo() returns 202, addrinfo=0x0
[13:11:20.594][D][esp-idf:000][med_read]: E (45463) transport_base: Failed to open a new connection: 32769
[13:11:20.594][D][esp-idf:000][med_read]: E (45463) HTTP_CLIENT: Connection failed, sock < 0
Do you no where my Problem is?
Thank you for you support.