Hi all,
With my 2020 Pentair Intelliconnect recently having died, I declined the pool store’s alternative due to the cost (2.3k dollars for something that’s basically quite basic).
I have already done some work on integrating my pool heater into HA (see: How I added a Hayward solar pool control to HA via ESPhome) so that got me thinking it must be possible to do better this time around.
I saw some other projects out there like OpnPool, raspipool and some others however I wanted it tailored for my setup. And bragging rights for doing it myself, as well, I guess ![]()
I’ve found quite a bit of useful info on the Pentair RS485 protocol and, luckily, found some ready-to-use code out there for controlling the pump (more on that below).
The pool kit I have and wanted to integrate:
- Pentair Intelliflo VSP
- Pentair iChlor 30
- Valve actuator to push water to the solar heating panels (to replace the Hayward controller)
- Valve actuator for the waterfall water feature
- Pentair pool light
The functionalities I wanted:
- Able to run without depending on Home Assistant:
- all configuration to be done on the ESP via webserver
- all automations to run on the ESP
- All sensors & settings are exposed to Home Assistant and can be altered there
- Ability to select the pump program (set locally on the pump, eg 1000 RPM or 47 GPM) at any time (during or outside of a schedule)
- Run the pump in line with 2 time based schedules, each with their respective program
- Switch on the power for the chlorinator based on pump status (should only be powered when pump is running)
- Set pool heating target temperature
- Monitor the pool & roof temperature, open the valve to start heating the water (if temps are fine) and change the pump program to ensure sufficient flow to the panels.
- Freeze protection to run the pump if temperature goes below a modifiable threshold and other schedules should overrule the freeze protect mode
- Ability to define if chlorinator should be on or off during freeze protect
- Switch on the waterfall based on a time based schedule
- Ability to switch on the light
- Ability to fully disable any components on an individual basis (e.g. in case chlorinator is broken or solar heating is leaking)
What equipment I purchased:
- 1 x Waveshare 6-channel ESP32-S3 relay module (38 USD) – reason for this board:
- 6 relays – perfect for my setup
- Integrated RS-485
- External wifi antenna connector
- Plenty of extra GPIO pins
- 1 x ADS1115 (I2C ADC) (5 USD) – chosen over onboard ADCs for precision purposes – I soldered this to a small separate board to accommodate the 10Kohm resistors and some terminals for the wires
- 1 x Switchbot BLE outdoor thermometer (13 USD) – for outdoor temperature reading to enable freeze protect of the pump
- 1 x RS485 to TTL (5 USD) – currently unused (more on that later)
- 2 x 240VAC to 24VAC transformers (34 USD) – to power the actuators (probably could have gotten by with 1 but wanted ample power for them) -
- 1 x 24VAC to 5VDC transformer (21 USD) – to provide 5 V for the board
- 1 x RF coaxial antenna extension cable (3.25 USD)
I repurposed the outdoor case from the Pentair Intelliconnect so that one was free (kind of) and I still had some power switches (so used 2 of those to switch both phases of the 240V).
This is what it looks like:
The code:
- The base configuration for this board already exists in the ESPHome devices documentation (see WAVESHARE-6CH-RELAY | devices.esphome.io)
- The Pentair Intelliflo component from Nicostrown’s github (GitHub - nicostrown/ESPHome-Pentair-Intelliflo)
I then wrote scripts that are run through every 2 seconds:
- The “pump schedule check” verifies if current time is within any of the schedules and, if so, switches on pump and / or changes pump program
- The “pump program check” verifies if any changes were done to pump programs and if a change was done in the currently running schedule, then update immediately
- The “ichlor on / off script” checks if the pump has been running or stopped for a modifiable period of time (delay) and switches the power relays on or off
- The “waterfall open / close” script verifes if the current time is within the waterfall schedule and, if so, opens the waterfall valve
- The “pool heating check” script verifies if the temperature of the roof is greater than the pool (plus a differential to not start heating if the roof is only marginally hotter than the pool) and, if so, opens the heating valve and adjusts the pump program to an appropriate setting (based on GPM)
- The “freeze protect check” script is run only when the pump is idle and verifies if the outside temperature is below a modifiable minimum and, if so, runs the pump at a low RPM to prevent the pipes from freezing (I’m in Florida so this is only an issue a few days a year).
Then this is the final yaml with all the above combined:
This is what it looks like in Home Assistant
(note: iChlor override is temporary to prevent the device from being powered on/off through the script because currently the RS485 cable is bridged with the pump cable so the iChlor can monitor if the pump is running or not and doesn’t produce chlorine when it isn’t)
TO DO
- Fully integrate with the iChlor so I can set the output percentage → while I’ve found some code for this - see: GitHub - wolfson292/intellichlor: Intellichlor ESPHome Custom Component - I’m currently not able to make this work. The ESP simply reboots after 1 minute of uptime. Could use some help here

- Add a screen inside the box to interact with the ESP without going through the webserver












