Summary

TCP/IP control protocol for the StormAudio ISP family of Immersive Sound Processors (ISP Elite MK1, ISP Elite MK2, ISP Core 16, plus rebranded Bryston/Focal variants). ASCII command/response model over Telnet port 23, newline-terminated. Covers power, input select, preset, surround mode, theater audio controls, per-zone audio, front panel, triggers, HDMI info, OSD, and front-panel navigation.

Transport

protocols:
  - tcp
addressing:
  port: 23  # source: "The ISP listens to port 23 (Telnet) for incoming connections"
auth:
  type: none  # inferred: no auth procedure in source

# Message framing (from source):
#   - ASCII strings, terminated by <LF> (\x0A / \n)
#   - On connect, ISP broadcasts current values of all parameters
#   - On any parameter change via any interface, new value is broadcast to all connected clients
#   - Unrecognized / out-of-range commands return literal string "error"

Traits

- powerable    # inferred from ssp.power.on / ssp.power.off
- routable     # inferred from ssp.input.[xx] + inputZone2
- queryable    # inferred from numerous read commands (ssp.power, ssp.vol, ssp.mute, etc.)
- levelable    # inferred from volume/bass/treble/brightness/c_en/s_en/lfe_en/lipsync/loudness controls

Actions

# Section 3.1 - Control Group
- id: keepalive
  label: Keepalive / Ping
  kind: query
  command: "ssp.keepalive"
  params: []

- id: procstate_read
  label: Read Processor State
  kind: query
  command: "ssp.procstate"
  response: "ssp.procstate.[xx] where 0=off (sleep), 1=init/shutdown, 2=on"

- id: power_read
  label: Read Power Status
  kind: query
  command: "ssp.power"
  response: "ssp.power.on or ssp.power.off"

- id: power_on
  label: Power On (take out of sleep)
  kind: action
  command: "ssp.power.on"
  notes: "Processor is fully operational only after ssp.procstate.[2] is received"

- id: power_off
  label: Power Off (sleep mode)
  kind: action
  command: "ssp.power.off"

- id: power_toggle
  label: Toggle Power
  kind: action
  command: "ssp.power.toggle"
  response: "ssp.power.on or ssp.power.off"

- id: reset
  label: Processor Reset
  kind: action
  command: "ssp.reset"
  notes: "Processor will reboot; TCP connection will be lost"

- id: close_connection
  label: Close TCP Connection
  kind: action
  command: "ssp.close"
  notes: "Does not shut down the API application"

- id: version_read
  label: Read Firmware Version
  kind: query
  command: "ssp.version"
  response: "ssp.version.[xx]"

- id: brand_read
  label: Read Brand
  kind: query
  command: "ssp.brand"
  response: "ssp.brand.['BRAND']; BRAND in StormAudio, Bryston, FOCAL"

- id: model_read
  label: Read Model
  kind: query
  command: "ssp.model"
  response: "ssp.model.['MODEL']; MODEL in IISP, Astral 16, ISP Elite MK1, SP4, ISP Elite MK2, ISP Core 16"

# Section 3.2 - Message Status
- id: msgstatus_read
  label: Read Message Status ID
  kind: query
  command: "ssp.msgstatus"
  response: "ssp.msgstatus.[xx] (see msg-id table)"

- id: msgstatusTxt_read
  label: Read Message Status Text
  kind: query
  command: "ssp.msgstatusTxt"
  response: "ssp.msgstatusTxt.[xx, 'msg']"

# Section 3.3.1 - Inputs
- id: input_read
  label: Read Active Input
  kind: query
  command: "ssp.input"
  response: "ssp.input.[xx]"

- id: input_select
  label: Select Input
  kind: action
  command: "ssp.input.{id}"
  params:
    - name: id
      type: integer
      description: Input ID (returns error if input is disabled)

- id: inputZone2_select
  label: Select Zone2 Audio Input
  kind: action
  command: "ssp.inputZone2.{id}"
  params:
    - name: id
      type: integer
      description: Zone2 input ID (returns 0 if input has no Zone2 Audio IN)

- id: input_next
  label: Select Next Valid Input
  kind: action
  command: "ssp.input.next"

- id: input_prev
  label: Select Previous Valid Input
  kind: action
  command: "ssp.input.prev"

- id: input_list
  label: List All Configured Inputs
  kind: query
  command: "ssp.input.list"
  response: "Bracketed by ssp.input.start / ssp.input.end; per-input: ssp.input.list.['NAME', ID, VIDEO IN ID, AUDIO IN ID, AUDIO ZONE2 IN ID, RESERVED, DELAY, RESERVED]"

- id: inputHdmiMatrixMode_read
  label: Read HDMI Matrix Mode
  kind: query
  command: "ssp.inputHdmiMatrixMode"
  response: "ssp.inputHdmiMatrixMode.[xx]; 0=Mirror, 1=Zone2 A/V, 2=Pass Through; 'error' if HdmiMatrix license not activated"
  notes: "Requires 7+2 eARC board"

- id: inputHdmiPassThru_select
  label: Select HDMI Pass Through Input
  kind: action
  command: "ssp.inputHdmiPassThru.{id}"
  params:
    - name: id
      type: integer
      description: Input ID (0 or one from ssp.input.list)
  notes: "Requires 7+2 eARC board, HdmiMatrix license, and Matrix mode == Pass Through"

# Section 3.3.2 - Preset
- id: preset_read
  label: Read Active Preset
  kind: query
  command: "ssp.preset"
  response: "ssp.preset.[xx]"

- id: preset_select
  label: Select Preset
  kind: action
  command: "ssp.preset.{id}"
  params:
    - name: id
      type: integer

- id: preset_next
  label: Select Next Preset
  kind: action
  command: "ssp.preset.next"

- id: preset_prev
  label: Select Previous Preset
  kind: action
  command: "ssp.preset.prev"

