Python module to talk to ISY devices from UDI.
Project description
PyISY
Python library for the Universal Devices ISY-994, Polisy, and eisy controllers.
This library allows for easy interaction with ISY nodes, programs, variables, and the network module. It provides asynchronous communication and supports near real-time updates via WebSocket or SOAP event streams.
The full documentation is available at https://pyisy.readthedocs.io.
Features
- Asynchronous communication via
asyncioandaiohttp. - Support for ISY-994 (v4 and v5 firmware), Polisy, and eisy.
- Automatic updates from the device via WebSocket or SOAP.
- Interaction with nodes, groups, programs, variables, and networking modules.
- Command-line interface for quick testing and monitoring.
Installation
pip install pyisy
Quick Start
You can test the connection to your ISY directly from the command line:
python3 -m pyisy http://your-isy-url:port username password
Basic Usage
import asyncio
from pyisy import ISY
async def main():
# Connect to ISY controller
isy = ISY("192.168.1.10", 80, "admin", "password")
# Initialize the connection and download information
await isy.initialize()
# Get a node by its address
node = isy.nodes["1A 2B 3C 1"]
print(f"Node Name: {node.name}")
print(f"Node Status: {node.status}")
# Turn a node on
await node.turn_on()
# Shutdown the connection
await isy.shutdown()
if __name__ == "__main__":
asyncio.run(main())
Development
Contributions are welcome! This project uses pre-commit to ensure code quality.
Setup
# Clone the repository
git clone https://github.com/automicus/PyISY.git
cd PyISY
# Install development + test dependencies
pip install -r requirements.txt -r requirements-dev.txt -r requirements-test.txt
pip install -e .
# Install pre-commit hooks
pre-commit install
We use ruff for formatting and linting. You can run it manually:
ruff check .
ruff format .
A VSCode DevContainer is also provided for a consistent development environment.
Tests
PyISY has an offline pytest suite covering the XML parsers, connection
behavior, the full ISY.initialize() lifecycle, and the per-node /
per-program action methods used by the Home Assistant isy994
integration. The fixtures are anonymized real-controller exports —
running the suite needs no live ISY.
Please run the tests before opening a PR. They are fast (~10 s) and catch most regressions in the public API that Home Assistant Core depends on.
# Run the full suite
pytest
# Run with a coverage report
pytest --cov=pyisy --cov-report=term-missing
# Run a single file or test
pytest tests/test_nodes.py
pytest tests/test_climate_lock.py::test_set_climate_setpoint_heat_doubles_for_uom_101
The same pytest job runs in CI on Python 3.11 and 3.14 (matching the
range Home Assistant supports). The terminal coverage report is visible
in the workflow logs.
If you change parsing or status behavior, be ready to refresh snapshots:
pytest --snapshot-update
Snapshots live under tests/__snapshots__/ and are tracked in git.
Releases
Detailed change logs are available on the GitHub Releases page.
Credits
- Ryan Kraus (@rmkraus) - Creator
- Tim (@shbatm) - lead Maintainer
- Greg Laabs (@overloadut) - Maintainer
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 pyisy-3.6.1.tar.gz.
File metadata
- Download URL: pyisy-3.6.1.tar.gz
- Upload date:
- Size: 145.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d6407702e67b006de414570f576589b6681029ed6bb24f9e9004b1ae16b5c724
|
|
| MD5 |
10cfe78fee9fb9ebca9d12c20d60ff5f
|
|
| BLAKE2b-256 |
d570670cf3b25f121b1bbd20d7ae5841d0faa9fb2d0eb19f96ffecb916290fcd
|
Provenance
The following attestation bundles were made for pyisy-3.6.1.tar.gz:
Publisher:
pythonpublish.yml on automicus/PyISY
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyisy-3.6.1.tar.gz -
Subject digest:
d6407702e67b006de414570f576589b6681029ed6bb24f9e9004b1ae16b5c724 - Sigstore transparency entry: 1475046382
- Sigstore integration time:
-
Permalink:
automicus/PyISY@24b15230af03d2a4ef64a18fb6af5f0b9bc9ab66 -
Branch / Tag:
refs/tags/v3.6.1 - Owner: https://github.com/automicus
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pythonpublish.yml@24b15230af03d2a4ef64a18fb6af5f0b9bc9ab66 -
Trigger Event:
release
-
Statement type:
File details
Details for the file pyisy-3.6.1-py3-none-any.whl.
File metadata
- Download URL: pyisy-3.6.1-py3-none-any.whl
- Upload date:
- Size: 76.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ea0f209109c1aeebc30fcb2de8247d278ca3b3a2cdc97189de29c670072e2157
|
|
| MD5 |
8034802141d8311938097277ba4d97bc
|
|
| BLAKE2b-256 |
afae4db59b75bd9de03e38fe2e3d092ccdaf5c70419a7cdab2ab8e24bd991aab
|
Provenance
The following attestation bundles were made for pyisy-3.6.1-py3-none-any.whl:
Publisher:
pythonpublish.yml on automicus/PyISY
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyisy-3.6.1-py3-none-any.whl -
Subject digest:
ea0f209109c1aeebc30fcb2de8247d278ca3b3a2cdc97189de29c670072e2157 - Sigstore transparency entry: 1475046554
- Sigstore integration time:
-
Permalink:
automicus/PyISY@24b15230af03d2a4ef64a18fb6af5f0b9bc9ab66 -
Branch / Tag:
refs/tags/v3.6.1 - Owner: https://github.com/automicus
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pythonpublish.yml@24b15230af03d2a4ef64a18fb6af5f0b9bc9ab66 -
Trigger Event:
release
-
Statement type: