Skip to main content

Russound MCA / RIO

GEM driver russound_rio controls Russound MCA-66, MCA-88, MCA-C5, and MBX-series multi-zone amplifiers using the RIO ASCII protocol over TCP port 9621.

What it does

  • Per-zone power, volume, mute, and source select.
  • Live state updates via the RIO WATCH event subscription mechanism, with a periodic poll as a fallback.
  • One driver instance per controller; chained controllers share the TCP socket but address as 2.x, 3.x, etc.

Prerequisites

  • MCA-series amplifier with RIO Ethernet enabled. RIO is the default protocol on the MCA-C5 and MBX series; legacy MCA-66 amplifiers may need a Russound USB-to-Ethernet bridge or a firmware update before RIO is available.
  • TCP port 9621 reachable on the LAN.
  • No other RIO client (MyRussound mobile app, third-party controller) holding the socket — most RIO firmware revisions allow only a single concurrent TCP client.

Setup steps

  1. Assign a static IP or DHCP reservation to the amplifier.
  2. In GEM, create a Device with driver russound_rio and enter the amplifier's IP. Port 9621 is the default.
  3. If you have multiple amplifiers chained on a single RNET bus, set controller_id on each device row (1 for the first amp, 2/3/4/5/6 for downstream amps). For most installations there is just one amp and the default of 1 is correct.
  4. Run the get_zones command to enumerate available zones — the driver issues a GET C[x].Z[y].name for each zone slot.
  5. Create a GEM zone per amplifier zone. Set zone.address to controller.zone (e.g., 1.1 for the first zone of the first controller, 1.6 for the sixth zone of an MCA-66, 2.1 for the first zone of a chained second amp).

Attribute reference

Device

NameRequiredDescription
ipyesLAN IP or hostname of the amplifier.
portnoTCP port. Defaults to 9621.
controller_idnoPosition in the RNET chain. Defaults to 1.
status_intervalnoResync poll interval (ms). Defaults to 60000. Live updates arrive via WATCH events; this is a fallback in case of dropped notifications.

Zone

No required zone attributes. The zone address field encodes the controller and zone index.

Zone address format

<controller>.<zone> — e.g.:

  • 1.1 — first zone of the first controller
  • 1.6 — sixth zone of an MCA-66
  • 1.8 — eighth zone of an MCA-88
  • 2.1 — first zone of a chained second controller

A bare zone number (e.g. 3) is also accepted and is interpreted as <controller_id>.3, but the explicit controller.zone form is preferred.

Commands

NameArgsNotes
on / offaddressPower the zone on or off.
set_volumeaddress, levelVolume 0-100. The driver scales to the RIO native 0-50 range internally.
volume_up / volume_downaddressSingle-step volume change.
mute_on / mute_off / mute_toggleaddressMute control.
set_sourceaddress, sourceSource index 1-8 (matches the input wiring on the amp).
get_zone_statusaddressRefreshes power/volume/source/mute for a single zone.
get_zonesEnumerate zones on the configured controller.

Known limitations

  • Source labels are not yet round-tripped — set_source takes the absolute index. A future enhancement could query GET S[x].name and surface the labels to the UI.
  • Audio metadata (current track, artist, etc.) reported by RIO sources is not yet captured.
  • Zone groups (linked zones) are controllable individually but the group state itself is not modeled.
  • Older MCA-66 firmware that pre-dates RIO 02.x does not support WATCH; in that environment the driver falls back to polling only.

Troubleshooting

SymptomCheck
Driver shows connected but commands fail.Confirm no other RIO client is connected. RIO permits a single TCP client at a time on most firmware.
Volume slider goes to 50 instead of 100.The driver scales 0-100 → 0-50. If a UI control is reading the raw amp value the conversion was bypassed; check that the volume attribute on the zone is being read, not currentVolume or similar.
Connect succeeds but no event updates arrive.Verify the WATCH C[x].Z[y] ON subscription returned S (success) on connect — log line is visible in the device log. RIO firmware older than 02.x replies E and falls back to polling.
Second chained amp not responding.Make sure each chained amp has its own GEM device row with the matching controller_id. Both rows can share the same ip.