- id: preset_list
  label: List All Configured Presets
  kind: query
  command: "ssp.preset.list"
  response: "Bracketed by ssp.preset.start / ssp.preset.end; per-preset: ssp.preset.list.['NAME', ID, ['zone IDs...'], SPHEREAUDIO, RESERVED×4]"

- id: preset_custom_read
  label: Read Preset Custom Status
  kind: query
  command: "ssp.preset.custom"
  response: "ssp.preset.custom.on (mismatch / edit mode) or ssp.preset.custom.off"

# Section 3.3.3 - Surround Mode
- id: surroundmode_read
  label: Read Preferred Upmix/Surround Mode
  kind: query
  command: "ssp.surroundmode"
  response: "ssp.surroundmode.[xx]; 0=Native, 1=Stereo Downmix, 2=Dolby Surround, 3=DTS Neural:X, 4=Auro-Matic"

- id: surroundmode_set
  label: Set Surround Mode
  kind: action
  command: "ssp.surroundmode.{id}"
  params:
    - name: id
      type: integer
      description: "0=Native, 1=Stereo Downmix, 2=Dolby Surround, 3=DTS Neural:X, 4=Auro-Matic"

- id: surroundmode_list
  label: List Available Surround Modes
  kind: query
  command: "ssp.surroundmode.list"
  response: "Bracketed by ssp.surroundmode.start / ssp.surroundmode.end; per-mode: ssp.surroundmode.list.['NAME', ID]"

- id: allowedmode_read
  label: Read Active Surround Mode (Real)
  kind: query
  command: "ssp.allowedmode"
  response: "ssp.allowedmode.[xx] (0..4, same encoding as surroundmode)"
  notes: "Real active mode; may differ from preferred when content prevents upmixing"

# Section 3.3.4 - Active Speaker
- id: speaker_read
  label: Read Active Speaker Config
  kind: query
  command: "ssp.speaker"
  response: "ssp.speaker.[xx]; 0 = preset without Theater"

# Section 3.4.1 - Mute
- id: mute_read
  label: Read Mute Status
  kind: query
  command: "ssp.mute"
  response: "ssp.mute.on or ssp.mute.off"

- id: mute_on
  label: Mute On
  kind: action
  command: "ssp.mute.on"

- id: mute_off
  label: Mute Off
  kind: action
  command: "ssp.mute.off"

- id: mute_toggle
  label: Mute Toggle
  kind: action
  command: "ssp.mute.toggle"

# Section 3.4.2 - Dim
- id: dim_read
  label: Read Dim Status
  kind: query
  command: "ssp.dim"
  response: "ssp.dim.on or ssp.dim.off"

- id: dim_on
  label: Dim On
  kind: action
  command: "ssp.dim.on"

- id: dim_off
  label: Dim Off
  kind: action
  command: "ssp.dim.off"

- id: dim_toggle
  label: Dim Toggle
  kind: action
  command: "ssp.dim.toggle"

# Section 3.4.3 - Volume
- id: vol_read
  label: Read Volume
  kind: query
  command: "ssp.vol"
  response: "ssp.vol.[-xx]; range -0 to -100"

- id: vol_up
  label: Volume Up (+1.0 dB)
  kind: action
  command: "ssp.vol.up"

- id: vol_down
  label: Volume Down (-1.0 dB)
  kind: action
  command: "ssp.vol.down"

- id: vol_set
  label: Set Volume
  kind: action
  command: "ssp.vol.{-xx}"
  params:
    - name: level
      type: integer
      description: "Volume in dB, 0..-100"

# Section 3.4.4 - Loudness
- id: loudness_read
  label: Read Loudness Level
  kind: query
  command: "ssp.loudness"
  response: "ssp.loudness.[xx]; 0=Off, 1=Low, 2=Medium, 3=Full"

- id: loudness_set
  label: Set Loudness Level
  kind: action
  command: "ssp.loudness.{xx}"
  params:
    - name: level
      type: integer
      description: "0=Off, 1=Low, 2=Medium, 3=Full"

# Section 3.4.5 - Bass
- id: bass_read
  label: Read Bass Level
  kind: query
  command: "ssp.bass"
  response: "ssp.bass.[xx]; range -6..+6, step 1 dB; max range depends on WebUI Audio Control Range MAX"

- id: bass_up
  label: Bass Up (+1.0 dB)
  kind: action
  command: "ssp.bass.up"

- id: bass_down
  label: Bass Down (-1.0 dB)
  kind: action
  command: "ssp.bass.down"

- id: bass_set
  label: Set Bass Level
  kind: action
  command: "ssp.bass.{xx}"
  params:
    - name: level
      type: integer
      description: "-6..+6 dB"

# Section 3.4.6 - Treble
- id: treble_read
  label: Read Treble Level
  kind: query
  command: "ssp.treble"
  response: "ssp.treble.[xx]; range -6..+6, step 1 dB"

- id: treble_up
  label: Treble Up (+1.0 dB)
  kind: action
  command: "ssp.treble.up"

- id: treble_down
  label: Treble Down (-1.0 dB)
  kind: action
  command: "ssp.treble.down"

- id: treble_set
  label: Set Treble Level
  kind: action
  command: "ssp.treble.{xx}"
  params:
    - name: level
      type: integer
      description: "-6..+6 dB"

# Section 3.4.7 - Brightness
- id: brightness_read
  label: Read Center Brightness
  kind: query
  command: "ssp.brightness"
  response: "ssp.brightness.[xx]; range -6..+6, step 1 dB"

- id: brightness_up
  label: Brightness Up (+1.0 dB)
  kind: action
  command: "ssp.brightness.up"

- id: brightness_down
  label: Brightness Down (-1.0 dB)
  kind: action
  command: "ssp.brightness.down"

- id: brightness_set
  label: Set Brightness Level
  kind: action
  command: "ssp.brightness.{xx}"
  params:
    - name: level
      type: integer
      description: "-6..+6 dB"

