Release 2026.5.11: v1-over-UDP + HA integration
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.
This commit is contained in:
parent
abf96601e8
commit
259c46e558
19
README.md
19
README.md
@ -53,6 +53,25 @@ asyncio.run(main())
|
||||
|
||||
For the panel walkthrough — connect, list zones, react to push events — see the [tutorial](https://hai-omni-pro-ii.warehack.ing/tutorials/first-script/).
|
||||
|
||||
## Two wire dialects — TCP/v2 vs UDP/v1
|
||||
|
||||
The Omni network module is configurable at the panel keypad to listen on **TCP, UDP, or both**. Each transport speaks a different wire dialect — `OmniClient` above handles the TCP path (OmniLink2, the modern wire format used by PC Access ≥ 3); panels configured UDP-only fall back to the legacy v1 protocol with typed `RequestZoneStatus` / `RequestUnitStatus` opcodes, no `RequestProperties`, and streaming name downloads. For those, use [`OmniClientV1`](https://hai-omni-pro-ii.warehack.ing/reference/library-api/#v1-udp-omniclientv1) from the `omni_pca.v1` subpackage:
|
||||
|
||||
```python
|
||||
from omni_pca.v1 import OmniClientV1
|
||||
|
||||
async with OmniClientV1(
|
||||
host="192.168.1.9",
|
||||
controller_key=bytes.fromhex("..."),
|
||||
) as panel:
|
||||
info = await panel.get_system_information() # same dataclass as v2
|
||||
names = await panel.list_all_names() # streaming UploadNames
|
||||
zones = await panel.get_zone_status(1, 16) # typed status by range
|
||||
await panel.execute_security_command(area=1, mode=SecurityMode.AWAY, code=1234)
|
||||
```
|
||||
|
||||
The HA integration picks the right client automatically based on the **Transport** dropdown in the config flow (TCP vs UDP). See [zone & unit numbering](https://hai-omni-pro-ii.warehack.ing/explanation/zone-unit-numbering/) for why v1 panels need the long-form `RequestUnitStatus` for unit indices > 255.
|
||||
|
||||
## Quick start (Home Assistant)
|
||||
|
||||
```bash
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
{
|
||||
"domain": "omni_pca",
|
||||
"name": "HAI/Leviton Omni Panel",
|
||||
"version": "2026.5.10",
|
||||
"version": "2026.5.11",
|
||||
"iot_class": "local_push",
|
||||
"config_flow": true,
|
||||
"dependencies": [],
|
||||
"codeowners": ["@rsp2k"],
|
||||
"requirements": ["omni-pca==2026.5.10"],
|
||||
"requirements": ["omni-pca==2026.5.11"],
|
||||
"documentation": "https://git.supported.systems/warehack.ing/omni-pca",
|
||||
"issue_tracker": "https://git.supported.systems/warehack.ing/omni-pca/issues",
|
||||
"integration_type": "hub"
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
[project]
|
||||
name = "omni-pca"
|
||||
version = "2026.5.10"
|
||||
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" }
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user