Roon Extension: McIntosh Volume, Source and Power Control

Hi all,

I’ve “finished” my first efforts on extension for McIntosh C47 volume/source/power control via RS232 protocol.
It’s now available on Github: roon-extension-mcintosh.
There is an associated project which deals with the actual RS232 parsing, if you would want to have a closer look: node-mcintosh.

1 Like

Anyone have this up and running?, I have tried to understand if I can connect like a RaspberryPi to my Mcintosh Amp, if I am not using it as my end point?

Basically I am streaming through a NAIM streamer so solving this by grouping the RPI with the NAIm for volume is not an option.

Any Ideas or suggestions?

@John_Jensen , I don’t have this setup anymore, but yes it was working great.
And yes, you can use RaspberryPI for the extension. You would just need the RS232 cable which can be plugged into USB on the RPI.
Let say like this one: cp2102 USB Serial RS232 Cable Dsub 9pin Male Plug Silabs cp210x Type B RS232 Converter PCBA|com port rs232|adapter cabledb9 adapter - AliExpress
But before you get one, make sure the pins are assigned the same as on your MC gear.

Hi Stefan,

I read your script and I think I understood how it works. But I don‘t know how and on which device I have to install the script. Can you help me with this and give me more information?
Thanks in advance and greetings from Austria

Hi @Philipp_Pirklbauer , normally you would use a Raspbery Pi, or some other small linux box. But it could even be your laptop/desktop.
Advantage of these small boxes is that they don’t consume a lot of power and so you can leave them running unatended 24/7.
As this is set up using RS232 you need to have it close to your McIntosh gear, so it can be connected to it.
In my previous post you can see the possible adapter that can be used. But different MC gear has different RS232 connectors and the protocols may be slightly different.
This specific roon extension was tested only on the C47 preamp.

Hi @StefanK
Thank you for your quick answer!
I‘m using an Intel NUC with Roon rock. Do you know if it also works this way? If yes, how can I install the roon extension there?

Unfortunately it won’t work. Roon Rock is a closed up system, so you won’t be able to add extensions into it.
Raspbery Pi won’t cost you a lot. You can pick basically any version as this extension does not require too many resources. Of course some unix skills will be required.

hi @StefanK , how would I load the extension onto the Raspbery Pi - Dietpi?

I have the extension manager 1.1.2 running on the Raspberry, it was installed directly through Dietpi software.

I am unable to figure out how to place the extension in the extension manager. Is there a directory for me to clone the extension files to and then, the extension would appear in the extension manager for me install? Or how. I

I’ll be trialing it with an MA9500 that has a 3.5mm serial input and I have the USB-to-serial cable for it.


For the moment this extension is not covered in the Extension Manager repository .
You will have to perform manual installation using git clone command.
Then you simply run the extension from the install directory using command node app.js.
To make it more automated you can use a pm2 app manager

1 Like

Many thanks for your follow up :slight_smile:

Installed the nodejs app and ran the command, but then the following error was produced,

throw err;

