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.5a3.tar.gz (28.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.5a3-py3-none-any.whl (35.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: pyintellicenter-0.0.5a3.tar.gz
  • Upload date:
  • Size: 28.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.5a3.tar.gz
Algorithm Hash digest
SHA256 5f9a8c8bc6d5804553b1006fd897eb2acca2b1f0afb3cbc3a605af414705c584
MD5 c389fcf230dcb333cb53365e1e4da466
BLAKE2b-256 3168b1e2346e074878b72d68034a3954775e1eb09fe2c70ac6ea5010b8f2f103

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pyintellicenter-0.0.5a3-py3-none-any.whl
Algorithm Hash digest
SHA256 44b807a417ef11d26a708f27d370c758202744b0f19d2fbe3512f773ce180060
MD5 4b3311a8392ae9a562e36ed41353421a
BLAKE2b-256 75e6cfd5a7a16b512f4f0c69c3681680afe8b187c9144cde8f40777d591a3092

See more details on using hashes here.

Provenance

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