Releases: wilbowes/EchoMuse
Release list
EchoMuse v2.11.0
Headphone jack fixes, and a device that can say why it has no light sensor
The headline: plugging in headphones no longer breaks the Dot
If you booted an Echo with a cable already in the 3.5mm jack, it came up
with no wake word, no working buttons and never appeared in the
dashboard. If you unplugged headphones, the speaker stayed silent until
the next reboot. Both are fixed.
Two independent faults were behind that, and neither was in the button
code:
Android was holding the speaker. With a headset present, Android's
media service claims the audio device, and EchoMuse's attempt to open it
waited behind that forever. Everything else — the buttons, the wake
word, the connection to the controller — is started after the speaker,
so one stalled open took the whole device with it. The buttons were
never broken; nothing was listening to them. That is also why unplugging
and replugging appeared to fix it.
Nothing restored the speaker after unplugging. Inserting a plug mutes
the internal amplifier, which is correct — you do not want the Dot
playing to the room while you are wearing headphones. Nothing turned it
back on, and startup was the only thing that ever did, which is exactly
why only a reboot brought it back.
Audio routing itself never needed fixing: the jack switches the output in
hardware.
What you should expect
Plug in and audio moves to the headphones. Unplug and it returns to the
speaker, within about a second. Boot with a cable in and the device
starts normally.
A note on unplugging
On the previous firmware, unplugging was once seen to stall the microphone
for about thirty seconds, with the device showing as disconnected before
reconnecting on its own. It has not reproduced on this release across
repeated plug cycles, so you are unlikely to meet it — but it is only one
device's worth of testing, so it is being tracked rather than declared
fixed. If you do see it, it recovers by itself without a restart and
nothing is lost. Details and how to help pin it down: #117.
Behaviour change worth knowing about
EchoMuse now stops Android's media service at startup, on every boot, not
only when a jack is present — the point is to stop it claiming the
speaker before we ask for it. EchoMuse drives the audio hardware directly
and does not use that service. Nothing else on the device depends on it.
Ambient light: the device now says why it found no sensor
Some Dots report no light sensor. Until now the reason was written only
to a log file on the device, which support bundles do not collect and a
reboot erases — so telling "this hardware has no sensor fitted" apart
from "the driver failed to start" needed a shell session on your own
device.
The device now reports that reason when it connects, and it appears in
support bundles. If your light sensor is missing, a bundle from Settings
→ Support will now say which of those it is. This does not make a missing
sensor appear; it makes the question answerable.
Requires the matching controller release (controller-v2.17.0) to be
displayed. On an older controller the device simply reports it and
nothing reads it — nothing breaks.
Upgrading
Nothing is required of you. No configuration changes, no re-provisioning,
and settings are preserved. As always the previous firmware stays in the
other slot and the device rolls back automatically if this one fails to
start.
What's Changed
- docs: rewrite rooting.md plainly, and fix an attribution that read wrong by @wilbowes in #59
- controller: ride out a data-plane blip instead of truncating the audio by @wilbowes in #60
- docs: bring CLAUDE.md, the journal and README up to date by @wilbowes in #61
- fix: stop telling HA a barge-in pause is the user's pause (#62) by @wilbowes in #64
- support: one-file diagnostics bundle, built privacy-first by @wilbowes in #63
- support: redact account names, and report the resources on both sides by @wilbowes in #69
- support: put the controller's own log in the bundle, and thin the noise by @wilbowes in #70
- Duck and mix music under voice instead of pausing (#67) by @wilbowes in #71
- docs: catch the docs up to ducking, streaming TTS and shadow mode by @wilbowes in #75
- ota: make md5 the definition of a successful firmware transfer by @wilbowes in #77
- docs: record the OTA transfer verification, and what actually fixed the Dot by @wilbowes in #78
- fix(docker): select esbuild binary by architecture (unblocks arm64 builds) by @QuickMythril in #81
- ci: publish the controller image for arm64 as well as amd64 by @wilbowes in #83
- dashboard: show the WiFi band on each device's Status tab by @wilbowes in #86
- wizard: report the FireOS build, and say which one we test against by @wilbowes in #84
- wizard: make WiFi failures explain themselves by @wilbowes in #85
- wizard: check where the boot image is going before writing it by @wilbowes in #92
- controller: stop writing every device log line twice by @wilbowes in #93
- controller: a deleted device can come back by @wilbowes in #98
- wizard: capture device state when a provisioning step fails by @wilbowes in #94
- wizard: tell an absent package apart from a broken package manager by @wilbowes in #95
- wizard: a step that loses the cable no longer hangs forever by @wilbowes in #99
- wizard: say when a reconnect came back in the wrong mode by @wilbowes in #101
- wizard: stop the disconnect handler crying wolf on our own reboots by @wilbowes in #102
- esphome: rebuild HA's entity list when capabilities change by @wilbowes in #104
- Fire the action-button hold while muted by @wilbowes in #108
- Add buttonSingleTapEvent and buttonMultiTapMs: tap as an HA event by @bboe in #107
- Fix the audio jack stranding the device (#80) by @wilbowes in #113
- Report why there is no ambient light sensor (#90) by @wilbowes in #114
- docs: the audio jack, the ALS reason, and tap-as-event by @wilbowes in #116
New Contributors
- @QuickMythril made their first contribution in #81
- @bboe made their first contribution in #107
Full Changelog: v2.9.13...v2.11.0
EchoMuse v2.10.0
v2.10.0 — music ducks under a voice response instead of pausing
Ask a question while music is playing and the music now stays on, dropped in
level, with the response mixed over the top. It comes back up when the
response ends. Previously the music paused and resumed.
This is a better answer than pausing, and it removes a class of problems
rather than improving them. Resuming needed a seek, and a Music Assistant
flow stream cannot seek — so a 28-second question cost 28 seconds of the
song, and a long one could land you in the next track entirely. Behaviour
differed depending on where the music came from, with no way to tell which
you had. None of that exists now: the music is never stopped, so there is
nothing to seek back to.
It has to happen on the device. The controller runs about four seconds ahead
of what you hear, so when the wake word fires those four seconds are already
on the Echo — audio that has left the controller cannot be ducked by it.
Music now has its own audio channel on the device and the two are mixed as
they are played, which also means the duck is instant and the music keeps
its full protection against Wi-Fi stalls.
How far the music drops is yours to set: Config → Playback → Duck depth,
default -18dB. It is a taste setting and worth trying in the room it plays
in. Your response is never attenuated, only the music underneath it.
Also in this release:
- The LED ring's level meter follows the response only. It briefly followed
the music too, which read as the Echo reacting to something you had not
said. - The ambient light sensor no longer stops being readable after one failed
lookup, and a failure now says which failure it was. - Long-press on the action button reports how long it was actually held.
Requires the controller from controller-v2.14.0 or newer for ducking. On an
older controller this firmware behaves exactly as before — music pauses —
so the two can be updated in either order.
What's Changed
- docs: rewrite rooting.md plainly, and fix an attribution that read wrong by @wilbowes in #59
- controller: ride out a data-plane blip instead of truncating the audio by @wilbowes in #60
- docs: bring CLAUDE.md, the journal and README up to date by @wilbowes in #61
- fix: stop telling HA a barge-in pause is the user's pause (#62) by @wilbowes in #64
- support: one-file diagnostics bundle, built privacy-first by @wilbowes in #63
- support: redact account names, and report the resources on both sides by @wilbowes in #69
- support: put the controller's own log in the bundle, and thin the noise by @wilbowes in #70
- Duck and mix music under voice instead of pausing (#67) by @wilbowes in #71
Full Changelog: v2.9.13...v2.10.0
EchoMuse v2.9.13
v2.9.13 — hold the action button, and a light sensor Amazon hid
Two new things your Echo can tell Home Assistant, and one fix to how it
cancels.
Hold the action button
- Hold it for about three quarters of a second and it sends an event to
Home Assistant instead of starting a voice turn. It appears as an
'Action Button' entity you can pick straight from the automation editor
— no YAML, nothing to guess. - A normal press is unchanged: starts a voice turn, cancels one in
progress, still instant. - If you are used to holding the button to start a turn, that will now do
nothing locally. A tap is the way. - Double and triple presses are deliberately not included. Detecting them
means delaying every single press to check whether another is coming,
which would make the button feel slower for everyone.
Ambient light
- The Dot has a light sensor that Amazon's own software never exposed —
it does not appear anywhere in Android's sensor list. It works, and it
is quick: a hand over the top takes it from a lit room to zero and back
within a second. - It appears in Home Assistant as an 'Ambient Light' sensor in lux. A
meaningful change — someone switching a lamp on — is reported straight
away; otherwise it updates about every thirty seconds. - Useful for 'only if it's dark' conditions, or for driving something else
in the room by daylight. - A device without the sensor reports nothing rather than a misleading
zero, because zero lux is a real reading.
Fixed
- Pressing the action button during a spoken response now stops the audio.
Previously the light ring cleared but the device carried on talking to
the end of the answer.
Under the hood
- The startup script now keeps a small permanent record of its own
decisions, so a device that fails to come back after an update can
explain why afterwards. It takes effect on the next restart after this
update, and the controller collects it automatically.
Both new entities appear on their own; nothing to configure. Requires
nothing of you — existing settings, wake word assets and the rollback slot
are untouched.
What's Changed
Full Changelog: v2.9.12...v2.9.13
EchoMuse v2.9.11
v2.9.11 — diagnostics for on-device wake word
A small, low-risk update. It changes no behaviour: it adds two numbers to
the status report the device already sends every 30 seconds.
Only useful if you run on-device wake word (Config -> Wake word -> Score on
device). If you don't, this update is optional — nothing else differs from
v2.9.11's predecessor.
What it adds
- The device now reports the slowest single wake-word inference in each
window, and the longest gap between audio frames reaching the scorer.
Why
- When on-device scoring falls behind, it drops audio frames rather than
ever stalling the microphone. The drop count alone says it happened but
not why, and there are only two possible causes, needing opposite fixes:
inference running slow, or audio arriving in bursts. These two numbers
tell them apart. Drops have been rare in testing (58 in ~925,000 frames,
with no effect on the audio path), so this is groundwork for trusting
on-device detection rather than a fix for anything you would notice.
Cost
- Two integers on an existing message, and one clock reading per audio
frame on a path that takes no locks. No measurable CPU or memory change.
Requires nothing of you. Existing settings, wake word assets and rollback
slot are untouched, and a device that has never had on-device scoring
enabled behaves exactly as before.
What's Changed
- controller: stream Home Assistant TTS during generation by @kopiro in #47
- controller: tell the dashboard when a newer controller is published by @wilbowes in #48
- docs: journal the streaming TTS merge, the meter gap, and controller-v2.11.0 by @wilbowes in #49
- dashboard: line up the Link meter with Latency and Temp by @wilbowes in #50
- wakeword: distribute the on-device assets, and instrument what a drop was by @wilbowes in #51
- ci: verify the release binary carries the tag, not a string-layout artifact by @wilbowes in #52
New Contributors
Full Changelog: v2.9.10...v2.9.11
EchoMuse v2.9.10
Reporting improvements, and a fix to on-device wake word scoring
Nothing changes about how your Echo listens or responds. This release is
worth taking mainly for what it adds to the dashboard.
What you get
-
The Status tab now shows this Echo's temperature and how many of its CPU
cores are awake, and warns if the chip ever starts limiting itself
thermally. It idles around 33°C, so anything amber there is unusual. -
A second CPU core is kept awake. The Echo has four and parks the ones it
is not using; the audio pipeline works to a tight deadline and does
better when it is not sharing with everything else. Measured cost was
0.3°C and no change in power behaviour worth mentioning. -
Amazon's Whole Home Audio service is switched off. It is the multi-room
feature EchoMuse replaces, and nothing else on the device was using it.
Frees roughly 20MB of memory, applied on this update and taking full
effect after the Echo next restarts.
Fixed
-
On-device wake word scoring (the experimental "Score on device" option)
was comparing itself against the controller unfairly during playback.
While audio is playing, the controller deliberately lowers the bar for
hearing the wake word — the speaker drowns you out — and the Echo was
not doing the same, so every interruption looked like the Echo had
missed it. Both sides now use the same bar, and the comparison in the
Activity tab reports how many turns were genuinely comparable rather
than lumping the rest in as failures.If you do not use that option, this changes nothing for you.
Updating is safe and needs nothing from you. If an update ever goes wrong,
the Echo rolls back to its previous version on its own.
Full Changelog: v2.9.9...v2.9.10
EchoMuse v2.9.9
On-device wake word scoring (experimental, off by default)
This Echo can now run the wake-word model itself and report what it would
have detected — without acting on it. Nothing about how your Echo behaves
changes unless you switch it on, in Config → Wake word → "Score on device".
It exists to answer whether on-device detection is trustworthy before
anything depends on it. With it on, each turn's row in the Activity tab shows
the Echo's own score beside the controller's, and the activity view reports
how often they agreed and how far apart they were.
Before you enable it:
-
It needs files placed on the Echo that are not part of this firmware —
ONNX Runtime and the wake-word models, about 15MB, in
/data/local/share/echomuse/oww. They are deliberately not shipped in the
firmware: that would double both this download and the space each of the
two firmware slots takes. Until they are there the toggle does nothing,
and the device log names the file it could not find. -
It costs roughly half a CPU core, permanently, because the wake stream is
always on. Measured as comfortable on this hardware — the microphone
pipeline was unaffected across hours of use, including during music
playback — but turn it on for one Echo at a time and watch the Resources
panel on the Status tab. -
It needs a controller new enough to record the comparison. An older
controller simply never switches it on, so there is no bad pairing.
Also in this release
-
A second CPU core is kept awake. The Echo has four and parks the ones it
is not using; the audio pipeline works to a 160ms deadline and does
better when it is not sharing with everything else. -
The Status tab now shows the Echo's temperature and how many of its CPU
cores are awake, and warns if the chip ever begins limiting itself
thermally. It idles at around 33°C, so anything amber there is genuinely
unusual.
Updating is safe and needs nothing from you. If an update ever goes wrong,
the Echo rolls back to its previous version on its own.
What's Changed
- api: config POSTs refuse to silently delete settings by @wilbowes in #26
- fix: config guard stole @auth.require_admin from _post_global_config by @wilbowes in #27
- ring: legible playback meter, honest turn-state, tunable curve by @wilbowes in #29
- config: per-section fleet/device scoping, plus a last_seen fix by @wilbowes in #30
- instrumentation + media player fixes: RTT, resume seek, feed buffer by @wilbowes in #31
- Save and play back the mic audio of recent turns by @wilbowes in #42
- Tap the utterance recording below NS, not above it by @wilbowes in #43
- docs: record why delay-and-sum is marginal on a 72mm array by @wilbowes in #44
- wakeword: streaming feature pipeline, validated against Python by @wilbowes in #45
- wakeword: run the models on the device, via a dlopen'd ONNX Runtime by @wilbowes in #46
Full Changelog: v2.9.7...v2.9.9
EchoMuse v2.9.8
What's Changed
- api: config POSTs refuse to silently delete settings by @wilbowes in #26
- fix: config guard stole @auth.require_admin from _post_global_config by @wilbowes in #27
- ring: legible playback meter, honest turn-state, tunable curve by @wilbowes in #29
- config: per-section fleet/device scoping, plus a last_seen fix by @wilbowes in #30
- instrumentation + media player fixes: RTT, resume seek, feed buffer by @wilbowes in #31
Full Changelog: v2.9.7...v2.9.8
EchoMuse v2.9.7
EchoMuse v2.9.6
What's Changed
- controller: ESPHome server for devices approved after startup + 'Voice Assistant' naming by @wilbowes in #13
- controller: report hardware model to HA, not the device label by @wilbowes in #14
- controller: make ESPHome server registration idempotent by @wilbowes in #15
- docs: HA naming, on-demand ESPHome registration, 2026-07-19 changelog by @wilbowes in #16
- Custom wake-word models: dashboard install + controller test suite by @wilbowes in #17
- Multi-device wake arbitration (one utterance, one responder) + Dockerfile COPY fix by @wilbowes in #18
- Real media playback on the HA media_player (music, pause/resume, voice preemption) by @wilbowes in #20
- docs: README rewrite — reflect what EchoMuse actually is now by @wilbowes in #21
- Delivery instrumentation: measure every hop of the voice turn by @wilbowes in #22
Full Changelog: v2.9.5...v2.9.6
EchoMuse v2.9.5
What's Changed
- device: light the mute button LED (gpio444); volume arc only on physical presses by @wilbowes in #12
Full Changelog: v2.9.4...v2.9.5