Control your Pentair IntelliCenter pool system directly from Home Assistant with real-time local updates.
This integration connects your Pentair IntelliCenter pool control system to Home Assistant using a 100% local connection. No cloud services, no internet dependency - just direct communication with your IntelliCenter over your local network.
- Monitor Everything: Pool/spa temperature, pump status, chemistry levels, heater activity
- Control Your Pool: Turn on lights, adjust heater setpoints, activate circuits, run light shows
- Create Automations: Schedule spa warmups, trigger party lighting, get freeze protection alerts
- Real-time Updates: Push-based notifications for instant state changes (no polling)
- Local Connection: Direct communication on port 6681 - no cloud required, no authentication needed
- Flexible Transport: Choose between TCP or WebSocket connections based on your network setup
- Automatic Discovery: Zeroconf/mDNS discovers your IntelliCenter automatically
- Real-time Updates: Push-based notifications for instant state changes
- Reliable Connection: Automatic reconnection with exponential backoff and circuit breaker
- Highly Responsive: Optimized async architecture with intelligent request queuing
- Comprehensive Support: Pools, spas, lights, pumps, heaters, chemistry, schedules, covers
- Multi-Language: User interface available in 12 languages
- Easy Reconfiguration: Change connection settings without removing the integration
This release fixes cover semantics, heater detection, and adds firmware awareness — with major contributions from @bhamiltoncx:
- Correct Pool Cover Behavior (thanks @bhamiltoncx): the integration previously conflated a cover's enabled setting with its position. Position now comes from the panel's real position attribute (
POSIT). On older firmware that doesn't report position (e.g. IC 1.064), the cover state shows unknown and open/close report a clear error — previously these commands silently toggled the cover's enabled setting instead of moving it. (Note: v3.9.0 also hid covers whoseSTATUSreadOFF, which made some covers go permanently unavailable — corrected in a later release; see issue #107.) - Cross-Body Heater Detection (thanks @bhamiltoncx): a heater actively heating a body that isn't in its configured body list (possible on real panels) is now correctly reported as heating.
- Firmware Advisories: the integration now recognizes firmware releases with documented problems (e.g. the withdrawn 2.x line) and raises a dismissible Repairs warning — and warns during initial setup before you finish adding the integration.
- "Not in Auto" Problem Sensor: turns on when the panel is left in Service or Time Out mode (e.g. after maintenance or a power outage), which silently suspends schedules and automatic valve/pump control.
- Fully Localized: all new warnings and errors are translated into the 12 supported languages.
- Circulation Watchdog Example: new README automation example that detects a stuck valve indirectly from the pump's hydraulic signature (valve actuators have no feedback path to IntelliCenter).
This integration is built on two separate packages:
| Package | Description |
|---|---|
| pyintellicenter | Standalone Python library for IntelliCenter protocol (PyPI) |
| intellicenter | Home Assistant integration (this repository) |
The protocol layer was extracted to pyintellicenter v0.1.0+ to enable:
- Independent development and testing of the protocol library
- Reuse in other projects outside Home Assistant
- Cleaner separation of concerns
Before installing this integration, you need:
| Requirement | Details |
|---|---|
| Home Assistant | Version 2025.11 or newer |
| IntelliCenter | i5P, i7P, i9P, or i10P panel |
| Network | Local network access to IntelliCenter (TCP port 6681) |
See INSTALL.md for the complete guide.
Quick version (HACS): add this repository as a custom repository in HACS, install Pentair IntelliCenter, restart Home Assistant, then add the integration from Settings → Devices & Services.
Your IntelliCenter should be discovered automatically:
- Navigate to Settings → Devices & Services
- Look for "Pentair IntelliCenter" under Discovered
- Click Configure and confirm
If discovery doesn't work:
- Navigate to Settings → Devices & Services
- Click Add Integration (bottom right)
- Search for "Pentair IntelliCenter"
- Enter your IntelliCenter's IP address
- Select transport type (TCP recommended, WebSocket available as alternative)
Finding your IP address:
- Router's DHCP client list (look for "Pentair")
- Pentair mobile app: Settings → System Information
- IntelliCenter display panel
Tip: Assign a static IP or DHCP reservation to prevent address changes.
To change the IP address or transport type after setup:
- Navigate to Settings → Devices & Services
- Find the IntelliCenter integration
- Click the three dots (⋮) → Reconfigure
- Update the IP address and/or transport type
- The integration will reconnect with the new settings
After setup, configure connection settings:
- Settings → Devices & Services → IntelliCenter → Configure
- Available options:
- Keepalive Interval (30-300s, default 90): Connection health check frequency
- Reconnect Delay (10-120s, default 30): Initial retry delay after disconnect
| Category | Entity Type | Features |
|---|---|---|
| Pool/Spa | Switch, Sensors, Water Heater | On/off, temperature, heater control (incl. HCOMBO hybrid modes) |
| Lights | Light | On/off, color effects (IntelliBrite, MagicStream) |
| Light Shows | Light | Coordinated multi-light effects and the Color Sync action over TCP or WebSocket |
| Circuits | Switch | All "Featured" circuits (cleaner, blower, etc.) |
| Pumps | Binary Sensor, Sensors | Running status, power (W), speed (RPM), flow (GPM) |
| Chemistry | Sensors, Number | pH, ORP, tank levels, setpoints (IntelliChem) |
| Heat Pumps | Climate | UltraTemp heating/cooling with presets |
| Heaters | Binary Sensor, Water Heater | Running status; HCOMBO (UltraTemp ETi Hybrid) Gas/Heat Pump/Hybrid/Dual modes |
| Schedules | Binary Sensor | Active status (disabled by default) |
| System | Switch, Binary Sensor, Sensors | Vacation mode, freeze protection, temperatures, System Mode (auto/service/timeout), "Not in Auto" problem indicator, firmware advisories (a Repairs warning is raised for firmware with documented issues, e.g. the pulled 2.x line) |
| Covers | Cover | Pool cover position (POSIT) and open/close; availability follows the panel connection (STATUS never hides the entity); older firmware without position reporting shows unknown |
- Last Temp (
sensor, one per body, e.g. "Pool Last Temp"): the body's last recorded water temperature (LSTTMP), enabled by default. Unlike the physical Water Sensor — whose probe sits in an above-ground pipe and reads colder when the pump is off — the Last Temp value latches the last circulating temperature, so it stays accurate while the pump is idle.
Use the intellicenter.color_sync action with the complete light-group entity:
action:
- service: intellicenter.color_sync
target:
entity_id: light.pool_light_groupColor Sync is intentionally limited to the hardware-confirmed safety envelope:
firmware 1.064, one complete light group containing exactly two distinct
GloBrite members, and a uniform starting state in which both members are all off
or all on. Color Set, Color Swim, and member-position controls are not exposed.
The call is synchronous. On the observed firmware it usually takes roughly 96-97 seconds plus request latency because it waits for the physical action, a 60-second post-terminal observation, and a final controller read before returning. During that interval, other IntelliCenter object mutations requested through this Home Assistant connection fail immediately rather than queueing behind Color Sync. Read-only updates continue. Urgent control from the physical panel remains available, but changing panel state during the action can make the action report an incomplete outcome.
An explicit failure means dispatch did not begin or IntelliCenter rejected the command, so no action was confirmed. An uncertain no-response outcome means dispatch started but IntelliCenter did not respond, so the action may have run. An acknowledged or visibly started but incomplete outcome means authoritative completion could not be confirmed. For either uncertain or incomplete outcomes, inspect the lights and panel state before retrying.
automation:
- alias: "Evening Spa"
trigger:
- platform: sun
event: sunset
offset: "-00:30:00"
action:
- service: switch.turn_on
target:
entity_id: switch.spa
- service: water_heater.set_temperature
target:
entity_id: water_heater.spa
data:
temperature: 102automation:
- alias: "Pool Party Mode"
trigger:
- platform: state
entity_id: input_boolean.party_mode
to: "on"
action:
- service: light.turn_on
target:
entity_id: light.pool_light
data:
effect: "Party"automation:
- alias: "Freeze Protection Alert"
trigger:
- platform: state
entity_id: binary_sensor.freeze_protection
to: "on"
action:
- service: notify.mobile_app
data:
title: "Pool Alert"
message: "Freeze protection activated!"Valve actuators (including the IntelliValve) have no feedback path to IntelliCenter — the panel drives them blind over a 3-wire 24VAC interface, so neither IntelliCenter nor this integration can report a valve's position or mode directly. Notably, IntelliValves can come back up in SERVICE mode after a power outage and stay there until the MODE button is physically pressed, silently stopping proper circulation.
Circulation problems can still be detected indirectly through the pump's hydraulic signature: for a variable-speed pump, power follows the affinity law (watts ∝ RPM³) with a plumbing-specific constant. A valve stuck in the wrong position changes the hydraulic curve, pushing power measurably off that line.
To calibrate, note your pump's steady-state watts at each scheduled RPM and
compute watts / rpm³ (it should be nearly identical across speeds); use that
as the constant below (5.6e-8 is one real-world example).
automation:
- alias: "Pool Circulation Watchdog"
trigger:
# Pump power off its normal curve for 20 min (tolerates transients)
- platform: template
value_template: >-
{% set rpm = states('sensor.pump_rpm') | float(0) %}
{% set power = states('sensor.pump_power') | float(0) %}
{% set expected = 5.6e-8 * rpm**3 %}
{{ rpm >= 1300 and expected > 0
and (((power - expected) | abs) / expected) > 0.15 }}
for: "00:20:00"
id: hydraulic_anomaly
# Panel left in service/timeout mode (e.g. after a power outage).
# The integration also ships this as a built-in "Not in Auto" problem
# binary sensor; trigger on that entity instead if you prefer.
- platform: state
entity_id: sensor.system_mode
to:
- service
- timeout
for: "00:30:00"
id: panel_not_auto
# IntelliCenter reconnected after being unreachable
- platform: state
entity_id: sensor.system_mode
from: unavailable
for: "00:03:00"
id: reconnected
action:
- choose:
- conditions:
- condition: trigger
id: hydraulic_anomaly
sequence:
- service: notify.mobile_app
data:
title: "Pool: Possible Stuck Valve"
message: >-
Pump power has been off its normal curve for 20+ min:
{{ states('sensor.pump_power') }} W at
{{ states('sensor.pump_rpm') }} RPM. A valve may be stuck
in SERVICE mode — check the actuator MODE buttons.
- conditions:
- condition: trigger
id: panel_not_auto
sequence:
- service: notify.mobile_app
data:
title: "Pool: Panel Not in Auto"
message: >-
IntelliCenter has been in
'{{ states('sensor.system_mode') }}' mode for 30+ min.
Schedules and valves are not running automatically.
- conditions:
- condition: trigger
id: reconnected
sequence:
- service: notify.mobile_app
data:
title: "Pool: IntelliCenter Back Online"
message: >-
IntelliCenter reconnected after being unreachable — if this
was a power outage, verify the valve actuator LEDs show
AUTO (green), not SERVICE (yellow).
mode: singleNotes:
- Entity names derive from your pool objects' names; substitute your own
(e.g.
sensor.pump_rpm/sensor.pump_powercome from the pump's power/RPM sensors,sensor.system_modefrom the System Mode sensor, whose states are exactlyauto/service/timeout). - The pump doesn't need a separate "running" check —
rpm >= 1300already gates on it (an idle pump reports 0 RPM). The floor also keeps the check above the power sensor's 25 W rounding step, which at very low speeds (< ~120 W expected) would exceed the threshold on its own. - IntelliFlo VS pumps report 0 GPM (no flow meter) — power-at-RPM is the usable signal. VSF/VF owners can additionally alert on abnormal GPM.
- The 15% threshold covers a real system's observed ±2% normal spread and ~11% worst-case steady-state excursions, plus headroom; start there and widen it if you get false alarms.
- Re-calibrate the constant after plumbing changes (new salt cell, filter, heater bypass, etc.).
If your IntelliCenter is not automatically discovered:
-
Verify network connectivity
- Home Assistant and IntelliCenter must be on the same network/VLAN
- Check that mDNS/multicast traffic is not blocked by your router or firewall
- Some managed switches block multicast by default
-
Check IntelliCenter network settings
- Verify the IntelliCenter has a valid IP address
- Ensure the network cable is securely connected
- Check the IntelliCenter display for network status
-
Use manual setup
- Go to Settings → Devices & Services → Add Integration
- Search for "Pentair IntelliCenter"
- Enter the IP address manually
If the integration fails to connect:
-
Verify the IP address
- Confirm the IP address is correct in your router's DHCP client list
- Check the Pentair mobile app under Settings → System Information
-
Test network connectivity
telnet <intellicenter-ip> 6681
- If connection fails, check firewall rules
- Verify no other device is using port 6681
-
Check IntelliCenter status
- Ensure the IntelliCenter is powered on
- Verify the network cable is connected
- Check for any error indicators on the panel
-
Power cycle the IntelliCenter
- Turn off power to the IntelliCenter for 30 seconds
- Turn power back on and wait for it to fully boot
- Retry the connection
If entities show as unavailable after initial setup:
-
Check connection status
- Go to Settings → Devices & Services
- Look for the IntelliCenter integration status
- A red indicator means the connection is down
-
Review Home Assistant logs
- Go to Settings → System → Logs
- Filter for "intellicenter" to see relevant messages
- Look for connection errors or timeouts
-
Reload the integration
- Go to Settings → Devices & Services
- Click the three dots (⋮) next to IntelliCenter
- Select Reload
-
Automatic recovery
- The integration automatically reconnects with exponential backoff
- Wait a few minutes for automatic recovery
- Check the circuit breaker hasn't opened (5 consecutive failures)
-
Reload after configuration changes
- After changing pool equipment in IntelliCenter, reload the integration
- New equipment may not appear until reload
-
Unit mismatch
- If you change metric/imperial units on IntelliCenter, reload the integration
- Temperature values may be incorrect until reload
-
Equipment not supported
- Some equipment types may have limited support
- Check the Supported Equipment section above
- Open an issue on GitHub for unsupported equipment
For detailed troubleshooting, enable debug logging by adding to configuration.yaml:
logger:
default: warning
logs:
custom_components.intellicenter: debug
pyintellicenter: debugAfter adding this configuration:
- Restart Home Assistant
- Reproduce the issue
- Check logs at Settings → System → Logs
- Download full logs for bug reports
If you're still having issues:
- Check existing issues: GitHub Issues
- Open a new issue: Include debug logs and your IntelliCenter model
- Community support: GitHub Discussions
- Equipment Coverage: Tested primarily with standard configurations. Some equipment may have limited testing.
- Unit Changes: Reload integration after changing metric/imperial on IntelliCenter.
- Configuration Changes: Reload integration after significant pool configuration changes.
# Clone repositories
git clone https://github.com/joyfulhouse/intellicenter.git
git clone https://github.com/joyfulhouse/pyintellicenter.git
# Install dependencies
cd intellicenter
uv sync
# Install pyintellicenter in dev mode
uv pip install -e ../pyintellicenter
# Run tests
uv run pytest
# Lint and format
uv run ruff check --fix && uv run ruff formatSee docs/ for architecture documentation and development guidelines.
- Bug Reports: GitHub Issues
- Feature Requests: GitHub Issues
- Discussions: GitHub Discussions
This integration is built and maintained in my spare time, with real hardware and tooling costs behind every release. If it's useful to you, consider sponsoring the project or leaving a tip to help offset development and testing — it's genuinely appreciated and helps keep the project moving.
GNU GENERAL PUBLIC LICENSE v3.0 - see LICENSE file for details.
This integration meets the Platinum tier quality standards for Home Assistant integrations - the highest level achievable.
Platinum Requirements:
- Fully async architecture with optimized performance
- Comprehensive type annotations (mypy strict mode)
- Detailed code documentation throughout
- Production hardening with circuit breaker and health monitoring
Gold Requirements:
- Full translation support (12 languages)
- Easy reconfiguration through the UI
- Comprehensive automated testing (367 tests)
- Extensive user-friendly documentation
- Automatic Zeroconf discovery
Plus all Silver and Bronze tier requirements met.
This integration builds upon the excellent work of:
- @jlvaillant - Original intellicenter integration that pioneered Home Assistant support for Pentair IntelliCenter
- @dwradcliffe - Enhanced fork with connection fixes and improvements
We extend our sincere gratitude for their foundational work that made this integration possible.