Summary

This spec covers the third-party ASCII control protocol used by Bose Professional audio products — ControlSpace ESP/EX signal processors, PowerMatch and PowerShare amplifiers, MSA12X powered steerable array loudspeakers, and the WP/EP/EX Dante endpoints. The protocol is transported as ASCII text terminated by <CR> over RS-232 (ESP/EX), TCP port 10055 (ESP/EX/PM/PS), and UDP port 49494 (MSA12X, endpoints). Commands are divided into System, Device, Module, MSA12X, Endpoint, and Subscription categories. Module commands reference user-defined or fixed module labels in the ControlSpace Designer design.

Transport

protocols:
  - serial
  - tcp
  - udp
addressing:
  tcp_port: 10055
  udp_port: 49494
serial:
  baud_rate: 38400
  data_bits: 8
  parity: none
  stop_bits: 1
  flow_control: none
auth:
  type: none  # inferred: no auth procedure in source

Notes on transport (from source):

  • RS-232: 3-wire connection is sufficient; CTS/RTS optional. 1U ESPs (880/1240/4120/1600) default to 38,400 baud. ESP-00 and EX default to 115,200 baud. 8 data bits, no parity, 1 stop bit for all.
  • Serial-over-TCP (port 10055) is for ESP, EX, PowerMatch (networked), PowerShare. Device acts as Server; the client must initiate the connection. Up to 32 simultaneous SoIP connections (8 for ESP-00/PS404D/PS604D). Port can be changed/disabled on 1U ESPs and EX via ControlSpace Designer.
  • Serial-over-UDP (port 49494) is used by MSA12X and WP/EP/EX endpoints. MSA12X supports 1 SoIP connection. Endpoints also send unsolicited UDP event notifications to an IP/port configured via the SASIP command.
  • ESP also sends "Ready" over RS-232 when boot completes; SoIP connections must be re-established after reboot.

Traits

- powerable       # inferred from SY/Standby commands on PM/PS, MSA12X STANDBY
- routable        # inferred from Router, Matrix Mixer, Source Selector, Conference Room Router commands
- queryable       # inferred from GS, GG, GN, GV, GM, GL, GY, GF, GR, GH, GA, STATUS, VERSION, AUDIOLEVEL queries
- levelable       # inferred from SV/GV volume, SG/GG group level, EQ, gain, delay, dynamics parameters

Actions

# ----------------------------------------------------------------------------
# System Commands (System-level Parameter Sets, Groups, Room Combine)
# ----------------------------------------------------------------------------
- id: set_parameter_set
  label: Recall Parameter Set
  kind: action
  command: "SS{n}"
  params:
    - name: n
      type: hex
      description: Parameter Set number, 1-FFh (1-255 decimal)
- id: get_parameter_set
  label: Get Last Invoked Parameter Set
  kind: query
  command: "GS"
- id: set_group_level
  label: Set Group Master Level
  kind: action
  command: "SG{n,l}"
  params:
    - name: n
      type: hex
      description: Group number, 1-40h (1-64 decimal)
    - name: l
      type: hex
      description: Level, 0h (-60dB) to 90h (+12dB) in 0.5dB steps (ESP); PM/PS 0h-78h (0dB); FFh (-60.5dB/-inf)
- id: get_group_level
  label: Get Group Master Level
  kind: query
  command: "GG{n}"
- id: set_group_level_increment
  label: Set Group Level Increment/Decrement
  kind: action
  command: "SH{n,d,x}"
  params:
    - name: n
      type: hex
      description: Group number, 1-40h (1-64 decimal)
    - name: d
      type: integer
      description: Direction, 1=up or 0=down
    - name: x
      type: hex
      description: Number of 0.5dB steps (e.g. 5dB = A)
- id: set_group_mute
  label: Set Group Master Mute
  kind: action
  command: "SN{n,m}"
  params:
    - name: n
      type: hex
      description: Group number, 1-40h (1-64 decimal)
    - name: m
      type: enum
      description: 'M=Mute, U=Un-mute, T=Toggle mute state'
- id: get_group_mute
  label: Get Group Master Mute
  kind: query
  command: "GN{n}"