Error: Cannot find module ‘node-mcintosh’
Require stack:

  • /home/roon-extension-mcintosh/app.js
    at Module._resolveFilename (node:internal/modules/cjs/loader:1144:15)
    at Module._load (node:internal/modules/cjs/loader:985:27)
    at Module.require (node:internal/modules/cjs/loader:1235:19)
    at require (node:internal/modules/helpers:176:18)
    at Object. (/home/roon-extension-mcintosh/app.js:3:28)
    at Module._compile (node:internal/modules/cjs/loader:1376:14)
    at Module._extensions…js (node:internal/modules/cjs/loader:1435:10)
    at Module.load (node:internal/modules/cjs/loader:1207:32)
    at Module._load (node:internal/modules/cjs/loader:1023:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:135:12) {
    code: ‘MODULE_NOT_FOUND’,
    requireStack: [ ‘/home/roon-extension-mcintosh/app.js’ ]

Node.js v21.1.0

Checked whether the USB to 3.5mm Serial cable that I’m using was identified, and it was.

Bus 001 Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC

Checked that the pin txd / rxd / gnd matches the MA9500, and it was correct.

I can understand that the extension couldn’t find the McIntosh device, but not sure how I can test the connection outside of the extension, or is there something that I need to edit in the extension.

The MA9500 is using a maximum baudrate of 115000.

Thank you for your follow up and help.

Hi Tigo,

I did not give you the full installation steps, just a high-level.
After doing ‘git checkout’ of the project, you also need to enter the directory of the project and run ‘npm install’.
However this is a rather old extension, so it most likely won’t work on new version of Node (like v16 and up). You would have to install older Node version, which then may not work for the other extensions you are using.
Then you might need to play with some node version manager, to ensure old extensions run on older Node (like node v8), while the new ones can run on v16 and up.
Unfortunately I don’t have much time at the moment to check if this extension can be upgraded to work on new Node versions.

1 Like

Hi Stefan,

Thank you for clarifying things - all new to me. I’ll try to dig into it in the new year when I return from work-travel assignments. If you get the chance to look into it, that would be great. I’ll also report back my attempts as well when I do.

Many thanks,

No luck at all with it.

Managed to install node 8, with

npm i -g --unsafe-perm n && n 8

installed : v8.17.0 (with npm 6.13.4)

Then tried to install it with,

root@RPi8G:/home/roon-extension-mcintosh# node app.js
    throw err;

Error: Cannot find module 'node-mcintoshCS'
    at Function.Module._resolveFilename (module.js:548:15)
    at Function.Module._load (module.js:475:25)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/home/roon-extension-mcintosh/app.js:3:28)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)

Then, tried

npm install --verbose
npm info it worked if it ends with ok
npm verb cli [ '/usr/local/bin/node',
npm verb cli   '/usr/local/bin/npm',
npm verb cli   'install',
npm verb cli   '--verbose' ]
npm info using npm@6.13.4
npm info using node@v8.17.0
npm verb npm-session 56dd57e503461f7a
npm info lifecycle roon-extension-mcintosh@1.0.1~preinstall: roon-extension-mcintosh@1.0.1
npm timing stage:loadCurrentTree Completed in 33ms
npm timing stage:loadIdealTree:cloneCurrentTree Completed in 1ms
npm timing stage:loadIdealTree:loadShrinkwrap Completed in 10ms
npm http fetch GET 200 1053ms
npm http fetch GET 200 919ms
[  ................] - fetchMetadata: sill pacote range manifest for^1.0.1 fetched in 2036ms

and it get stuck. Tried to follow some guidance from the web on how to resolve it - no luck either.

If you can assist any further with perhaps upgrading the extension to be part of the extensions manager, that would be awesome. I remember trying to fiddle with the extension generator to upgrade the extension, but couldn’t quite get my head around it.

Many thanks for your assistance with all :pray:

I have finally had some time to check what can be done. Unfortunately we are in a bit of a mess.
Extension relies on two quite old packages ‘serialport’ and ‘usb-detection’, where both have already advanced several itterations.
My original extension only works with Node v8, but the current packages from roon require Node v10.
So even if we make my extension work simply switching to Node v8, it won’t work due to the Roon’s requirement to use Node v10.

Moving my extension to v10 requires update to newer versions of the used packages, which in turn means a rewrite of the code. This would not be that difficult to do, but I no longer have a McIntosh preamp I could test with.
Moving the extension to Node v10 is also rather shortsighted as Node is at the moment already on v20/v21.
When Roon developers decide to upgrade their extensions again to require some specific Node version, this will stop to work once again.

I can’t promise anything, but I’ll see if I can find some time to do the upgrades. But you’ll have to be the beta tester, as I can’t test it myself :slight_smile:

Putting this extension to the extension manager I suppose should be easy to do, but due to the ‘serialport’ and ‘usb-detection’ this may be difficult to install on majority of the systems as it requires some additional libraries to be present for a potential build from sources.

Hi Stefan,

I’m happy to be the beta - tester and to extend any assistance possible. I’ll dm you my contact details to facilitate comms.

