python-client
Connect to a Scrypted server from Python and use the same SDK objects
(systemManager, deviceManager, mediaManager) that Python plugins see.
The modules in this directory are symlinks into ../../server/python and
../../sdk/types so the client and the plugin runtime share one
implementation.
Usage
Installed from PyPI, everything lives under the scrypted_sdk package:
pip install scrypted-sdk
from scrypted_sdk import connect_scrypted_client
From a checkout of this repository, the modules are importable directly:
pip install -r requirements.txt
import asyncio
from scrypted_client import connect_scrypted_client
async def main(loop):
transport, sdk = await connect_scrypted_client(
loop, "https://localhost:10443", "username", "password"
)
for id in sdk.systemManager.getSystemState():
print(sdk.systemManager.getDeviceById(id).name)
await transport.close()
loop = asyncio.new_event_loop()
loop.run_until_complete(main(loop))
test.py is a runnable version of the above; point it at a server with the
SCRYPTED_BASE_URL, SCRYPTED_USERNAME, and SCRYPTED_PASSWORD environment
variables.
examples/light.py is the Python equivalent of packages/client/examples/light.ts — it turns a named light on and back off:
SCRYPTED_USERNAME=admin SCRYPTED_PASSWORD=swordfish python examples/light.py "Office Dimmer"
It works both with pip install scrypted-sdk and directly from a repo
checkout with only requirements.txt installed.
By default the login request and the engine.io connection skip TLS
certificate verification, since Scrypted servers use self-signed certificates
out of the box. To control TLS (or connection pooling), pass your own
login_session and a pre-built EioRpcTransport(loop, http_session=...).
Session ownership: a login_session you pass is only borrowed for the login
request and is never closed. An http_session passed to EioRpcTransport
becomes owned by the transport — transport.close() closes it along with the
engine.io connection and background tasks — so don't share that session with
anything else.
Packaging
The scrypted-sdk PyPI package is
built from this directory. Because the modules here are flat top-level
modules (that is how the plugin runtime loads them), publishing them as-is
would install modules named rpc, plugin_remote, etc. into consumers'
environments. Instead, a build hook (hatch_build.py)
generates a scrypted_sdk package at build time: it copies each module
(reading through the symlinks) and mechanically rewrites the flat imports to
package-qualified ones (import rpc → from scrypted_sdk import rpc).
Nothing is committed and no runtime code is modified beyond that rewrite.
To build locally:
pip install build && python -m build # or: uv build
To release: bump version in pyproject.toml and push a
python-sdk-v* tag. The Python SDK workflow
builds, smoke-tests, and publishes to PyPI via
trusted publishing — the PyPI
project just needs koush/scrypted + python-sdk.yml registered as a
trusted publisher (no API tokens).