Skip to main content

Python library for Pentair IntelliCenter pool control systems

Reason this release was yanked:

Pre-release, use v0.1.0 or later

Project description

pyintellicenter

PyPI version Python Versions Tests License: MIT

Python library for communicating with Pentair IntelliCenter pool control systems over local network.

⚠️ Alpha Release: This library is in early development. API may change between versions.

Features

  • Local Communication: Direct TCP connection to IntelliCenter (no cloud required)
  • Real-time Updates: Push-based notifications via NotifyList protocol
  • Async/Await: Built on Python asyncio for efficient I/O
  • Type Annotations: Full type hints for IDE support and static analysis
  • Robust Connection Handling: Automatic reconnection with exponential backoff
  • Resilient: Circuit breaker pattern, connection metrics, comprehensive error handling

Installation

pip install pyintellicenter

Or install from GitHub:

pip install git+https://github.com/joyfulhouse/pyintellicenter.git

Requirements

  • Python 3.11+
  • Pentair IntelliCenter controller (i5P, i7P, i9P, or i10P)
  • Local network access to IntelliCenter (TCP port 6681)

Quick Start

import asyncio
from pyintellicenter import ModelController, PoolModel, ConnectionHandler

async def main():
    # Create a model to hold equipment state
    model = PoolModel()

    # Create controller connected to your IntelliCenter
    controller = ModelController("192.168.1.100", model)

    # Use ConnectionHandler for automatic reconnection
    handler = ConnectionHandler(controller)
    await handler.start()

    # Access system information
    print(f"Connected to: {controller.systemInfo.propName}")
    print(f"Software version: {controller.systemInfo.swVersion}")

    # List all equipment
    for obj in model:
        print(f"{obj.sname} ({obj.objtype}): {obj.status}")

    # Control equipment
    pool = model.getByType("BODY", "POOL")[0]
    controller.requestChanges(pool.objnam, {"STATUS": "ON"})

asyncio.run(main())

Architecture

The library is organized in layers:

Protocol Layer (protocol.py)

  • ICProtocol: Low-level asyncio protocol handling TCP communication
  • JSON message framing (messages terminated with \r\n)
  • Flow control (one request at a time)
  • Keepalive queries for connection health

Controller Layer (controller.py)

  • BaseController: Basic connection and command handling
  • ModelController: State management with PoolModel
  • ConnectionHandler: Automatic reconnection with exponential backoff
  • SystemInfo: System metadata (version, units, unique ID)
  • ConnectionMetrics: Request/response statistics

Model Layer (model.py)

  • PoolModel: Collection of pool equipment objects
  • PoolObject: Individual equipment item (pump, light, heater, etc.)

Attributes (attributes.py)

  • Type and attribute constants for all equipment types
  • BODY_TYPE, PUMP_TYPE, CIRCUIT_TYPE, etc.
  • STATUS_ATTR, SNAME_ATTR, OBJTYP_ATTR, etc.

API Reference

ModelController

controller = ModelController(
    host="192.168.1.100",  # IntelliCenter IP address
    model=PoolModel(),     # Model to populate
    port=6681,             # TCP port (default: 6681)
    keepalive_interval=90, # Keepalive query interval in seconds
)

# Start connection and populate model
await controller.start()

# Send changes to equipment
controller.requestChanges(objnam, {"STATUS": "ON"})

# Access system info
info = controller.systemInfo
print(info.propName, info.swVersion, info.usesMetric)

ConnectionHandler

handler = ConnectionHandler(
    controller,
    timeBetweenReconnects=30,    # Initial reconnect delay (seconds)
    disconnectDebounceTime=15,   # Grace period before marking disconnected
)

# Start with automatic reconnection
await handler.start()

# Stop and cleanup
handler.stop()

PoolModel

model = PoolModel()

# Iterate all objects
for obj in model:
    print(obj.sname)

# Get by type
bodies = model.getByType("BODY")
pool = model.getByType("BODY", "POOL")[0]
pumps = model.getByType("PUMP")

# Get by object name
obj = model["POOL1"]

# Get children of an object
children = model.getChildren(panel)

PoolObject

obj = model["PUMP1"]

# Properties
obj.objnam    # Object name (e.g., "PUMP1")
obj.sname     # Friendly name (e.g., "Pool Pump")
obj.objtype   # Object type (e.g., "PUMP")
obj.subtype   # Subtype (e.g., "VSF")
obj.status    # Current status

# Check type
obj.isALight           # Is this a light?
obj.isALightShow       # Is this a light show?
obj.isFeatured         # Is this featured?
obj.supportColorEffects # Supports color effects?

# Access attributes
rpm = obj["RPM"]
power = obj["PWR"]

Equipment Types

Type Description Common Subtypes
BODY Body of water POOL, SPA
PUMP Pump SPEED, FLOW, VSF
CIRCUIT Circuit/Feature LIGHT, INTELLI, GLOW, DIMMER
HEATER Heater GENERIC, SOLAR, ULTRA
CHEM Chemistry ICHLOR, ICHEM
SENSE Sensor POOL, AIR, SOLAR
SCHED Schedule -

Connection Behavior

The library implements robust connection handling:

  1. Initial Connection: Connects and fetches system info + all equipment
  2. Keepalive: Sends lightweight queries every 90 seconds (configurable)
  3. Push Updates: Receives real-time NotifyList updates from IntelliCenter
  4. Reconnection: Exponential backoff starting at 30 seconds (configurable)
  5. Circuit Breaker: Pauses after 5 consecutive failures

Development

# Clone repository
git clone https://github.com/joyfulhouse/pyintellicenter.git
cd pyintellicenter

# Install with dev dependencies
pip install -e ".[dev]"

# Run tests
pytest

# Run linting
ruff check src tests
ruff format src tests

# Run type checking
mypy src

License

MIT License - see LICENSE for details.

Related Projects

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

pyintellicenter-0.0.5a10.tar.gz (34.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyintellicenter-0.0.5a10-py3-none-any.whl (41.1 kB view details)

Uploaded Python 3

File details

Details for the file pyintellicenter-0.0.5a10.tar.gz.

File metadata

  • Download URL: pyintellicenter-0.0.5a10.tar.gz
  • Upload date:
  • Size: 34.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pyintellicenter-0.0.5a10.tar.gz
Algorithm Hash digest
SHA256 59b19866d5b5537707443da745fc4d9e7c17d512ec25e25d74769a7910b945bf
MD5 b43a375e056b2f686d71ddfd60967d46
BLAKE2b-256 54e950fb33c1dab0a54d4eebd8433b5bd8c941d80577dade191350b91a35caa9

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyintellicenter-0.0.5a10.tar.gz:

Publisher: publish.yml on joyfulhouse/pyintellicenter

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyintellicenter-0.0.5a10-py3-none-any.whl.

File metadata

File hashes

Hashes for pyintellicenter-0.0.5a10-py3-none-any.whl
Algorithm Hash digest
SHA256 6d8a1ef71d970b73354f89e60f25c56142609ec09e0009983faf6024dfe9b317
MD5 bce57f861df8ce933bad5eb72feb4744
BLAKE2b-256 a8bc5dd892a9dbefd79364ca92a93fa121667380b73ebd564f04eb65c1e8e356

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyintellicenter-0.0.5a10-py3-none-any.whl:

Publisher: publish.yml on joyfulhouse/pyintellicenter

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page