# Section 3.4.8 - Center Enhance
- id: c_en_read
  label: Read Center Enhance
  kind: query
  command: "ssp.c_en"
  response: "ssp.c_en.[xx]; range -6..+6, step 1 dB"

- id: c_en_up
  label: Center Enhance Up (+1.0 dB)
  kind: action
  command: "ssp.c_en.up"

- id: c_en_down
  label: Center Enhance Down (-1.0 dB)
  kind: action
  command: "ssp.c_en.down"

- id: c_en_set
  label: Set Center Enhance
  kind: action
  command: "ssp.c_en.{xx}"
  params:
    - name: level
      type: integer
      description: "-6..+6 dB"

# Section 3.4.9 - Surround Enhance
- id: s_en_read
  label: Read Surround Enhance
  kind: query
  command: "ssp.s_en"
  response: "ssp.s_en.[xx]; range -6..+6, step 1 dB"

- id: s_en_up
  label: Surround Enhance Up (+1.0 dB)
  kind: action
  command: "ssp.s_en.up"

- id: s_en_down
  label: Surround Enhance Down (-1.0 dB)
  kind: action
  command: "ssp.s_en.down"

- id: s_en_set
  label: Set Surround Enhance
  kind: action
  command: "ssp.s_en.{xx}"
  params:
    - name: level
      type: integer
      description: "-6..+6 dB"

# Section 3.4.10 - Sub Enhance (DEPRECATED)
- id: sub_en_read
  label: Read Sub Enhance (deprecated)
  kind: query
  command: "ssp.sub_en"
  response: "ssp.sub_en.[xx]; range -6..+6"
  notes: "DEPRECATED since v22-1 - use ssp.lfe_en"

- id: sub_en_up
  label: Sub Enhance Up (deprecated)
  kind: action
  command: "ssp.sub_en.up"
  notes: "DEPRECATED"

- id: sub_en_down
  label: Sub Enhance Down (deprecated)
  kind: action
  command: "ssp.sub_en.down"
  notes: "DEPRECATED"

- id: sub_en_set
  label: Set Sub Enhance (deprecated)
  kind: action
  command: "ssp.sub_en.{xx}"
  params:
    - name: level
      type: integer
      description: "-6..+6 dB"
  notes: "DEPRECATED"

# Section 3.4.11 - LFE Enhance
- id: lfe_en_read
  label: Read LFE Enhance
  kind: query
  command: "ssp.lfe_en"
  response: "ssp.lfe_en.[xx]; range -6..+6, step 1 dB"

- id: lfe_en_up
  label: LFE Enhance Up (+1.0 dB)
  kind: action
  command: "ssp.lfe_en.up"

- id: lfe_en_down
  label: LFE Enhance Down (-1.0 dB)
  kind: action
  command: "ssp.lfe_en.down"

- id: lfe_en_set
  label: Set LFE Enhance
  kind: action
  command: "ssp.lfe_en.{xx}"
  params:
    - name: level
      type: integer
      description: "-6..+6 dB"

# Section 3.4.12 - Lip Sync
- id: lipsync_read
  label: Read Lip Sync
  kind: query
  command: "ssp.lipsync"
  response: "ssp.lipsync.[xx]; range -(Inputs AV Delay + Settings AV Zone Delay) to 100 ms, step 1 ms"

- id: lipsync_up
  label: Lip Sync Up (+5 ms)
  kind: action
  command: "ssp.lipsync.up"

- id: lipsync_down
  label: Lip Sync Down (-5 ms)
  kind: action
  command: "ssp.lipsync.down"

- id: lipsync_set
  label: Set Lip Sync
  kind: action
  command: "ssp.lipsync.{xx}"
  params:
    - name: ms
      type: integer
      description: "Delay in ms"

# Section 3.4.13.1 - Auro Strength
- id: aurostrength_read
  label: Read Auro Strength
  kind: query
  command: "ssp.aurostrength"
  response: "ssp.aurostrength.[xx]; 0..15"
  notes: "Visible only when active surround == Auro-Matic"

- id: aurostrength_set
  label: Set Auro Strength
  kind: action
  command: "ssp.aurostrength.{xx}"
  params:
    - name: level
      type: integer
      description: "0..15"
  notes: "Visible only when active surround == Auro-Matic"

# Section 3.4.13.2 - Auro Preset
- id: auropreset_read
  label: Read Auro Preset
  kind: query
  command: "ssp.auropreset"
  response: "ssp.auropreset.[xx]; 0=Small, 1=Medium, 2=Large, 3=Speech"
  notes: "Visible only when active surround == Auro-Matic"

- id: auropreset_set
  label: Set Auro Preset
  kind: action
  command: "ssp.auropreset.{xx}"
  params:
    - name: id
      type: integer
      description: "0=Small, 1=Medium, 2=Large, 3=Speech"
  notes: "Visible only when active surround == Auro-Matic"

- id: auropreset_list
  label: List Auro Presets
  kind: query
  command: "ssp.auropreset.list"
  response: "Bracketed by ssp.auropreset.start / ssp.auropreset.end; per-preset: ssp.auropreset.list.['NAME', ID]"

# Section 3.4.13.3 - DRC
- id: drc_read
  label: Read DRC Status
  kind: query
  command: "ssp.drc"
  response: "ssp.drc.on / ssp.drc.off / ssp.drc.auto"

- id: drc_on
  label: DRC On
  kind: action
  command: "ssp.drc.on"

- id: drc_off
  label: DRC Off
  kind: action
  command: "ssp.drc.off"

- id: drc_auto
  label: DRC Auto
  kind: action
  command: "ssp.drc.auto"

# Section 3.4.13.4 - Center Spread
- id: cspread_read
  label: Read Center Spread
  kind: query
  command: "ssp.cspread"
  response: "ssp.cspread.on / ssp.cspread.off"

- id: cspread_on
  label: Center Spread On
  kind: action
  command: "ssp.cspread.on"

