Repository navigation
Releases: triumfas/Denon-Advanced-Audio
Release list
v0.3.10 — Pure quick-select actually fixed
Pure quick-select, actually fixed this time
v0.3.9 fixed the Pure quick button by switching from MSPURE DIRECT to bare MSPURE, based on one test that appeared to show it preserving the last-active mode. A user reported it still wasn't switching categories at all -- testing from a genuinely different starting category (Movie) proved why: MSPURE is simply a no-op, not a real category-select command like MSMOVIE/MSMUSIC/MSGAME are. The earlier test was a false positive -- it happened to start from a state that command would leave unchanged either way.
The real fix
There is no telnet command for "switch to Pure, keep whatever submode was active" -- Movie/Music/Game get this natively, Pure does not. So the integration now tracks it client-side:
coordinator.last_pure_submoderemembers whichever of Direct / Pure Direct / Auto you last used.- It updates whenever you explicitly pick one (via either Sound Mode entity), and self-heals from Direct/Pure Direct whenever the receiver reports them, from any source. (Auto can't self-heal this way -- like Movie/Music/Game, it's a resolving command itself and never reads back under its own name, so picking it explicitly is the only way the integration learns you use it.)
- The Quick select's Pure button now sends that remembered submode's own command directly, defaulting to Pure Direct only if nothing's been remembered yet.
Verified end-to-end against real hardware this time: explicitly set Direct, switched to a different category (Movie), then confirmed the Quick Pure button restores Direct -- not Pure Direct.
Upgrade
- HACS users: update -> v0.3.10 -> restart Home Assistant.
- Manual users: replace
custom_components/denon_advanced_audio/files and restart.
v0.3.8 — Sound Mode (Quick) remembers last category
Sound Mode (Quick) remembers your last pick
v0.3.7 correctly explained why select.denon_sound_mode_quick reverts to unknown after picking Movie/Music/Game: those categories often resolve to a mode shared across all three (Stereo, Dolby Surround, DTS Neural:X, Multi Ch Stereo, Virtual), which the receiver's MS? readback can't distinguish between categories for. That's the common case, though -- so reverting to unknown every time wasn't very useful in practice.
What changed
The integration now remembers which category you last picked and keeps showing it instead of immediately reverting to unknown:
- Pick Music, it resolves to Stereo (a shared mode) -> the entity now keeps showing Music instead of unknown.
- The memory self-heals automatically whenever the receiver reports an unambiguous mode (Mono Movie, Rock Arena/Jazz Club/Matrix, Video Game, or anything under Pure) -- from any source, not just this integration. Change modes from the receiver's own remote or its app and land on something unambiguous, and the memory re-syncs to match.
- It's sanity-checked: a remembered "Pure" is never shown while a mode shared by Movie/Music/Game is active, since Pure never shares modes with the other three -- that combination is provably stale and is discarded rather than shown.
- Not persisted across a Home Assistant restart -- starts back at unknown until the next unambiguous reading or quick-select pick.
The full select.denon_sound_mode's option-narrowing and its mode_group attribute benefit from the same memory.
Upgrade
- HACS users: update -> v0.3.8 -> restart Home Assistant.
- Manual users: replace
custom_components/denon_advanced_audio/files and restart.
v0.3.7 — Sound Mode tables rebuilt from real hardware
Sound Mode, rebuilt from real hardware
v0.3.5/v0.3.6 shipped a Sound Mode mode table based on legacy Denon protocol documentation. Testing against an actual AVR-X3700H (probing telnet MS<mode>/MS? directly and cross-checking against the receiver's own web UI) turned up real discrepancies. This release replaces the guessed table with a verified one.
What was wrong
- "Dolby Digital", "DTS Surround", "Standard", "Left", "Right" don't exist on this firmware. The real modes are Dolby Surround (SET command
STANDARD, reads backDOLBY AUDIO-DSUR) and DTS Neural:X (SET commandDTS SURROUND, reads backNEURAL:X) -- confirmed working with zero audio signal present, so the previous "only show these when the source carries a matching bitstream" gating was built on a wrong premise and has been removed. - "Matrix" belongs to the Music category, not Movie.
- Movie/Music/Game/Pure aren't settable states -- they're categories. Sending
MSMUSICdoesn't set a "Music" state; it jumps to whichever concrete mode was last selected within that category (confirmed: it landed onSTEREObecause Stereo was the last-selected item there, exactly matching what the receiver's own UI showed as bold/selected). This is genuine AVR behavior -- the front-panel display doesn't show "MUSIC" either.
What changed
- Sound Mode (Quick)'s reported state is now honest about this: it only resolves to Movie/Music/Game/Pure when the active mode uniquely belongs to one category (e.g. "Mono Movie" -> Movie). For a mode shared across all three (Stereo, Dolby Surround, DTS Neural:X, Multi Ch Stereo, Virtual), the receiver genuinely doesn't expose which category is active -- so it now correctly shows unknown instead of a guess that's often wrong.
- Sound Mode's table and grouping now match the receiver's real UI structure: Movie/Music/Game share a common pool of 5 modes plus 1-3 exclusive to each (Mono Movie / Rock Arena+Jazz Club+Matrix / Video Game); Pure is a fully separate set of 3 (Direct, Pure Direct, Auto).
- "DTS Virtual:X" is recognized and displays correctly when it's the active mode, but isn't offered as a selectable choice -- no working SET command for it was found despite testing several candidates.
Upgrade
- HACS users: update -> v0.3.7 -> restart Home Assistant.
- Manual users: replace
custom_components/denon_advanced_audio/files and restart.
Thanks for testing this against real hardware and catching the mismatch -- if your receiver reports any raw sound mode not in this list, the raw_sound_mode attribute on select.denon_sound_mode will show it even when unrecognized, which is the fastest way to spot the next gap.
v0.3.5 — Sound Mode select entities
Control your AVR's surround mode from Home Assistant
Two new select entities to switch the receiver's sound mode directly from HA, via telnet (MS<mode>) -- the write-side companion to the read-only sensor.denon_sound_mode added in v0.3.3.
New entities
| Entity | Options | Notes |
|---|---|---|
select.denon_sound_mode_quick |
Movie / Music / Game / Pure Direct | The four common quick-select modes |
select.denon_sound_mode |
Auto, Standard, Direct, Stereo, Dolby Digital, DTS Surround, Mch Stereo, Virtual, Matrix, Rock Arena, Jazz Club, Mono Movie, Video Game, Left, Right | Full Denon IP protocol mode set. Hidden by default -- enable it in the entity settings if you want direct access to the less common modes |
Both read their current state from the same sound_mode polling already used by the existing sensor.
About mode availability
Which modes are actually selectable depends on the current input's format -- the AVR silently ignores a mode it doesn't support for the current source, the same way the front-panel/remote control behaves. Content-driven readouts like "Dolby Atmos" or "DTS:X" (what the AVR is decoding, not something you select) won't show as a selected option -- that's expected, not a bug.
As with other write operations in this integration, changing the mode while every zone is powered off now raises a visible error instead of failing silently (consistent with the v0.3.4 fix).
Upgrade
- HACS users: update -> v0.3.5 -> restart Home Assistant.
- Manual users: replace
custom_components/denon_advanced_audio/files and restart.
v0.3.4 — Fix stale now-playing sensors, silent write failures & channel guessing
Fixes
Now-playing sensors could get stuck on a stale value
The coordinator's stale-value fallback couldn't tell "telnet reply not received this cycle" apart from "receiver explicitly reported no signal" — both surfaced as None and got silently replaced with the previous reading. So when playback stopped or the input changed, sensors like Audio Format, Audio Sample Rate, Video Input/Output Resolution could keep showing outdated data indefinitely.
Fixed: genuine no-signal/no-rate replies ("---", "NON"/"NONE") are now normalized to an explicit "No signal" value instead of None, so these sensors update immediately. Transient telnet/HTTP failures still fall back to the last known value as before — no more flapping to unavailable on a brief network hiccup.
Sample rate codes without a "K" suffix showed the raw code
Some sample-rate replies (e.g. "441" for 44.1 kHz) don't use the "48K"-style suffix. These were shown as-is instead of being converted.
Fixed: sensor.denon_audio_sample_rate now correctly shows 44.1 kHz, 88.2 kHz, 176.4 kHz, etc.
Changing a setting with all zones off failed silently
If every zone was powered off, writing a setting (select/number/switch) sent nothing to the receiver but the UI still reported success — no indication anything went wrong.
Fixed: this now raises a visible Home Assistant error explaining that a zone needs to be powered on first.
Output Channels sensor assumed a subwoofer was always present
sensor.denon_output_channels hardcoded has_sub=True, which could misreport .1/.0 for sub-less setups.
Fixed: subwoofer presence is now derived from the reported subwoofer levels. The sensor is also renamed to Output Channels (Estimated) and disabled by default, since it remains a heuristic rather than a receiver-reported value.
Upgrade instructions
- HACS users: update via HACS → Denon Advanced Audio → Redownload → v0.3.4, then restart Home Assistant.
- Manual users: replace the
custom_components/denon_advanced_audio/files and restart Home Assistant.
No config changes needed. Existing entities keep their unique IDs.
Full changelog
- 🐛 Fix now-playing sensors getting stuck on stale values after signal loss or input change
- 🐛 Fix sample rate codes without a "K" suffix (e.g.
441) not being converted to kHz - 🐛 Fix settings writes silently failing when all zones are powered off — now raises a clear error
- 💅 Rename
Output ChannelstoOutput Channels (Estimated), disable it by default, and derive subwoofer presence from reported levels instead of assuming one is present - 🏷️ Version bumped to
0.3.4
Full diff: v0.3.3...v0.3.4
v0.3.3 — Sound Mode, Input Type & Output Channels
Complete signal-chain visibility
Three new diagnostic sensors that finish the "what is my AVR actually doing right now" picture, alongside the format info added in v0.3.0/v0.3.1.
New entities
| Entity | Source | Example |
|---|---|---|
sensor.denon_sound_mode |
telnet MS? |
STEREO, MOVIE, PURE DIRECT, DOLBY ATMOS |
sensor.denon_input_signal_type |
telnet SD? |
eARC, HDMI, Analog, Digital (Coax/Opt) |
sensor.denon_output_channels |
derived | 2.1, 5.1, 7.1.4 |
Now you can see the full chain:
🎵 Dolby Audio - DD · 48 kHz
🔊 Mode: STEREO → 2.1
🔌 Input: eARC
📺 4K50 → 4K50 · Passthrough
About Output Channels
Because the AVR does not expose the active channel layout directly on X3700H firmware, this sensor is an educated guess derived from sound_mode + SYSDA input format. It's accurate for typical content (Stereo → 2.1, Movie decoding Atmos → 7.1.4, etc.), but exotic upmix cases may differ. The sensor's attributes expose source_channels, sound_mode, and is_derived: true so this is always transparent.
Upgrade
- HACS users: update → v0.3.3 → restart Home Assistant.
- Manual users: replace
custom_components/denon_advanced_audio/files and restart.
Existing entities keep their unique IDs.
Full changelog
- ✨ Add
Sound Modesensor (telnetMS?) - ✨ Add
Input Signal Typesensor (telnetSD?) - ✨ Add
Output Channelssensor (derived from mode + input) - 🔌
telnet.pyextended with new command queries andSD_MAPlabel table - 🔧
api.pyextended to route the new fields (idempotent patch) - 🏷️ Version bumped to
0.3.3
Full diff: v0.3.2...v0.3.3
v0.3.2 — Cleanup and cards examples added
Cleanup and cards examples added
Full Changelog: v0.3.1...v0.3.2
v0.3.1 — Consistent Audio Category + friendly ARC labels
Fixes
Audio Category was contradicting Audio Format
On v0.3.0, sensor.denon_audio_category was derived from the AVR's SSINFAISSIG bitstream code. In practice, this code doesn't always refresh when the stream changes on X-series firmware — so you'd sometimes see Audio Format: Dolby Audio - DD+ next to Audio Category: DTS, which is nonsense.
Fixed: Audio Category is now derived from the SYSDA decoded-format string (the same source that feeds Audio Format). The two sensors can no longer disagree. The old SSINFAISSIG value is still exposed as an attribute for diagnostic purposes.
Unknown was confusing when watching TV Audio via ARC
When the AVR is on TV Audio (eARC/ARC), there is no HDMI input signal, so Video Input Resolution and Video Scaling correctly reported None — but Home Assistant rendered them as Unknown, which looks like a bug.
Fixed: friendlier states for the "no HDMI in" scenario:
| Sensor | Before | After |
|---|---|---|
| Video Input Resolution | Unknown |
No signal |
| Video Output Resolution | Unknown |
No signal |
| Video Scaling | Unknown |
TV Audio (ARC) (when output has signal but input doesn't) or No signal |
Upgrade instructions
- HACS users: update via HACS → Denon Advanced Audio → Redownload → v0.3.1, then restart Home Assistant.
- Manual users: replace
custom_components/denon_advanced_audio/sensor.pyandmanifest.jsonwith the new files, then restart Home Assistant.
No config changes needed. Existing entities keep the same unique IDs — no re-linking required.
Full changelog
- 🐛 Fix Audio Category / Audio Format contradiction — derive category from
SYSDAinstead ofSSINFAISSIG - ✨ New helper
category_from_sysda()covering Dolby, DTS, PCM, Multi-ch PCM, Analog, MPEG, AAC, MP3, FLAC, ALAC, WAV, DSD, WMA - 💅
Video Input ResolutionandVideo Output ResolutionshowNo signalinstead ofUnknown - 💅
Video ScalingshowsTV Audio (ARC)when only the output side has a signal (eARC/ARC scenario), andNo signalwhen neither side does - 📎 Original SSINFAISSIG category still available as an attribute on
sensor.denon_audio_categoryfor diagnostics - 🏷️ Version bumped to
0.3.1
Full diff: v0.3.0...v0.3.1
v0.3.0 — Now Playing Quality sensors
What's new
Six new read-only diagnostic sensors that surface what the AVR is actually decoding and outputting right now — perfect for verifying that Atmos, DTS:X, or 4K passthrough is really reaching your receiver.
New entities
| Entity | Example state |
|---|---|
sensor.denon_audio_format |
Dolby Atmos, Dolby Audio - DD, DTS-HD MA, DTS:X, PCM |
sensor.denon_audio_category |
Dolby / DTS / PCM / Multi-ch PCM / Auro-3D / HEOS/Streaming |
sensor.denon_audio_sample_rate |
48 kHz, 96 kHz, 192 kHz |
sensor.denon_video_input_resolution |
4K50, 1080p60, 2160p24 |
sensor.denon_video_output_resolution |
4K50, 1080p60, 2160p24 |
sensor.denon_video_scaling |
Passthrough / Upscaling / Downscaling |
All six are grouped in Home Assistant's Diagnostic section on the device page and update automatically as the source device (Blu-ray, streaming box, console) switches formats.
How it works
The Denon /ajax/* HTTP API does not expose live playback format info — only setup menu values. To bridge that gap, the integration now opens a very brief telnet connection (~1 second) once per poll cycle, sends four queries (SSINFAISSIG ?, SSINFAISFSV ?, SSINFSIGRES ?, SYSDA ?), and closes the socket.
Everything else in the integration (Speaker Presets, Audyssey, Zone Power, ECO, etc.) still uses pure HTTP — nothing else has changed.
v0.2.1 — HTTP client session reuse
Reuses the shared HTTP client session (HTTP Keep-Alive) for faster response times and lower resource usage, and checks zone power before setting changes to prevent receiver API lockups.