External integration - Denon / Marantz AVR

Feedback on the new version: Speaking on a speaker works for my amplifier and my Denon speaker.

I noticed a strange bug with the volume slider that goes from 24% to 26%, impossible to get 25%.

Another strange behavior, I created a scene to test sending a message. If I run it more than once in a short time frame, the scene execution generates a message that repeats

Good news, it’s moving forward!

Denon/Marantz AVR Integration Update

Two fixes following user feedback on « Speak on a Speaker »:

  • Fix: Triggering the action multiple times in quick succession caused messages to pile up in the amplifier’s queue, which then played them back one by one in sequence. The queue is now cleared before each announcement, so only the last message counts.

  • Clarification: The volume slider cannot display 25% (or 75%) stably — it automatically reverts to 26% (or 76%). This is a hardware limitation of the amplifier (98 volume steps to represent 101 values from 0 to 100%), not a fixable bug on the integration side.

Cool, it works. It’s great to finally be able to use my amp and the speaker. Great job.

If you can manage to control the volume on the HEOS speakers, that would be awesome :star_struck:

I thought it worked anyway, is that not the case? I’d be happy to have logs for debugging in this case!

Here are my logs

image

I just saw your reply, I’ll check it out!

v1.0.19 : Fix volume/mute control on a standalone HEOS speaker (Denon Home, HEOS 1/3/5/7, Bar…) added via manual IP.

These speakers do not have the Telnet « AVR Control » service of a real amplifier, so Volume, Volume +/- and Mute now automatically go through HEOS when Telnet is not reachable. No change for a real amplifier-tuner (classic Telnet remains priority).

Remember to update the container to test (@Tolkyen)

I just tested it, it works. It’s great.

While doing my tests, I noticed that when using the « Speak on a Speaker » action in scenes, the Volume parameter of the action has no effect (Ampli and Denon Home). To work around this, I set the volume of the speaker before the action so that it works

I’m doing the same for now, I need to dig deeper.

This is not a bug in this integration but a limitation of Gladys core itself (according to Claude @pierre-gilles).

By checking server/lib/external-integration/externalIntegration.registerProxyService.js in Gladys core, the proxy that all external integrations (Docker) go through only passes the value field (the already generated TTS audio URL) to onSetValue() — the options object containing the volume slider value of the « Speak on a speaker » action is purged before even reaching the WebSocket. Unlike internal integrations (Sonos, Google Cast, AirPlay) that receive options as a normal function argument, an external integration like this one has no way of seeing or acting on the slider value — the announcement is always read at the device’s current volume, regardless of what the scene editor displays.

Hi everyone,

I have a Denon S650H amplifier and I can’t get the notification broadcast to work.

I set up my scene, write my message, and when I launch the scene, nothing happens on the amplifier side.
Here are the logs I observe.

