StormAudio ISP / ISR
StormAudio Immersive Sound Processors (ISP series) and Immersive Sound Receivers (ISR series)
are controlled over StormAudio's SSP Telnet control protocol — newline-delimited ssp.*
text commands on TCP port 23. GEM sends the room-cinema controls an integrator needs:
power, input, master volume, mute, surround-mode and preset recall, tone (bass/treble),
speaker-enhance and sub trims, lip-sync, IMAX mode, and front-panel/display controls.
This driver models the processor as a single main-zone device. It does not create a zone of its own — instead you point an AV zone's Volume Device at it so the room's volume slider and mute indicator ride the processor. See "Linking to an AV zone" below.
What's controlled
- Main-zone power on / off / toggle
- Master volume — absolute set as a
0–100percentage, plus up/down steps, with an optional safety cap (max_volume) - Mute on / off / toggle
- Input selection by numeric input index (and a separate Zone 2 output input, plus an HDMI pass-through input select)
- Surround-mode recall and processing trims: surround-enhance, center-enhance, sub-enhance, bass, treble, lip-sync
- Preset recall
- IMAX mode on / off / auto
- Volume dim, display toggle, front-panel colour, and an on-screen navigation cluster (up/down/left/right/enter/back)
- Live status: the processor pushes state changes as they happen, and the driver also polls power, volume, mute, and input every 30 seconds as a fallback
Prerequisites
- A StormAudio ISP or ISR with the SSP network control interface enabled and reachable on the LAN over TCP port 23.
- A stable IP for the processor — assign a static IP or a DHCP reservation so the address never moves.
Setup
- On the StormAudio processor, enable network / Telnet control and confirm it answers on port 23.
- In GEM, open Devices, add a device, and choose the StormAudio ISP / ISR driver.
- Set Processor IP to the unit's address. Telnet Port defaults to
23— leave it unless the unit was re-mapped. - (Optional) Set Max Allowed Volume to cap how loud the
volumecommand can drive the room. It defaults to80(out of 100) as a safety limit — see "Volume scaling" below. - Save. On connect, GEM opens the Telnet session and begins polling power, volume, mute, and input every 30 seconds.
Linking to an AV zone
The processor feeds volume and mute into an AV zone rather than appearing as its own controllable zone:
- Open AV Zones and edit (or create) the zone for the room the processor serves.
- Set the Volume Device field to this StormAudio device.
- Save. From then on, whenever the processor reports a new volume or mute state, GEM mirrors it onto that AV zone's volume slider and mute indicator — and the zone's volume control drives the processor.
Selecting an input on the processor is a device command, not an AV source change. The processor's active input is tracked separately from GEM's AV source routing — choosing the room's source on a touchpanel does not, by itself, change the processor's input unless you wire that input select into the source's on-macro.
Volume scaling
The processor reports and accepts volume on the wire as −100 (mute floor) to 0 (maximum).
GEM presents this to you as a friendlier 0–100 percentage and does the conversion in both
directions, so everywhere in the UI — the AV zone slider, the volume command, the volume
status attribute — you work in 0–100.
The Max Allowed Volume (max_volume) attribute is a safety cap applied to the volume
command only. With the default of 80, a volume command asking for more than 80 is rejected
rather than clamped, so an over-eager macro or panel can't slam the room to reference level.
Raise it (up to 100) when you genuinely need full output; lower it to protect speakers or
neighbours.
volume_up and volume_down step the processor's own volume directly and are not bounded
by max_volume — only the absolute volume command honours the cap.
Attributes
Device — required
| Attribute | Type | Description |
|---|---|---|
ip | string | Processor LAN IP. |
Device — optional
| Attribute | Type | Default | Description |
|---|---|---|---|
port | int | 23 | SSP Telnet port. |
max_volume | int | 80 | Safety cap (0–100) on the absolute volume command. |
State attributes (read-only, auto-populated)
As the processor reports state — both from push events and the periodic poll — the driver keeps
these attributes on the device current. They are status you read (in widgets, conditions, or
macros), not values you set by hand: power_state, volume (0–100), mute_state, input,
input_zone2, preset, bass, treble, brightness, dim, center_enhance,
surround_enhance, sub_enhance, lipsync, imax_mode, storm_xt, auro_strength,
version, brand, and model.
Commands
The driver declares the full command surface below. Commands whose name starts with get_ are
status queries; the rest are actions. Arguments you supply (a level, an input index, a preset,
a colour) are shown in the Arg column.
Power, volume, mute
| Command | Arg | Sends | Notes |
|---|---|---|---|
power_on | — | ssp.power.on | Power the processor on. |
power_off | — | ssp.power.off | Power off. |
power_toggle | — | ssp.power.toggle | Toggle power. |
volume | level | ssp.vol.<wire> | Absolute volume as 0–100; honours max_volume. |
volume_up | — | ssp.vol.up | Step up (not bounded by max_volume). |
volume_down | — | ssp.vol.down | Step down. |
mute_on | — | ssp.mute.on | Mute. |
mute_off | — | ssp.mute.off | Unmute. |
mute_toggle | — | ssp.mute.toggle | Toggle mute. |
volume_dim_on / volume_dim_off / volume_dim_toggle | — | ssp.dim.* | Dim (night-attenuation) control. |
After any volume or mute command the driver re-queries the processor about half a second later, so the cached state — and the linked AV zone — stays in sync with what the unit actually did.
Inputs
| Command | Arg | Sends | Notes |
|---|---|---|---|
input | input | ssp.input.<n> | Select main input by index. Run list_inputs to see the index-to-name map. |
zone2_input | input | ssp.inputZone2.<n> | Select the Zone 2 output's input. |
hdmi_passthrough_input | input | ssp.inputHdmiPassThru.<n> | Select the HDMI pass-through input. |
list_inputs | — | ssp.input.list | List available inputs. |
Surround, presets, tone
| Command | Arg | Sends | Notes |
|---|---|---|---|
surround_mode | mode | ssp.surroundmode.<mode> | Recall a surround mode. |
list_surround_modes | — | ssp.surroundmode.list | List all surround modes. |
get_active_surround_modes | — | ssp.allowedmode | The modes valid for the current source. |
preset | preset | ssp.preset.<n> | Recall a preset. |
list_presets | — | ssp.preset.list | List presets. |
bass / bass_up / bass_down | level (for bass) | ssp.bass.* | Bass trim. |
treble / treble_up / treble_down | level (for treble) | ssp.treb.* | Treble trim. |
surround_enhance / _up / _down | level | ssp.s_en.* | Surround-enhance level. |
center_enhance / _up / _down | level | ssp.c_en.* | Center-enhance level. |
sub_enhance / _up / _down | level | ssp.sub_en.* | Sub-enhance level. |
lipsync / lipsync_up / lipsync_down | level (for lipsync) | ssp.lipsync.* | Lip-sync delay. |
IMAX, display, navigation
| Command | Arg | Sends | Notes |
|---|---|---|---|
imax_mode_on / imax_mode_off / imax_mode_auto | — | ssp.IMAXMode.* | IMAX Enhanced mode. |
frontpanel_color | color | ssp.frontpanel.color.<color> | One of blue, red, green, white, magenta, orange. |
brightness_up / brightness_down | — | ssp.brightness.* | Front-panel brightness. |
display_toggle | — | ssp.display.toggle | Toggle the front-panel display. |
up / down / left / right / enter / back | — | ssp.nav.* | On-screen menu navigation. |
reset | — | ssp.reset | Processor reset. |
ping | — | ssp.keepalive | Keep-alive probe (see Troubleshooting). |
Numerous get_* queries are also available — get_power, get_volume, get_mute,
get_input, get_bass, get_treble, get_surround_mode, get_preset, get_model,
get_version, get_speaker_config, and more — for pulling a specific value on demand. See
Commands for how a device's command list is surfaced in the admin UI.
Known limitations
- Single device, not multi-zone. Even on units with a Zone 2 output, GEM models one
StormAudio device with a
zone2_inputcommand and aninput_zone2status attribute, rather than a second independent GEM zone. - Incompatible surround modes are silently ignored. StormAudio only accepts a surround-mode change when the active input carries a compatible bitstream (e.g. Auro-3D or DTS:X need a matching source). A rejected mode change produces no error — the mode simply stays put.
volume_up/volume_downignore the safety cap. Only the absolutevolumecommand is bounded bymax_volume.
Troubleshooting
| Symptom | Check |
|---|---|
| No connection | Confirm SSP / Telnet control is enabled on the processor and that TCP 23 is reachable (not blocked by a VLAN or firewall). Verify the Processor IP. |
| Volume applies but the room is quieter than expected | Max Allowed Volume is capping the percentage. Raise it (up to 100) if you actually need full output. |
| Surround-mode change has no effect | Confirm the active input carries a compatible bitstream — StormAudio silently ignores incompatible mode requests. Run get_active_surround_modes to see what the current source allows. |
| Connection drops and reconnects | Telnet has no built-in keepalive, so an upstream firewall idle-timeout can cut an idle session. The driver already polls every 30 seconds; if a site's timeout is shorter, add the ping (ssp.keepalive) command to a periodic macro. |
See also
- AV Zones — set this processor as a zone's Volume Device.
- AV Sources — how room sources route, and where an input-select macro would live.
- Devices — adding and configuring the device.
- Commands — viewing and running a device's command list.