- id: cspread_off
  label: Center Spread Off
  kind: action
  command: "ssp.cspread.off"

- id: cspread_toggle
  label: Center Spread Toggle
  kind: action
  command: "ssp.cspread.toggle"

# Section 3.4.13.5 - Dialog Control
- id: dialogcontrol_read
  label: Read Dialog Control
  kind: query
  command: "ssp.dialogcontrol"
  response: "ssp.dialogcontrol.[avail, X]; avail=0/1, X=0..6 dB in 1 dB steps"
  notes: "Works only when DTS:X stream indicates dialog control available"

- id: dialogcontrol_set
  label: Set Dialog Control Level
  kind: action
  command: "ssp.dialogcontrol.{x}"
  params:
    - name: x
      type: integer
      description: "0..6 dB"

# Section 3.4.13.6 - Dialog Norm
- id: dialognorm_read
  label: Read Dialog Norm
  kind: query
  command: "ssp.dialognorm"
  response: "ssp.dialgnorm.on / ssp.dialognorm.off"
  notes: "Visible when ssp.stream.[x] contains 'DTS' or 'IMAX'"

- id: dialognorm_on
  label: Dialog Norm On
  kind: action
  command: "ssp.dialognorm.on"

- id: dialognorm_off
  label: Dialog Norm Off
  kind: action
  command: "ssp.dialognorm.off"

- id: dialognorm_toggle
  label: Dialog Norm Toggle
  kind: action
  command: "ssp.dialognorm.toggle"

# Section 3.4.13.7 - IMAX Mode
- id: IMAXMode_read
  label: Read IMAX Mode
  kind: query
  command: "ssp.IMAXMode"
  response: "ssp.IMAXMode.on / ssp.IMAXMode.off / ssp.IMAXMode.auto"
  notes: "Visible when ssp.stream.[x] contains 'IMAX'"

- id: IMAXMode_on
  label: IMAX Mode On
  kind: action
  command: "ssp.IMAXMode.on"
  notes: "Source notes response is ssp.IMAXMode.auto (not .on)"

- id: IMAXMode_off
  label: IMAX Mode Off
  kind: action
  command: "ssp.IMAXMode.off"

- id: IMAXMode_auto
  label: IMAX Mode Auto
  kind: action
  command: "ssp.IMAXMode.auto"

# Section 3.4.13.8 - StormXT
- id: stormxt_read
  label: Read StormXT Status
  kind: query
  command: "ssp.stormxt"
  response: "ssp.stormxt.on or ssp.stormxt.off; 'error' if StormXT license not activated"

- id: stormxt_on
  label: StormXT On
  kind: action
  command: "ssp.stormxt.on"

- id: stormxt_off
  label: StormXT Off
  kind: action
  command: "ssp.stormxt.off"

- id: stormxt_toggle
  label: StormXT Toggle
  kind: action
  command: "ssp.stormxt.toggle"

# Section 3.4.13.9 - Dolby Mode
- id: dolbymode_read
  label: Read Dolby Mode
  kind: query
  command: "ssp.dolbymode"
  response: "ssp.dolbymode.[X]; 0=Off, 1=Movie, 2=Music, 3=Night"

- id: dolbymode_set
  label: Set Dolby Mode
  kind: action
  command: "ssp.dolbymode.{x}"
  params:
    - name: x
      type: integer
      description: "0=Off, 1=Movie, 2=Music, 3=Night"

# Section 3.4.13.9 (2nd) - Dolby Virtualizer
- id: dolbyvirtualizer_read
  label: Read Dolby Virtualizer
  kind: query
  command: "ssp.dolbyvirtualizer"
  response: "ssp.dolbyvirtualizer.on / ssp.dolbyvirtualizer.off"

- id: dolbyvirtualizer_on
  label: Dolby Virtualizer On
  kind: action
  command: "ssp.dolbyvirtualizer.on"

- id: dolbyvirtualizer_off
  label: Dolby Virtualizer Off
  kind: action
  command: "ssp.dolbyvirtualizer.off"

- id: dolbyvirtualizer_toggle
  label: Dolby Virtualizer Toggle
  kind: action
  command: "ssp.dolbyvirtualizer.toggle"

# Section 3.4.14 - SphereAudio Effect
- id: spheraudioeffect_read
  label: Read SphereAudio Effect
  kind: query
  command: "ssp.spheraudioeffect"
  response: "ssp.spheraudioeffect.[X]; 0=ByPass, 1=Lounge, 2=Home Cinema, 3=Concert, 4=Cinema; 'error' if SphereAudio license not activated"

- id: spheraudioeffect_set
  label: Set SphereAudio Effect
  kind: action
  command: "ssp.spheraudioeffect.{x}"
  params:
    - name: x
      type: integer
      description: "0=ByPass, 1=Lounge, 2=Home Cinema, 3=Concert, 4=Cinema"

# Section 3.4.15 - LFE Dim
- id: lfedim_read
  label: Read LFE Dim
  kind: query
  command: "ssp.lfedim"
  response: "ssp.lfedim.on / ssp.lfedim.off"

- id: lfedim_on
  label: LFE Dim On
  kind: action
  command: "ssp.lfedim.on"

- id: lfedim_off
  label: LFE Dim Off
  kind: action
  command: "ssp.lfedim.off"

- id: lfedim_toggle
  label: LFE Dim Toggle
  kind: action
  command: "ssp.lfedim.toggle"

# Section 3.5 - Zones
- id: zones_list
  label: List Configured Zones
  kind: query
  command: "ssp.zones.list"
  response: "Bracketed by ssp.zones.start / ssp.zones.end; per-zone: ssp.zones.list.[ID, 'NAME', LAYOUT, TYPE, USE ZONE2 SOURCE, VOLUME, DELAY, EQ, LIPSYNC, MODE, MUTE, LOUDNESS, AVZONES, BASS, TREBLE, RESERVED×3]"

