Summary

Bose ControlSpace PowerMatch networked amplifiers (PM8500N, PM8250N, PM4500N, PM4250N) controlled via ASCII serial commands over TCP/IP (Serial-over-Ethernet). Protocol supports volume/mute per channel, standby control, fault/alarm monitoring, output configuration query, and deep signal-processing module control (PEQ, limiter, delay, matrix mixer, band pass, speaker PEQ). Commands use hex notation for system/device commands and ASCII text for module commands. All commands terminated with <CR> (0x0D). No authentication required.

Transport

protocols:
  - tcp
addressing:
  port: 10055
auth:
  type: none  # inferred: no auth procedure in source

Traits

traits:
  - powerable    # SY standby/normal commands
  - queryable    # GV, GM, GL, GY, GC, GF, GR, GH query commands
  - levelable    # SV, GV, SG, GG volume commands in 0.5dB steps
  - routable     # Matrix Mixer cross-point routing

Actions

actions:
  - id: set_parameter_set
    label: Set Parameter Set
    kind: action
    description: "Recall/invoke Parameter Set n (1-FF hex = 1-255 decimal)"
    command: "SS n"
    params:
      - name: n
        type: integer
        description: "Parameter Set number, 1-255 decimal (sent as hex)"

  - id: get_parameter_set
    label: Get Parameter Set
    kind: feedback
    description: "Query last invoked Parameter Set"
    command: "GS"
    response: "S n"
    params:
      - name: n
        type: integer
        description: "Last invoked Parameter Set (0 if none recalled)"

  - id: set_group_level
    label: Set Group Master Level
    kind: action
    description: "Set master level of Group n to level l. PM range: 0h (-60dB) to 78h (0dB) in 0.5dB steps, or FFh (-inf)"
    command: "SG n,l"
    params:
      - name: n
        type: integer
        description: "Group number 1-64 (hex 1-40)"
      - name: l
        type: integer
        description: "Level 0-120 decimal (0=-60dB, 120=0dB) or 255 (-inf), sent as hex"

  - id: get_group_level
    label: Get Group Master Level
    kind: feedback
    description: "Query level of Group n"
    command: "GG n"
    response: "GG n,l"
    params:
      - name: n
        type: integer
        description: "Group number 1-64 (hex 1-40)"

  - id: set_group_increment
    label: Set Group Level Increment/Decrement
    kind: action
    description: "Increment or decrement master level of Group n by x 0.5dB steps"
    command: "SH n,d,x"
    params:
      - name: n
        type: integer
        description: "Group number 1-64"
      - name: d
        type: integer
        description: "Direction: 1=up, 0=down"
      - name: x
        type: integer
        description: "Number of 0.5dB steps (hex)"

  - id: set_group_mute
    label: Set Group Master Mute
    kind: action
    description: "Set mute state for Group n"
    command: "SN n,m"
    params:
      - name: n
        type: integer
        description: "Group number 1-64"
      - name: m
        type: string
        description: "M=Mute, U=Unmute, T=Toggle"

  - id: get_group_mute
    label: Get Group Master Mute
    kind: feedback
    description: "Query mute state of Group n"
    command: "GN n"
    response: "GN n,m"
    params:
      - name: n
        type: integer
        description: "Group number 1-64"

  - id: set_parameter_set_list
    label: Set Parameter Set List Selection
    kind: action
    description: "Change current selection of a Parameter Set List"
    command: "SA \"A\">1=n"
    params:
      - name: module_name
        type: string
        description: "Parameter Set List name in quotes"
      - name: n
        type: integer
        description: "Index of Parameter Set to select"

  - id: get_parameter_set_list
    label: Get Parameter Set List Selection
    kind: feedback
    description: "Query current selection of a Parameter Set List"
    command: "GA \"A\">2"
    response: "GA \"A\">2=n"
    params:
      - name: module_name
        type: string
        description: "Parameter Set List name in quotes"

  - id: set_volume
    label: Set Output Volume
    kind: action
    description: "Set output volume for slot s, channel c. PM output only: 0h (-60dB) to 78h (0dB) in 0.5dB steps. Ignored if channel muted."
    command: "SV s,c,l"
    params:
      - name: s
        type: integer
        description: "Slot number (PM: 1=In A-D, 2=Out 1-4, 3=In E-H [8ch], 4=Out 5-8 [8ch])"
      - name: c
        type: integer
        description: "Channel 1-4, sent as hex"
      - name: l
        type: integer
        description: "Level 0-120 decimal (sent as hex)"

  - id: get_volume
    label: Get Output Volume
    kind: feedback
    description: "Query output level for slot s, channel c"
    command: "GV s,c"
    response: "GV s,c,l"
    params:
      - name: s
        type: integer
        description: "Slot number (hex)"
      - name: c
        type: integer
        description: "Channel number (hex)"

  - id: set_volume_increment
    label: Set Volume Increment/Decrement
    kind: action
    description: "Increment or decrement output volume. Ignored if channel muted."
    command: "SI s,c,d,x"
    params:
      - name: s
        type: integer
        description: "Slot number (hex)"
      - name: c
        type: integer
        description: "Channel 1-4 (hex)"
      - name: d
        type: integer
        description: "Direction: 1=up, 0=down"
      - name: x
        type: integer
        description: "Number of 0.5dB steps (hex)"

  - id: set_mute
    label: Set Output Mute
    kind: action
    description: "Set mute for slot s, channel c. PM outputs only."
    command: "SM s,c,m"
    params:
      - name: s
        type: integer
        description: "Slot number (hex)"
      - name: c
        type: integer
        description: "Channel 1-4 (hex)"
      - name: m
        type: string
        description: "M=Mute, U=Unmute, T=Toggle"

  - id: get_mute
    label: Get Output Mute
    kind: feedback
    description: "Query mute state for slot s, channel c"
    command: "GM s,c"
    response: "GM s,c,m"
    params:
      - name: s
        type: integer
        description: "Slot number (hex)"
      - name: c
        type: integer
        description: "Channel 1-4 (hex)"

  - id: get_signal_level
    label: Get Signal Level
    kind: feedback
    description: "Query signal levels for channels in slot s. PM outputs in dBV max from -60.0 to 0.0 in 0.5dB steps."
    command: "GL s"
    response: "GL s [l1,...,lN]"
    params:
      - name: s
        type: integer
        description: "Slot index (hex)"

  - id: set_ip_address
    label: Set IP Address
    kind: action
    description: "Change IP address. Takes effect after reboot."
    command: "IP xxx.xxx.xxx.xxx"
    params:
      - name: address
        type: string
        description: "IP address in dotted decimal"

  - id: get_ip_address
    label: Get IP Address
    kind: feedback
    description: "Query current IP address"
    command: "IP"
    response: "IP xxx.xxx.xxx.xxx"

  - id: set_network_param
    label: Set Network Parameter
    kind: action
    description: "Set subnet mask, gateway, or DHCP/static mode. Takes effect after reboot."
    command: "NP p,v"
    params:
      - name: p
        type: string
        description: "T=Type, M=Subnet Mask, G=Default Gateway"
      - name: v
        type: string
        description: "D=DHCP, S=Static, or xxx.xxx.xxx.xxx for address"

  - id: get_network_param
    label: Get Network Parameter
    kind: feedback
    description: "Query network settings"
    command: "NP p"
    response: "NP p,v"
    params:
      - name: p
        type: string
        description: "T=Type, M=Subnet Mask, G=Default Gateway"

  - id: reset_defaults_network
    label: Reset Network to Defaults
    kind: action
    description: "Reset all network parameters to factory defaults"
    command: "NP F"

  - id: reset_device
    label: Reset/Reboot Device
    kind: action
    description: "Restart the device (equivalent to power-cycle). Reverts to power-on settings."
    command: "RESET"

  - id: set_standby
    label: Set Standby Status
    kind: action
    description: "Put amplifier into standby or return to normal. Not immediate; allow time."
    command: "SY s"
    params:
      - name: s
        type: string
        description: "S=Standby, N=Normal"

  - id: get_standby
    label: Get Standby Status
    kind: feedback
    description: "Query current standby state"
    command: "GY"
    response: "GY s"
    params: []

  - id: get_configuration
    label: Get Output Configuration
    kind: feedback
    description: "Return current output channel configuration (IN/BL/B7/B1/PA/QL/Q7/Q1 per channel)"
    command: "GC"
    response: "GC 1,2,3,4,5,6,7,8"

  - id: set_fault_notification
    label: Set Fault Notification
    kind: action
    description: "Enable/disable unsolicited Fault Output state change notifications. Resets to Off on power-up."
    command: "SF n"
    params:
      - name: n
        type: string
        description: "O=On, F=Off"

  - id: get_fault_status
    label: Get Fault Status
    kind: feedback
    description: "Query current Fault Output state"
    command: "GF"
    response: "GF f"

  - id: clear_faults
    label: Clear Fault/Alarms
    kind: action
    description: "Clear active alarm conditions and reset Fault Output. Re-alarms if condition persists."
    command: "CF"

  - id: set_alarm_reporting
    label: Set Alarm Reporting
    kind: action
    description: "Enable/disable unsolicited alarm/fault event notifications. Resets to Off on power-up."
    command: "SR n"
    params:
      - name: n
        type: string
        description: "O=On, F=Off"

  - id: get_alarm_status
    label: Get Alarm Status
    kind: feedback
    description: "Query alarm/fault status for a single channel"
    command: "GR c"
    response: "GR c,s,t"
    params:
      - name: c
        type: integer
        description: "Channel 1-8 (1-4 for PM4500/4250)"

  - id: get_alarm_history
    label: Get Alarm History
    kind: feedback
    description: "Request dump of internal alarm history/log"
    command: "GH"
    response: "GH [Time, Date, Description...]"

  - id: clear_alarm_history
    label: Clear Alarm History
    kind: action
    description: "Clear the internal alarm log"
    command: "CH"

  - id: set_module_parameter
    label: Set Module Parameter
    kind: action
    description: "Set a signal processing module parameter by module name and indices. ACK (0x06) on success, NAK+error code on failure."
    command: "SA \"Module Name\">Index1>Index2=Value"
    params:
      - name: module_name
        type: string
        description: "Unique module label from ControlSpace Designer"
      - name: index_1
        type: integer
        description: "Primary index"
      - name: index_2
        type: integer
        description: "Secondary index (omit if unused)"
      - name: value
        type: string
        description: "Parameter value as ASCII text"

  - id: get_module_parameter
    label: Get Module Parameter
    kind: feedback
    description: "Query a signal processing module parameter"
    command: "GA \"Module Name\">Index1>Index2"
    response: "GA \"Module Name\">Index1>Index2=Value"

  - id: invoke_module_action
    label: Invoke Module Action
    kind: action
    description: "Invoke an action for a module (limited modules only). ACK on success."
    command: "MA \"Module Name\">Index1=Parameter"
    params:
      - name: module_name
        type: string
        description: "Module name"
      - name: index_1
        type: integer
        description: "Action index"
      - name: parameter
        type: string
        description: "Action parameter"

  - id: subscribe
    label: Subscribe to Data Changes
    kind: action
    description: "Register for unsolicited updates when a parameter changes"
    command: "SUB \"GET command string\""
    params:
      - name: get_command
        type: string
        description: "Full GET command string to subscribe to"

  - id: unsubscribe
    label: Unsubscribe from Data Changes
    kind: action
    description: "Stop unsolicited updates for a previously subscribed parameter"
    command: "UNS \"GET command string\""
    params:
      - name: get_command
        type: string
        description: "Full GET command string to unsubscribe from"
  - id: query_subscription_support
    label: Query Subscription Support
    kind: query
    command: "SUB"
    params: []

