Denon / Marantz AVR integration for Gladys Assistant

Control a Denon or Marantz AV receiver: power, volume, mute, source — auto-discovered, no cloud.
Control a Denon or Marantz AV receiver from Gladys: power, volume, mute and input source. Works with the "AVR Control" protocol shared by (almost) the whole Denon/Marantz networked receiver lineup — not tied to a specific model.
Overview
The integration talks directly to your receiver over the local network (Telnet, TCP port 23) — no cloud account, no internet dependency. The receiver itself pushes every state change (power, volume, mute, source) as soon as it happens, whether triggered from Gladys, the physical remote, or the Denon/HEOS app, so the dashboard stays in sync in real time.
These show up per receiver:
- Power — on/off, controllable.
- Volume — 0-100%, controllable (mapped from the receiver's internal -80 dB to +18 dB scale). Confirmed on real hardware: one specific percent (25% on the default scale) can never stay put — setting it snaps to 26% instead. This is a genuine hardware limit (the receiver only has 99 discrete volume steps for the 101 possible percent values), not a bug this integration can fix.
- Mute — on/off, controllable.
- Source — a dropdown of the receiver's input codes (e.g.
TUNER,BD,NET), directly on the dashboard. The Select input action described below does the exact same thing and stays available as an alternative — useful if your Gladys instance is on an older version that doesn't render the dropdown yet. You can rename or hide entries — see Configuration below. - Source index — the same source control as a plain number instead of a dropdown: 0 is the first entry currently shown in the Source dropdown above, 1 the second, and so on. If you hide an entry (see Configuration below), every entry after it shifts down by one — the numbering always matches what's actually visible in the dropdown at the time. This exists for scenes: see "Automating source/sound mode from a scene" below for why you may or may not need it, depending on your Gladys version.
- Sound mode — a dropdown of surround/sound modes (e.g.
MOVIE,STEREO,PURE DIRECT). Fewer receivers behave identically here than for the other controls — if a mode you use on the physical remote doesn't appear, it's likely just missing from the generic list this integration ships with. - Play / Pause / Next / Previous — buttons that control playback on a network/USB/streaming source (Qobuz, Spotify Connect, TIDAL, internet radio...). They do nothing on a source that isn't a player (a TV input, for instance). These need a Music box, not the plain device list: on your dashboard, add a box and pick Music as its type, then this AVR as its device — that's what actually renders the play/pause/skip buttons. In the regular device list they only show up as plain rows with no visible value, which is expected there. On a HEOS-equipped receiver, these buttons are sent over HEOS whenever possible, since that's the actual control path for HEOS-managed sources like Qobuz or Spotify Connect — see "HEOS support" below.
- Now playing — a read-only "Artist - Title" line, filled in automatically while streaming. For an internet radio station with no track metadata, the "Artist" slot falls back to the station's own name (e.g. "Oui FM") — the same name the receiver's front display shows — instead of staying blank next to a generic stream description like "63 kbps aac".
- Play notification — backs Gladys' built-in "Speak on a speaker" scene action: pick this AVR from that action's speaker dropdown and it reads your text out loud. Requires HEOS (see "HEOS support" below) — there is no legacy-Telnet way to play an arbitrary audio URL, so this only appears/works once a HEOS player id has been matched for this receiver. The volume slider in that scene action has no effect here: Gladys does not forward it to this kind of integration (a core limitation, not something this integration can work around) — the announcement plays at the receiver's current volume. This is also the one feature here that works on a standalone HEOS speaker (Denon Home, HEOS 1/3/5/7, Bar...) added through the manual IP fallback in Configuration, not just a real AV receiver — everything else on this page (Power, Volume, Source...) still needs the Telnet-based "AVR Control" service those speakers don't have, so this integration otherwise won't work with one at all. Triggering this scene action repeatedly in quick succession replaces whatever is currently speaking rather than queuing behind it — the queue is cleared before every announcement, confirmed necessary on real hardware (without it, a burst of announcements played back one after another instead of just the last one).
- Setup-menu remote control — cursor Up/Down/Left/Right, Enter, Return, Info, Menu and relative Volume Up/Down, shown as clickable buttons directly in the device list (no extra dashboard box needed). Handy for navigating the receiver's on-screen Setup menu from Gladys instead of hunting for the physical remote. Don't want all of them cluttering a dashboard? Hide the ones you don't use the same way you'd hide any other device feature — nothing to configure on this integration's side.
Automating source/sound mode from a scene
In a scene, the generic "Control a device" action is what sets Source/Sound mode/
Source index — there's no scene action for a manifest's own custom buttons (Select input
here), on any Gladys version.
- On Gladys 4.86.1 or newer, "Control a device" already shows a proper labeled dropdown for
SourceandSound mode, exactly like the dashboard — just pick the device, then the feature, then the value.Source indexstill works too if you'd rather set a plain number. - On an older Gladys, that dropdown either isn't offered or doesn't accept the value — use Source index instead: it's a plain number, which "Control a device" has always been able to set, and it maps to the same input as the dropdown (position in the currently visible Source list, 0 = first entry).
- If "Control a device" shows nothing at all for this AVR (no
Source/Sound modedropdown, noSource indexeither): try a hard refresh / clear your browser cache first — confirmed once to be the actual cause, a stale cached front-end bundle showed a completely empty picker for this device while other integrations (MQTT, Zigbee2MQTT) still worked fine, fixed instantly by clearing the cache, no configuration change needed. Still nothing after that? The device was likely added before this integration shippedSource index, combined with a Gladys core older than 4.86.1 — open this integration's Discovery tab, run a scan, and click Update on the device, the same as any other structural change (see Configuration below).
HEOS support
Denon/Marantz receivers with a HEOS module (most current network models) run HEOS as a separate service alongside the classic Telnet control used for everything else on this page. Streaming sources like Qobuz, Spotify Connect, TIDAL or TuneIn are actually played back through HEOS — the classic transport commands this integration used before have no effect on them at all.
Starting with this version, the Play/Pause/Next/Previous buttons talk to HEOS automatically when the receiver supports it: no configuration needed, nothing to turn on. If HEOS isn't reachable (no HEOS module, or its network port is blocked), the buttons transparently fall back to the classic commands, which still work for the receiver's own non-HEOS Net/USB sources.
Once HEOS is confirmed for your receiver, it also becomes the source for the playback state and the "Now playing" title/artist — refreshed both when HEOS pushes a change and on a background check every 30 seconds, so the dashboard catches up on its own within half a minute even if a push notification is missed (this can happen if the HEOS connection drops briefly, which is a known HEOS behavior on an idle connection).
Limits: this is implemented from HEOS's own (unofficial, but widely used) network protocol, cross-checked against the library behind Home Assistant's official HEOS integration — not tested by the developer against a live HEOS streaming session, since that requires an actual paid streaming account. If the buttons don't do anything on your setup even though the receiver is reachable, please report it (with the logs mentioned below) so it can be fixed.
Prerequisites
- A Denon or Marantz AV receiver with a network (Ethernet/Wi-Fi) connection.
- Network Standby (sometimes labelled "ECO" standby) enabled in the receiver's setup menu. Without it, the receiver drops off the network entirely when powered off and Gladys cannot reach it (including to turn it back on).
- Gladys and the receiver on the same LAN/VLAN, with multicast allowed between them (needed for automatic discovery — see below).
Configuration
- Open the Discovery tab of the integration and run a scan. Denon/Marantz receivers answer automatically (SSDP/UPnP) — no IP to type, no account. The receiver should appear with its real name and model.
- Add the discovered device. Gladys keeps a persistent connection to it from then on.
- If nothing is found: your network likely blocks multicast between segments (VLANs, several
network interfaces on the Gladys host, some mesh Wi-Fi setups...). Open the integration's
Configuration tab and fill in the receiver's IP address manually, save, then scan again —
it will show up as a fallback entry. Several receivers the scan can't reach (e.g. on different
networks)? Enter their addresses separated by commas, e.g.
192.168.1.50, 192.168.2.50— each one becomes its own fallback entry. A fixed IP or a DHCP reservation for every receiver is recommended in that case, since the manual entry does not track IP changes automatically. - Two actions are available from the Configuration screen for any AVR you added:
- Test connection — queries the receiver and reports its current power/volume/mute/source (with its index, see "Source index" above)/sound mode.
- Select input — pick an input from the standard list of Denon/Marantz source codes and switch to it.
- Rename or hide sources on the dashboard dropdown (Configuration tab, advanced): the
dropdown shows generic codes like
SAT/CBLorGAME, not what you actually plugged in. Fill inCODE=Labelpairs separated by commas to rename them — e.g.SAT/CBL=Chromecastif that's what's on that input — orCODE=(nothing after the=) to remove an entry you never use, e.g.SAT/CBL=Chromecast, GAME=. After saving, run a Discovery scan again and click Update on the device — the dropdown's choices are part of the device's structure, so they don't refresh just because the configuration changed.
Troubleshooting
- Nothing found by the scan: check that Gladys and the receiver are on the same network segment and that multicast/UPnP is not filtered by your router or switches, then use the manual IP fallback (see above).
- Discovered but commands don't apply / no feedback: make sure Telnet (port 23) isn't disabled or firewalled on the receiver's network interface, and that no other controller is hogging the Telnet session in a way that blocks new ones (rare, but some models cap concurrent Telnet clients).
- Receiver unreachable while powered off: enable Network Standby / ECO standby in the receiver's setup menu (see Prerequisites).
- The integration logs everything it does: check the integration logs from the Gladys UI (or
docker logson the host). Note that Gladys itself has no way to setLOG_LEVEL=debugon an installed integration's container (it isn't one of the fixed environment variables Gladys sets, nor a config field) — that flag only applies when running this integration yourself outside Gladys (see "Run it locally" in the developer README). Every log line that actually matters for troubleshooting (a receiver connecting, a HEOS player id being matched, a "Speak on a speaker" stream being accepted or rejected...) is deliberately kept atinfolevel or above for exactly this reason, so it shows up withoutdebug; only the very verbose Telnet-line-by-line detail isdebug-only and effectively out of reach from a normal Gladys install. - Sound mode, playback buttons or now-playing don't work as expected: these rely on parts of
the protocol that vary more across models/firmware than power/volume/mute/source. Compare what
your remote actually sends against what this integration expects — since the raw line-by-line
detail needed for that is
debug-only (see above), usescripts/debug-telnet.js/scripts/debug-heos.jsdirectly against the receiver instead of the container logs. - Playback buttons still do nothing on Qobuz/Spotify Connect/TIDAL: check the logs for a line mentioning "HEOS player id ... matched" shortly after the AVR connects — if it's not there, this receiver's HEOS CLI service (port 1255) wasn't reachable (firewall, older non-HEOS model, or HEOS momentarily not ready) and the integration silently fell back to the classic commands, which don't reach HEOS-managed sources.
- "Speak on a speaker" doesn't show up in the speaker list at all: the device was likely created before this feature shipped — open this integration's Discovery tab, scan, and click Update on the device (see "Re-publishing a device" under Discovery).
- The scene runs with no error, but nothing plays on the Denon: this is normal-looking on the
Gladys side even on failure — a scene logs a failed action and reports as having run either way,
it never surfaces an error to the user for this particular action. Check, in order:
- Run Test connection from this integration's Configuration screen: its reply now ends with
a line like
HEOS: player id 12345 matchedorHEOS: not connected/no player id matched. Anything other than "player id ... matched" means HEOS itself is the problem — same requirement, same causes as the playback buttons above (firewalled port 1255, older non-HEOS model, or HEOS not ready yet after a restart). - If HEOS is connected but reports no player id matched, check the logs for a line
naming the IPs HEOS actually sees (
HEOS reports: ...) — a receiver with more than one network interface (Ethernet + Wi-Fi) can advertise a different address to HEOS than the one this integration is using, which prevents the match forever. - If a player id is matched, check the logs for the outcome of the stream itself: a line saying HEOS rejected the stream (with an error code/text from the receiver) means the TTS URL wasn't playable as far as the receiver is concerned (unreachable from the receiver's own network, wrong format...). A line saying HEOS accepted it and you still hear nothing should not happen any more (confirmed and fixed on real hardware: an earlier version percent-encoded the stream URL, which some receivers accept without complaint — result: success, a generic "Url Stream" placeholder even shows up as the current track — and then never actually fetch, so nothing plays no matter the input, power, volume, or mute state; see the developer README's "Speak on a speaker" section for the root cause). If it still happens on an up-to-date install, please report it.
- Run Test connection from this integration's Configuration screen: its reply now ends with
a line like
Configuration settings
These are the settings Denon / Marantz AVR asks for in its configuration screen in Gladys.
| Setting | Type | Required | Description |
|---|---|---|---|
| Getting started | section | No | Denon/Marantz AVRs are found automatically on the LAN (SSDP/UPnP) — open the Discovery tab and run a scan. Make sure 'Network Standby' (or 'ECO' network standby) is enabled in the receiver's setup menu so it stays reachable while off. If your network blocks multicast (VLANs...), fill in the manual IP below instead. |
| Manual IP/hostname (fallback) | string | No | Only needed if the automatic scan does not find (all of) your receiver(s). Leave empty otherwise. Several networks/receivers: separate multiple addresses with commas, e.g. "192.168.1.50, 192.168.2.50". |
| Telnet port (advanced) | number | No | Every Denon/Marantz model uses 23. Change only for a non-standard setup. |
| Reconnect backoff base (s) | number | No | Base delay before a Telnet reconnect attempt; it grows with consecutive failures, capped at 120 s. |
| Rename/hide sources (advanced) | string | No | Customize the source dropdown: comma-separated CODE=Label pairs to rename an entry (e.g. "SAT/CBL=Chromecast" if that's what's actually plugged into that input), or CODE= (empty label) to hide one entirely, e.g. "SAT/CBL=Chromecast, GAME=". Codes are the ones listed under Select input. After changing this, re-run a Discovery scan and click Update on the device — a dropdown's choices are part of its structure, so a config change alone does not refresh it. |
How to install Denon / Marantz AVR in Gladys
- In Gladys, open Integrations: Denon / Marantz AVR appears in the catalog, next to the native integrations, with a community badge.
- Click Install. Gladys pulls the Docker image (
ghcr.io/lm1lc3n7/gladys-denon-avr:1.0.18), starts it in a sandbox isolated from the core, and generates the integration's interface (devices, discovery and configuration). - Open the Configuration screen of the integration, fill in the settings, and save.
- You can also install it directly from its repository URL: https://github.com/LM1LC3N7/gladys-denon-avr.
Denon / Marantz AVR requires Gladys >=4.86.1. The catalog inside Gladys refreshes every hour, so a new version becomes available at most one hour after its release.
Not running Gladys yet? It is free and open source: follow the installation guide to get started.
About external integrations
Denon / Marantz AVR is an external integration: a community integration packaged as a Docker container and published on GitHub, that Gladys installs in one click and runs in a sandbox isolated from its core. It is published and maintained by LM1LC3N7, not by the Gladys core team.
- Browse all external integrations
- Discover the native integrations built into Gladys
- Build and publish your own external integration
- Source code on GitHub — source of this documentation