First PyPI release of the v1 wire path. Wheel published from local source 2026-05-11 with omni_pca/v1/ subpackage included. What's in 2026.5.11 vs 2026.5.10 (already on PyPI): * New omni_pca.v1 subpackage -- OmniConnectionV1, OmniClientV1, OmniClientV1Adapter -- for panels that listen on UDP only and speak the legacy OmniLink (not OmniLink2) wire dialect. * HA integration wires the adapter into the coordinator when Transport=UDP is selected at config-flow time; v2/TCP path is unchanged. * Streaming UploadNames discovery (bare opcode + lock-step Acknowledge until EOD/NAK). * Long-form RequestUnitStatus for unit indices > 255 (sprinklers, named flags, expansion-enclosure outputs). * Chunked status polls -- firmware 2.12 NAKs at ~63 records per request, so we batch in groups of 40. * OmniConnection.close() now sends ClientSessionTerminated so the panel frees our session slot immediately on disconnect. Verified end-to-end against a firmware 2.12 OmniPro II panel at 192.168.1.9: discovery (16 zones, 44 units, 16 buttons, 8 codes, 2 thermostats, 8 messages) + status polling + execute_command round-trip all working under HA, side-by-side with the existing TCP mock-panel path in the dev stack. README: new "Two wire dialects" section explaining when to pick TCP/OmniClient vs UDP/OmniClientV1. manifest.json: requirements bump to omni-pca==2026.5.11.
86 lines
2.3 KiB
TOML
86 lines
2.3 KiB
TOML
[project]
|
|
name = "omni-pca"
|
|
version = "2026.5.11"
|
|
description = "Async Python client for HAI/Leviton Omni-Link II home automation panels (Omni Pro II, Omni IIe, Omni LTe, Lumina)."
|
|
readme = "README.md"
|
|
license = { text = "MIT" }
|
|
authors = [{ name = "Ryan Malloy", email = "ryan@supported.systems" }]
|
|
requires-python = ">=3.14.2"
|
|
keywords = ["hai", "leviton", "omni", "home-automation", "omni-link", "home-assistant"]
|
|
classifiers = [
|
|
"Development Status :: 3 - Alpha",
|
|
"Framework :: AsyncIO",
|
|
"Intended Audience :: Developers",
|
|
"License :: OSI Approved :: MIT License",
|
|
"Operating System :: OS Independent",
|
|
"Programming Language :: Python :: 3.12",
|
|
"Programming Language :: Python :: 3.13",
|
|
"Programming Language :: Python :: 3.14",
|
|
"Topic :: Home Automation",
|
|
]
|
|
dependencies = [
|
|
"cryptography>=44.0.0",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
cli = ["rich>=13.9.0", "typer>=0.15.0"]
|
|
|
|
[project.scripts]
|
|
omni-pca = "omni_pca.__main__:main"
|
|
|
|
[project.urls]
|
|
Repository = "https://git.supported.systems/warehack.ing/omni-pca"
|
|
|
|
[build-system]
|
|
requires = ["uv_build>=0.11.8,<0.12.0"]
|
|
build-backend = "uv_build"
|
|
|
|
[dependency-groups]
|
|
dev = [
|
|
"pytest>=8.3.0",
|
|
"pytest-asyncio>=0.25.0",
|
|
"pytest-cov>=6.0.0",
|
|
"ruff>=0.13.0",
|
|
"mypy>=1.18.0",
|
|
]
|
|
# Optional group for testing the HA custom_component end-to-end. Pulls in
|
|
# the full Home Assistant test harness; requires Python 3.14.2+. The repo's
|
|
# .python-version pins to 3.14 for development; install with:
|
|
# uv sync --group ha
|
|
ha = [
|
|
"pytest-homeassistant-custom-component>=0.13.330",
|
|
]
|
|
|
|
[tool.pytest.ini_options]
|
|
asyncio_mode = "auto"
|
|
testpaths = ["tests"]
|
|
addopts = ["-ra", "--strict-markers", "--strict-config"]
|
|
markers = [
|
|
"slow: tests that take more than ~1s",
|
|
"live: tests that require a real panel (skipped by default)",
|
|
]
|
|
|
|
[tool.ruff]
|
|
line-length = 100
|
|
target-version = "py312"
|
|
src = ["src", "tests", "custom_components"]
|
|
|
|
[tool.ruff.lint]
|
|
select = [
|
|
"E", "F", "W",
|
|
"I", "N", "UP", "B", "A", "C4", "PT", "SIM", "RUF",
|
|
]
|
|
ignore = ["E501"]
|
|
|
|
[tool.ruff.lint.per-file-ignores]
|
|
"tests/*" = ["N802", "N803", "PT011"]
|
|
|
|
[tool.mypy]
|
|
python_version = "3.12"
|
|
strict = true
|
|
warn_unused_configs = true
|
|
warn_redundant_casts = true
|
|
warn_unused_ignores = true
|
|
disallow_untyped_defs = true
|
|
no_implicit_reexport = true
|