- id: zones_lipsync_set
  label: Set Zone Lip Sync
  kind: action
  command: "ssp.zones.lipsync.{zone_id,yy}"
  params:
    - name: zone_id
      type: integer
    - name: yy
      type: integer
      description: "ms, range -(Inputs AV Delay + Settings AV Zone Delay) to 100"

- id: zones_volume_set
  label: Set Zone Volume
  kind: action
  command: "ssp.zones.volume.{zone_id,yy}"
  params:
    - name: zone_id
      type: integer
    - name: yy
      type: integer
      description: "0..-100 dB"

- id: zones_volume_up
  label: Zone Volume Up (+1.0 dB)
  kind: action
  command: "ssp.zones.volume.up.{zone_id}"
  params:
    - name: zone_id
      type: integer

- id: zones_volume_down
  label: Zone Volume Down (-1.0 dB)
  kind: action
  command: "ssp.zones.volume.down.{zone_id}"
  params:
    - name: zone_id
      type: integer

- id: zones_eq_set
  label: Set Zone EQ
  kind: action
  command: "ssp.zones.eq.{zone_id,yy}"
  params:
    - name: zone_id
      type: integer
    - name: yy
      type: integer
      description: "0=Off, 1=On"

- id: zones_eq_toggle
  label: Toggle Zone EQ
  kind: action
  command: "ssp.zones.eq.toggle.{zone_id}"
  params:
    - name: zone_id
      type: integer

- id: zones_mute_set
  label: Set Zone Mute
  kind: action
  command: "ssp.zones.mute.{zone_id,yy}"
  params:
    - name: zone_id
      type: integer
    - name: yy
      type: integer
      description: "0=Not muted, 1=Muted"

- id: zones_mute_toggle
  label: Toggle Zone Mute
  kind: action
  command: "ssp.zones.mute.toggle.{zone_id}"
  params:
    - name: zone_id
      type: integer

- id: zones_bass_set
  label: Set Zone Bass
  kind: action
  command: "ssp.zones.bass.{zone_id,yy}"
  params:
    - name: zone_id
      type: integer
    - name: yy
      type: integer
      description: "Bass level, step 1 dB"

- id: zones_treble_set
  label: Set Zone Treble
  kind: action
  command: "ssp.zones.treble.{zone_id,yy}"
  params:
    - name: zone_id
      type: integer
    - name: yy
      type: integer
      description: "Treble level, step 1 dB"

- id: zones_mode_set
  label: Set Zone Binaural Mode
  kind: action
  command: "ssp.zones.mode.{zone_id,yy}"
  params:
    - name: zone_id
      type: integer
    - name: yy
      type: integer
      description: "0=Stereo, 1=Binaural"
  notes: "Returns 'error' if SphereAudio license not activated"

- id: zones_mode_toggle
  label: Toggle Zone Binaural Mode
  kind: action
  command: "ssp.zones.mode.toggle.{zone_id}"
  params:
    - name: zone_id
      type: integer

- id: zones_useZone2_set
  label: Set Zone Use Zone2
  kind: action
  command: "ssp.zones.useZone2.{zone_id,yy}"
  params:
    - name: zone_id
      type: integer
    - name: yy
      type: integer
      description: "0=No, 1=Yes"

- id: zones_useZone2_toggle
  label: Toggle Zone Use Zone2
  kind: action
  command: "ssp.zones.useZone2.toggle.{zone_id}"
  params:
    - name: zone_id
      type: integer

- id: zones_loudness_set
  label: Set Zone Loudness
  kind: action
  command: "ssp.zones.loudness.{zone_id,yy}"
  params:
    - name: zone_id
      type: integer
    - name: yy
      type: integer
      description: "0..3"

- id: zones_loudness_read
  label: Read Zone Loudness
  kind: query
  command: "ssp.zones.loudness.{zone_id}"
  params:
    - name: zone_id
      type: integer

- id: zones_profiles_list
  label: List All Zone Profiles
  kind: query
  command: "ssp.zones.profiles.list"
  response: "Bracketed by ssp.zones.profiles.start / ssp.zones.profiles.end; per-profile: ssp.zones.profiles.list.[zone_id, profile_id, 'NAME', ACTIVE, RESERVED×4]"

- id: zones_profiles_list_by_zone
  label: List Profiles Within Zone
  kind: query
  command: "ssp.zones.profiles.list.{zone_id}"
  params:
    - name: zone_id
      type: integer

- id: zones_profiles_read
  label: Read Active Profile for Zone
  kind: query
  command: "ssp.zones.profiles.{zone_id}"
  params:
    - name: zone_id
      type: integer
  response: "ssp.zones.profiles.[zone_id, profile_id]"

- id: zones_profiles_set
  label: Assign Active Profile for Zone
  kind: action
  command: "ssp.zones.profiles.{zone_id,yy}"
  params:
    - name: zone_id
      type: integer
    - name: yy
      type: integer
      description: Profile ID

# Section 3.6.1 - Front Panel
- id: frontpanel_color_read
  label: Read Front Panel Color
  kind: query
  command: "ssp.frontpanel.color"
  response: "ssp.frontpanel.color.[blue|red|green|white|magenta|orange]"
  notes: "Not available for Bryston/Focal brands"

- id: frontpanel_color_set
  label: Set Front Panel Color
  kind: action
  command: "ssp.frontpanel.color.{color}"
  params:
    - name: color
      type: string
      enum: [blue, red, green, white, magenta, orange]
  notes: "Not available for Bryston/Focal brands"

- id: frontpanel_stbybright_read
  label: Read Front Panel Standby Brightness
  kind: query
  command: "ssp.frontpanel.stbybright"
  response: "ssp.frontpanel.stbybright.[xx]; 0..100, step 10"

- id: frontpanel_stbybright_set
  label: Set Front Panel Standby Brightness
  kind: action
  command: "ssp.frontpanel.stbybright.{xx}"
  params:
    - name: level
      type: integer
      description: "0..100, step 10"