- id: set_room_combine
  label: Set Room Combine
  kind: action
  command: "SRC{n,a,b,s}"
  params:
    - name: n
      type: integer
      description: Room Combine Group number, 1-6 (EX only)
    - name: a
      type: integer
      description: Room number 1-6 (or name)
    - name: b
      type: integer
      description: Room number 1-6 (or name)
    - name: s
      type: enum
      description: 'J=Join, S=Split'
- id: get_room_combine
  label: Get Room Combine
  kind: query
  command: "GRC{n,a,b}"
- id: set_parameter_set_list
  label: Set Parameter Set List Selection
  kind: action
  command: 'SA"A">{1|2}={n}'
  params:
    - name: list_name
      type: string
      description: Parameter Set List name (quoted)
    - name: index1
      type: integer
      description: Always 1 or 2 to select the list
    - name: n
      type: integer
      description: Index of Parameter Set within the list
- id: get_parameter_set_list
  label: Get Parameter Set List Selection
  kind: query
  command: 'GA"A">{1|2}'

# ----------------------------------------------------------------------------
# Device Commands (slot/channel level, mute, signal level, network, faults)
# ----------------------------------------------------------------------------
- id: set_io_volume
  label: Set Input/Output Volume
  kind: action
  command: "SV{s,c,l}"
  params:
    - name: s
      type: hex
      description: Slot number (see Source Tables 1-2 for slot map per device)
    - name: c
      type: integer
      description: Channel number 1-8 (ESP) or 1-4 (PM/PS)
    - name: l
      type: hex
      description: 'Level 0h (-60dB) to 90h (+12dB), 0.5dB steps (ESP); 0h-78h (0dB) for PM/PS'
- id: get_io_volume
  label: Get Input/Output Volume
  kind: query
  command: "GV{s,c}"
- id: set_io_volume_increment
  label: Set Input/Output Volume Increment/Decrement
  kind: action
  command: "SI{s,c,d,x}"
  params:
    - name: s
      type: hex
      description: Slot number
    - name: c
      type: integer
      description: Channel number 1-8 (ESP) or 1-4 (PM/PS)
    - name: d
      type: integer
      description: '1=up, 0=down'
    - name: x
      type: hex
      description: Number of 0.5dB steps
- id: set_io_mute
  label: Set Input/Output Mute
  kind: action
  command: "SM{s,c,m}"
  params:
    - name: s
      type: hex
      description: Slot number
    - name: c
      type: integer
      description: Channel number 1-8 (ESP) or 1-4 (PM/PS)
    - name: m
      type: enum
      description: 'M=Mute, U=Un-mute, T=Toggle'
- id: get_io_mute
  label: Get Input/Output Mute
  kind: query
  command: "GM{s,c}"
- id: get_signal_level
  label: Get Signal Level
  kind: query
  command: "GL{s}"
  params:
    - name: s
      type: hex
      description: Slot index (see GL Indices table in source)
- id: get_signal_level_param
  label: Get Signal Level (Parameter)
  kind: query
  command: "GL{s,p}"
  params:
    - name: s
      type: hex
      description: Slot index
    - name: p
      type: integer
      description: Parameter index (for AEC Input=1, ERL=2, ERLE=3)
- id: get_ip_address
  label: Get IP Address
  kind: query
  command: "IP"
- id: set_ip_address
  label: Set IP Address
  kind: action
  command: "IP{ip}"
  params:
    - name: ip
      type: string
      description: 'Dotted quad xxx.xxx.xxx.xxx (takes effect after reboot)'
- id: get_network_parameter
  label: Get Network Parameter
  kind: query
  command: "NP{p}"
  params:
    - name: p
      type: enum
      description: 'T=Type (DHCP/Static), M=Subnet Mask, G=Default Gateway'
- id: set_network_parameter
  label: Set Network Parameter
  kind: action
  command: "NP{p,v}"
  params:
    - name: p
      type: enum
      description: 'T, M, or G'
    - name: v
      type: string
      description: 'D=DHCP, S=Static, or xxx.xxx.xxx.xxx (takes effect after reboot)'
