Summary
The McIntosh CR106 is a multi-zone preamplifier supporting RS232 and TCP/IP external control via an ASCII packet protocol. This spec covers core (power, status, display), per-input, per-zone, and group (multi-zone) commands. Control is compatible with Crestron, AMX, Savant, Control4, and other RS232-based systems.
Transport
protocols:
- tcp
- serial
# Source states both RS232 and TCP/IP carry the same ASCII packet protocol.
# "The CR106 RS232 uses port 57012 for these communications." (TCP port for IP control)
addressing:
port: 57012
serial:
baud_rate: 115200
data_bits: 8
parity: none
stop_bits: 1
flow_control: none
auth:
type: none # inferred: no auth procedure in source
Traits
traits:
- powerable # inferred from PWR power on/off command
- queryable # inferred from QRY / ZQY / GQY query commands
- routable # inferred from ZIA / GIA input selection commands
- levelable # inferred from ZVL volume, ZBA balance, trim and tone commands
Actions
# Packet structure (verbatim from source):
# Start Byte 0x28 '(' | Command ID (3 bytes) | Parameters (each prefixed 0x20 space) | Stop Byte 0x29 ')'
# Optional CR/NL (0x0D 0x0A) terminator for readability.
# Command IDs are 3-char ASCII. Param ordering follows source packet tables.
# Conventions: Unit ID 1-5 (0x31-0x35); Zone ID 1-6 (0x31-0x36); Group ID 1-6 (0x31-0x36).
# Input ID values: 0=NONE, 1=AUX1, 2=AUX2, 3=AUX3, 4=AUX4, 5=COAX1, 6=COAX2, 7=OPT1, 8=OPT2, 9=BLUETOOTH.
# --- Core Commands ---
- id: query
label: Query
kind: query
command: "(QRY)"
params: []
notes: "With no parameter specified, returns status for the requested command."
- id: status_enable
label: Status Enable
kind: action
command: "(STA {state})"
params:
- name: state
type: enum
values: ["1", "0"]
description: "'1' -> On (auto status messages on state change); '0' -> Off"
- id: power
label: Power
kind: action
command: "(PWR {state})"
params:
- name: state
type: enum
values: ["1", "0"]
description: "'1' -> On; '0' -> Off. If Power is Off, all non-Power commands return FAILED_PRECONDITION."
- id: display_brightness
label: Display Brightness
kind: action
command: "(TDB {level})"
params:
- name: level
type: enum
values: ["1", "2", "3", "4"]
description: "'1'->25%, '2'->50%, '3'->75%, '4'->100%"
- id: meter_lights
label: Meter Lights
kind: action
command: "(TML {state})"
params:
- name: state
type: enum
values: ["1", "0"]
description: "'1' -> On; '0' -> Off"
# --- Input Commands --- packet: (CMD UnitID InputID [Param])
- id: input_trim_level
label: Input Trim Level
kind: action
command: "(ITL {unit_id} {input_id} {level})"
params:
- name: unit_id
type: integer
description: "Target CR106 Unit/Link ID, 1-5"
- name: input_id
type: integer
description: "Input ID 0-9 (see Input ID map)"
- name: level
type: string
description: "'-10' to '10' set level; step size 0.5dB"
- id: bt_pair
label: BT Pair
kind: action
command: "(IBT {unit_id} {input_id})"
params:
- name: unit_id
type: integer
description: "Target CR106 Unit/Link ID, 1-5"
- name: input_id
type: integer
description: "Must be 9 (BLUETOOTH); status not supported"
notes: "Only valid for Bluetooth input; status query not supported."
# --- Zone Commands --- packet: (CMD UnitID ZoneID [Param])
- id: zone_query
label: Zone Query
kind: query
command: "(ZQY {unit_id} {zone_id})"
params:
- name: unit_id
type: integer
description: "Target CR106 Unit/Link ID, 1-5"
- name: zone_id
type: integer
description: "Target Zone index, 1-6"
notes: "Returns all settings for the requested Zone."
- id: zone_select
label: Zone Select
kind: action
command: "(ZNS {unit_id} {zone_id})"
params:
- name: unit_id
type: integer
description: "Target CR106 Unit/Link ID, 1-5"
- name: zone_id
type: integer
description: "Target Zone index, 1-6"
notes: "Sets the Zone Context of the display."
- id: zone_volume
label: Zone Volume
kind: action
command: "(ZVL {unit_id} {zone_id} {value})"
params:
- name: unit_id
type: integer
description: "Target CR106 Unit/Link ID, 1-5"
- name: zone_id
type: integer
description: "Target Zone index, 1-6"
- name: value
type: string
description: "'U' -> Up 1%; 'D' -> Down 1%; '0'-'100' -> Set %"
- id: zone_mute
label: Zone Mute
kind: action
command: "(ZMT {unit_id} {zone_id} {state})"
params:
- name: unit_id
type: integer
description: "Target CR106 Unit/Link ID, 1-5"
- name: zone_id
type: integer
description: "Target Zone index, 1-6"
- name: state
type: enum
values: ["1", "0"]
description: "'1' -> Mute; '0' -> Unmute"
- id: zone_input_selection
label: Zone Input Selection
kind: action
command: "(ZIA {unit_id} {zone_id} {source_unit_id} {input_id})"
params:
- name: unit_id
type: integer
description: "Target CR106 Unit/Link ID, 1-5"
- name: zone_id
type: integer
description: "Target Zone index, 1-6"
- name: source_unit_id
type: integer
description: "Parameter 1 = source Unit ID"
- name: input_id
type: integer
description: "Parameter 2 = Input ID (see Input ID map)"
- id: zone_balance
label: Zone Balance
kind: action
command: "(ZBA {unit_id} {zone_id} {value})"
params:
- name: unit_id
type: integer
description: "Target CR106 Unit/Link ID, 1-5"
- name: zone_id
type: integer
description: "Target Zone index, 1-6"
- name: value
type: string
description: "'L' -> Left 1dB; 'R' -> Right 1dB; '-50' to '50' -> Set Value (sign: - Left, + Right)"
- id: zone_b_channel_trim
label: Zone B Channel Trim Level
kind: action
command: "(ZBT {unit_id} {zone_id} {level})"
params:
- name: unit_id
type: integer
description: "Target CR106 Unit/Link ID, 1-5"
- name: zone_id
type: integer
description: "Target Zone index, 1-6"
- name: level
type: string
description: "'-10' to '10' set level; step size 0.5dB"
- id: zone_subwoofer_trim
label: Zone Subwoofer Trim Level
kind: action
command: "(ZST {unit_id} {zone_id} {level})"
params:
- name: unit_id
type: integer
description: "Target CR106 Unit/Link ID, 1-5"
- name: zone_id
type: integer
description: "Target Zone index, 1-6"
- name: level
type: string
description: "'-10' to '10' set level; step size 0.5dB"
- id: zone_tone_bass
label: Zone Tone Bass
kind: action
command: "(ZTB {unit_id} {zone_id} {value})"
params:
- name: unit_id
type: integer
description: "Target CR106 Unit/Link ID, 1-5"
- name: zone_id
type: integer
description: "Target Zone index, 1-6"
- name: value
type: string
description: "'U' -> Up 1dB; 'D' -> Down 1dB; '-12' to '12' -> Set Level"
- id: zone_tone_treble
label: Zone Tone Treble
kind: action
command: "(ZTT {unit_id} {zone_id} {value})"
params:
- name: unit_id
type: integer
description: "Target CR106 Unit/Link ID, 1-5"
- name: zone_id
type: integer
description: "Target Zone index, 1-6"
- name: value
type: string
description: "'U' -> Up 1dB; 'D' -> Down 1dB; '-12' to '12' -> Set Level"
- id: zone_equalizer
label: Zone Equalizer
kind: action
command: "(ZEQ {unit_id} {zone_id} {preset})"
params:
- name: unit_id
type: integer
description: "Target CR106 Unit/Link ID, 1-5"
- name: zone_id
type: integer
description: "Target Zone index, 1-6"
- name: preset
type: enum
values: ["0", "1", "2", "3", "4", "5", "6"]
description: "'0'->Off, '1'->Music, '2'->Music II, '3'->Relaxed, '4'->Tilt, '5'->Action, '6'->Action + Movie"
- id: zone_high_pass
label: Zone High Pass
kind: action
command: "(ZHP {unit_id} {zone_id} {value})"
params:
- name: unit_id
type: integer
description: "Target CR106 Unit/Link ID, 1-5"
- name: zone_id
type: integer
description: "Target Zone index, 1-6"
- name: value
type: string
description: "'0' -> Disable; '1' -> Enable; '40'-'120' -> Set Hertz"
notes: "Status returns enable + frequency, e.g. (ZHP 1 3 0 50) = 1-ZONE3 high pass disabled at 50Hz."
- id: zone_low_pass
label: Zone Low Pass
kind: action
command: "(ZLP {unit_id} {zone_id} {value})"
params:
- name: unit_id
type: integer
description: "Target CR106 Unit/Link ID, 1-5"
- name: zone_id
type: integer
description: "Target Zone index, 1-6"
- name: value
type: string
description: "'0' -> Disable; '1' -> Enable; '40'-'120' -> Set Hertz"
notes: "Status returns enable + frequency, e.g. (ZLP 4 2 1 70) = 4-ZONE2 low pass enabled at 70Hz."
# --- Group Commands --- packet: (CMD GroupID [Param]) (GMK omits Group ID)
- id: group_query
label: Group Query
kind: query
command: "(GQY {group_id})"
params:
- name: group_id
type: integer
description: "Target Group index, 1-6"
notes: "Returns all settings for the requested Group. If Group ID omitted, returns list of current Group IDs."
- id: group_volume
label: Group Volume
kind: action
command: "(GVL {group_id} {value})"
params:
- name: group_id
type: integer
description: "Target Group index, 1-6"
- name: value
type: string
description: "'U' -> Up 1%; 'D' -> Down 1%; '0'-'100' -> Set %"
- id: group_mute
label: Group Mute
kind: action
command: "(GMT {group_id} {state})"
params:
- name: group_id
type: integer
description: "Target Group index, 1-6"
- name: state
type: enum
values: ["1", "0"]
description: "'1' -> Mute; '0' -> Unmute"
- id: group_input_selection
label: Group Input Selection
kind: action
command: "(GIA {group_id} {source_unit_id} {input_id})"
params:
- name: group_id
type: integer
description: "Target Group index, 1-6"
- name: source_unit_id
type: integer
description: "Parameter 1 = source Unit ID"
- name: input_id
type: integer
description: "Parameter 2 = Input ID (see Input ID map)"
- id: create_group
label: Create Group
kind: action
command: "(GMK {zones})"
params:
- name: zones
type: string
description: "Repeated 'ij' tokens; i=Unit ID, j=Zone ID. Omits Group ID and its preceding space."
notes: "e.g. (GMK 12 22 31 54) creates a group with 1-ZONE2, 2-ZONE2, 3-ZONE1, 5-ZONE4."
- id: delete_group
label: Delete Group
kind: action
command: "(GRM {group_id})"
params:
- name: group_id
type: integer
description: "Target Group index, 1-6"
- id: update_group_zones
label: Update Group Zones
kind: action
command: "(GUZ {group_id} {zones})"
params:
- name: group_id
type: integer
description: "Target Group index, 1-6"
- name: zones
type: string
description: "Repeated 'ij' tokens; i=Unit ID, j=Zone ID"
notes: "e.g. (GUZ 3 12 22 31 54) updates Group 3 to 1-ZONE2, 2-ZONE2, 3-ZONE1, 5-ZONE4."
Feedbacks
# Source: device echoes the same Command as an acknowledgement after processing.
# Invalid/corrupt commands yield an Error Message instead (see Events).
- id: command_ack
type: string
description: "Echo of the processed command packet, used as acknowledgement."
- id: power_state
type: enum
values: [on, off]
description: "Reported via PWR status / QRY."
- id: zone_settings
type: string
description: "Returned by ZQY; all settings for the requested Zone."
- id: group_settings
type: string
description: "Returned by GQY; all settings for the requested Group (or list of Group IDs if Group ID omitted)."
Variables
# Settable continuous/level parameters are expressed as Actions (ZVL, ZBA, trims, tone, ZHP/ZLP freq).
# No separate non-action variables documented in source.
# UNRESOLVED: source defines no distinct variable channel beyond the actions above.
Events
# Unsolicited messages the CR106 transmits automatically.
- id: status_update
type: string
description: "On state change, the CR106 auto-transmits status updates (only when STA enabled), letting the host maintain current state."
- id: connect_banner
type: string
description: "On first AC connection, sends model, serial, and firmware: (CR106), (Serial Number: XXX####), (FW Version: #.#.#)."
# Error messages (verbatim from source):
- id: err_unknown
type: string
description: "(ERR 2) - Default message for all unclassified errors."
- id: err_invalid_argument
type: string
description: "(ERR 3) - Parameter is invalid for specified command."
- id: err_failed_precondition
type: string
description: "(ERR 9) - Parameter incompatible with current value(s) for one or more other settings."
- id: err_unimplemented
type: string
description: "(ERR 12) - Command is not supported/recognized."
Macros
# No multi-step sequences described explicitly in source.
# UNRESOLVED: no macros documented.
Safety
confirmation_required_for: []
interlocks:
- "Power off precondition: when PWR is Off, all non-Power RS232 commands return FAILED_PRECONDITION (ERR 9)."
# Source contains no explicit safety warnings, power-on sequencing, or interlock procedures
# beyond the power-off command-precondition above. No values inferred.
Notes
- Hardware: RS232C serial control via 3.5mm TRS cable. Pinout — Tip: TXD (transmitted by CR106), Ring: RXD (received by CR106), Sleeve: Ground.
- Compatibility: Protocol compatible with Crestron, AMX, Savant, Control4, and other RS232-based control systems.
- Unit/Link ID range 1-5; Zone ID range 1-6; Group ID range 1-6.
- Input ID map: 0=NONE (zones/groups only), 1=AUX1, 2=AUX2, 3=AUX3, 4=AUX4, 5=COAX1, 6=COAX2, 7=OPT1, 8=OPT2, 9=BLUETOOTH.
- Trim step sizes: ITL/ZBT/ZST use 0.5dB steps over -10..10.
- Disabled inputs/zones: Requesting a disabled Input or Zone returns FAILED_PRECONDITION (ERR 9).
## Provenance
```yaml
source_domains:
- mcintoshlabs.com
- scribd.com
source_urls:
- https://www.mcintoshlabs.com/-/media/Files/mcintoshlabs/DocumentMaster/us/CR106-External-Control.pdf
- https://www.scribd.com/document/942837415/McIntosh-RS232ControlApplicationNote
retrieved_at: 2026-08-01T20:36:33.586Z
last_checked_at: 2026-08-05T08:31:47.600Z
```
## Verification Summary
```yaml
verdict: verified
checked_at: 2026-08-05T08:31:47.600Z
matched_actions: 27
action_count: 27
confidence: medium
summary: "All 27 spec actions match source opcodes verbatim; transport values (port 57012, 115200, 8/N/1) verified; source catalogue fully represented. (8 unresolved item(s) noted in Known Gaps.)"
```
## Known Gaps
```yaml
- "model family marketing name not stated beyond \"CR106\"; firmware version range not stated"
- "source defines no distinct variable channel beyond the actions above."
- "no macros documented."
- "marketing model family name beyond CR106 not stated"
- "firmware version compatibility range not stated"
- "protocol version not stated"
- "max concurrent TCP connections / keepalive behavior not stated"
- "whether TCP and RS232 can operate simultaneously not stated"
```
---
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0