- id: frontpanel_actbright_read
  label: Read Front Panel Active Brightness
  kind: query
  command: "ssp.frontpanel.actbright"
  response: "ssp.frontpanel.actbright.[xx]; 0..100, step 10"

- id: frontpanel_actbright_set
  label: Set Front Panel Active Brightness
  kind: action
  command: "ssp.frontpanel.actbright.{xx}"
  params:
    - name: level
      type: integer
      description: "0..100, step 10"

- id: frontpanel_stbytime_read
  label: Read Front Panel Standby Delay
  kind: query
  command: "ssp.frontpanel.stbytime"
  response: "ssp.frontpanel.stbytime.[xx]; allowed 2, 5, 10, 20, 30, 60 sec"

- id: frontpanel_stbytime_set
  label: Set Front Panel Standby Delay
  kind: action
  command: "ssp.frontpanel.stbytime.{xx}"
  params:
    - name: seconds
      type: integer
      enum: [2, 5, 10, 20, 30, 60]

# Section 3.7.1 - Trigger
- id: trig_read
  label: Read Trigger Status
  kind: query
  command: "ssp.trig{n}"
  params:
    - name: n
      type: integer
  response: "ssp.trig{n}.on or ssp.trig{n}.off"

- id: trig_on
  label: Turn Trigger On
  kind: action
  command: "ssp.trig{n}.on"
  params:
    - name: n
      type: integer

- id: trig_off
  label: Turn Trigger Off
  kind: action
  command: "ssp.trig{n}.off"
  params:
    - name: n
      type: integer

- id: trig_manual_read
  label: Read Trigger Manual/Automatic Mode
  kind: query
  command: "ssp.trig{n}.manual"
  params:
    - name: n
      type: integer
  response: "ssp.trig{n}.manual.on / ssp.trig{n}.manual.off"

- id: trig_toggle
  label: Toggle Trigger
  kind: action
  command: "ssp.trig{n}.toggle"
  params:
    - name: n
      type: integer

- id: trigger_list
  label: List Trigger Names
  kind: query
  command: "ssp.trigger.list"
  response: "Bracketed by ssp.trigger.start / ssp.trigger.end; per-trigger: ssp.trigger.list.['NAME']"

# Section 3.8 - Stream Info
- id: fs_read
  label: Read Input Sample Rate
  kind: query
  command: "ssp.fs"
  response: "ssp.fs.[xx]"

- id: stream_read
  label: Read Input Stream Type
  kind: query
  command: "ssp.stream"
  response: "ssp.stream.[xx]"

- id: format_read
  label: Read Input Channel Configuration
  kind: query
  command: "ssp.format"
  response: "ssp.format.[xx]"

# Section 3.9 - HDMI Info
- id: hdmi_input_read
  label: Read HDMI Output Video-In Info
  kind: query
  command: "ssp.hdmi{x}.input"
  params:
    - name: x
      type: integer
      description: "Output 1 or 2"
  response: "ssp.hdmi{x}.input.['yy']"

- id: hdmi_sync_read
  label: Read HDMI Output Sync Info
  kind: query
  command: "ssp.hdmi{x}.sync"
  params:
    - name: x
      type: integer
      description: "Output 1 or 2"

- id: hdmi_timing_read
  label: Read HDMI Output Timing
  kind: query
  command: "ssp.hdmi{x}.timing"
  params:
    - name: x
      type: integer
      description: "Output 1 or 2"

- id: hdmi_hdr_read
  label: Read HDMI Output HDR
  kind: query
  command: "ssp.hdmi{x}.hdr"
  params:
    - name: x
      type: integer
      description: "Output 1 or 2"

- id: hdmi_cp_read
  label: Read HDMI Output Copy Protection
  kind: query
  command: "ssp.hdmi{x}.cp"
  params:
    - name: x
      type: integer
      description: "Output 1 or 2"

- id: hdmi_colorspace_read
  label: Read HDMI Output Color Space
  kind: query
  command: "ssp.hdmi{x}.colorspace"
  params:
    - name: x
      type: integer
      description: "Output 1 or 2"

- id: hdmi_colordepth_read
  label: Read HDMI Output Color Depth
  kind: query
  command: "ssp.hdmi{x}.colordepth"
  params:
    - name: x
      type: integer
      description: "Output 1 or 2"

- id: hdmi_mode_read
  label: Read HDMI Output Mode
  kind: query
  command: "ssp.hdmi{x}.mode"
  params:
    - name: x
      type: integer
      description: "Output 1 or 2"

# Section 3.10 - OSD
- id: osd_info
  label: Toggle Extended OSD Info Panel
  kind: action
  command: "ssp.osd.info"
  notes: "HMC HDMI boards only"

# Section 3.11 - Front Panel Display
- id: display_toggle
  label: Toggle Front Panel Display
  kind: action
  command: "ssp.display.toggle"
  notes: "ISP Core and ISP mk3 (or superior) only"

# Section 3.11.2 - Front Panel Navigation
- id: nav_up
  label: Front Panel Nav Up
  kind: action
  command: "ssp.nav.up"
  notes: "ISP Core and ISP mk3 (or superior) only"

- id: nav_down
  label: Front Panel Nav Down
  kind: action
  command: "ssp.nav.down"
  notes: "ISP Core and ISP mk3 (or superior) only"

- id: nav_left
  label: Front Panel Nav Left
  kind: action
  command: "ssp.nav.left"
  notes: "ISP Core and ISP mk3 (or superior) only"

- id: nav_right
  label: Front Panel Nav Right
  kind: action
  command: "ssp.nav.right"
  notes: "ISP Core and ISP mk3 (or superior) only"

- id: nav_ok
  label: Front Panel Nav OK
  kind: action
  command: "ssp.nav.ok"
  notes: "ISP Core and ISP mk3 (or superior) only"

