Esparagus Echo is a series of ESP32-S3-based voice control edge devices. They are designed to work with ESPHome as an edge part of the voice control pipeline. The boxed devices are enclosed in a neat-looking aluminum case and expose feedback LEDs on the front panel where it is easy to spot them, leaving power and speaker connectors on the backside. Solo C1 goes the other way and ships as a bare board that replaces the electronics inside an IKEA speaker.
New: Esparagus Solo C1 is a drop-in replacement PCB for the IKEA KALLSUP Bluetooth speaker. Swap the original board for it and the speaker keeps its battery, driver, LED and buttons, but gains announcements, multi-room music and a voice assistant through Home Assistant. See Esparagus Solo C1.
The boxed Esparagus Solo (rev B) remains available and fully supported, and is documented below. It will be sunset eventually, but not yet.
- Esparagus Echo
The Esparagus Echo design shares a lot with the earlier Esparagus series of devices, using similar parts and the same pinout whenever possible. I see it as a side branch of the series.
I'm a big fan of Alexa. I'm using it around the house, and my family uses it all the time, down to our two-year-old. I hardly need to mention the privacy concerns, as they are common enough. My biggest pain point is the inability to integrate Alexa into the Home Assistant setup that I have at home. I'm a big fan of automation around the house and want to trigger complex flows based on the specific sensors and devices that I have. I think the freedom of implementation is a bit like the magic of Home Assistant. Why not have voice control, since everyone around the house is used to it already?
Esparagus Solo has all the basic necessities: a mic on the front panel, a couple of feedback LEDs, and a speaker at the back. Onboard is a simple and well-known MAX98357 DAC, good for a reasonable 5W of audio output. That's pretty much it.
This is the boxed product, currently on rev B, and its configs live in firmware/esphome/echo-solo-b.
Solo C1 is the same idea in a different shape: instead of a boxed device of its own, it is a drop-in replacement PCB for the IKEA KALLSUP Bluetooth speaker. Take the KALLSUP apart, lift out the original board, drop this one in, and the speaker becomes a Home Assistant device with announcements, multi-room music and a voice assistant, while staying the speaker it was.
The board is laid out to reuse what is already in the enclosure, so the retrofit needs no rewiring and no glue:
| Part of the speaker | How Solo C1 uses it |
|---|---|
| Battery and its connector | Same connector and polarity. The board charges the cell and reports voltage, charge state and whether external power is present |
| Speaker driver and its connector | Same connector, driven by the onboard MAX98357 DAC |
| RGB LED | Sits in the original position on the PCB, so it lines up with the enclosure's light pipe |
| Buttons | Both original buttons are kept. One powers the speaker on and off, the other is yours to define in YAML |
| USB-C port | Charging and power, as before |
What you gain over the stock speaker:
- Voice assistant with on-device wake word detection, through the Home Assistant voice pipeline
- Announcements, so automations can speak through the speaker
- Multi-room music via Music Assistant, synchronised with other Esparagus devices
- A scriptable button, exposed to Home Assistant as an event entity
The KALLSUP opens up into the enclosure, the speaker driver and the base plate. The board sits where the original one did, on the same battery and speaker leads.
The original board (top) and Solo C1 (bottom). The SPK and LIPO connectors sit in the same places, which is what makes this a drop-in swap.
Both boards from the button side. The two tactile switches on Solo C1 line up with the lid, and are silkscreened PWR and IO0.
On top of the Solo capabilities, Esparagus Duo uses a dual-mic setup, an extra LED, and, most importantly, a two-channel MAX98357 DAC to deliver quality stereo audio, which also makes it usable as a media player. To make sure it streams without a hiccup, it uses an external Wi-Fi antenna for much improved reception, and has SPI Ethernet for the most robust networking.
| Esparagus Solo (rev B) | Esparagus Solo C1 | Esparagus Duo | |
|---|---|---|---|
| Form factor | Boxed device | Replacement PCB for IKEA KALLSUP | Boxed device |
| Image | ![]() |
||
| MCU | ESP32-S3-WROOM-1-N8R8 module | ESP32-S3-WROOM-1-N8R8 module | ESP32-S3-WROOM-1U-N8R8 module |
| MIC | Single TDK InvenSense ICS-43434 I2S MEMS Mic | Single TDK InvenSense ICS-43434 I2S MEMS Mic | Dual TDK InvenSense ICS-43434 I2S MEMS Mic |
| DAC | Single I2S DAC (MAX98357) with built-in D-Class amp | Single I2S DAC (MAX98357) with built-in D-Class amp | Dual I2S DAC (MAX98357) with built-in D-Class amp |
| Power | 5V from USB-C (Up to 1.5A) | 5V from USB-C, or the KALLSUP battery | 5V from USB-C (Up to 2.5A) |
| Battery monitoring | none | Battery voltage, charge status, external power presence | none |
| Controls | none | Power button and a scriptable action button | none |
| Speaker | Onboard, at the back | The KALLSUP driver, original connector | Onboard, at the back |
| Output, 4Ω | 3W | 3W | 2x 3W |
| Output, 8Ω | 5W | 5W | 2x 5W |
| PSRAM | 8MB PSRAM | 8MB PSRAM | 8MB PSRAM |
| Peripheral | 2x XL1615 RGB LED | 1x RGB LED, in the original KALLSUP position | 3x XL1615 RGB LED |
| Wireless Connectivity | Wi-Fi + BLE External antenna |
Wi-Fi + BLE PCB antenna |
Wi-Fi + BLE External antenna |
| Ethernet | none | none | WIZnet W5500 SPI Ethernet |
| Size (excl. antenna) | 70 x 24 x 88 mm | Fits the KALLSUP enclosure | 70 x 24 x 88 mm |
All current and future boards carry the N8R8 module, with 8MB of flash and 8MB of PSRAM, which is what the ESPHome configs here are built for. Some early boards shipped with the 16MB N16R8 variant instead. They keep working with the same configs, using 8MB of the flash they have.
| I2S CLK | I2S DOUT | I2S DIN | I2S WS | DAC CE | RGB LED | |
|---|---|---|---|---|---|---|
| Echo Solo | 14 | 16 | 21 | 15 | 17 | 42 |
| Echo Duo | 14 | 16 | 21 | 15 | 17 | 42 |
Current for both boxed devices, Echo Solo and Echo Duo.
| I2S CLK (OUT) | I2S DATA (OUT) | I2S WS (OUT) | I2S CLK (IN) | I2S DATA (IN) | I2S WS (IN) | DAC CE | RGB LED | |
|---|---|---|---|---|---|---|---|---|
| Echo Solo | 18 | 17 | 8 | 16 | 15 | 7 | 9 | 42 |
| Echo Duo | 18 | 17 | 8 | 16 | 15 | 7 | 9 | 42 |
The audio pins are unchanged from rev B. The RGB LED moves to GPIO10 because it has to sit where the KALLSUP light pipe expects it, and the action button, battery sense and power sense inputs are new.
| I2S CLK (OUT) | I2S DATA (OUT) | I2S WS (OUT) | I2S CLK (IN) | I2S DATA (IN) | I2S WS (IN) | DAC CE | RGB LED | ACTION BTN | |
|---|---|---|---|---|---|---|---|---|---|
| Echo Solo C1 | 18 | 17 | 8 | 16 | 15 | 7 | 9 | 10 | 0 |
| Pin | Type | Notes | |
|---|---|---|---|
| Battery voltage | 4 | ADC1 input | Behind a 1:3 resistor divider, so the firmware multiplies the reading by 3 |
| External power | 41 | Digital input | Open drain, active low |
| Battery charging | 40 | Digital input | Open drain, active low |
Notes on the pins above:
- The battery divider must land on GPIO1-10. Only those pins reach ADC1 on the ESP32-S3, and ADC2 (GPIO11-20) is unusable while WiFi is on. The firmware expects the divider on GPIO4.
- GPIO0 is a strapping pin and carries the pullup that role requires, so the button needs no pullup of its own. Holding the button down across a reset puts the chip into download mode, which is why no firmware gesture uses a hold through reboot.
| SPI CLK | SPI MOSI | SPI MISO | LAN RES | LAN CS | LAN INT | |
|---|---|---|---|---|---|---|
| Echo Duo | 12 | 11 | 13 | 5 | 10 | 6 |
Since these devices are designed to be used primarily within a Home Assistant setup, the software folder contains ESPHome configurations for all of them. There is a folder per board: echo-solo-b for the boxed Solo, echo-solo-c for the KALLSUP retrofit, and echo-duo-b for the Duo. Each folder holds a config per use case:
sendspinis a media player built on the Sendspin protocol, for synchronised multi-room audio with Music Assistantvoice-assist-sendspinadds wake word detection and a voice pipeline on top of the Sendspin player, with ducking while the assistant talksmedia-playeris a plain Home Assistant media playersnapclientturns the device into a Snapcast client
The shared building blocks live in packages and are pulled in by each config, so a board only has to declare its own pinout.
The simplest way to use Esparagus Echo with Home Assistant is as a media player device. The YAML configs will get you started. Below are the configuration steps you need to carry out in HA itself.
| Step | Screenshot |
|---|---|
| Add ESPHome Addon Navigate to HA Settings > Addons > Add Addon Search for ESPHome and install it. Enable the Show in sidebar switch while you are there |
![]() |
| Prepare Esparagus Echo for ESPHome onboarding Use Web Flasher to flash stock ESPHome into device |
![]() |
| Onboard Esparagus Echo ESPHome device into HA Go to the HA ESPHome page and you should be able to find a new device. You need to onboard it with the below config (feel free to change names) This will take a moment or two |
![]() |
| Validate device in the ESPHome | ![]() |
| Add ESPHome Integration Navigate to HA Settings > Devices & services > Integrations. Click the big + ADD INTEGRATION button, look for ESPHome, and click to add it. It should discover and add ESPHome media devices based on the previous step |
![]() |
| Use your media device in the HA | ![]() |
| Use your media device in the MA Add Music Assistant HA MediaPlayers provider to discover new Media device |
![]() |
Originally I had trouble configuring the voice assistant setup on the Echo, despite the good examples shared here and here. The examples failed because a single I2S bus was handling both audio input and output. In theory that is a perfectly good configuration, since both DACs and both mics work in slave mode as they should, and I even wrote simple Arduino code that captures frames from the mic and sends them over to the speakers in stereo, which worked beautifully.
ESPHome, however, was not cooperating, so I went with a hardware fix and used extra pins to run independent I2S buses for the mics and the DACs. Note that wake word detection currently does not benefit from the second mic, but I hope support will be added in the future, since the Espressif folks seem to be working on it (although they may use an external noise-reduction IC, I'm not sure).
All in all, wake word detection started to work flawlessly in revision B, and although it is not as fast as, say, Alexa, it is truly amazing to have it working on such a small device.
Please look at this config to make it work. Note that it also requires configuring Home Assistant properly; you may use the official guide, Seeed's docs or a community-created YouTube tutorial.
The KALLSUP keeps both of its buttons, with one role each:
| Button | On the board | On the KALLSUP lid | Role |
|---|---|---|---|
| Power | PWR |
⏻ | Switches the speaker on and off, as it did before the retrofit |
| Action | IO0 |
Bluetooth icon | Whatever you define in YAML. Wired to GPIO0 and handled by ESPHome |
The action button ships with the gestures of the Home Assistant Voice PE center button, so muscle memory carries over between the two devices. Replacing them means editing one package, voice-assist-addon-button.yaml or sendspin-addon-button.yaml, where each gesture is a plain ESPHome on_multi_click entry.
On the voice assistant configs:
| Gesture | Action |
|---|---|
| Single click | Stops whatever is active, in order: a ringing timer, a running pipeline, an announcement. If nothing is active, starts the voice assistant |
| Double click | Next track, and fires a double_press event |
| Triple click | Fires a triple_press event |
| Long press (1s) | Mutes or unmutes the voice assistant, and fires a long_press event |
On the plain media player configs, where there is no pipeline to talk to:
| Gesture | Action |
|---|---|
| Single click | Play or pause |
| Double click | Next track, and fires a double_press event |
| Triple click | Previous track, and fires a triple_press event |
| Long press (1s) | Stop, and fires a long_press event |
The double, triple and long presses are published to Home Assistant as a Button press event entity, so you can hang automations off them. The single click is not exposed, because it drives the device itself. A Disable physical controls switch turns the button off entirely, and is hidden by default.
There are two ways to put the action button to work. The first keeps the firmware untouched: listen for the Button press event in a Home Assistant automation and do anything HA can do.
automation:
- trigger:
- platform: state
entity_id: event.esparagus_echo_solo_button_press
attribute: event_type
to: double_press
action:
- action: light.toggle
target:
entity_id: light.kitchenThe second runs on the device itself, which keeps working when Home Assistant is down. Extend the button from your board config and add a gesture of your own:
binary_sensor:
- id: !extend center_button
on_multi_click:
- timing:
- ON for at least 3s
then:
- switch.toggle: relay_in_the_hallwayAnything ESPHome can do as an action belongs here: GPIO, a script, an HA service call, a TTS announcement, a scene.
Note that !extend appends to the gesture list rather than replacing it, so pick a timing that does not overlap one of the four above, or the overlapping gestures will both match. To change or drop a shipped gesture, edit the package itself.
Running on battery adds four entities:
| Entity | Type | Notes |
|---|---|---|
Battery Voltage |
Sensor, V | Averaged over six samples taken 5s apart |
Battery Level |
Sensor, % | Estimated from voltage, 3.3V empty to 4.2V full on a single Li-ion cell |
External Power |
Binary sensor | On when the USB-C supply is present |
Battery Charging |
Binary sensor | On while the charger is active |
The empty and full voltages are substitutions, so a different cell chemistry only takes a config change rather than a firmware patch.
The ESP32-S3 needs a special routine for the very first ESPHome flash, which was optional on the classic ESP32. It takes a few extra steps.
| Step | Image |
|---|---|
| Open the device box and connect it to the PC for initial flashing. It will report itself as a USB device, but it cannot go into flashing mode on its own. With the device powered on, hold the FLASH button down, press the RESET button, then release FLASH. |
![]() |
| Only after that, connect to the device from web.esphome.io | ![]() |
| You may press the PREPARE FOR FIRST USE button as usual. | ![]() |
You will be greeted with An error occurred. Improv Wi-Fi Serial not detected error. That's because the device is not able to RESET over USB during the first flashing. Reset it manually using RESET button |
![]() |
| Re-connect to the device and proceed with the initial Wi-Fi configuration | ![]() |
Alternative firmware that uses the ESP-NOW protocol for bi-directional communication over Wi-Fi. This is a clone of the esp32-walkie-talkie project by atomic14. More details here.
Please visit the hardware section for board schematics and PCB designs. Note that PCBs are shared as multi-layer PDFs as well as Gerber archives.
Rev A and Rev B files are published there. The Solo C1 schematic and PCB, including the KALLSUP connector placement and board outline, will be added once the revision is released.
| Esparagus Solo (Prototype) | Esparagus Solo (rev B) | Esparagus Solo C1 (in a KALLSUP) | Esparagus Duo |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
| Esparagus Solo (Prototype) | Esparagus Solo (rev B) | Esparagus Solo C1 | Esparagus Duo |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
You may support our work by ordering this product at Lectronz or Tindie.



