Feedbacks

feedbacks:
  - id: parameter_set_state
    type: integer
    description: "Last invoked Parameter Set number (0=none recalled, 1-255)"
    query_command: "GS"
    response_format: "S n"

  - id: group_level
    type: integer
    description: "Master level of a group (0-120 decimal = -60dB to 0dB, 255 = -inf)"
    query_command: "GG n"
    response_format: "GG n,l"

  - id: group_mute_state
    type: enum
    values: [M, U]
    description: "Mute state of a group"
    query_command: "GN n"
    response_format: "GN n,m"

  - id: output_volume
    type: integer
    description: "Output volume for slot/channel (0-120 decimal = -60dB to 0dB)"
    query_command: "GV s,c"
    response_format: "GV s,c,l"

  - id: output_mute_state
    type: enum
    values: [M, U]
    description: "Mute state for output slot/channel"
    query_command: "GM s,c"
    response_format: "GM s,c,m"

  - id: signal_level
    type: array
    description: "Signal levels for channels in a slot (hex array, dBV max for PM outputs: -60.0 to 0.0 in 0.5dB steps)"
    query_command: "GL s"
    response_format: "GL s [l1,...,lN]"

  - id: standby_state
    type: enum
    values: [S, N]
    description: "Standby state (S=Standby, N=Normal)"
    query_command: "GY"
    response_format: "GY s"

  - id: output_configuration
    type: array
    description: "Per-channel output config. Values: IN (Independent/Mono), BL (Bridged LoZ), B7 (Bridged 70V), B1 (Bridged 100V), PA (Parallel), QL (Quad LoZ), Q7 (Quad 70V), Q1 (Quad 100V)"
    query_command: "GC"
    response_format: "GC 1,2,3,4,5,6,7,8"

  - id: fault_status
    type: enum
    values: [F, C]
    description: "Fault output state (F=Fault, C=No Fault)"
    query_command: "GF"
    response_format: "GF f"

  - id: alarm_status_channel
    type: composite
    description: "Alarm/fault for a single channel. Severity: W/F/S/N. Type: N/O/S/A/D/I/L/C/P/Z."
    query_command: "GR c"
    response_format: "GR c,s,t"

