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 License: MIT

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

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
  • Production Ready: 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.1.tar.gz (28.1 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.1-py3-none-any.whl (30.1 kB view details)

Uploaded Python 3

File details

Details for the file pyintellicenter-0.0.1.tar.gz.

File metadata

  • Download URL: pyintellicenter-0.0.1.tar.gz
  • Upload date:
  • Size: 28.1 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.1.tar.gz
Algorithm Hash digest
SHA256 15ca34e3a9742817131444ee1d017c480753448df998109ab7f505365b202beb
MD5 ed0cb48d0590a7767138d9b31eaca33d
BLAKE2b-256 cf2b8bd4848dbb2d2badd70f3c018e824d500d005f57acd2410b8638dedd5446

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyintellicenter-0.0.1.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.1-py3-none-any.whl.

File metadata

File hashes

Hashes for pyintellicenter-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 9270d98a947a5d89b3611958fab5e86788b994d0c9b6e129ea653bbdee224392
MD5 29e36b38b4e72b924369355139ab6455
BLAKE2b-256 8f4abfe00f69cea578f0cb1e43423e0fc7e79da61bc5f1235c86b8546e9a3223

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyintellicenter-0.0.1-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