Skip to main content

sdsctl

sdsctl logo

CI Python 3.11–3.14 Development status: alpha License: MIT

sdsctl is a Python library and toolkit for controlling and monitoring Uniden SDS100, SDS150, and SDS200 scanners. It provides USB serial control for all three models and native Ethernet control and network audio for the SDS200.

Use it from the command line, a full-screen terminal interface, a responsive web dashboard, Home Assistant, containers, MQTT, or a typed Python API.

Start here

Choose the installation that matches where you want to run sdsctl:

Goal Recommended path
Home Assistant OS Install the Home Assistant App
One Home Assistant App with private-LAN Pi or browser displays Advanced Home Assistant access
Linux or Raspberry Pi terminal workstation Install sds200[tui,playback]
Linux web or MQTT server Install sds200[web,mqtt]
Every optional Python runtime interface Install sds200[all]
Base CLI or Python library only Install sds200
Docker or Podman Follow the container guide
One Docker daemon with remote CLI or TUI clients Follow the remote container guide
Development and contribution Install .[dev,all] from a source checkout

The Installation wiki page explains prerequisites, virtual environments, Linux audio packages, Home Assistant, containers, upgrades, and how to verify each target.

Install the Python package

Python 3.11 or newer is required.

Install the base CLI and library:

python -m pip install sds200

Install all optional Python runtime interfaces:

python -m pip install "sds200[all]"

The all extra is exactly the union of tui, web, mqtt, and playback. It does not install operating-system packages, Home Assistant, Docker or Podman, audio servers, or FFmpeg. Linux local playback also needs a working PortAudio runtime; Debian and Raspberry Pi OS users normally install libportaudio2.

For a container installation, select a published version rather than a source checkout. The version-specific image for this release is:

docker pull theboyd78/sdsctl:0.31.0

theboyd78/sdsctl:latest follows the newest successfully published release. The repository Compose files remain source-built; see the generic container deployment guide.

First connection

Connect a scanner by USB in serial mode, then run:

sdsctl discover
sdsctl info
sdsctl monitor

Stop the monitor with Ctrl+C.

For an SDS200 on an authorized local network:

sdsctl discover --network 192.168.1.0/24 --network-only
sdsctl --host SCANNER_IP info

Only probe networks you own or are authorized to scan. The First Connection guide covers USB permissions, multiple scanners, stable Linux device paths, SDS200 Ethernet, profiles, expected success, and common failures.

What you can do

  • Discover and control supported scanners over USB, plus SDS200 Ethernet
  • Monitor structured scanner state and model-aware capabilities
  • Use a responsive Textual terminal interface with semantic controls
  • Run one daemon-owned scanner, PSI, audio, recording, event, and Waterfall runtime for local or explicitly authenticated private-network CLI/TUI clients
  • Use a loopback web dashboard or explicit authenticated native-TLS LAN mode
  • Publish bounded MQTT state, events, Home Assistant Discovery, and controls
  • Play live SDS200 network audio and create finalized WAV recordings
  • Run the Home Assistant App with Ingress, MQTT entities, first-party cards, browser audio, recordings, and an optional media-source integration
  • Edit supported Favorites fields through exact review, backup, confirmation, execution, rollback, and readback boundaries
  • Review and explicitly adopt supported RadioReference-assisted changes
  • Capture and replay sessions for hardware-independent development
  • Install and manage modular web, Home Assistant, and TUI themes

The Using sdsctl guide routes each task to its shortest workflow and detailed reference.

Supported scanners

Model USB control Native Ethernet control RTSP/RTP audio
SDS100 Yes No No
SDS150 Yes No No
SDS200 Yes Yes Yes

SDS200 USB, Ethernet control, and network audio have been validated on physical firmware 1.26.01. SDS100 core USB behavior has also been hardware-validated on firmware 1.26.01. SDS150 support follows the shared SDS-series remote-command specification and still needs physical-hardware validation. See Supported scanner models for the exact capability and validation matrix.

Interfaces and guides

Advanced, version-controlled references remain in the repository:

Security and safety

The SDS200 network-control protocol is unauthenticated and unencrypted. Keep it on a trusted LAN or access it through a secured VPN. Do not expose UDP port 50536 directly to the public Internet.

The default web service is loopback-only. Remote LAN access requires the documented authenticated native-TLS mode. Home Assistant uses a separate authenticated Ingress boundary. Reverse-proxy, public, and anonymous exposure are not supported by implication.

Favorites data, RadioReference credentials and payloads, scanner addresses, recordings, captures, Home Assistant capabilities, and diagnostics may be private. Review and sanitize complete artifacts before sharing them.

This project is not a safety-critical or emergency-dispatch system. Do not rely on it as the sole means of receiving urgent communications. Read SECURITY.md for vulnerability reporting and the transport limits before deployment.

Project naming

The product, repository, and executable are named sdsctl. The compatible Python distribution and import package remain named sds200. New Python code should use SDSScanner; the historical SDS200 class name remains an alias.

Development

git clone https://github.com/stevenboyd78/sdsctl.git
cd sdsctl
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -e ".[dev,all]"

See CONTRIBUTING.md for the complete development and test workflow. Hardware-independent tests must not require a physical scanner.

Project status

Version 0.31.0 includes Mimic-SDS Web, TUI and Home Assistant presentations, installed display-profile administration, Waterfall/TUI refinements and the physically qualified SDS200 Version 1.26.01 one-press Menu boundary. The App's new profile path remains empty and the Menu switch remains false by default. See the release scope for included changes, pre-publication evidence, upgrade requirements and deferred work.

The transport-aware Raspberry Pi TUI retains observe-only preflight and managed outage waiting/recovery. Scanner model/firmware presentation, ordinary Ingress and manual dashboard login remain separate from experimental browser enrollment. An upgrade does not enable automatic sign-in, a display profile or Menu control in existing installations. Secure unattended keyring, abrupt power-loss, cross-build and alternative-engine acceptance are not claimed. The other 26 front-panel keys, other firmware/context combinations, held gestures, sequences and retries remain unavailable. See the latest GitHub Release, CHANGELOG.md, ROADMAP.md, and project vision for released changes, ordered work, and deferred product direction.

Acknowledgments

See ACKNOWLEDGMENTS.md.

License

MIT. See LICENSE.

Metadata

Release files for sds200 0.31.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sds200 0.31.0
File Size Uploaded
sds200-0.31.0.tar.gz 18.2 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for sds200 0.31.0
File Interpreter ABI Platform
sds200-0.31.0-py3-none-any.whl Python 3 none any Details

Total release size: 21.2 MB

Release files / sds200-0.31.0.tar.gz

Download URL sds200-0.31.0.tar.gz
Size 18.2 MB
Tags Source
SHA-256 checksum
How to use checksums
89a97f8d3664a272d0440a69b8484dc4839becec20897be7558e9fe4d1643f51
BLAKE2b-256 checksum
How to use checksums
ea224891a4e077c844d3124f52e993987631acc91f744a6b534dbe38fb4ef281
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 6, 2026.

Transparency log

Release files / sds200-0.31.0-py3-none-any.whl

Download URL sds200-0.31.0-py3-none-any.whl
Size 3.0 MB
Tags Python 3
SHA-256 checksum
How to use checksums
554e4208948e3064233bb8263e4ef982bc6fed0484ec5929a934c2a1f9c2cb80
BLAKE2b-256 checksum
How to use checksums
01c39d785c842f72eb101a1572d2947b47c1d3509f92214fa03f844824453a55
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 6, 2026.

Transparency log
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page