- id: reset_network_defaults
  label: Reset Network Parameters to Defaults
  kind: action
  command: "NPF"
- id: reset_reboot
  label: Reset / Reboot Device
  kind: action
  command: "RESET"
- id: set_standby
  label: Set Standby State (PM/PS only)
  kind: action
  command: "SY{s}"
  params:
    - name: s
      type: enum
      description: 'S=Standby, N=Normal'
- id: get_standby
  label: Get Standby State (PM/PS only)
  kind: query
  command: "GY"
- id: get_configuration
  label: Get Output Configuration (PM only)
  kind: query
  command: "GC"
- id: set_fault_notification
  label: Set Fault Output Notification (PM only)
  kind: action
  command: "SF{n}"
  params:
    - name: n
      type: enum
      description: 'O=On, F=Off (preference not retained across power-cycle)'
- id: get_fault_status
  label: Get Fault Status (PM only)
  kind: query
  command: "GF"
- id: clear_fault_alarms
  label: Clear Fault/Alarms (PM only)
  kind: action
  command: "CF"
- id: set_alarm_reporting
  label: Set Alarm Reporting (PM only)
  kind: action
  command: "SR{n}"
  params:
    - name: n
      type: enum
      description: 'O=On, F=Off (preference not retained across power-cycle)'
- id: get_alarm_status
  label: Get Alarm Status (PM only)
  kind: query
  command: "GR{c}"
  params:
    - name: c
      type: integer
      description: 'Channel 1-8 (1-4 for PM4500N/PM4250N), or 0 for non-channel-specific alarms'
- id: get_alarm_history
  label: Get Alarm History (PM/PS only)
  kind: query
  command: "GH"
- id: clear_alarm_history
  label: Clear Alarm History (PM/PS only)
  kind: action
  command: "CH"

# ----------------------------------------------------------------------------
# Module Commands (SA/GA/MA) - parameter ranges per module type are documented
# in the source's "ESP/EX Module Indices" and "PowerMatch / PowerShare Module
# Indices" sections. Each action below is a parameterized template; Index 1,
# Index 2, and Value are user-defined per the per-module table in the source.
# ----------------------------------------------------------------------------
- id: set_module_parameter
  label: Set Module Parameter
  kind: action
  command: 'SA"Module Name">{Index1}>{Index2}={Value}'
  params:
    - name: module
      type: string
      description: Module label (quoted; user-defined in ControlSpace Designer, or fixed for PM/PS)
    - name: index1
      type: string
      description: Primary index - selects input, channel, sub-module, or section per module type
    - name: index2
      type: string
      description: Secondary index (where applicable) - selects parameter per module type
    - name: value
      type: string
      description: 'Value to set (range and format per module type - see source sections 6.1.x / 6.2.x)'
- id: set_module_parameter_remote
  label: Set Module Parameter on a Different Device
  kind: action
  command: 'SA@"Device Name" "Module Name">{Index1}>{Index2}={Value}'
  params:
    - name: device
      type: string
      description: Device label (quoted; ESP network only - not for PM)
    - name: module
      type: string
      description: Module label (quoted)
    - name: index1
      type: string
      description: Primary index
    - name: index2
      type: string
      description: Secondary index
    - name: value
      type: string
      description: Value to set
- id: get_module_parameter
  label: Get Module Parameter
  kind: query
  command: 'GA"Module Name">{Index1}>{Index2}'
- id: get_module_parameter_remote
  label: Get Module Parameter on a Different Device
  kind: query
  command: 'GA@"Device Name" "Module Name">{Index1}>{Index2}'
- id: invoke_module_action
  label: Invoke Module Action (MA) - PSTN/VoIP
  kind: action
  command: 'MA"Module Name">{Index1}={Parameter}'
  params:
    - name: module
      type: string
      description: Module label (PSTN In / VoIP In)
    - name: index1
      type: integer
      description: '1=Dial Key, 2=Make Call, 3=End Call, 4=Answer Call, 5=TransferCall (VoIP)'
    - name: parameter
      type: string
      description: Dial digits, number, or SIP target

