Skip to content

Releases: triumfas/Denon-Advanced-Audio

v0.3.10 — Pure quick-select actually fixed

Choose a tag to compare

@triumfas triumfas released this 12 Sep 11:03

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_submode remembers 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

Choose a tag to compare

@triumfas triumfas released this 12 Sep 09:39

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

Choose a tag to compare

@triumfas triumfas released this 12 Sep 09:24

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 back DOLBY AUDIO-DSUR) and DTS Neural:X (SET command DTS SURROUND, reads back NEURAL: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 MSMUSIC doesn't set a "Music" state; it jumps to whichever concrete mode was last selected within that category (confirmed: it landed on STEREO because 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

Choose a tag to compare

@triumfas triumfas released this 12 Sep 08:45

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

Choose a tag to compare

@triumfas triumfas released this 06 Sep 10:09

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 Channels to Output 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

Choose a tag to compare

@triumfas triumfas released this 05 Jul 12:41

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 Mode sensor (telnet MS?)
  • ✨ Add Input Signal Type sensor (telnet SD?)
  • ✨ Add Output Channels sensor (derived from mode + input)
  • 🔌 telnet.py extended with new command queries and SD_MAP label table
  • 🔧 api.py extended 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

Choose a tag to compare

@triumfas triumfas released this 04 Jul 18:03

Cleanup and cards examples added

Full Changelog: v0.3.1...v0.3.2

v0.3.1 — Consistent Audio Category + friendly ARC labels

Choose a tag to compare

@triumfas triumfas released this 04 Jul 15:41

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.py and manifest.json with 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 SYSDA instead of SSINFAISSIG
  • ✨ New helper category_from_sysda() covering Dolby, DTS, PCM, Multi-ch PCM, Analog, MPEG, AAC, MP3, FLAC, ALAC, WAV, DSD, WMA
  • 💅 Video Input Resolution and Video Output Resolution show No signal instead of Unknown
  • 💅 Video Scaling shows TV Audio (ARC) when only the output side has a signal (eARC/ARC scenario), and No signal when neither side does
  • 📎 Original SSINFAISSIG category still available as an attribute on sensor.denon_audio_category for diagnostics
  • 🏷️ Version bumped to 0.3.1

Full diff: v0.3.0...v0.3.1

v0.3.0 — Now Playing Quality sensors

Choose a tag to compare

@triumfas triumfas released this 04 Jul 15:32

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

Choose a tag to compare

@triumfas triumfas released this 04 Jul 14:08
c6694b6

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.