Variables

variables:
  - id: group_level
    description: "Group master volume level (-60dB to 0dB in 0.5dB steps for PM, or -inf via FFh)"
    set_command: "SG n,l"
    min: -60.0
    max: 0.0
    step: 0.5
    unit: dB

  - id: output_volume
    description: "Output channel volume (-60dB to 0dB in 0.5dB steps for PM)"
    set_command: "SV s,c,l"
    min: -60.0
    max: 0.0
    step: 0.5
    unit: dB

  - id: standby_auto_wait
    description: "Auto-standby wait time (not directly on PM; via Parameter Set standby property)"
    # UNRESOLVED: auto-standby time commands listed for MSA12X only; PM uses Parameter Sets

Events

events:
  - id: fault_output_change
    description: "Unsolicited notification of Fault Output state change (enabled via SF O). Format: GF f where F=Fault, C=No Fault. Resets to Off on power-up."
    trigger: "SF O enables; occurs on state change"

  - id: alarm_event
    description: "Unsolicited alarm/fault notification (enabled via SR O). Format: GR c,s,t,x where c=channel (0 for non-channel), s=severity (W/F/S), t=type (N/O/S/A/D/I/L/C/P/Z), x=condition (S=Set/C=Clear). Resets to Off on power-up."
    trigger: "SR O enables; occurs on alarm/fault event"

  - id: module_auto_notification
    description: "Modules prefixed with '#' in ControlSpace Designer emit GA responses when parameters change from other devices (e.g. CC-16/CC-64). NOT sent if change is via serial command."
    trigger: "External device changes a #prefixed module parameter"

  - id: subscription_update
    description: "Subscribed parameters emit their GET response value when the subscribed data changes. Setup via SUB command."
    trigger: "SUB \"GET command\" registered; fires on value change"

