Control roon tested volume when connected source is roon ready device

So, in attempting to replace a HEOS network of devices, I have one problem that must be common for others. I have some great end points that have pretty good DAC’s so no need to change them (example Marantz SR receiver)

I would like to use a Roon Ready HDMI output (digital) because the marantz can handle high def music bit rates…

this is do-able (for example, I have an OPPO-203 that is Roon Ready and has HDMI to marantz)

and HERE is where the experience goes sideways:

  1. open marantz app, turn on receiver, change to input X (again, this is a roon tested device)
  2. open roon app, select music, group devices etc
  3. switch back to marantz app to adjust volume
  4. from phone home screen (say locked) I can play/pause/skip tracks - what I cannot do is adjust the volume…

so, the request is to make a ‘roon tested’ device a power/volume only device for a roon ready device (group them so that your UI will send all commands music related to roon ready and all things volume to roon tested in this virtual group)…

think of it as the “harmony remote” of Roon App – the Roon Ready digital device doesnt control volume…

I got rejected on this once before saying “not possible” - seems entirely possible as Roon sees both my Oppo and my Marantz device…

Not sure if it may help, but I have been working on integrating HEOS (denon and marantz) devices to be controlled by Roon - with two way feedback from the heos device.

Working well for me, with neatly 16 devices that I can control and group from Roon.

Requires a Roon extension that will run on a raspberry pi , Linux or windows device.

Still prerelease but looking for beta testers if you are interested in integrating Roon with Heos.

Happy to try and support your needs. Don’t think your specific request is possible however!

Hello Peter,
I would love to beta test the integration tool. I have two AVRs (one denon and one marantz) and five heos speakers… the marantz is also using zone 2 to drive some patio speakers…

I am currently running the roon software on my synology nas and I can install your tool on either a networked windows machine or a docker image on the nas…

I suspected this is entirely possible as I have other dnla devices that can “see” the heos/denon/marantz end points (and I even have a third party windows store app called HEOS REMOTE that works pretty well. I also see denon documents the api calls to their devices too)

regarding my specific request: yeah, its a stretch to ask Roon for the feature, however, since the Roon core can see all the items, it doesnt seem out of touch that they control the volume of one device and the streaming on the other device at the same time once you “group them”)

thanks again

I updated the package on NPM and Github.

This is now at version 0.3.1-3 and is pretty stable for me.

This should work on your windows box but haven’t tested on a linux system aside from a raspberry pi 4 as yet (where it runs fine and I have had 15 HEOS players connected and grouped). Will be interested if you can get this running on your NAS.

I have no experience of using HEOS in second zones though the Denon site indicates there are incompatibilities in earlier version - don’t know how this will work here. Might be possible to create an add-in potentially if needed.

Please come back to me with any issues and I look forward to creating a docker image when this has been more thoroughly tested and have some feedback.

