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
- 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.
- In /admin/devices, add a device with driver Monoprice / Dayton / Xantech 6-Zone Amp. Enter the gateway (or amp) IP and the TCP port.
- If you have expansion amplifiers daisy-chained off the main unit, set Max Amps to
2or3. - Open the Script Console and run
command({device: <id>, action: "get_zone_status", args: {address: "11"}}). A#>11…status line confirms framing is correct. - In /admin/zones, create one zone per amplifier zone. The Address is the two-digit
<amp><zone>code.
Attribute reference
Device attributes
| Attribute | Required | Default | Purpose |
|---|---|---|---|
ip | yes | — | IP of the serial-over-IP gateway, or of the amp if it has native Ethernet. |
port | no | 8080 | TCP port. Varies by gateway — Global Cache 4999, USR-TCP232 8899, others 23, or the Dayton DAX control port. |
max_amps | no | 1 | Number of daisy-chained amplifiers (1–3), used by get_zones discovery. |
status_interval | no | 60000 | How often every configured zone is re-polled (ms). Polling is the only state channel — the amp sends nothing unsolicited. |
command_throttle | no | 120 | Minimum gap between outbound commands (ms). Do not drop below 100. |
Zone attributes (written by the driver)
| Attribute | Meaning |
|---|---|
state | on / off. |
mute_state | on / off. |
volume | 0–100, scaled from the amp's native 0–38. |
source | Selected input, integer 1–6. |
Zone address format
A two-digit <amp><zone> code:
| Amp | Zones |
|---|---|
| Main amp (1) | 11 12 13 14 15 16 |
| Expansion amp 2 | 21 22 23 24 25 26 |
| Expansion amp 3 | 31 32 33 34 35 36 |
A single-amp system uses 11–16, not 01–06. 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
(11–16, 21–26, 31–36).
| Command | Args | What it does |
|---|---|---|
on | address | Power the zone on. |
off | address | Power the zone off. |
all_off | — | Power off every configured zone in one sweep. |
set_volume | address, level | Set the zone to an absolute volume 0–100 (scaled to the amp's native 0–38). |
mute_on | address | Mute the zone. |
mute_off | address | Unmute the zone. |
mute_toggle | address | Flip mute from the last polled state — can be one poll stale if the zone was muted at a keypad since the last read. |
set_source | address, source | Select the amp's rear input, 1–6. |
get_zone_status | address | Force an immediate status read for one zone. |
get_zones | — | Poll every zone across all configured amps (1–max_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:
- 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.
- 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,
1–6. - Give each source an On Macro that sends this amp's
set_sourcefor 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>whereccisPR(power00/01),MU(mute),VO(volume00–38) orCH(source01–06). Example:<11VO15sets 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_intervalto taste. - No native relative volume or mute toggle. Every value is set absolutely.
mute_toggleis 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
| Symptom | Check |
|---|---|
| No response from amp | Telnet 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 updates | The amp pushes nothing; confirm status_interval and that the zone address is the two-digit code (11, not 1). |
| Some zones respond, others do not | Those 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 steps | Expected — 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.
Related documentation
- 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