I’ve tried to use my Lumin as a volume control for my setup, - setting the McIntosh at 60% volume as an interim solution. But, had an incident of forgetting that the McIntosh was at 60% - and music playing from a setup with a fixed-volume at 100% - hahaha. What a moment!!!

Many thanks :))) and Happy New Year :partying_face:

Hi Stefan,

I’m also interested on this extension, so happy to be a beta tester too on my McInstosh C2700.

@Tigo, @Jaime_Baraqui I have finally found some time to review the code and update it.
You can now pull the latest version from GitHub. It works fine also on new versions of Node.js.
When I still had McIntosh, I have had only MC47 to play with, so let’s hope McIntosh keeps the same protocol and commands for the other devices.

FYI: ‘McIntosh USB Vendor ID’ in the Roon extension settings is not mandatory, but the only accurate way to ensure the extension does not get its state desynchronized from the real device. This is when you let say also use your remote to turn off McIntosh and not via roon.
Problem is, this will only work if you are able to run the extension on the same device as your streamer is which is not a very typical setup.
I had it setup this way (luckily with ssh access to the streamer):

SoTM SMS-200
-> USB audio -> USB cable -> McIntosh C47 DAC
-> USB Serial port adapter -> RS232 Serial cable -> McIntosh C47

If this turns out to be a problem, let me know and I can see if I can change the logic to query the state from McIntosh in some intervals (not ideal, but would ensure the state is synchronized)

1 Like

Hi StefanK,
Thanks very for this great updated extension. I was able to install it on DietPi without any problem. Everything moves smoothly. Now I am waiting for my usb-rs232 cable to test the extension on my C2700 pre-amp.

Jaime Baraqui

I downloaded the latest version. Proceed with the following.

Checked whther, the USB to serial is identified,

Bus 001 Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC


1 - npm install from within the roon-extension directory

 npm install
var stripAnsi = require('strip-ansi');

Error [ERR_REQUIRE_ESM]: require() of ES Module /usr/local/lib/node_modules/npm/node_modules/strip-ansi/index.js from /usr/local/lib/node_modules/npm/node_modules/wide-align/node_modules/string-width/index.js not supported.
Instead change the require of /usr/local/lib/node_modules/npm/node_modules/strip-ansi/index.js in /usr/local/lib/node_modules/npm/node_modules/wide-align/node_modules/string-width/index.js to a dynamic import() which is available in all CommonJS modules.
    at Object.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/wide-align/node_modules/string-width/index.js:2:17) {

Node.js v21.5.0

2 - node app.js - from within the directory

node app.js
  throw err;

Error: Cannot find module 'node-mcintosh'
Require stack:
- /home/roon-extension-mcintosh/app.js
    at Module._resolveFilename (node:internal/modules/cjs/loader:1143:15)
    at Module._load (node:internal/modules/cjs/loader:984:27)
    at Module.require (node:internal/modules/cjs/loader:1234:19)
    at require (node:internal/modules/helpers:176:18)
    at Object.<anonymous> (/home/roon-extension-mcintosh/app.js:3:28)
    at Module._compile (node:internal/modules/cjs/loader:1375:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1434:10)
    at Module.load (node:internal/modules/cjs/loader:1206:32)
    at Module._load (node:internal/modules/cjs/loader:1022:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:142:12) {
  requireStack: [ '/home/roon-extension-mcintosh/app.js' ]

Node.js v21.5.0

Am trying to run this on dietpi v9.0.2 - that’s currently running the extension manager in docker form with other extensions, - as per the guide, and chromium for touch / web control. I wouldn’t think there’s anything conflicting.

Should I try to rebuild the dietpi with just the extension? and then add the others.

@Jaime_Baraqui - what version of dietpi were using? are you running anything else on it?


Hi Tigo,

I am using Raspberry PI 4 B with Dietpi 9.02. I installed on dietpi Roon Bridge, Roon Extension, node.js and Git. Then with Git clone command I get the extension in a Home directory, then I did a NPM Install and finally run with “node .” on the extension directory. Everything with no error.

The problem that I have is that the extension does not detect the serial port. I tried putting from 1 to 20 in the serial port field in the extension interfase on roon.

1 Like