# ----------------------------------------------------------------------------
# MSA12X Commands (UDP port 49494)
# ----------------------------------------------------------------------------
- id: msa12x_find_unit
  label: MSA12X Find Unit (LED flash 5s)
  kind: action
  command: "FU{n}"
  params:
    - name: n
      type: integer
      description: 'Module within array: 1, 2, or 3 (2-module array uses 1 and 3)'
- id: msa12x_identify
  label: MSA12X Identify (persistent LED)
  kind: action
  command: "ID{n} {s}"
  params:
    - name: n
      type: integer
      description: 'Module 1, 2, or 3 (2-module array: 1 and 3)'
    - name: s
      type: integer
      description: '1=On, 0=Off'
- id: msa12x_array_count
  label: MSA12X Array Module Count
  kind: query
  command: "ARRAY"
- id: msa12x_set_input_gain
  label: MSA12X Set Input Gain
  kind: action
  command: "IG{t} {g}"
  params:
    - name: t
      type: enum
      description: 'A=Analog, D=Dante'
    - name: g
      type: number
      description: 'Gain: 0.0, 14.0, or 24.0'
- id: msa12x_get_input_gain
  label: MSA12X Get Input Gain
  kind: query
  command: "IG{t} Q"
  params:
    - name: t
      type: enum
      description: 'A=Analog, D=Dante'
- id: msa12x_set_input_source
  label: MSA12X Set Input Source
  kind: action
  command: "INPUT 1 {t}"
  params:
    - name: t
      type: integer
      description: '0=Dante, 1=Analog (ignored if backup mode is active)'
- id: msa12x_get_input_source
  label: MSA12X Get Input Source
  kind: query
  command: "GINPUT"
- id: msa12x_get_backup_strategy
  label: MSA12X Get Input Backup Strategy
  kind: query
  command: "GBKSTG"
- id: msa12x_set_standby
  label: MSA12X Set Standby Action
  kind: action
  command: "STANDBY {a}"
  params:
    - name: a
      type: enum
      description: 'NOW=enter Standby, WAKE=exit Standby'
- id: msa12x_get_standby
  label: MSA12X Get Standby State
  kind: query
  command: "GETSBST"
- id: msa12x_set_autostandby_time
  label: MSA12X Set Auto-Standby Wait Time (minutes)
  kind: action
  command: "STANDBY {w}"
  params:
    - name: w
      type: integer
      description: 'Wait time in minutes, 0-120 (0 disables auto-standby)'
- id: msa12x_get_autostandby_time
  label: MSA12X Get Auto-Standby Wait Time
  kind: query
  command: "GETSBTIME"
- id: msa12x_load_preset
  label: MSA12X Load Preset
  kind: action
  command: "LOAD {p}"
  params:
    - name: p
      type: integer
      description: 'Preset index 0-9 (preset number-1)'
- id: msa12x_get_current_preset
  label: MSA12X Get Last Invoked Preset
  kind: query
  command: "GCP"
- id: msa12x_get_audio_level
  label: MSA12X Get Audio Level
  kind: query
  command: "AUDIOLEVEL"
- id: msa12x_get_status_warning
  label: MSA12X Get Module Warning Status
  kind: query
  command: "STATUS 0 {n}"
  params:
    - name: n
      type: integer
      description: 'Module 1, 2, or 3'
- id: msa12x_get_status_fault
  label: MSA12X Get Module Fault Status
  kind: query
  command: "STATUS 1 {n}"
  params:
    - name: n
      type: integer
      description: 'Module 1, 2, or 3'
- id: msa12x_get_firmware_version
  label: MSA12X Get Module Firmware Version
  kind: query
  command: "VERSION {n}"
  params:
    - name: n
      type: integer
      description: 'Module 1, 2, or 3'

# ----------------------------------------------------------------------------
# Endpoint Commands (UDP port 49494) - WP/EP/EX Dante endpoints
# ----------------------------------------------------------------------------
- id: ep_find_unit
  label: Endpoint Find Unit (LED flash 5s)
  kind: action
  command: "FU"
- id: ep_identify
  label: Endpoint Identify (persistent LED)
  kind: action
  command: "ID{s}"
  params:
    - name: s
      type: integer
      description: '1=On, 0=Off'