I’m still playing around with bi-directional grouping and need to work on better logging but overall this is stable and seems to avoid some of the UPnP issues that have been reported (setting Resync delay 0.5 sec or more seems to be important - you may find a different amount is need.

Thanks for trying. Here the current instructions.


A ROON Extension to allow control of Denon/Marantz HEOS devices from ROON.


  • :mag_right: Automatic discovery of HEOS devices and make them available as ROON audio devices (via UPnP).

  • :dart: Bi-directional Control of player play, pause, previous, volume, mute and grouping within HEOS players from ROON or Heos App.

  • :notes: Uses HEOS grouping to ensure synchronization with other HEOS players. Only groups HEOS players.

  • :loud_sound: Does not use AirPlay so can stream at Hi-Resolution for HS2 players.

  • :no_entry_sign: Written in pure Javascript / Nodejs with limited module dependencies (heos-api, squeeze2UPnP, Xml2js,ip)


Install/Update nodejs for your system (tested on Windows and Raspberry pi 4) . This requires at least Node v16, the current stable version. [Download | Node.js]

Clone a local copy of this repository to a local directory ‘./RHEOS’, or copy the zip file and unpack into ‘./RHEOS’.

From the command line try : “gh repo clone LINVALE/RHEOS ./RHEOS”

(If successful you will see a ‘package,json’ and ‘package-lock.json’ as well as ‘app.mjs’ in the directory, along with other required files)

Then switch to that directory and type “npm install”, This should create a folder ‘node_modules’ with the required dependencies.

Install rheos using npm:

npm install rheos

Initial Set Up

Run the app from the directory to which you downloaded on the command line type → “node .”

Enable Squeezebox Support via Setup → Enable squeezebox support

Enable RHEOS in ROON via Settings → Extensions → enable

Connecting to devices

RHEOS will attempt to discover all connected HEOS devices on start up. Tested to date with Marantz HEOS enabled AVRs, PLAYERS :HEOS DRIVE HS1 and HS2, HEOS1, HEOS3, HEOS 5 and HEOS 7, HEOS LINK and HEOS AMP. Maximum number of players that can be simulatnaeosly grouped is 16, dependent upon network performance.

Players will appear as Squuezebox Devices in ROON Settings → Audio. Intially all unnamed. Each device needs to be named in ROON with the same name used in HEOS (Edit Rooms → Select / Edit Name). On first set up the ROON device setup → audio device will be shown as “RHEOS”. In order to identify which ROON output is linked (if you have more than one) select Settings → Extensions and the setup screen will appear shwing the discovered HEOS players. Exit this screen WITHOUT saving and go back to Settings → Audio. You will now be in “configuration” mode and audio devices will be identified by the names of the discovered HEOS players. Each Audio device MUST be named exactly to match the Room name in HEOS (now shown in the Device set up with a reminder to save Extension Settings when you are finished naming all players). Some HEOS dvices add identifiers to the name you edit in the HEOS app, dependent on model. Ensure you use the entire name as shown. This only needs to be done once (unless you reset or transfer your ROON core). Edit each RHEOS Audio Device name. I also strongly recommend that you select a Resync delay of 500 ms aor more. This will minimize problems when a play list switched between songs with different resolutons casusing upredictable playback. Choose exactly the same resync delay for each and all the RHEOS players. This is also a good time to select FLAC compression in advanced - the RHEOS bridge uses FLAC conversion and compression is helpful in reducing network load.

Then return to Extensions → settings and SAVE. This should now return to “play” mode. Any time you enter Extension settings play mode is suspended and devices can be configured.

If you have HS2 devices you may wish to enable Hi-Res streaming (192 kHz 24 Bit Flac). Do this in Settings-> Extension → RHEOS → Settings for each HS2 player. This may increase network load and success will depend upon wired connections and a fast ethernet. All players default to CD quality 48kHz 24 bit.

The only other settings are an IP address of the Heos Player you would like to use as the main connection. All HEOS commands are sent tho this and RHEOS listens for changes to any of your players through this. If there is a problem discovering your HEOS players you can try to edit this. Once a connection has been made, all HEOS player IPs are stored and can be selected from the drop-down. If none has been found you may enter the IP address, if you can find this from your router DHCP table.

Roon Extension Host IP Address shows the discovered IP address of the device you are using to run RHEOS - a windows machine or 32 bit rasberry pi at present. You may want to try editing this if for some reason network discovery is not working.

Under RHEOS UPnP Settings there are options to select buffer-size, output-size, stream-length, seek-after-pause, volume-on-play, volume-feedback, FLAC-header, keep-alive, next-delay, send-meta-data and send-cover-art. The defaulst are te settings I have found to work best across a variety of HEOS players so I recoomend not adjusting these unless you have specific needs or something isnt working for you. Full information on them can be found here GitHub - philippe44/LMS-to-uPnP: Integrate UPnP players with LogitechMediaServer. I may add or remove options in the future and change the 'default setting based upon future testing and feedback. I will note this in any updates.


The HEOS players can be controlled as a normal ROON endpoint. Grouping is done through standard ROON grouping but behind the scenes these are translated to HEOS groups and you will see the change occure in the HEOS app.

Known Limitations

Individaully grouped players can have their volume changed and be muted (either in ROON or the Heos app).

Group volume control of all devices in a group is not possible from ROON .

Pausing a device from Roon and then re-starting from HEOS will result in an error message (in HEOS) and returning to the start of the track.

Skipping to next track in ROON playlist is not possible from HEOS.

Devices will show “Streaming from LMS” on their display and in the HEOS app.

Cover art and metadata are not shown on the HEOS app or on the playback device.

Track progress on HEOS device and app does not show a track duration and resets after pause.

Clicking “ok” in the Heos app should remove the error.

Please report any issues via GitHub or raise on the ROON communuty site.



Thanks to Juliuscc for the development of heos-api - a superb tool!

Learn more about using heos-api at:

Thanks to philippe44 for development of Squeeze2upnp. None of this would have been possible without the C binaries that allow HEOS players to emulate SlimDevices

Squeeze2UPnP GitHub - philippe44/LMS-to-uPnP: Integrate UPnP players with LogitechMediaServer



Please send issues and pull requests with your problems or ideas!

Thanks Peter, I wasnt able to look at this the last few days but the link does not appear to work when I just tried it now. Is is a private project? I just clicked the “follow” button so you can see my account that is following you in github…


Sorry about that - had forgotten to change status back after merging.

Should work now - public one again.

Will be pushing a new commit in the next day or two.

Thanks for testing, and I hope it works for you :wink:

I’ll do my best to help. Forgive the primitive coding, lot’s to refactor and optimize, I think.

Finally got some time to try this - not my area of expertise but: I moved my RoonOnNAS install to a docker image and after multiple deletes and start overs think I have nodejs and its and your dependencies installed (but wouldnt actually know how to confirm)…

(note: I can move this over to github commentary if you like…)

however, when i run: node .
I get the following error:

root@RoonHRC:/RHEOS# node .

Unable to connect discover any Heos Players
(Use node --trace-uncaught ... to show where the exception was thrown)

so i ran the trace and here are the results:

root@RoonHRC:/RHEOS# node --trace-uncaught …
throw err;

Error: Cannot find module ‘/RHEOS/…’
at Function.Module._resolveFilename (node:internal/modules/cjs/loader:933:15)
at Function.Module._load (node:internal/modules/cjs/loader:778:27)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)
at node:internal/main/run_main_module:17:47 {
requireStack: []
Thrown at:
at Module._resolveFilename (node:internal/modules/cjs/loader:933:15)
at Module._load (node:internal/modules/cjs/loader:778:27)
at executeUserEntryPoint (node:internal/modules/run_main:77:12)
at node:internal/main/run_main_module:17:47


now, I am not a docker container/linux person at all, and searching the web gets all sorts of discussions about being a regular account with sudo access vs the root account for installing some of the modules… then the counter that docker is setup different etc etc…

so I have built several of these, when I get time, I will also create a normal windows core on my laptop and attempt to install your project and the proper version of nodejs and get back to you…

for now, i am stuck…


PS - actually looking at this error message, it cannot find some files - was I supposed to make the RHEOS directory uppercase or not? I made it upper case but during the npm install rheos i did type that lower case… i might see if i can hack the folder name and try again… i will let you know

since its docker, i was able to stop the image and remap the upper to lower case… after restarting i reran npm install and npm install rheos in the new lower case directory just to be sure…

unfortunately, no joy, but a different trace message with only on “.” after the trace:

root@RoonHRC:/rheos# node --trace-uncaught .

Unable to connect discover any Heos Players
Thrown at:
at loadESM (node:internal/process/esm_loader:94:31)
at processTicksAndRejections (node:internal/process/task_queues:96:5)


then the original error
root@RoonHRC:/rheos# node --trace-uncaught …
throw err;

Error: Cannot find module ‘/rheos/…’
at Function.Module._resolveFilename (node:internal/modules/cjs/loader:933:15)
at Function.Module._load (node:internal/modules/cjs/loader:778:27)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)
at node:internal/main/run_main_module:17:47 {
requireStack: []
Thrown at:
at Module._resolveFilename (node:internal/modules/cjs/loader:933:15)
at Module._load (node:internal/modules/cjs/loader:778:27)
at executeUserEntryPoint (node:internal/modules/run_main:77:12)
at node:internal/main/run_main_module:17:47

So sorry you are having problems Patrick.

Probably my installation instructions are not clear enough or I’ve missed something.

Sounds like you are trying this on your NAS. I’m likely to need to make changes to accommodate non arm based machines and haven’t tested outside a raspberry pi.

Windows install should be more straightforward so I’ll see if I can replicate on a clean test system.

Will be updating GitHub and npm tomorrow, all being well with my testing.

Perhaps pm me and we can continue the conversation and get back here with the solution rather than cluttering the conversation in the community.

Could you share what the file structure you have in the RHEOS folder following the install please? It should look like this:

If not, please confirm that in the directory you entered ‘npm install’ and let me know any error messages you get.

Also fine to raise as an issue on the Git and we can work it through there.