Macros

# UNRESOLVED: no multi-step macro sequences explicitly defined in source.
# Parameter Set recall (SS n) acts as a macro-like preset recall.

Safety

confirmation_required_for: []
interlocks: []
notes: >
  RESET command reverts device to power-on (flashed) settings - current runtime state is lost.
  Standby transition (SY) is not immediate; allow adequate time for process to complete.
  Set Volume commands (SV, SI) are ignored when the target channel is muted.
  Volume/mute commands operate on outputs only for PowerMatch - inputs are not controllable via SV/SI/SM.
  Set Alarm Reporting (SR) and Set Fault Notification (SF) preferences reset to Off on every power-up.
  Alarm log time/date values are only accurate if no power loss occurred since last ControlSpace Designer connection.

Notes

  • Command format: ASCII text terminated with <CR> (0x0D). System/Device commands use hex notation for numeric values. Module commands use plain ASCII decimal.
  • Hex values accepted upper or lower case; responses always lower case.
  • Space after command is optional. Comma separates parameters. No hex suffix needed.
  • No acknowledgement sent for System/Device Set commands — follow Set with Get to confirm success.
  • Module commands respond with ACK (0x06) on success or NAK (0x15) + 2-digit error code (01=invalid name, 02=illegal index, 03=out-of-range, 99=unknown).
  • Module labels must be unique per device. Duplicate names cause SA/GA/MA to malfunction.
  • PowerMatch module labels are fixed (e.g. "PEQ-5band A"-"PEQ-5band H", "SpeakerPEQ 1"-"SpeakerPEQ 8", "Limiter 1"-"Limiter 8", "Delay 1"-"Delay 8", "Band Pass 1"-"Band Pass 8", "Matrix 1"). Only Input and Amp Output modules can be renamed.
  • Module cross-device addressing (SA @"Device Name" ...) is NOT available for PowerMatch — send commands to each device individually.
  • PM8500N/PM8250N: 8 output channels, slots 1-4. PM4500N/PM4250N: 4 output channels, slots 1-2.
  • GL command for 8ch PM uses Slot 1 (inputs) and Slot 2 (outputs) for all 8 channels.
  • Matrix Mixer module input 9 is the Signal Generator.
  • Max 32 simultaneous TCP connections shared with ControlSpace Remote.
  • Connection closed when ControlSpace Designer goes online; can be re-established after.
  • Device acts as TCP server; control system must initiate connection.

