Roon Extension : RHEOS 2-way control & 192Hz/24bit Playback and Grouping on Denon/Marantz HEOS devices now in Extension Manager

@Christopher_Helm - you will change the image tag in the yaml text to :test
DO NOT DO IT NOW, THERE IS A SLIGHT BUG IN :TEST at the moment

image: rheos/roon-extension-rheos:test

OR
follow most of the steps again and build an rheos_beta instance using :test

  • copy the config.json from your main image into that folder, change the yaml to that…

then you can switch between them… there is one other thing to remind you about - checking the Enabled rheos extension - sometimes things can get cross with file permissions (when you are like me and tinker) and you can get two instances in roon as extensions…this will cause volume control to not work…

go to settings in roon > extensions - at the top is AUTHORIZATIONS

inside, look to make sure you dont have two there AND/OR you have one enabled here but another wanting to be enabled on the list of extensions

2 Likes

Thanks Patrick the slight bug is proving remarkable resistant :wink:

1 Like

THANKS everyone! I am just now getting a chance to dive back into this. Will report back once I try the above.

2 Likes

any progress? we will be flying a bit blind but if you show screen shots we can help

1 Like

I had REOS 0.9.5-2 running for quite sometime. Following my earlier documented instructions (running container with bridge mode).
I wanted to clean things up, so I purged the container/container image after upgrading my QNAP version and re-added the container.
It’s failed ever since, I never see any extension registered with Roon.

It’s failing to init the container, the error I am seeing is below. You can see that everytime it tries again (restarts the container), it pulls a new IP (also gets a new mac address - dhcp logs).

@peter_richardson what logs besides the snippets below would you like?

I see the following errors from the following container configs:

rheos/roon-extension-rheos-0.9.5-2 --bridge network (note: same version as latest)
rheos/roon-extension-rheos:latest – bridge network
rheos/roon-extension-rheos:latest – host network

/2/2025, 2:56:09 AM STARTING RHEOS
1/31/2025, 6:55:06 PM STARTING RHEOS
SYSTEM INFORMATION: 10.1.1.179,Linux,32ebbde2ce59,linux,x64 Version : 0.9.5-2 NODEJS VERSION: v21.7.3
->  1/31/2025, 6:55:07 PM RHEOS: CONNECTING TO DISCOVERED PLAYER
node:internal/process/promises:289
            triggerUncaughtException(err, true /* fromPromise */);
            ^

[UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "No devices found".] {
  code: 'ERR_UNHANDLED_REJECTION'
}

Node.js v21.7.3
1/31/2025, 6:55:49 PM STARTING RHEOS
SYSTEM INFORMATION: 10.1.1.180,Linux,32ebbde2ce59,linux,x64 Version : 0.9.5-2 NODEJS VERSION: v21.7.3
->  1/31/2025, 6:55:50 PM RHEOS: CONNECTING TO DISCOVERED PLAYER
node:internal/process/promises:289
            triggerUncaughtException(err, true /* fromPromise */);
            ^

with the following config I also get an IP, but not shown in the logs; overall the same error

container:
rheos/roon-extension-rheos-test. --bridgemode --privmode (runc)

Node.js v19.9.0
/bin/sh: 1: pkill: not found
->  02/02/2025, 03:10:32.922 AM RHEOS: STARTING RHEOS
GETTING SETTINGS
->  02/02/2025, 03:10:32.954 AM RHEOS: DEFAULT HEOS CONNECTION IP IS NOT SET
node:internal/process/promises:289
            triggerUncaughtException(err, true /* fromPromise */);
            ^

[UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "No devices found".] {
  code: 'ERR_UNHANDLED_REJECTION'
}

I also tried quickly running on docker M4 (MacOS - 15.3 / docker 14.37.2 / engine 27.4.0
ran rheos/roon-extension-rheos-latest (host network)
got the same error as above.
any aarch64 compat concerns (I don’t see any flagged)

Are you running with network:host in your start up for the container?

I have tried NAT (-- host network) and Bridge (–network bridge) with the latest deployments - above notes.

Previous install was always using a bridge network.
I did upgrade the QNAP version recently, but previous install was working on the new version.

Other containers start and run, most using NAT
did just test nginx wtih a bridge network - it came up and I was able to load the default webpage.

Nothing has changed in the extension.

Explore your implementation and local set up.

This is beyond my ability to support I am afraid :
:roll_eyes:

1 Like

@peter_richardson installed and ran your extension, everything worked like a charm! Thank you so much and will be glad to make a donation as a sign of gratitude and support.

I’ve created a group in Roon where I’ve paired the RHEOS instance with another Squeezebox emulation created by a squeezliteupnp daemon connected to another UPnP renderer (Naim MuSo QB gen 1). Audio is coming out from both devices, but the RHEOS instance is slightly delayed.
Any ideas on getting these two in sync?

I very much doubt that’s possible without you adjusting the delay in Roon. You can’t playback on sync in LMS with the UPnP bridge it has a lot of overheads and each devices UPnP stack will have different internal delays. Roon has no insight into this side of things.

Sorry, but the way this works with RHEOS is to use HEOS synchronization (not as good as ROON, but acceptable) - so only HEOS enabled devices can be synchronized.
The UPnP2squeeze bridge that is used for RHEOS will not allow satisfactory synching - maybe 2 secs variability at best!

Looking at the attached log its seems you have node 19 and 21 running - not sure how.

There’s a known issue with recent node versions above I think 20 with the ROON api.

Just see if this makes a difference perhaps and we could see if there’s a work around.