- id: nav_back
  label: Front Panel Nav Back
  kind: action
  command: "ssp.nav.back"
  notes: "ISP Core and ISP mk3 (or superior) only"

Feedbacks

# All feedback is broadcast-style: every connected client receives the new value
# any time a parameter changes via any interface (front panel, WebUI, TCP, etc.).
# Names listed below mirror the response formats documented in the source.

- id: power_state
  type: enum
  values: [on, off]
  examples: ["ssp.power.on", "ssp.power.off"]

- id: procstate
  type: enum
  values: ["0 (off / sleep)", "1 (init or shutdown)", "2 (on)"]
  examples: ["ssp.procstate.0", "ssp.procstate.1", "ssp.procstate.2"]

- id: mute_state
  type: enum
  values: [on, off]

- id: dim_state
  type: enum
  values: [on, off]

- id: vol_level
  type: integer
  description: "0..-100 (dB). Sent as ssp.vol.[-xx]"

- id: loudness_level
  type: enum
  values: ["0 (Off)", "1 (Low)", "2 (Medium)", "3 (Full)"]

- id: bass_level
  type: integer
  description: "-6..+6 dB"

- id: treble_level
  type: integer
  description: "-6..+6 dB"

- id: brightness_level
  type: integer
  description: "-6..+6 dB"

- id: c_en_level
  type: integer
  description: "Center Enhance, -6..+6 dB"

- id: s_en_level
  type: integer
  description: "Surround Enhance, -6..+6 dB"

- id: lfe_en_level
  type: integer
  description: "LFE Enhance, -6..+6 dB"

- id: lipsync_level
  type: integer
  description: "ms; range -(Inputs AV Delay + Settings AV Zone Delay) to 100"

- id: input_id
  type: integer
  description: "Active input ID"

- id: preset_id
  type: integer
  description: "Active preset ID"

- id: presenter_custom
  type: enum
  values: [on, off]
  examples: ["ssp.preset.custom.on", "ssp.preset.custom.off"]

- id: surroundmode_id
  type: integer
  description: "0=Native, 1=Stereo Downmix, 2=Dolby Surround, 3=DTS Neural:X, 4=Auro-Matic"

- id: allowedmode_id
  type: integer
  description: "Real active surround mode (may differ from preferred for non-upmixable content)"

- id: speaker_id
  type: integer
  description: "0 if preset has no Theater"

- id: aurostrength
  type: integer
  description: "0..15"

- id: auropreset_id
  type: integer
  description: "0=Small, 1=Medium, 2=Large, 3=Speech"

- id: drc_state
  type: enum
  values: [on, off, auto]

- id: cspread_state
  type: enum
  values: [on, off]

- id: dialogcontrol
  type: string
  description: "Tuple [available, level dB]; e.g. ssp.dialogcontrol.[1, 3]"

- id: dialognorm_state
  type: enum
  values: [on, off]

- id: imax_mode
  type: enum
  values: [on, off, auto]

- id: stormxt_state
  type: enum
  values: [on, off]
  notes: "Returns 'error' without StormXT license"

- id: dolbymode
  type: enum
  values: ["0 (Off)", "1 (Movie)", "2 (Music)", "3 (Night)"]

- id: dolbyvirtualizer_state
  type: enum
  values: [on, off]

- id: spheraudioeffect
  type: enum
  values: ["0 (ByPass)", "1 (Lounge)", "2 (Home Cinema)", "3 (Concert)", "4 (Cinema)"]
  notes: "Returns 'error' without SphereAudio license"

- id: lfedim_state
  type: enum
  values: [on, off]

- id: zone_volume
  type: integer
  description: "Zone volume 0..-100 dB"
  examples: ["ssp.zones.volume.[zone_id, yy]"]

- id: zone_mute
  type: integer
  description: "0=Not muted, 1=Muted"

- id: zone_eq
  type: integer
  description: "0=Off, 1=On"

- id: zone_loudness
  type: integer
  description: "0..3"

- id: zone_mode
  type: integer
  description: "0=Stereo, 1=Binaural"

- id: zone_bass
  type: integer
  description: "Zone bass level, step 1 dB"

- id: zone_treble
  type: integer
  description: "Zone treble level, step 1 dB"

- id: zone_lipsync
  type: integer
  description: "Zone lip sync in ms"

- id: zone_useZone2
  type: integer
  description: "0=No, 1=Yes"

- id: frontpanel_color
  type: enum
  values: [blue, red, green, white, magenta, orange]

- id: frontpanel_stbybright
  type: integer
  description: "0..100, step 10"

- id: frontpanel_actbright
  type: integer
  description: "0..100, step 10"

- id: frontpanel_stbytime
  type: enum
  values: [2, 5, 10, 20, 30, 60]

- id: trigger_state
  type: enum
  values: [on, off]
  examples: ["ssp.trig{n}.on", "ssp.trig{n}.off"]

- id: trigger_manual
  type: enum
  values: [on, off]
  examples: ["ssp.trig{n}.manual.on", "ssp.trig{n}.manual.off"]

- id: input_stream
  type: string
  description: "Free-form stream type, e.g. contains 'DTS', 'IMAX' for dialog gates"

- id: input_sample_rate
  type: string
  description: "Sample rate code"

- id: input_format
  type: string
  description: "Input channel configuration code"

- id: hdmi_info
  type: string
  description: "HDMI output info strings: input, sync, timing, hdr, cp, colorspace, colordepth, mode"

- id: version
  type: string
  description: "Firmware version string"

- id: brand
  type: enum
  values: [StormAudio, Bryston, FOCAL]

- id: model
  type: enum
  values: [IISP, "Astral 16", "ISP Elite MK1", SP4, "ISP Elite MK2", "ISP Core 16"]

- id: msgstatus
  type: integer
  description: "Message status ID (0..99); see msg-id table - 0=empty, 1=Backup, 2=Restore, 3=Selective, 4=Reset, 5=Firmware upgrade, 6=Dirac loading, 98=msg string, 99=?"

