Skip to main content

AudioControl Multi-Zone Amplifier

The audiocontrol driver controls AudioControl networked multi-zone matrix amplifiers (Director M-series, D2800, D4600). Telnet ASCII commands on port 23 drive the amp and poll zone status via SYSTEMstat?.

Prerequisites

  • Amplifier on the same LAN as GEM, with a static IP or DHCP reservation.
note

The /json/signalprocessing.json endpoint is only used once at connect for model detection — its body is too large for the device HTTP server to serve reliably on multi-zone amps (truncates around 24 KB), so all live zone state comes over telnet.

Setup

  1. System → Devices: add a device with driver audiocontrol. Set ip. Default port is 23.
  2. Save and enable. On connect the driver:
    • probes /json/signalprocessing.json for ampModel / ampName and writes them to model / amp_name. If the JSON endpoint is unreachable it falls back to SYSTEMstat? over telnet, parsing the AMPLIFIER NAME: line.
    • starts polling the amp every sync_interval ms (default 5000) via SYSTEMstat?. Each zone row in the response auto-creates a GEM zone the first time it is seen, under the av subsystem. Wired zones get numeric addresses (1..N); Digital Out zones get letter addresses (a, b).
  3. You don't have to wait for the first poll — run the sync_zones command to force an immediate SYSTEMstat? sweep and create any missing zones now. It reports how many zones it created versus how many already existing.
  4. Run sync_av_zones to create matching AV Zone rows for the main (numeric) zone outputs (so each shows up in the AV routing graph). Existing AV Zone rows are left alone. Digital Out zones are skipped — they're driven by the DXO commands rather than Z[address] templates, and their always-on power state would otherwise trip AV power divergence detection. If a Digital Out already has an AV Zone row from an earlier sync, delete it (or set power_reconcile = false on the zone) to stop divergence alerts.

Attributes

Device — required

AttributeTypeDescription
ipstringLAN IP of the amplifier.

Device — optional

AttributeTypeDefaultDescription
portint23Telnet port.
zone_countint8Number of output zones.
sync_intervalint (ms)5000Zone status poll cadence.

Reflected device attributes

AttributeSource
modelampModel from one-shot JSON probe, or AMPLIFIER NAME: from SYSTEMstat?.
amp_nameampName from the one-shot JSON probe (user-renamable).
global_temp, global_voltage, global_protection, thermal_protectionParsed from SYSTEMstat? lines.
active_zonesJSON list of the names of zones currently powered on, recomputed after each SYSTEMstat? poll settles (read-only at-a-glance summary of what the amp is driving).
last_errorLast poll error message.

Zone

  • Address required: yes.
  • Address format: numeric 1..N for wired zones, a / b for Digital Out zones.

The driver writes the following onto each polled zone:

AttributeTypeSource
power_statestringon / off
mute_statestringon / off. The regular status poll does not report mute, and there is no dedicated mute-query command, so this only populates if you issue a raw mute query through passthrough (e.g. Z1mute?).
volumeintCurrent zone volume (0–100 scale).
inputstringRaw source label the zone is currently on, exactly as the amp reports it — e.g. MX13 & 13 (matrix channel pair), DXa (Digital In A), Local. This is the source label, not a numeric id.
signal_sensestringon / off

Commands

Power & status

CommandArgsNotes
power_on / power_offWhole-amp power.
query_statusIssues SYSTEMstat?; populates global telemetry attributes.
query_voltage / query_temp / query_protect / query_shortSingle-value queries.
query_groups / query_amp_name
query_zone_on / query_zone_off / query_input / query_group_input
sync_zonesForce a zone status poll now and auto-create any missing GEM zones.
sync_av_zonesWalk the main (numeric) zone outputs and ensure a matching AV Zone row exists. Digital Out zones are skipped.
all_zones_on / all_zones_off
mute_all / unmute_allMute or unmute every zone at once.

Zone control