- id: ep_set_input_gain
  label: Endpoint Set Input Gain
  kind: action
  command: "IG{c} {g}"
  params:
    - name: c
      type: integer
      description: Channel number
    - name: g
      type: number
      description: 'Gain per model: EX-4ML/EX-8ML/EP40 = 0/15/30/45 dB; EP22/WP22B/BU = 0/25/40 dB'
- id: ep_get_input_gain
  label: Endpoint Get Input Gain (EX-4ML/EX-8ML only)
  kind: query
  command: "IG{c} Q"
  params:
    - name: c
      type: integer
      description: 'Channel number, or 0 for all channels'
- id: ep_set_input_source
  label: Endpoint Set Input Source (WP22BU)
  kind: action
  command: "IS{c} {s}"
  params:
    - name: c
      type: integer
      description: 'Channel 2 only for WP22BU'
    - name: s
      type: enum
      description: 'A, B, or A+B'
- id: ep_set_phantom_power
  label: Endpoint Set Phantom Power
  kind: action
  command: "PP{c} {s}"
  params:
    - name: c
      type: integer
      description: Channel number, 1-8
    - name: s
      type: integer
      description: '1=On, 0=Off'
- id: ep_get_phantom_power
  label: Endpoint Get Phantom Power (EX-4ML/EX-8ML only)
  kind: query
  command: "PP{c} Q"
  params:
    - name: c
      type: integer
      description: 'Channel number, or 0 for all'
- id: ep_set_output_gain
  label: Endpoint Set Output Gain (EP22)
  kind: action
  command: "OG{c} {g}"
  params:
    - name: c
      type: integer
      description: Channel number
    - name: g
      type: number
      description: 'Gain: 0.0 or 10.0'
- id: ep_read_signal_level
  label: Endpoint Read Signal Level (EX-4ML/EX-8ML)
  kind: query
  command: "RSL"
- id: ep_write_logic_output
  label: Endpoint Write Logic Output
  kind: action
  command: "WLO{p} {s}"
  params:
    - name: p
      type: integer
      description: 'Output 1-16 (EX-8ML) or 1-8 (EX-4ML)'
    - name: s
      type: integer
      description: '1=On, 0=Off'
- id: ep_read_logic_output
  label: Endpoint Read Logic Output
  kind: query
  command: "RLO{p}"
  params:
    - name: p
      type: integer
      description: 'Output number, or 0 for all'
- id: ep_read_logic_input
  label: Endpoint Read Logic Input
  kind: query
  command: "RLI{p}"
  params:
    - name: p
      type: integer
      description: 'Input 1-8 (EX-8ML) or 1-4 (EX-4ML), or 0 for all'
- id: ep_set_logic_event
  label: Endpoint Set Logic Event Notification
  kind: action
  command: "EVNT{p} {e}"
  params:
    - name: p
      type: integer
      description: Logic input number
    - name: e
      type: enum
      description: 'RISE, FALL, BOTH, or OFF'
- id: ep_set_event_notification_ip
  label: Endpoint Set Event Notification IP/Port
  kind: action
  command: "SASIP{a}:{p}"
  params:
    - name: a
      type: string
      description: 'Target IP xxx.xxx.xxx.xxx'
    - name: p
      type: integer
      description: Target UDP port
- id: ep_query_audio_settings
  label: Endpoint Query All Audio Settings
  kind: query
  command: "QUERY"
- id: ep_restore_factory_defaults
  label: Endpoint Restore Factory Defaults
  kind: action
  command: "DEFAULTS"
- id: ep_get_firmware_version
  label: Endpoint Get Firmware Version
  kind: query
  command: "VERSION"

# ----------------------------------------------------------------------------
# Subscription Commands (unsolicited updates)
# ----------------------------------------------------------------------------
- id: subscription_support_query
  label: Query Device Subscription Support
  kind: query
  command: "SUB"
- id: subscription_register
  label: Subscribe to Data Change
  kind: action
  command: 'SUB"{GET_command_text}"'
  params:
    - name: get_command
      type: string
      description: 'Quoted GET command text (System, Device, or Module GET command)'
