Skip to content

StreamDeck

Jeremy Fielder edited this page Apr 8, 2026 · 6 revisions

StreamDeck Integration

AetherSDR supports Elgato Stream Deck devices via the StreamController plugin system and AetherSDR's built-in TCI server. This approach works with all Stream Deck models on Linux, macOS, and Windows.

Note: Prior to v0.8.6, AetherSDR had native USB HID StreamDeck support. This was replaced by the TCI-based plugin for better flexibility, cross-platform support, and community extensibility.

Prerequisites

  1. AetherSDR v0.8.6+ with TCI server enabled
  2. StreamController — the open-source Linux Stream Deck application (installation guide)
  3. Python 3.10+

Installation

1. Enable the TCI Server

In AetherSDR, go to Settings → Autostart TCI with AetherSDR and check it. The TCI WebSocket server listens on port 40001 by default.

Verify it's running: connect to a radio, then check the status bar — you should see the TCI icon.

2. Install StreamController

Follow the StreamController installation guide for your platform.

3. Install the AetherSDR Plugin

Copy the plugin from the AetherSDR source tree to StreamController's plugin directory:

# Linux
cp -r /path/to/AetherSDR/plugins/streamcontroller-aethersdr \
  ~/.var/app/com.core447.StreamController/data/plugins/com_aethersdr_radio

# Or if using a system install:
cp -r /usr/share/AetherSDR/plugins/streamcontroller-aethersdr \
  ~/.var/app/com.core447.StreamController/data/plugins/com_aethersdr_radio

Restart StreamController after copying. The "AetherSDR" plugin should appear in the plugin list.

4. Configure the Connection

The plugin connects to AetherSDR's TCI server at ws://localhost:40001 automatically. No configuration needed if both are running on the same machine.

For remote operation, set the TCI host in the plugin settings to the IP of the machine running AetherSDR.

Available Actions (43 total)

TX Control

Action Description
PTT Push-to-talk (hold to transmit)
MOX Toggle Toggle transmit on/off
TUNE Toggle Toggle tune carrier
RF Power Adjust RF power level
Tune Power Adjust tune power level

Frequency / Band

Action Description
Band 160m–6m Direct band select (11 bands)
Band Up / Down Step through bands sequentially
Tune Up / Down Nudge frequency by one step

Mode

Action Description
Mode USB, LSB, CW, AM, FM, DIGU, DIGL, FT8 Direct mode select

Audio

Action Description
Mute Toggle Toggle audio mute
Volume Up / Down Adjust AF gain

DSP

Action Description
NB Toggle Noise blanker
NR Toggle Noise reduction
ANF Toggle Auto notch filter
APF Toggle Audio peak filter
SQL Toggle Squelch

Slice

Action Description
Split Toggle Toggle split mode
Lock Toggle Toggle VFO lock
RIT Toggle Toggle RIT
XIT Toggle Toggle XIT

DVK (Digital Voice Keyer)

Action Description
Play Play DVK recording
Record Start/stop DVK recording

Layout Tips

  • Stream Deck XL (32 keys): Use Row 1 for bands, Row 2 for modes, Row 3 for TX/slice controls, Row 4 for DSP toggles
  • Stream Deck MK2 (15 keys): Focus on the controls you use most — band/mode on top rows, TX/DSP on bottom
  • Stream Deck Mini (6 keys): PTT, MOX, TUNE, band up/down, and one mode toggle
  • Stream Deck + (8 keys + 4 dials): Keys for toggles, assign dials to VFO tune, volume, RF power, squelch via StreamController's dial actions
  • Stream Deck Pedal (3 keys): PTT on center pedal, band up/down on sides

How It Works

StreamDeck Hardware
       ↓ USB HID
StreamController App
       ↓ Plugin API
AetherSDR Plugin (Python)
       ↓ WebSocket
AetherSDR TCI Server (port 40001)
       ↓ TCP 4992
FlexRadio

The plugin maintains a persistent WebSocket connection to AetherSDR's TCI server. Button presses send TCI commands; radio state changes are pushed back to update button labels and indicators.

Troubleshooting

Plugin not appearing in StreamController

  • Verify the plugin was copied to the correct directory
  • Check that the directory name is com_aethersdr_radio
  • Restart StreamController

Buttons not responding

  • Check that AetherSDR is running and connected to a radio
  • Verify TCI is enabled: Settings → Autostart TCI with AetherSDR
  • Check StreamController logs for WebSocket connection errors

Connection refused

  • Ensure AetherSDR's TCI server is running (port 40001)
  • If running remotely, check firewall rules for port 40001
  • Try wscat -c ws://localhost:40001 to test the connection manually

Extending the Plugin

The plugin source is in plugins/streamcontroller-aethersdr/ in the AetherSDR repository. Each action is a self-contained Python class in the actions/ directory. To add a new action:

  1. Create a new directory under the appropriate category (e.g., actions/DSP/MyAction/)
  2. Create MyAction.py extending ActionBase from the plugin
  3. Register it in main.py

See the TCI protocol documentation for available commands.

Migration from Native StreamDeck (pre-v0.8.6)

If you were using the built-in StreamDeck support in v0.8.5 or earlier:

  1. The hidapi library is no longer required for StreamDeck (still needed for HID encoders like FlexControl)
  2. The Settings → StreamDeck... menu item has been removed
  3. Install StreamController + the AetherSDR plugin as described above
  4. The udev rule for StreamDeck access is now managed by StreamController, not AetherSDR

Clone this wiki locally