No description
  • C# 71.6%
  • HTML 23.6%
  • CSS 3.8%
  • JavaScript 0.7%
  • Shell 0.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Perkka2 ec8352229d
Some checks are pending
Release / build (macos-15, osx-arm64) (push) Waiting to run
Release / build (macos-15, osx-x64) (push) Waiting to run
Release / build (ubuntu-latest, linux-arm64) (push) Waiting to run
Release / build (ubuntu-latest, linux-x64) (push) Waiting to run
Release / build (windows-latest, win-arm64) (push) Waiting to run
Release / build (windows-latest, win-x64) (push) Waiting to run
Release / release (push) Blocked by required conditions
fix: zone setup writes, volume slider lag and setup menu names
- Write setup values the way the receiver's own UI does: the bare tag,
  not wrapped in the document root (ZONE2 Setup took 200 and ignored it,
  ECO answered 501). Nested settings keep the groups the UI names
  (AutoStandby), and Firmware switches are written as their group.
- Offer ZONE2 Setup Volume Level (incl. Variable), Volume Limit and
  Power On Level as dropdowns; fix Lch/Rch level codes.
- Ignore late volume echoes while a drag or step is in flight, step
  zone 2/3 in whole dB, and make +/- send absolute volumes.
- Name setup screens from breadcrumbs and the string table's words
  (Crestron Connected, Quick Select Options), and let tile labels wrap.
2026-10-15 14:56:41 +02:00
.github/workflows build: publish as single-file executable 2026-10-06 15:43:07 +02:00
Components fix: zone setup writes, volume slider lag and setup menu names 2026-10-15 14:56:41 +02:00
docs fix: zone setup writes, volume slider lag and setup menu names 2026-10-15 14:56:41 +02:00
Models fix: zone setup writes, volume slider lag and setup menu names 2026-10-15 14:56:41 +02:00
Pages feat: add HEOS login, playlists and more 2026-09-24 15:05:14 +02:00
Properties feat: initial Blazor Server remote for Denon AVRs 2026-09-22 05:42:14 +00:00
Services fix: zone setup writes, volume slider lag and setup menu names 2026-10-15 14:56:41 +02:00
Shared feat: initial Blazor Server remote for Denon AVRs 2026-09-22 05:42:14 +00:00
wwwroot fix: zone setup writes, volume slider lag and setup menu names 2026-10-15 14:56:41 +02:00
.gitignore feat: initial Blazor Server remote for Denon AVRs 2026-09-22 05:42:14 +00:00
_Imports.razor feat: initial Blazor Server remote for Denon AVRs 2026-09-22 05:42:14 +00:00
App.razor feat: initial Blazor Server remote for Denon AVRs 2026-09-22 05:42:14 +00:00
appsettings.Development.json feat: initial Blazor Server remote for Denon AVRs 2026-09-22 05:42:14 +00:00
appsettings.json feat: initial Blazor Server remote for Denon AVRs 2026-09-22 05:42:14 +00:00
DenonRemote.csproj build: publish as single-file executable 2026-10-06 15:43:07 +02:00
Program.cs fix: zone setup writes, volume slider lag and setup menu names 2026-10-15 14:56:41 +02:00
publish.sh build: publish as single-file executable 2026-10-06 15:43:07 +02:00
README.md feat: add HEOS group volume 2026-09-30 08:47:05 +02:00

Denon Remote

A fast replacement for the web interface built into Denon AVR receivers — for the AVR-X4100W and AVR-X2500H, and anything speaking the same control protocol.

The receivers' own page does a full HTTP round trip per action and re-reads the whole status document each time. This keeps the control socket open instead, so a tap is a few bytes on a connection that is already up, and changes made from the physical remote or the front panel appear here immediately.

Blazor Server on .NET 8. No account, no cloud, nothing leaves the network.

The Remote tab: power, volume, inputs, sound mode, Quick Select and scenes

Running it

dotnet run

Open http://localhost:5080. It listens on 0.0.0.0:5080, so from a phone on the same wifi use http://<your-machine>.local:5080. Add it to the home screen on iOS and it opens full-screen.

