Async Python client for the Hypercolor daemon
Project description
Hypercolor Python
Async Python client and WebSocket helpers for the Hypercolor daemon.
This package lives inside the main Hypercolor repository at python/. It is a
standalone uv project, so Python contributors can work here without touching the
Rust workspace.
Generation details live in ../docs/development/CLIENT_GENERATION.md.
Install
uv sync
The package is source-only for the v0.1 launch and is not published to PyPI yet. Once it is published, apps should depend on it normally:
uv add hypercolor
Quick Start
import asyncio
from hypercolor import HypercolorClient
async def main() -> None:
async with HypercolorClient() as client:
status = await client.get_status()
devices = await client.get_devices()
print(status.running)
print([device.name for device in devices])
asyncio.run(main())
The async client is the primary API. Use SyncHypercolorClient for scripts or
small tools that are not already running an event loop.
from hypercolor import SyncHypercolorClient
with SyncHypercolorClient() as client:
print(client.get_status().global_brightness)
Drivers
Driver inventory includes module capabilities, config keys, optional control surface paths, and protocol catalogs for HAL-backed modules.
import asyncio
from hypercolor import HypercolorClient
async def main() -> None:
async with HypercolorClient() as client:
for driver in await client.get_drivers():
if driver.descriptor.capabilities.protocol_catalog:
print(driver.descriptor.display_name)
print([protocol.display_name for protocol in driver.protocols])
asyncio.run(main())
Effects
import asyncio
from hypercolor import HypercolorClient
async def main() -> None:
async with HypercolorClient() as client:
effects = await client.get_effects()
aurora = next(effect for effect in effects if effect.name == "Aurora")
await client.apply_effect(
aurora.id,
controls={"speed": 72, "palette": "silkcircuit"},
transition={"type": "fade", "duration_ms": 400},
)
asyncio.run(main())
Control Surfaces
Control surfaces are dynamic device and driver settings. The generated OpenAPI models stay private; the public client accepts normal Python values.
import asyncio
from hypercolor import HypercolorClient
async def main() -> None:
async with HypercolorClient() as client:
surface = await client.get_device_controls("keyboard")
await client.set_control_values(
surface.id,
{
"enabled": True,
"brightness": 88,
},
expected_revision=surface.revision,
)
await client.invoke_control_action(
surface.id,
"identify",
{"duration_ms": 750},
)
asyncio.run(main())
Inside an async function, typed daemon values can pass through directly:
async with HypercolorClient() as client:
await client.set_control_values(
"device:keyboard",
{"accent": {"kind": "color_rgb", "value": [128, 255, 234]}},
)
WebSocket Events
import asyncio
from hypercolor import HypercolorClient
from hypercolor.websocket import EventMessage, MetricsMessage
async def main() -> None:
async with HypercolorClient() as client:
async with client.events() as stream:
await stream.subscribe("events", "metrics")
async for message in stream:
if isinstance(message, EventMessage):
print(message.event, message.data)
elif isinstance(message, MetricsMessage):
print(message.data)
asyncio.run(main())
Binary frame, spectrum, and canvas messages are decoded into dataclasses, so callers do not need to parse the wire format.
Development
Use the local recipes from python/:
just verify
just fix
just generate
just generate-check
The full project recipe also runs the Python gate:
just python-verify
Manual equivalents:
uv run ruff check .
uv run ruff format --check .
uv run ty check
uv run python scripts/generate_ws_protocol.py --check
uv run pytest
uv run python scripts/generate_openapi_client.py --check
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 hypercolor-0.2.0a1.tar.gz.
File metadata
- Download URL: hypercolor-0.2.0a1.tar.gz
- Upload date:
- Size: 145.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"CachyOS Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8af628a2ac0f5f27533b228f984910cc10f9cbf5442ff6fb84c0cac96ed441d2
|
|
| MD5 |
c910473615f7634ea51b5ac5ab1b0d99
|
|
| BLAKE2b-256 |
2fd67f1452029ad14930934be9724694c1525ed9e35959a7be33fd4e97db1135
|
File details
Details for the file hypercolor-0.2.0a1-py3-none-any.whl.
File metadata
- Download URL: hypercolor-0.2.0a1-py3-none-any.whl
- Upload date:
- Size: 431.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.30 {"installer":{"name":"uv","version":"0.9.30","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"CachyOS Linux","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c9448dd8b881c9addc5d2f8468008455749657ae0698ace56ecae6308a9c57f9
|
|
| MD5 |
6133081912b49df566cc44bd9ceba7e7
|
|
| BLAKE2b-256 |
e7154c14fe3333241a20dcf27e889372132acc5ca62e12163546a1c7e2bf1454
|