Bose SoundTouch
The Bose SoundTouch driver controls SoundTouch speakers and soundbars (10/20/30, SoundTouch 300, Wave SoundTouch IV) through the local HTTP+XML API on port 8090. One GEM device represents one speaker.
Status
Transport (play/pause/stop/skip), volume and mute, presets 1-6, source switching (AUX/Bluetooth), and live now-playing polling are wired. The passthrough style command and group/zone (multi-room) management are not implemented in this driver — for whole-home grouping use the SoundTouch app or wire each speaker as its own GEM device.
Prerequisites
- SoundTouch speaker on the LAN with current firmware and the SoundTouch mobile app paired.
- Static IP or DHCP reservation on the speaker — GEM does not auto-discover SoundTouch units.
- TCP 8090 reachable from the GEM host to the speaker.
Setup
- Pair the speaker in the Bose SoundTouch mobile app and configure presets 1-6.
- Reserve the speaker's IP in DHCP.
- In System > Devices, create a device with driver
bose_soundtouch. Set theipattribute. Port defaults to8090. - Verify connectivity from the Script Console:
The response will include the speaker's name and MAC.await gem.command({device: <device_id>, action: 'get_info'});
- The driver polls
/now_playingand/volumeeverystatus_intervalms; track, artist, source, volume, mute, and play state attributes update automatically.
Attribute reference
Device attributes
| Attribute | Type | Required | Description |
|---|---|---|---|
ip | string | yes | LAN IP of the speaker. |
port | int | no | HTTP port. Default 8090. Some early units use 8091. |
status_interval | int | no | Poll interval in milliseconds. Default 5000. |
The driver reflects the following attributes onto the device as state changes:
| Attribute | Type | Source |
|---|---|---|
volume | int | /volume actualvolume (0-100). |
mute_state | string | on / off. |
play_state | string | PLAY_STATE, PAUSE_STATE, STOP_STATE, BUFFERING_STATE, etc. |
source | string | STANDBY, INTERNET_RADIO, BLUETOOTH, AUX, etc. |
track | string | Now-playing track title (when present). |
artist | string | Now-playing artist (when present). |
Zone address format
This driver does not use zones — each speaker is its own device.
Commands
| Command | Args | Notes |
|---|---|---|
play / pause / stop / play_pause | — | Transport keys. |
next_track / previous_track | — | |
power_toggle | — | SoundTouch only exposes a single POWER toggle key — there is no on/off pair. |
volume | level (0-100) | Sets absolute volume. |
volume_up / volume_down / mute_toggle | — | |
play_preset | preset (1-6) | Triggers the preset configured in the SoundTouch app. |
set_source | source (AUX_INPUT, BLUETOOTH) | Switches inputs. |
send_key | key | Sends any raw SoundTouch key press. |
get_now_playing / get_volume / get_info / get_presets / get_sources | — | Read endpoints. |
Known limitations
- Multi-room grouping (zones) is not supported by this driver. The Bose Zone API is documented but commercial install patterns are usually one-speaker-per-room, so we kept the surface focused.
- The SoundTouch API does not expose per-track album art beyond a URL field; only track and artist text are mirrored as attributes.
- Source switching is key-based, not name-based — there is no "set input HDMI-2" call. Use
play_presetfor source-tied presets.
Troubleshooting
| Symptom | Check |
|---|---|
| No response on port 8090 | Verify firmware is current and the SoundTouch app can control the speaker. Try port 8091 on early units. |
| Volume changes but state does not appear in GEM | Reduce status_interval to 2000ms while debugging. |
| Presets do nothing | Open the SoundTouch app and assign presets 1-6 first; the driver triggers PRESET_N keys but does not assign them. |
401 / 403 from /info | Some firmware locks down API access until the speaker has been paired in the SoundTouch mobile app. Run pairing in the app first. |