PyISYoX¶
An async Python client for eisy / Polisy on IoX 6¶
PyISYoX talks to Universal Devices’ eisy and Polisy controllers
running IoX 6.0.0+. It is a JSON-first rewrite of the original
pyisy library, built around a small set of focused public types:
pyisyox.Controller— the one user-facing handle. Construct it,await controller.connect(), drive nodes throughcontroller.nodes[address].send_command(...), subscribe to WebSocket events, thenawait controller.stop().pyisyox.PortalAuth/pyisyox.LocalAuth— auth strategies. PortalAuth (JWT bearer) is the recommended default; LocalAuth (HTTP basic) exists as a feature-degraded fallback.pyisyox.Node,pyisyox.Group,pyisyox.Program,pyisyox.Variable,pyisyox.NetworkResource— runtime wrappers over the controller’s domain objects. WebSocket frames mutate their underlying records in place, so attribute reads always reflect the latest state.
Note
The original ISY-994 hardware is out of scope. It tops out at
TLS 1.1 and a much smaller REST surface; users on that hardware
should use the upstream pyisy (v3.x) library. Everything here
assumes IoX 6 on eisy or Polisy.
Quick example¶
import asyncio
from pyisyox import Controller, PortalAuth
async def main() -> None:
controller = Controller(
"https://eisy.local:443",
PortalAuth("me@example.com", "portal-password"),
)
await controller.connect()
try:
light = controller.nodes["3D 7D 87 1"]
await light.send_command("DON", 75) # 75% on
finally:
await controller.stop()
asyncio.run(main())
See Quickstart for a guided tour, Connection Flow for the wire-level connect sequence, and Event Pipeline for the WebSocket dispatcher and subscription API.
Installation¶
pip install pyisyox
Requirements: Python 3.11+ and aiohttp. No XML parser
dependencies — the narrow XML surfaces still in use (/rest/status,
/rest/nodes, command responses, WS event frames) are decoded with
xml.etree.ElementTree from the stdlib.