Provenance

source_domains:
  - assets.boseprofessional.com
source_urls:
  - https://assets.boseprofessional.com/m/4998082f60dfee56/original/ControlSpace-Serial-Protocol-v5-13.pdf
  - https://assets.boseprofessional.com/m/48b4f11e8a4922b9/original/ug_csp_control_serial.pdf
  - https://assets.boseprofessional.com/m/5967be9a1795e9b9/original/tds_fse4_en.pdf
retrieved_at: 2026-05-15T03:21:05.516Z
last_checked_at: 2026-06-02T22:04:41.775Z

Verification Summary

verdict: verified
checked_at: 2026-06-02T22:04:41.775Z
matched_actions: 47
action_count: 47
confidence: medium
summary: "All 47 spec actions traced to source (dip-safe re-verify). (7 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "auto-standby time commands listed for MSA12X only; PM uses Parameter Sets"
- "no multi-step macro sequences explicitly defined in source."
- "firmware version compatibility ranges not stated in source"
- "maximum command rate / throttle limits not stated"
- "binary protocol variant not documented (ASCII only)"
- "exact signal level conversion formula for PM outputs (hex to dBV max) — described as 0.5dB steps from -60.0 to 0.0 dBV"
- "MSA12X and Endpoint commands omitted from this spec — they use UDP port 49494, not TCP port 10055"

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