Python API for Swidget smart devices
Project description
python-swidget
Python SDK for Swidget smart devices. It supports local HTTP control and websockets for realtime updates, along with SSDP discovery, Wi-Fi provisioning helpers, and a CLI tool (swidget).
Table of contents
- Installation
- Quickstart
- Device types and helpers
- HTTP vs websocket modes
- Discovery
- Provisioning (AP mode)
- CLI usage
- Development (tests, lint, hooks)
Installation
Using Poetry (preferred):
poetry install --with dev
Using pip:
pip install python-swidget
Quickstart
from swidget import SwidgetDimmer
dev = SwidgetDimmer(
host="192.168.1.50",
token_name="x-secret-key",
secret_key="password",
use_https=True,
use_websockets=False, # set True for realtime updates
)
# HTTP-only mode
await dev.update()
await dev.turn_on()
await dev.turn_off()
await dev.close()
Websocket mode (realtime)
dev = SwidgetDimmer(
host="192.168.1.50",
token_name="x-secret-key",
secret_key="password",
use_https=True,
use_websockets=True,
)
await dev.start() # opens websocket and updates state
await dev.turn_on()
await dev.close()
Device types and helpers
SwidgetDevice– base class (shared HTTP/websocket helpers)SwidgetDimmer– brightness control (brightness,set_brightness)SwidgetOutlet– outlet control (turn_on,turn_off, power readings)SwidgetSwitch– generic switch control (turn_on,turn_off)SwidgetTimerSwitch– timer-capable switch (set_countdown_timer)
Common properties:
device_type,insert_type,friendly_name,hw_inforealtime_values: convenience dict of sensor/power values
Common actions:
turn_on(),turn_off(),blink(),ping()update()to refresh summary/state/configsend_command(assembly, component, function, command_dict)for raw control
HTTP vs websocket modes
- HTTP-only: set
use_websockets=False. All operations go over REST (/api/v1/...). - Websocket mode: set
use_websockets=True. Summary/state updates and commands use the socket when connected; HTTP is used as fallback where applicable. - TLS:
use_https=Truedisables certificate verification by default; passverify_ssl=Truewhen constructingSwidgetDeviceif you have valid certs.
Discovery
Discover devices via SSDP:
from swidget import discover_devices
devices = await discover_devices(timeout=5)
for mac, dev in devices.items():
print(dev.host, dev.friendly_name, dev.host_type, dev.insert_type)
Discover a single device when you know the IP:
from swidget import discover_single
dev = await discover_single(
host="192.168.1.50",
token_name="x-secret-key",
password="device_password",
use_https=True,
use_websockets=False,
)
await dev.update()
Provisioning (AP mode)
Provision a device while connected to its AP (Swidget-... SSID):
from swidget import provision_wifi
provision_wifi(
device_name="My Swidget",
ssid="HomeWiFi",
network_password="wifi-pass",
secret_key="factory-secret",
)
Notes:
- Provisioning disables TLS verification; run only on the device’s AP network.
- The helper waits for connection success and triggers setup completion.
CLI usage
Install the console entrypoint via Poetry/pip and run:
swidget --host 192.168.1.50 --password device_password --type dimmer state
swidget --host 192.168.1.50 --password device_password on
swidget --host 192.168.1.50 --password device_password brightness 80
swidget discover
Key options:
--http_only(flag) to force HTTP-only (no websockets)--typeto skip discovery when you know the device typewifi jointo provision via AP (prompts for SSID/password)
Development
Run tests and lint (hook runs both):
pytest
black --check .
If you install via plain pip and want the dev toolchain (tests, typing, docs, formatting):
pip install pytest pytest-asyncio aioresponses mypy black sphinx sphinx-rtd-theme sphinx-autobuild
Enable git hook (optional):
git config core.hooksPath githooks
Code structure:
swidget/core library: device models, discovery, provisioning, websocket client, CLItests/unit tests (network mocked)devtools/synthetic_test.pyoptional integration script for real devices (kept separate from unit tests)examples/runnable samples (dimmer HTTP, outlet power, timer switch, snapshot)
Additional examples
Outlet (power reading + toggle)
from swidget import SwidgetOutlet
dev = SwidgetOutlet(
host="192.168.1.60",
token_name="x-secret-key",
secret_key="password",
use_https=True,
use_websockets=False,
)
await dev.update()
print("Host features:", dev.host_features)
print("Realtime values:", dev.realtime_values)
await dev.turn_on()
await dev.turn_off()
await dev.close()
Timer switch
from swidget import SwidgetTimerSwitch
dev = SwidgetTimerSwitch(
host="192.168.1.61",
token_name="x-secret-key",
secret_key="password",
use_https=True,
use_websockets=False,
)
await dev.set_countdown_timer(20) # minutes
await dev.close()
Snapshots (video-capable insert)
from swidget import SwidgetDevice
dev = SwidgetDevice(
host="192.168.1.62",
token_name="x-secret-key",
secret_key="password",
use_https=True,
use_websockets=False,
)
await dev.update()
img = await dev.get_snapshot_bytes(width=640, height=360)
with open("snapshot.jpg", "wb") as f:
f.write(img)
await dev.close()
Type checking
Run mypy in strict mode:
poetry run mypy --strict swidget
Docs build
Generate HTML docs with Sphinx:
cd docs
poetry run sphinx-build -b html . _build
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file python_swidget-1.4.15.tar.gz.
File metadata
- Download URL: python_swidget-1.4.15.tar.gz
- Upload date:
- Size: 25.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.2 CPython/3.12.3 Linux/5.10.102.1-microsoft-standard-WSL2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dc9f3977a715d51a46250ac38dc6d159bd7e26844c46bd8ed3ca5e9b5eec528c
|
|
| MD5 |
8f746066ea30564a5c3a3a851157883e
|
|
| BLAKE2b-256 |
a842fb949d89a0b93eca16ff0ea889709a7ef5e39147c61de78a859ebac67d65
|
File details
Details for the file python_swidget-1.4.15-py3-none-any.whl.
File metadata
- Download URL: python_swidget-1.4.15-py3-none-any.whl
- Upload date:
- Size: 26.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.2 CPython/3.12.3 Linux/5.10.102.1-microsoft-standard-WSL2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e1635762509928c3de8f7dd26511ebbbb3338f73bb319aa69d33b50e2494006f
|
|
| MD5 |
3bd6132a44a1629a7340c03e6dcade0d
|
|
| BLAKE2b-256 |
2fbf08cd7587a328f27809fa38483a8c1325e299ed5199d2c53cf1c79b92ae0a
|