- id: subscription_unregister
  label: Unsubscribe from Data Change
  kind: action
  command: 'UNS"{GET_command_text}"'
  params:
    - name: get_command
      type: string
      description: 'Quoted GET command text (must match a prior subscription)'

Feedbacks

- id: parameter_set_last_invoked
  type: integer
  description: Last invoked Parameter Set number, 0-FF (0 = none)
- id: group_level
  type: integer
  description: Group master level in 0.5dB steps (0=−60dB, 90=+12dB on ESP, 78=0dB on PM/PS, FF=−inf)
- id: group_mute_state
  type: enum
  values: [muted, unmuted]
- id: room_combine_state
  type: string
  description: 'Bracketed pairing list e.g. "GRC 1,[2,4,5][1,3]" indicating which rooms are joined'
- id: io_volume
  type: integer
  description: 'I/O level in 0.5dB steps per slot/channel (see SV/GV action for ranges)'
- id: io_mute_state
  type: enum
  values: [muted, unmuted]
- id: signal_level_array
  type: array
  description: 'Hex array of channel levels; convert via formula 20*log10(level/16777215) where applicable (MSA12X AUDIOLEVEL)'
- id: ip_address
  type: string
  description: 'Dotted quad xxx.xxx.xxx.xxx (response to IP query)'
- id: network_parameter
  type: string
  description: 'D=DHCP, S=Static, or dotted quad (response to NP query)'
- id: standby_state
  type: enum
  values: [standby, normal]
- id: output_configuration
  type: array
  description: 'Per-channel config tokens: IN, BL, B7, B1, PA, QL, Q7, Q1 (PM only, GC response)'
- id: fault_state
  type: enum
  values: [fault, no_fault]
- id: alarm_status
  type: string
  description: '"GR c,s,t" - channel/severity(W|F|S|N)/type(N|O|S|A|D|I|L|C|P|Z)'
- id: alarm_history
  type: array
  description: 'Array of [Time, Date, Description] entries from GH (PM/PS only)'
- id: msa12x_audio_level
  type: string
  description: 'ACK AUDIOLEVEL i l - i in {1,18,19}, l is 32-bit hex (24-bit level)'
- id: msa12x_warning_code
  type: integer
  description: '0=None, 18=Signal Clip, 19=Amp Limiting, 20=High Temperature'
- id: msa12x_fault_code
  type: integer
  description: '0=None, 1101=Driver Fault, 1104=Temperature Fault, 1105=Amp/Internal Connection Fault'
- id: msa12x_firmware_version
  type: string
  description: 'Firmware version string e.g. "x.x" (per module)'
- id: ep_logic_io_state
  type: integer
  description: '1=On, 0=Off (per pin, from RLI/RLO/RLI responses)'
- id: ep_audio_settings_snapshot
  type: string
  description: 'ACK QUERY IG1=... PP1=... ID=... snapshot of all audio parameters (per model)'
- id: ep_firmware_version
  type: string
  description: 'Firmware version string from VERSION'

Variables

# Module parameters are addressable as Variables in ControlSpace Designer.
# Each module type exposes a user-defined set of parameters; range/format
# details per module are documented in source sections 6.1.x and 6.2.x.
# Examples (representative - full set is per module type):
- id: input_gain
  type: number
  description: 'Pre-amp gain in dB. ESP/EX: 0/14/24/32/44/54/64 (Mic/Line II, 1U ESP, EX); legacy set differs. MSA12X: 0.0/14.0/24.0. Endpoints: per model 0/15/30/45 or 0/25/40 dB.'
- id: input_type
  type: enum
  description: 'M=Mic, L=Line (Input module Index 1=1)'
- id: input_mute
  type: enum
  description: 'O=On (muted), F=Off, T=Toggle'
- id: phantom_power
  type: enum
  description: 'O=On, F=Off, T=Toggle'
- id: output_level
  type: number
  description: '−60.5 to +12.0 dB in 0.5 dB steps (most modules); PM/PS: −60.5 to 0.0 dB'
- id: output_mute
  type: enum
  description: 'O=On (muted), F=Off, T=Toggle'