- id: msgstatusTxt
  type: string
  description: "Tuple [id, msg]; max 256 chars"

- id: zones_profiles
  type: string
  description: "Tuple [zone_id, profile_id]"

- id: input_listing
  type: string
  description: "Multi-message dump bracketed by ssp.input.start / ssp.input.end"

- id: preset_listing
  type: string
  description: "Multi-message dump bracketed by ssp.preset.start / ssp.preset.end"

- id: zones_listing
  type: string
  description: "Multi-message dump bracketed by ssp.zones.start / ssp.zones.end"

- id: inputZone2_id
  type: integer
  description: "0 if input has no Zone2 Audio IN"

- id: inputHdmiMatrixMode
  type: enum
  values: ["0 (Mirror)", "1 (Zone2 A/V)", "2 (Pass Through)"]
  notes: "Returns 'error' without HdmiMatrix license"

- id: trigger_list
  type: string
  description: "Trigger names bracketed by ssp.trigger.start / ssp.trigger.end"

- id: surroundmode_list
  type: string
  description: "Surround mode list bracketed by ssp.surroundmode.start / ssp.surroundmode.end"

- id: auropreset_list
  type: string
  description: "Auro preset list bracketed by ssp.auropreset.start / ssp.auropreset.end"

Variables

# No variable values are separately documentable here; every settable parameter
# in the source is a discrete command with its own id/value pair. See Actions.

Events

# Broadcast notifications sent on parameter change by any interface (front panel,
# WebUI, other TCP clients). Source describes these as "the same format as the
# read commands" - every read command listed above is also a potential event.
#
# Key events:
# - ssp.power.on / ssp.power.off              (power state change)
# - ssp.mute.on / ssp.mute.off                (mute toggle)
# - ssp.vol.[-xx]                             (volume change)
# - ssp.input.[xx]                            (input change)
# - ssp.preset.[xx]                           (preset change)
# - ssp.surroundmode.[xx]                     (surround mode change)
# - ssp.zones.list.*                          (any zone field change → entire list rebroadcast)
# - ssp.preset.list.*                         (preset name or active state change)
# - ssp.input.list.*                          (any input field change)
# - ssp.trigger.list.*                        (trigger name change)
# - ssp.frontpanel.color / .stbybright / .actbright / .stbytime (front panel changes)
# - ssp.update                                (firmware update - see Notes)

Macros

# UNRESOLVED: source does not document multi-step command sequences;
# macros must be defined by integrator.

Safety

confirmation_required_for:
  - ssp.reset          # processor reboot; TCP connection lost
  - ssp.power          # power state changes affect active audio
interlocks: []
# UNRESOLVED: source contains no explicit safety warnings, interlock procedures,
# or power-on sequencing requirements beyond the ssp.power.on → ssp.procstate.2
# ready-state note.

Notes

  • Protocol uses Telnet port 23 (TCP). No authentication described in source.
  • Frame format: ASCII, terminated by <LF> (\n). Source example: "ssp.hdmi1.input.["HDMI 1"]".
  • On connect, ISP broadcasts current values of every parameter.
  • Any parameter change via any interface (front panel, WebUI, another TCP client) is broadcast to all connected clients.
  • Unknown or out-of-range commands return the literal string "error".
  • ssp.reset causes reboot and drops TCP connection.
  • ssp.close only closes the TCP connection; API application continues running.
  • Bass/Treble/Brightness/C_en/S_en/sub_en/lfe_en maximum range depends on the WebUI "Audio Control Range MAX" setting (not exposed via TCP).
  • ssp.sub_en is deprecated since v22-1 (use ssp.lfe_en).
  • ssp.IMAXMode.on returns ssp.IMAXMode.auto (documented quirk in source).
  • Several commands require specific hardware: HDMI Matrix / 7+2 eARC board, HMC HDMI boards for OSD, ISP Core / mk3+ for front panel navigation.
  • Surround mode ssp.allowedmode (real) may differ from ssp.surroundmode (preferred) when content cannot be upmixed.
  • In a SphereAudio preset, several parameters are grayed/disabled in the UI: Master Volume, Mute, Vol Dim, Center Enhance, Surround Enhance, Sub Enhance, Bass, Treble, Brightness, Lipsync, LFE Dim.
  • Auro Strength, Auro Preset, DRC, Center Spread, Dialog Control, Dialog Norm, IMAX Mode, StormXT, Storm Audio modes are all conditionally visible depending on the active surround mode and source stream.

Provenance

source_domains:
  - stormaudio.com
source_urls:
  - https://www.stormaudio.com/wp-content/uploads/2024/10/Stormaudio_isp_tcpip_api_protocol_fw4.6r1_v23.pdf
retrieved_at: 2026-07-24T18:50:03.997Z
last_checked_at: 2026-08-05T08:49:35.992Z

Verification Summary

verdict: verified
checked_at: 2026-08-05T08:49:35.992Z
matched_actions: 171
action_count: 171
confidence: medium
summary: "All 171 spec action ids have literal wire-level matches in source; transport (TCP port 23, no auth) is verbatim; source command catalogue fully represented. (8 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "Astral 16 and SP4 listed in ssp.model responses but not in compatible_with models — source lists them as models but spec is for ISP-MK series"
- "source does not document multi-step command sequences;"
- "source contains no explicit safety warnings, interlock procedures,"
- "firmware version compatibility — source states \"4.6r1 and beyond\" but does not specify upper bound."
- "message-status IDs 0 and 99 — source table row is empty."
- "trigger count (max N triggers) — source uses ssp.trig{n} but never states N."
- "maximum number of inputs and presets — source lists examples but no numeric caps."
- "discrete value of \"xx\" placeholder in feedback IDs (e.g. exact code mapping for ssp.format, ssp.stream, ssp.fs)."

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