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.5a4.tar.gz (28.9 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.5a4-py3-none-any.whl (35.6 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: pyintellicenter-0.0.5a4.tar.gz
  • Upload date:
  • Size: 28.9 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.5a4.tar.gz
Algorithm Hash digest
SHA256 9ea1338db5db657fc9bd95fe2be2823ae17f21d561899590a92681781945b201
MD5 802d31f72c12130deda4edff503896c8
BLAKE2b-256 15c04b7266a5abb8453db93fea34ae687a4e0ff927064d004e2ef59165661fa8

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pyintellicenter-0.0.5a4-py3-none-any.whl
Algorithm Hash digest
SHA256 3193bf7e2214b66e4fdc54372f33d3918ebe90174f55f96629a94002a16ce8a2
MD5 1b8a2b5355429e7bcb823974a680c793
BLAKE2b-256 a1810f032cd6a8c51daed2307ae29db0329a18ecfe6ecd70f3e683d8e77a919a

See more details on using hashes here.

Provenance

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