- id: output_polarity
  type: enum
  description: 'O=On (inverted), F=Off, T=Toggle'
- id: peq_band_frequency
  type: integer
  description: '20 to 20000 Hz'
- id: peq_band_q
  type: number
  description: '0.10 to 10.0 in 0.1 steps'
- id: peq_band_gain
  type: number
  description: '−20.0 to +20.0 dB in 0.1 dB steps'
- id: geq_band_gain
  type: number
  description: '−15.0 to +15.0 dB in 0.1 dB steps (per band of 31, 20Hz-20kHz)'
- id: delay_time
  type: integer
  description: 'Samples; ESP-00 up to 144000 (3s), 1U ESP/EX up to 48000 (1s), PM up to 144000 (3s), PS up to 2400 (50ms)'
- id: limiter_peak_threshold
  type: number
  description: '0.5 to 71.0 V (or 142.0 for bridged), 0.5 step (PM Limiter)'
- id: matrix_cross_point_level
  type: number
  description: '−60.5 to 0.0 dB in 0.5 dB steps'
- id: source_selector_input
  type: integer
  description: '1-16 (mono or stereo source selector module)'
- id: router_output_input
  type: integer
  description: 'Output 1-32, Input 0-32 (0=Off)'
- id: pstn_auto_answer_rings
  type: integer
  description: '0=Off to 8 rings (PSTN Input module)'
- id: pstn_country_code
  type: integer
  description: '0 to 196 (see Appendix A in source)'
- id: voip_account_status
  type: string
  description: 'NOT_CONFIGURED|CONFIGURED|P2P_REGISTERED|PROXY_REGISTERING|PROXY_REGISTERED|PROXY_TIMEOUT (VoIP module, read-only)'
- id: voip_call_status
  type: string
  description: 'INCOMING|DIALING|RINGBACK|ACTIVE|HANGUP|HOLD_STATE_PEER (VoIP module, read-only)'
- id: agc_target_level
  type: number
  description: '−40.0 to +24 dB, 1 dB step (AGC Enhanced)'
- id: gate_threshold
  type: number
  description: '0 to −40 dBFS, 0.5 dB step'
- id: ducker_threshold
  type: number
  description: '0 to −40 dBFS, 0.5 step'
- id: pfs_dynamic_filter_release
  type: integer
  description: '1 to 43200 seconds'

Events

# Unsolicited notifications defined in source:
- id: msa12x_event
  description: 'Sent as UDP to the configured SASIP target. Format: ACK EVNT p e response, or RLI/RLO echoes of state changes.'
- id: endpoint_logic_event
  description: 'UDP packet sent when configured via EVNT (RISE/FALL/BOTH). Format documented alongside EVNT command in source.'
- id: subscribed_parameter_change
  description: 'For System/Device/Module GET commands that have subscription support (e.g. GG, GN, GV, GM, GA), the current value is sent automatically when it changes. Sent on the same TCP connection that issued SUB.'
- id: msa12x_warning_fault_change
  description: 'For PowerMatch, SR O enables unsolicited GR c,s,t,x alarms; SF O enables unsolicited GF notifications.'
- id: automatic_module_notification
  description: 'Module commands on a module whose label is prefixed with "#" (e.g. "#Hall") cause a GA response to be sent automatically whenever parameters for that module change from other devices (CC-16/CC-64). Not sent when the change is via the serial command itself.'

Macros

# Multi-step examples documented in source. Implementers can compose these
# from the Actions above; they are not standalone device commands.
- id: confirm_set_with_get
  description: 'Per source: "Following a Set command with a Get is a useful way to confirm command success." Pattern: issue SA/SV/SN/etc, then issue matching GA/GV/GN query.'
- id: boot_wait_then_reconnect
  description: 'On RS-232, ESP sends "Ready" after boot. On SoIP, callers must re-establish the TCP/UDP connection after sufficient time has elapsed (varies by device and installed cards).'
- id: controlspace_designer_link_break
  description: 'When the device goes on-line with ControlSpace Designer, the SoIP third-party control connection is closed; the control system must re-establish it once on-line.'

Safety