On first run: Setup → Scan for receivers, or add an IP by hand if your network blocks SSDP. Receivers and scenes live in ~/.denonremote/.

Builds that need no .NET installed are attached to each release for macOS, Windows and Linux, on both Intel and ARM.

What it does

Remote — power, volume, mute, inputs and sound mode, per zone. Zone 2 and Zone 3 appear only if the receiver has them. Input names, zone names and Quick Select names come from the unit itself, so the grid shows what you named things and hides inputs you deleted. Quick Select 1–4 are the receiver's own slots; scenes are app-side presets that set input, volume, sound mode and the other zones together — something the hardware can't do.

Sound — the settings buried deepest in the on-screen menu: tone, channel trims, Audyssey, Dynamic Volume, Restorer, and the full Surround Parameter menu. The app asks about all of them and shows the ones this receiver answered for, so what you see applies to your setup.

The Sound tab: tone, Audyssey, channel levels and surround parameters

EQ — the 9-band graphic EQ. This is not in Denon's published control protocol, nor in Home Assistant's denonavr integration; each generation drives it from its own setup UI over HTTP, and both mechanisms were read off the receivers rather than guessed. See docs/protocol.md.

The EQ tab: nine bands with speaker and channel selection

Setup — the receiver's own configuration, read live and shown in its own words: amp assign, speaker config, distances, levels, crossovers, HDMI, input assign, zone setup, and the rest. The menus, their order and their names come from the receiver each time rather than from a list kept here, so a unit with settings this one has never seen shows them anyway.

The Setup tab: the receiver's own menus with a speaker configuration page open

Playing — now playing and transport. The X2500H has HEOS; the X4100W predates it and is driven through the interface its own web UI uses. Music — browse and search the HEOS sources (local library, playlists, favorites, TuneIn and the streaming services the HEOS account has) and play or queue what is found. The Rooms panel on the Playing tab lists every HEOS player on the network: pick which to control, group rooms, and set their volumes — a grouped set gets one fader and one mute for the whole group, alongside each room's own.

A HEOS-only speaker or link has no receiver to remote, so it gets just Playing and Music, with volume and mute added. Neither it nor browsing has been tried on real hardware.

The Playing tab: track information with transport and repeat controls

System, Menu, Tuner — ECO mode, dimmer, auto-standby, HDMI routing; the cursor pad for the on-screen menus; frequency and presets while the tuner is selected.

Guardrails — a per-receiver volume ceiling nothing can exceed, a confirm step for a big slider jump, a sleep timer, and a night mode.

Protocol console — send any raw command and watch both directions live. This is the tool for working out commands that aren't in the protocol document.

A few things worth knowing

Every phone, tablet and laptop looking at the app shares one socket per receiver and sees the same live state, which also sidesteps the receivers' limit on concurrent control connections.

Every command verifies itself. The receiver answers a command it accepted and stays silent on one it doesn't support, so each change is followed by a query. A command that goes unanswered is reverted in the UI and reported as unsupported rather than sitting there looking applied.

The app never guesses on the receiver's behalf. Where it can read something from the unit — names, menus, allowed values, which settings apply — it does, and where the unit won't say, it says so instead of inventing a default.

Volume is shown as the number on the receiver's front panel.

Documentation

  • docs/protocol.md — the undocumented HTTP interfaces: the graphic EQ on both generations, the setup API, the pre-HEOS network player, and how they were found.
  • docs/maintaining.md — building and releasing, the layout of the source, the self-test, and the things that will bite whoever touches this next.

Status

Runs against both receivers on a home network. Checks:

dotnet run -- --self-test

312 checks over the parts that have actually had bugs — protocol parsing, command encoding, both graphic-EQ payload shapes, the setup API's XML, the network player's two screen modes, and the request pacing. It's a flag on the app rather than a test project, so it needs no packages and runs anywhere the app runs; the publish script and the release workflow both run it before building.

Beyond that the app is driven through a headless browser against stand-ins that speak the control protocol, the HEOS command line and the HTTP endpoints — including the real captured setup pages from both receivers.