This repository contains the source code for the Unfolded Circle Remote Two/3 integration driver for StormAudio devices. The Focal Astral 16 and Bryston SP4 should work, too.
The integration is based on the amazing work of JackJPowell's ucapi-framework.
- Supported entity types
- Installation instructions
- Update instructions
- Versioning
- Changelog
- Development
- Resources
- License
The Media Player entity implements the following features:
ON_OFF: Provides dedicated on/off commandsDPAD: Enables navigating your ISPs front panel (for supported models)TOGGLE: Provides the power toggleVOLUME: Enables adjusting the volume slider via the Remote 3's touch sliderVOLUME_UP_DOWN: Provides dedicated volume up/down commandsHOME: Provides the home and back commands. Both commands are mapped to thebackcommand, as there is nohomecommand for the ISPsMUTE: Mutes the deviceUNMUTE: Unmutes the deviceMUTE_TOGGLE: Toggles the mute state of the deviceSELECT_SOUND_MODE: Provides a dropdown of available sound modes (Upmixers)SELECT_SOURCE: Provides a dropdown of available sources
The entity doesn't provide any of the playback features, though, as the StormAudio API doesn't provide any of those commands (they would only be active for Roon anyway).
Furthermore, the Media Player entity implements all the Simple-Commands provided by the Remote entity, too.
The Media Player entity implements the following features:
ON_OFF: Provides dedicated on/off commandsTOGGLE: Provides the power toggleSEND_CMD: Allows sending a (custom) command to the deviceSEND_CMD_SEQUENCE: Allows sending a (custom) command sequence to the device
Furthermore, it implements many Simple-Commands.
The commands SEND_CMD and SEND_CMD_SEQUENCE allow the user to send any of your StormAudio's supported TCP commands (see https://www.stormaudio.com/tools-guides/ → Drivers Packages → TCP/IP API for reference).
Additionally, you can send the following custom commands for the send_cmd and send_cmd_sequence commands:
PRESET_<YourPresetName>--> This will select the given preset on your device.SOURCE_<YourSourceName>--> This will select the given source on your device.VOLUME_<YourVolumeLevel>--> This will set the volume level on your device to the given value (i.e.VOLUME_45will result in-55dBin your ISP).
This integration provides the following Select-Types:
- Auro-Matic presets
- Auro-Matic strength
- Presets
- Sound mode (aka Upmixers)
This integration provides the following sensors:
- Current Volume
- Muted Status
- Current Audio-Stream-Info (Stream (like PCM, DTS, etc.), input channel configuration and Samplerate)
- Current Auro-Matic Preset
- Current Auro-Matic Strength
- Current Dolby Mode
- Current Dolby Center Spread Setting
- Current Dolby Virtualizer Setting
- Current Loudness Setting
- Current Preset
- Current Source
- Current Upmixer
- StormXT Status
- Tone controls (Bass, Treble, Brightness, Center enhancement, Surround enhancement, LFE enhancement)
- Download the integration package (tar.gz file) from the Releases page
- Upload the archive via the Remote's web configurator: "Integrations" → "Install custom"
- Configure your device through the setup wizard
- Download the integration package (tar.gz file) from the Releases page
- Remove the existing integration from the Remote (twice) → no worries, all your configured activity settings will still be there.
- Upload the archive via the Remote's web configurator: "Integrations" → "Install custom"
- Configure your device through the setup wizard
We use SemVer for versioning. For the versions available, see the tags and releases in this repository.
The major changes found in each new release are listed in the changelog and under the GitHub releases.
├── driver.json # Integration metadata and configuration
├── uc_intg_stormaudio/ # Main integration code
│ ├── __init__.py # Main entry point
│ ├── config.py # device configuration dataclass
│ ├── const.py # Constants
│ ├── device.py # Device communication and state management
│ ├── device_attributes.py # Contains the device attributes, i.e. the state of the StormAudio ISP
│ ├── discover.py # Network device discovery
│ ├── helpers.py # Common used helper files
│ ├── media_player.py # Media player entity
│ ├── remote.py # Remote entity
│ ├── select_entity.py # Select entity
│ ├── sensor.py # Sensor entity
│ ├── setup.py # Setup flow and user configuration
│ └── stormaudio.py # The basic TCP-/Telnet-client for communicating with StormAudio devices
├── config/ # Runtime configuration storage
├── Dockerfile # Container build configuration
└── requirements.txt # Python dependencies
- Python 3.11+
- uv
- Docker, Docker Compose
-
Prepare the environment:
uv venv
-
Install dependencies:
uv sync
-
Install the git-hooks:
uv run pre-commit install
-
Run the integration either locally or via a Compose environment:
- Locally:
uv run python3 uc_intg_stormaudio
- via Compose:
docker compose up --remove-orphans --build --watch --pull=always
- Locally:
uv add <dependency>
uv export --format requirements.txt --output-file requirements.txt --no-annotate --no-header --no-hashes --no-devuv remove <dependency>
uv export --format requirements.txt --output-file requirements.txt --no-annotate --no-header --no-hashes --no-dev
uv lock --upgrade-package <dependency>
uv export --format requirements.txt --output-file requirements.txt --no-annotate --no-header --no-hashes --no-devuv lock --upgrade
uv export --format requirements.txt --output-file requirements.txt --no-annotate --no-header --no-hashes --no-dev| Variable | Description | Default |
|---|---|---|
UC_LOG_LEVEL |
Logging level (DEBUG, INFO, WARNING, ERROR) | DEBUG |
UC_CONFIG_HOME |
Configuration directory path | /config |
UC_INTEGRATION_INTERFACE |
Network interface to bind | 0.0.0.0 |
UC_INTEGRATION_HTTP_PORT |
HTTP port for the integration | 9090 |
UC_DISABLE_MDNS_PUBLISH |
Disable mDNS advertisement | false |
Mozilla Public License Version 2.0 – see LICENSE for details.