A few weeks ago, I released two extensions for Roon, my favorite music player. At that point in time, I had been using Roon for about nine months, but its usage in my living room had been a little bit… complicated - at least it wasn’t wife-compatible. This means that getting some audio out of the speakers still involved too many steps - two that is - and controlling the volume via the Roon Remote Control application was not possible. Fixing those two problems became possible when Roon Labs released version 1.3 of their software, featuring basic (beta) extensibility.

Volume Control Extension

The first extension I developed was a Volume Control Extension for Denon/Marantz AVRs. A Volume Control Extension can be bound to an existing output zone, allowing Roon to send volume changes to the extension instead of the Roon Bridge. The basics of how Roon works, can be found here.

Given the existence of “prior art” in the form of an extension for Devialet’s Expert, as well as an extension for Denon/Marantz via RS232, implementing my own extension became rather straightforward. You may ask why I didn’t just use the already existing extension for the Denon, and the answer is the connection to the receiver: I don’t have any hardware close to the receiver that would allow me to control it via RS232. However, the receiver is already connected to the network (via wifi), and controlling it via its telnet protocol was an obvious solution.

What turned out to be a little bit problematic first, was the client library I was using to control the receiver. But that was probably due to my lack of experience with Node.JS and my improper use of the concept of Promises, which the library was relying on.

Source Control Extension

The second extension, which was developed directly afterwards, was a Source Control Extension for Logitech Harmony. A Source Control Extension allows Roon to wake devices from Standby (or send them to), and to switch the inputs of a device. While I could’ve implemented all of that directly in the Denon extension, it made more sense to do this additional extension: it integrates nicely with the rest of my setup and allows the use of the remote control to change the volume, or to switch to a different “activity”. Besides, its probably useful to even more people than the Denon/Marantz extension.

The Logitech Harmony extension works by exposing all activities found on the configured Harmony Hub to Roon. Each of those extensions can then again be bound to an existing output zone, and Roon will ensure that it tells the extension when it starts outputting to that zone. But communication can also flow the opposite direction, and the extension will notify Roon whenever Harmony switches to another activity, momentarily stopping the audio output from Roon.


There were a few issues that I’ve encountered with the integration so far. The first one was already discussed on the Roon community board, and I tried to provide a standalone test-case to expose the erratic behavior. What I’ve been observing there was that notification from the extension towards Roon would stop working under certain circumstances involving a Roon Core and a Roon Remote on a MacBook. Still waiting for a confirmation that this could be reproduced on their end…

For the other two issues, I haven’t yet been able to rule out issues with the extensions themselves: after running the Source Control Extension for a week or so, suddenly the instances associated with the output zone started multiplying. So instead of one “music activity”, there were two of them. And for some reason, both the Denon and the Harmony extension stopped working until restarted. Given that this happened for both of them at the same time, I am tempted to believe that this is a more general issue and not related to any defect in the extensions themselves.