[2026-09-27T08:50:46.548Z] [INFO] Starting the Denon/Marantz AVR integration...
[2026-09-27T08:50:47.141Z] [INFO] [gladys-sdk] connected to Gladys (http://172.30.0.1:80)
[2026-09-27T08:50:47.243Z] [INFO] [denon-telnet] Connected to 192.168.100.245:23
[2026-09-27T08:50:47.243Z] [INFO] [avr] ext:ext-lm1lc3n7-gladys-denon-avr:avr:manual:192.168.100.245: connected (main zone), seeding initial state
[2026-09-27T08:50:47.246Z] [INFO] [heos-cli] Connected to 192.168.100.245:1255
[2026-09-27T08:50:47.255Z] [INFO] [avr] ext:ext-lm1lc3n7-gladys-denon-avr:avr:manual:192.168.100.245: HEOS player id -229519882 matched to 192.168.100.245 (main zone)
[2026-09-27T08:50:52.259Z] [INFO] [denon-discovery] SSDP scan: 0 Denon/Marantz AVR(s) found

I’m just wondering:

  • If my amplifier is in standby, I assume it should wake up on its own first?
  • If my amplifier is already on, do I need to change the source to broadcast the message?

Hi,

For your two questions:

  • Amplifier in standby: yes, it wakes up on its own. Since version 1.0.21 (which you have, as seen in the connected (main zone) line), the integration turns on the main zone before the announcement.

  • Amplifier already on: yes, it switches to the network/HEOS (NET) input, as this is the only way to make it play an audio file. It does not automatically return to the previous source.

In your logs, an important line is missing. When Gladys sends the announcement, the integration always writes:
onSetValue ← …:play_notification = https://…
followed by HEOS accepted the « Speak on a speaker » stream (or rejected, with the reason).

If you don’t have any of these lines after running the scene, it means Gladys never sent the message to the amplifier. The amplifier/HEOS part is fine on your end: the HEOS player is correctly found. You should therefore check on Gladys’s side:
Gladys Plus: the text-to-speech feature (« Speak on a speaker ») goes through Gladys Plus. Without an active subscription, the scene fails silently, and the error only appears in the Gladys server logs (docker logs gladys), not in the integration logs.

Amplifier added before this feature: run a scan in the Discovery tab, click Update on the amplifier, then select it again in the scene action.
If you see onSetValue ← …play_notification… but still no sound, send me the following lines.

Hi everyone,

Important update for the Denon / Marantz integration, 1.0.22, which takes advantage of the new features in Gladys 5.1. Gladys 5.1.0 minimum is required. If you are on an older version, you will stay on 1.0.21 until Gladys is updated.

In detail:

Widgets for the dashboard (Edit dashboard → add a card → Denon / Marantz AVR):

  • Now playing: album cover or radio logo, title, artist, input, sound mode, live volume, and the previous / play-pause / next / mute buttons. This is what was missing from Gladys’s Music card, which does not display the title or cover for an amplifier.
  • Shortcuts: 4 buttons to choose from inputs, Quick Select 1 to 5 (Smart Select on Marantz) and HEOS favorites. The active one is checked.
  • Amplifier: status at a glance (on, input, sound mode, mute) with the volume, and the power/standby, volume +/− and mute buttons.
  • Remote control: 4 keys to choose (arrows, OK, back, menu, info…). Several are placed side by side to have a complete keypad.
  • Radio: for those who use the FM/AM tuner, with frequency, preset, band and 4 buttons to choose. The amplifier automatically switches to the Tuner input if needed.

Actions and scene triggers (search for "Amplifier: " in the editor):

  • Actions: recall a Quick Select, play a HEOS favorite, « set the amplifier » (turn on, input, sound mode and volume in one action, practical for a Movie scene), and read the amplifier state to do a « Continue only if » on the input for example.
  • Triggers: « the input has changed » (e.g. switching to TV → dim the lights) and « the track has changed ».

« Speak on a speaker » improved: the volume chosen in the scene still does not reach external integrations, it’s a limit of Gladys. There is now a Announcement volume setting in the configuration. Above all, once the announcement is finished, the amplifier returns to its previous state: volume, input, and it goes back to standby if it was. This answers the comments from @Tolkyen and @guim31 above, where the amplifier remained on the NET input after an announcement. What HEOS was playing before (radio, playlist) does not resume automatically, however.

Less visible side:

  • Each amplifier now has its own connection badge in the device list (local / unreachable). An orange dot with the explanation appears if only HEOS responds, or if HEOS cannot find the amplifier at its IP, which is the classic cause of a silent « Speak on a speaker ».
  • If the amplifier changes IP (DHCP), a Discovery scan then « Update » is enough, no need to restart the integration. Same for a port change or renaming of sources, applied immediately.
  • Fix a possible crash of the integration on some HEOS messages.
  • Much fewer unnecessary writes in Gladys’s history: the playback state was re-recorded every 30 seconds even without change, which was about 2,900 lines per day and per amplifier.
  • Major cleanup in the code (split into modules, much more tests), without visible change.

No need to click on « Update » on the device for this version: the widgets and scenes are available directly after the integration update.

I haven’t been able to test the widgets, scenes and return after announcement on real hardware with Gladys 5.1 yet. Your feedback is therefore welcome, especially on Marantz, in multi-zone and with the tuner. Don’t hesitate to post the integration logs if something is stuck.

Happy listening!

Hi everyone,

New update 1.0.23 for the Denon/Marantz integration, with a big new feature: radio ad break detection :radio:

The principle: when you listen to a radio via HEOS (TuneIn, a favorite, a stream URL), the integration learns when the station plays its ads. During the breaks, it lowers the volume, then brings it back when the music resumes. If you adjust the volume in the meantime, your setting takes precedence.

It’s disabled by default. To enable it:

  1. update the integration;
  2. check « Detect radio ad breaks » in the configuration;
  3. restart a Discovery and click « Update » on your amplifier to get the new features.

In detail:

  • How it detects ads: based on title changes. It works on radios that provide their titles via HEOS, and on OUI FM and other Indés Radios (Voltage, Alouette, Hit West…), followed via their website stream. Bonus on these radios: the real title is displayed in « Now playing » instead of just the station name.
  • The ad jingle: it also learns the jingle of each station by listening to the stream. Once it has recognized it several times, it lowers the volume right on it.
  • Radios without titles: you teach it the schedule with the « Radio ad break » switch (on when the ad starts, off when it ends). Then it manages on its own, even if you turn on the radio in the middle of an ad.
  • The volume always comes back: max 10 min break. Volume restored if the integration restarts or if the connection to the amplifier drops. An « Speak on a speaker » announcement during an ad goes back to your normal volume.
  • See what it has learned:
    • the Radio widget has a new setting « Show: Radio ad breaks ». It shows the next ad window, ad hours per day (week / Saturday / Sunday), the last breaks and the status of the jingles;
    • the « Ad break report » button in the configuration summarizes everything in text;
    • the new « Radio ad window » feature is 1 during the usual ad windows. Put it in a Graph type Binary widget, next to « Radio ad break »: you see the usual schedule and the real breaks side by side.
  • Time zone: new setting, Europe/Paris by default. Integrations run in UTC: without this, the ad times would be offset.
  • On the consumption side, only when detection is enabled and a radio is playing: a few internet requests (TuneIn, Deezer for the duration of the titles, the station’s website). For the jingle, the radio stream is downloaded a second time (about 30 to 90 MB/h). This is cut with « Recognize ad jingles ».
  • For scenes: « Radio ad break » is a classic switch. You can disable the automatic volume reduction and trigger your own scene on it (change station, cut the sound…).

Small tip: if the « Ad break report » button responds « not implemented », it’s because the container is still running on the old version. Restart the integration update.

It’s still very fresh: I adjusted it by ear on OUI FM, but the version integrated into Gladys hasn’t been running much yet. Your feedback interests me, especially on other radios, with the integration logs if something is wrong.

Happy listening (without ads) :musical_notes:

Hello,

I just realized that the On/Off action does not work on my PM7000N amplifier

Here is the log on the button control:

[2026-10-30T11:26:11.436Z] [INFO] onSetValue <- ext:ext-lm1lc3n7-gladys-denon-avr:avr:manual:192.168.1.42:power = 0
[2026-10-30T11:26:18.321Z] [INFO] onSetValue <- ext:ext-lm1lc3n7-gladys-denon-avr:avr:manual:192.168.1.42:power = 1  

The actions to increase, decrease the volume work as well as the mute

Hi @Tolkyen,

Thanks for the feedback!

Your log shows that Gladys is indeed sending the On/Off to the integration, but not what the integration then sends to the amplifier. I have a serious lead, though. The integration was turning the amplifier on and off with the « main zone » commands (ZMON / ZMOFF) for home cinema amplifiers. According to the Denon and Marantz documentation, networked stereo amplifiers like yours do not have zones and only have PWON / PWSTANDBY. Volume and mute are controlled by other commands, which would match what you’re seeing.

In version 1.1.1 (Release v1.1.1 · LM1LC3N7/gladys-denon-avr · GitHub), the integration checks how many zones the amplifier reports on its Deviceinfo.xml page. If this page does not exist, it checks what the amplifier responds to upon connection. For an amplifier without zones, it uses PWON / PWSTANDBY for On/Off and to read if it is on. « Speak on a speaker » also: the amplifier turns on before the announcement and goes back to standby after, if it was in standby before. In doubt, it keeps the old commands, to never cut off zone 2 of a home cinema amplifier.

I don’t have a PM7000N to test in real life. Can you tell me if it works for you? After the update:

  1. restart the integration and wait about ten seconds;
  2. do an On and then an Off from Gladys;
  3. paste the lines from the integration log that contain DeviceZones, power mode, power on, or power off. You should see sent PWON and sent PWSTANDBY.

If it still doesn’t work, also open http://192.168.1.42/goform/Deviceinfo.xml in your browser (and if not, the same address with :8080 after the IP), and tell me what is between <DeviceZones> and </DeviceZones>.

If the amplifier does not confirm a command, an orange dot also appears on the device badge, with the command that remained unanswered. Let me know if you see it.

Thanks!

Hi @lmilcent,

Since the update, it works :grinning_face:.

Here are the logs:

[2026-10-31T13:13:13.529Z] [INFO] [denon-telnet] Connected to 192.168.1.42:23
[2026-10-31T13:13:13.529Z] [INFO] [avr] ext:ext-lm1lc3n7-gladys-denon-avr:avr:manual:192.168.1.42: connected (main zone), seeding initial state
[2026-10-31T13:13:13.536Z] [INFO] [heos-cli] Connected to 192.168.1.42:1255
[2026-10-31T13:13:13.544Z] [WARN] [denon-telnet] Telnet socket error on 192.168.1.30:23: connect ECONNREFUSED 192.168.1.30:23
[2026-10-31T13:13:13.544Z] [INFO] [heos-cli] Connected to 192.168.1.30:1255
[2026-10-31T13:13:13.546Z] [INFO] [avr] ext:ext-lm1lc3n7-gladys-denon-avr:avr:manual:192.168.1.42: HEOS player id 878100990 matched to 192.168.1.42 (main zone)
[2026-10-31T13:13:13.553Z] [INFO] [avr] ext:ext-lm1lc3n7-gladys-denon-avr:avr:manual:192.168.1.42: no DeviceZones in Deviceinfo.xml, power mode stays "zones not detected yet: ZMON/ZMOFF" until the Telnet answers or saved data decide
[2026-10-31T13:13:13.558Z] [INFO] [ad-break] ext:ext-lm1lc3n7-gladys-denon-avr:avr:manual:192.168.1.42: now playing Marantz PM7000N (Salon) - Optical In 1 (url:inputs/optical_in_1)
[2026-10-31T13:13:13.565Z] [INFO] [avr] ext:ext-lm1lc3n7-gladys-denon-avr:avr:manual:192.168.1.30: HEOS player id -2106550540 matched to 192.168.1.30 (main zone)
[2026-10-31T13:13:13.637Z] [INFO] [avr] ext:ext-lm1lc3n7-gladys-denon-avr:avr:manual:192.168.1.30: no DeviceZones in Deviceinfo.xml, power mode stays "zones not detected yet: ZMON/ZMOFF" until the Telnet answers or saved data decide
[2026-10-31T13:13:18.547Z] [INFO] [denon-discovery] SSDP scan: 0 Denon/Marantz AVR(s) found
[2026-10-31T13:13:19.531Z] [INFO] [avr] ext:ext-lm1lc3n7-gladys-denon-avr:avr:manual:192.168.1.42: no DeviceZones, PW? answered, ZM? (twice) and Z2? not, power mode is now "receiver without zones: PWON/PWSTANDBY"

I don’t have an orange dot on the PM7000N so everything seems OK

However, I have one on the Denon Home 150

And in the logs:

[2026-10-31T13:13:23.551Z] [WARN] [denon-telnet] Telnet socket error on 192.168.1.30:23: connect ECONNREFUSED 192.168.1.30:23
[2026-10-31T13:13:43.557Z] [WARN] [denon-telnet] Telnet socket error on 192.168.1.30:23: connect ECONNREFUSED 192.168.1.30:23
[2026-10-31T13:14:13.565Z] [WARN] [denon-telnet] Telnet socket error on 192.168.1.30:23: connect ECONNREFUSED 192.168.1.30:23

Another issue I noticed in the Amplifier widget: if you press the Vol+ or Vol- button repeatedly, after a while you get the message ‹ The action failed › and the widget buttons become unresponsive for a certain time.

Thanks again for the fix

Great news for the PM7000N, thanks @Tolkyen! And thanks for the other two remarks, they are fixed in version 1.2.0 (Release v1.2.0 · LM1LC3N7/gladys-denon-avr · GitHub), published today; it will arrive in the store at the next indexer run.

The Denon Home 150

Your Denon Home doesn’t have Telnet: it’s a HEOS speaker, controlled only by HEOS. The integration still tried Telnet in a loop, hence the warnings and the orange dot. Now, when HEOS announces a speaker model (« Denon Home… », « HEOS… ») and port 23 is refused, the integration treats it as a speaker:

  • volume, mute, play/pause/next/previous, « now playing » and « Speak on a speaker » go through HEOS;
  • power/standby, source, sound mode and tuner are no longer offered: HEOS has no command for that on a speaker;
  • only one line in the logs instead of warnings, and Telnet is retried only every 5 minutes;
  • no more orange dot; the badge goes to « unreachable » if the speaker no longer responds to HEOS.

Your PM7000N is not affected: a device whose Telnet has already responded, or whose model is not recognized as a speaker, remains treated as an amplifier.

For your already created Denon Home device: in the Discovery tab, run a scan then click « Update » for it. The buttons that do nothing disappear.

Vol+ / Vol- in the widget

It didn’t come from the amplifier: Gladys accepts at most 30 widget actions per minute for an integration, and the widget reload after each press also counts. With a press per 0.5 dB step, the limit was reached in a few seconds, and all the widget buttons were refused until the end of the minute.

Now, in the widgets, a press changes the volume by 2% on an amplifier (5% on a HEOS speaker), so four times fewer presses for the same setting. Quick presses are grouped: only the last desired volume is sent. And the volume no longer exceeds the maximum that the amplifier announces, so that a Vol- acts immediately. The Volume +/- buttons on the devices page keep the 0.5 dB step.

Gladys’ limit remains: by pressing really very quickly and for a long time, it can still be reached, but it will be much rarer.

After the update, can you tell me:

  1. In the integration logs, do you see a line that says the Denon Home is a HEOS speaker (« … is a HEOS speaker … »)? The « Telnet socket error … ECONNREFUSED » no longer come back in a loop?
  2. The orange dot has disappeared on the Denon Home?
  3. After Discovery then « Update »: power/standby, source and sound mode have disappeared? Volume, mute, playback and announcements still work?
  4. In the Amplifier widget, a 2% (about 2 dB) step per press: is it good, or too loud? Do you still have « The action failed »?
  5. On the PM7000N, does everything still work as with 1.1.1?

Thanks again for your precise feedback!

Hi @lmilcent, great work and what a quick response, well done.

Here are my feedback on your questions following the update:

  1. The « Telnet socket error … ECONNREFUSED » messages no longer loop, here is the only related log: [2026-11-01T11:26:33.999Z] [WARN] [denon-telnet] Telnet socket error on 192.168.1.48:23: connect ECONNREFUSED 192.168.1.48:23 (logged once while it repeats)

  2. Yes, the orange dot has disappeared from the Denon Home

  3. After Discovery then « Update »: power on/off, source, and sound mode have indeed disappeared. Volume, mute, playback, and announcements still work

  4. The Amplifier widget works. For the 2% step, I notice that when you exceed 25%, the amplifier display percentage and the widget percentage are offset by 1. However, I still sometimes get « The action failed »

  5. The PM7000N amplifier works as it did with version 1.1.1

In my tests, I also noticed that if I send a message to the amplifier, the music stream (I use Lyrion) that may be playing does not resume quickly, and sometimes I have a « residual » of the sent message if I pause then resume playback. I will continue testing to confirm the situation.

Thanks again for the progress.

Thanks @Tolkyen for this very complete feedback! Glad to hear the Denon Home is now working properly.

Version 1.2.1 (Release v1.2.1 · LM1LC3N7/gladys-denon-avr · GitHub) fixes what you saw; it will be available in the store at the next indexer update.

The 1 offset beyond 25 %

Well spotted: your PM7000N displays its own number, from 0 to 98, and Gladys converted it to a percentage out of 100. Now, on an amplifier (Telnet), Gladys shows exactly the amplifier’s number, including half steps (25.5). Above 98, it’s 98.

:warning: Consequence: for the same number, a scene, an announcement volume, or a recorded volume will sound slightly louder than before: +1 dB from 26 to 75, +2 dB from 76 to 98 (a scene at 90 sent 88, it now sends 90). To get the old level back, lower the number by 1 or 2. The Denon Home keeps its 0–100 scale.

**« The action failed »