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

Uploaded Python 3

File details

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

File metadata

  • Download URL: pyintellicenter-0.0.5a2.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.5a2.tar.gz
Algorithm Hash digest
SHA256 515614e90fb38afd8a33e5cb65250f51c52a4b78541f212e9753da451bd01f13
MD5 94e6401ac87d3be088b3baa7b521b656
BLAKE2b-256 01cb92dd9632dbf8ea0879b92dc5dd92152d0232a3376cd58b2fdc94c2d33958

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for pyintellicenter-0.0.5a2-py3-none-any.whl
Algorithm Hash digest
SHA256 b12161034aa25e3243c96f6d6eb726a76c9a3b7ce1db42a735fc9d58391206bf
MD5 c7049e70bb19f515c5e6ba3cb10cc1f4
BLAKE2b-256 f1628964a8b92fbcee9560eb78e58bd13ab0ab9f30fb5fd6afa4b1c66c59aa75

See more details on using hashes here.

Provenance

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