CommandArgsNotes
zone_on / zone_offaddressPer-zone power.
volumeaddress, volumeSet absolute zone volume. The amp reports volume on a 0–100 scale.
volume_up / volume_downaddressStep the zone volume up/down by one increment.
mute_on / mute_offaddress
set_bass / set_trebleaddress, level
bass_up / bass_down / treble_up / treble_downaddress
loudness_on / loudness_offaddress
zone_signalsense_on / zone_signalsense_offaddressPer-zone signal sense.
all_signalsense_on / all_signalsense_offGlobal.
get_volumeaddress
recall_eqaddress, preset (1-6)
query_zone_stat / query_zone_eq / query_zone_bass / query_zone_treble / query_zone_loudness / query_zone_input / query_zone_signalsense / query_zone_poweraddress
get_zone_inputaddressAlias of query_zone_input.

Source routing

CommandArgsNotes
set_sourceaddress, source_idM-series numbered local source (legacy).
set_source_localaddressD2800 / D4600: switch zone to its Local input.
set_source_bus_aaddressD2800 / D4600: switch zone to Bus A.
set_source_bus_baddressD2800 / D4600: switch zone to Bus B.
set_inputaddress, input (1-8)Route a matrix (analog) source channel pair (1-2 … 15-16) to a zone.
set_digital_inputaddress, input (a/b)Route Digital Input A or B to a zone.
set_dante_inputaddress, input (raw suffix)Route a Dante source by raw source suffix — e.g. V0CS3 (Dante input 3 via Dante Controller), V1CS2 (AudioControl Dante amp source), MX5 (matrix), DXa (digital). Appended after Z[n]source.
set_digital_outputaddress (a/b), input (MX1MX8, DXa, DXb, V0CSx, …)Route a source to Digital Output A or B by raw source suffix.
set_source_matrixaddress, source_id (1-8)M6800D / Director: route a matrix (analog) source channel pair (1-2 … 15-16) to a zone.
set_source_digitaladdress, digital_input (a/b)M6800D / Director: route Digital Input A or B to a zone.
set_source_danteaddress, dante_id, input_indexM6800D / Director: route a Dante source to a zone. dante_id 1-8 = AudioControl Dante amps (0 for non-AudioControl sources via Dante Controller); input_index 1-8 stereo pair from amp web UI. Digital inputs cannot be Dante-routed.
set_dxo_source_matrixoutput (a/b), source_id (1-8)M6800D / Director: route a matrix channel pair to Digital Output A or B.
set_dxo_source_danteoutput (a/b), dante_id, input_indexM6800D / Director: route a Dante source to Digital Output A or B.
query_dxo_inputoutput (a/b)Query the source currently routed to Digital Output A or B.

Lipsync (D4600 zones 5-8)

CommandArgsNotes
lipsync_up / lipsync_downaddressStep delay by 5 ms.
set_lipsyncaddress, steps (0-19)5 ms per step.

Groups

CommandArgsNotes
group_zoneaddress, group_idAdd zone to a group.
ungroup_zoneaddress, group_idRemove a zone from a group.
group_volumegroup_id, volumeSet every zone in a group to a volume.
group_mute / group_unmute / group_on / group_offgroup_id

Escape hatch

CommandArgsNotes
passthroughinputSend a raw telnet command to the amp. The string is transmitted verbatim. Useful for one-off diagnostics or commands not yet wrapped by the driver.

Known quirks

  • The amp does not push state changes — front-panel volume / source changes only appear after the next poll.
  • Digital Out zones use letter addresses (a, b); wired zones use numeric ids.
  • AV zones aren't auto-created on connect — run sync_av_zones once to populate them (main zone outputs only; Digital Out zones are excluded).
  • M-series uses numbered set_source; D2800 / D4600 use the Local / Bus A / Bus B variants.
  • Garbage commands echo back as xx<cmd>xx and are logged as warnings — useful for catching typos in custom macros.

Troubleshooting

SymptomCheck
Zone state diverges from front panelLower sync_interval or run sync_zones manually; the amp does not push events.
Zone physically on but GEM shows it off (e.g. an off command lost to a network blip)Self-heals: the driver's power_state poll feeds GEM's physical power reconciliation, which restores the zone's source (macros suppressed) so the off controls return. Opt out per zone with power_reconcile = false.
Model never populatedOne-shot JSON probe failed; check http://<ip>/json/signalprocessing.json in a browser, or watch logs for the telnet fallback.
sync_zones reports errorsConfirm the av subsystem exists in GEM — auto-created zones live under it. Also confirm telnet on port 23 is reachable.