Skip to main content

Monoprice / Dayton / Xantech 6-Zone Amp

Control a multi-zone whole-house amplifier that speaks the Monoprice 6-zone ASCII protocol — the Monoprice MPR-6 / 10761, Dayton Audio DAX66 / DAX88, and the Xantech MRC88-family clones that reuse the same command set. Per-zone power, volume, mute and source selection with polled status feedback. Up to three daisy-chained amplifiers (18 zones) run over a single connection.

The amplifier is RS-232 (9600 8N1) and, on the classic units, has no Ethernet. Integrate over the LAN through a serial-over-IP gateway (Global Cache, USR-TCP232, Brainboxes); newer Dayton DAX amplifiers expose their own onboard TCP control port instead.

Prerequisites

  • A Monoprice-protocol amplifier (Monoprice MPR-6/10761, Dayton Audio DAX66/DAX88, or a Xantech MRC88-family unit).
  • For classic units: the amplifier's RS-232 port wired to a serial-over-IP gateway set to 9600 8N1, no flow control, transparent TCP server mode. A straight-through or null-modem cable may be required depending on the gateway — if you get no reply, try the other.
  • For Dayton DAX units with native Ethernet: the amp on the LAN and its control port known.
  • The gateway (or amp) TCP port reachable from the GEM server.

Setup steps

  1. Configure the serial gateway for 9600 8N1, transparent mode (most Global Cache / USR / Brainboxes units expose this in their web UI). For a native-Ethernet Dayton DAX, note the control port.
  2. In /admin/devices, add a device with driver Monoprice / Dayton / Xantech 6-Zone Amp. Enter the gateway (or amp) IP and the TCP port.
  3. If you have expansion amplifiers daisy-chained off the main unit, set Max Amps to 2 or 3.
  4. Open the Script Console and run command({device: <id>, action: "get_zone_status", args: {address: "11"}}). A #>11… status line confirms framing is correct.
  5. In /admin/zones, create one zone per amplifier zone. The Address is the two-digit <amp><zone> code.

Attribute reference

Device attributes

AttributeRequiredDefaultPurpose
ipyesIP of the serial-over-IP gateway, or of the amp if it has native Ethernet.
portno8080TCP port. Varies by gateway — Global Cache 4999, USR-TCP232 8899, others 23, or the Dayton DAX control port.
max_ampsno1Number of daisy-chained amplifiers (1–3), used by get_zones discovery.
status_intervalno60000How often every configured zone is re-polled (ms). Polling is the only state channel — the amp sends nothing unsolicited.
command_throttleno120Minimum gap between outbound commands (ms). Do not drop below 100.

Zone attributes (written by the driver)

AttributeMeaning
stateon / off.
mute_stateon / off.
volume0–100, scaled from the amp's native 0–38.
sourceSelected input, integer 1–6.

Zone address format

A two-digit <amp><zone> code:

AmpZones
Main amp (1)11 12 13 14 15 16
Expansion amp 221 22 23 24 25 26
Expansion amp 331 32 33 34 35 36
warning

A single-amp system uses 1116, not 0106. The first digit is the amplifier number and is always present.

Commands

Every command below is driver-managed and available from the Commands editor, macros, triggers, and the Script Console. address is the two-digit zone code (1116, 2126, 3136).

CommandArgsWhat it does
onaddressPower the zone on.
offaddressPower the zone off.
all_offPower off every configured zone in one sweep.
set_volumeaddress, levelSet the zone to an absolute volume 0100 (scaled to the amp's native 038).
mute_onaddressMute the zone.
mute_offaddressUnmute the zone.
mute_toggleaddressFlip mute from the last polled state — can be one poll stale if the zone was muted at a keypad since the last read.
set_sourceaddress, sourceSelect the amp's rear input, 16.
get_zone_statusaddressForce an immediate status read for one zone.
get_zonesPoll every zone across all configured amps (1max_amps) and return the discovered list. Handy at first install to confirm addressing.

There is no relative-volume, volume-step, or native mute-toggle command — the protocol only sets values absolutely, so set_volume writes a level directly and mute_toggle is emulated from cached state.

Using it as an AV zone controller

The amp registers as an AV zone controller — a media player that can back one AV Zone per amplifier zone, giving users named source switching, volume, and mute from the AV interface instead of raw two-digit codes. Once the device and its zones exist:

  1. In AV Zones, add one AV Zone per amplifier zone and link each to its matching regular zone — that is what surfaces the zone as a room in the AV interface.
  2. In AV Sources, add one source per rear input you have wired. Label it after what is connected (e.g. "Sonos", "Turntable", "TV Audio") and set the source Address to the physical input number, 16.
  3. Give each source an On Macro that sends this amp's set_source for that input. Using the [@av_source.address] placeholder as the source value lets one macro pattern serve every input — it resolves to the source's Address at run time.

The driver keeps each zone's source attribute in sync from status polling, so the AV UI reflects the input actually selected even when it was changed at a wall keypad. See AV Sources and AV Zones for the full editor walkthroughs.

Protocol notes

ASCII, CR-terminated:

  • Query a zone: ?<zone> → the amp answers #> followed by 22 digits (11 two-digit fields: zone, PA, power, mute, DND, volume, treble, bass, balance, source, keypad).
  • Set a value: <<zone><cc><vv> where cc is PR (power 00/01), MU (mute), VO (volume 0038) or CH (source 0106). Example: <11VO15 sets zone 11 to volume 15.

The amp echoes commands before answering; the driver ignores any line that is not a #> status string.

Known limitations

  • No unsolicited status. The amplifier never reports changes on its own, so GEM only knows what it polls. A change made at a keypad appears at the next status poll, not instantly. Tune status_interval to taste.
  • No native relative volume or mute toggle. Every value is set absolutely. mute_toggle is emulated from the last polled mute state, so it can be one poll stale if the zone was muted at the keypad since the last read.
  • Sources are physical inputs 1–6. There is no software source label — name the GEM AV sources after whatever is wired to each rear input.
  • Coarse volume. Native range is 39 steps (0–38) mapped onto 0–100, so the slider moves in visible increments.
  • Tone controls (treble/bass/balance), the PA input and keypad state are read in the status string but are not exposed as commands in this driver.

Troubleshooting

SymptomCheck
No response from ampTelnet to the gateway IP/port and send ?11 then Enter. Nothing back means the gateway is not at 9600 8N1, or the serial cable polarity / null-modem requirement is wrong.
Commands accepted but state never updatesThe amp pushes nothing; confirm status_interval and that the zone address is the two-digit code (11, not 1).
Some zones respond, others do notThose zones are on an expansion amp — raise max_amps and confirm the amps are correctly daisy-chained and addressed 2x/3x.
Volume moves in coarse stepsExpected — only 39 native steps exist.

What we don't yet support

  • Tone controls (treble, bass, balance) and PA/paging input as commands.
  • Keypad event feedback.
  • Auto-discovery — devices and zones are added by fixed IP and explicit address.
  • Devices — adding and configuring the amplifier device
  • Zones — creating the per-output zones and their two-digit addresses
  • Subsystems — placing the zones under an AV subsystem
  • Commands — the full driver-managed command list
  • AV Zones — surfacing each amplifier zone as an AV room
  • AV Sources — naming the rear inputs as selectable sources