confirmation_required_for:
  - reset_reboot  # source: "all the current settings in the device will be lost and the device will revert to its power-on (flashed) settings"
  - np_f  # reset all network parameters to defaults
  - clear_fault_alarms  # alarms may re-trigger if conditions persist
  - ep_restore_factory_defaults  # source: returns to factory settings; Preset 0 stored with those defaults
  - ip_set  # change of network reachability
interlocks: []
# Source notes (no formal interlock list):
# - Set Volume commands are ignored if the channel is muted (mute first, then set level).
# - PowerMatch standby transitions are not immediate; allow time to complete.
# - IP and NP changes only take effect after a device reboot.
# - For MSA12X, if Backup Strategy is SP (Signal Presence), INPUT source changes are ignored.
# - Endpoints paired with an EX processor: directly changing endpoint settings may be overridden by the processor's programmed settings.
# - MSA12X is a Class-2 wiring device; nothing in the source describes AC mains interlocks.
# UNRESOLVED: formal safety interlock procedures (e.g. emergency-stop, evacuation paging) are not enumerated in this control-protocol document.

Notes

  • All ASCII commands and responses are terminated with <CR> (carriage return, ASCII 0x0D). Hex values may be sent in upper or lower case; responses are always lower case.
  • Module Commands: Set commands and Get responses end with = followed by the value; multiple commands on one line are separated by ;. Devices respond with <ACK> (ASCII 0x06) or <NAK> nn where nn is a 2-digit error code (01=Invalid Module Name, 02=Illegal Index, 03=Value out-of-range, 99=Unknown error).
  • MSA12X and Endpoint Commands: respond with literal "ACK" and echo of received command on success, or "NACK" on failure. (Not the raw ASCII <ACK>/<NAK> bytes used by Module Commands.)
  • Set/Get IP and NP changes do not take effect until the device is rebooted; pair with RESET to apply.
  • For Module commands, module labels must be unique within a device. If two modules share a name (e.g. an Output and a PEQ both called "Left"), SA/GA/MA will not work correctly.
  • Module names prefixed with # (set in ControlSpace Designer) cause automatic GA responses when other devices change that module's parameters.
  • For 8-channel PowerMatch and PowerShare devices, the GL command uses only Slot 1 (inputs) and Slot 2 (outputs) for all 8 channels.
  • Cross-point routing for the Standard Mixer uses an 8-hex-digit bitmask where each hex digit represents 4 outputs (little-endian within each digit).
  • Endpoint "Backup Strategy" (MSA12X): FORCE allows manual input selection via the INPUT command; SP 1 (Signal Presence) makes the device auto-failover to Analog and ignores manual INPUT commands.
  • The source is a multi-product control protocol document; the device name "DigiHiker" provided in the input does not match any product in the source. This spec covers the protocol as it applies across the listed model family.

Provenance

source_domains:
  - assets.boseprofessional.com
  - applicationmarket.crestron.com
source_urls:
  - https://assets.boseprofessional.com/m/3f75dade2573b467/original/ControlSpace-Serial-Protocol-v5-14-1.pdf
  - https://applicationmarket.crestron.com/content/Help/Bose/digihiker.pdf
retrieved_at: 2026-04-30T13:19:25.957Z
last_checked_at: 2026-06-02T21:41:05.649Z

Verification Summary

verdict: verified
checked_at: 2026-06-02T21:41:05.649Z
matched_actions: 77
action_count: 77
confidence: medium
summary: "All 77 spec actions have verbatim literal matches in the source and the source command catalogue is fully represented by the spec. (5 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "device-specific behavior differences (per-family firmware gates) are not exhaustively enumerated."
- "voltage/current ratings and safety interlock procedures are not described in this control-protocol document."
- "formal safety interlock procedures (e.g. emergency-stop, evacuation paging) are not enumerated in this control-protocol document."
- "device-specific firmware gates (which exact module index values each firmware version supports) are not enumerated."
- "timing parameters (e.g. maximum time between characters, command echo behavior) are described qualitatively in source but not as numeric timeouts."

From the AI4AV catalog (https://ai4av.net) · ODbL-1.0