ESPHome Pool Controller: Integration for Pentair IntelliFlo pumps, IntelliChlor chlorinators, IntelliBrite Lights, and other pool features

Hello,

I've opened an issue on the Github of the project. My setup is based on a whisperflow VS2.

I've configured the waveshare 6CH, i can see in the log that the wavesahre and the pump exchange a first packet for the status and i see that this status is reported on HA.

Unfortunately, rapidly, the pump stops and report an Serr 0 status and is totally blocked.

I suspect that the pump is not reacting well to the this frame

Sent: FF.00.FF.A5.00.60.10.01.04.02.C4.08.98.02.80 (15)

Any idea how to fix this ?

Thanks

FYI, I got the RS-485 wires working with an ESP and a RS-485 chip. Now I need to figure out how to get the other digital inputs connected to the ESP.

Has anyone run this on an Intelliflo3? I’ve been unsuccessful getting nodejspoolcontroller to ever talk to my pump once I upgraded to the the IF3.

Free Hardware Offer: Pentair IoT Module (ESP32-WROOM-32) for Reverse Engineering / ESPHome Integration

Hi everyone,

With Pentair officially discontinuing cloud support for their water softener IoT Module (Part #: 62125 / Connected XTR2), a lot of us are left with bricked connectivity on our Fleck 5800/5810/5812 XTRi valves. I purchased a $350 unit right before support was dropped, so I have a practically brand-new board sitting here that can no longer talk to the cloud.

Looking under the hood, the module is built around a standard ESP32-WROOM-32 chip. Because the hardware is standard ESP32, bringing local control (via ESPHome or custom firmware) back to this board is completely achievable. My goal is to build a custom front-end app so water softener owners are no longer tied to dead manufacturer clouds.

The Offer:

I am more than happy to ship this IoT module for free (I’ll cover shipping) to an experienced hardware reverse engineer or ESPHome developer who is willing to:

  • Sniff/document the local UART/serial communication protocol between the 62125 module and the XTRi timer board.
  • Dump/analyze the existing firmware or map out the pinout/GPIO connections.
  • Document the endpoints/payloads so we can create a native ESPHome component or custom local integration.

If you have already worked on this board, sniffed the protocol, or are interested in taking on the hardware to reverse engineer it, please reply here or send me a DM!

Or maybe one of you guys who has already worked on Pool projects involving the ESP32 already covers most of what i need and so i just need a link to that project?

Ever get this sorted?

Were you able to get communication from the pump? For the life of me I can’t get the pump to respond. I can see the Tx and logs show the send, but nothing ever comes back.

Update on my end. I got the Whisperflo pump to work with an ESP and RS485 module, but it had to keep looping and sending speed commands. It wasn’t a very robust solution. With the ESP32-S3-Relay-6CH I was able to use all of the wires from the Whisperflo control cable and it can now just set one of the configured speeds without looping and repeatedly sending speed commands.

I can publish my esphome fw if anyone’s interested.

The wiring is a bit deceiving in some of the pictures.
CH1: black(red from control cable)/white
CH2: black(red from control cable)/blue
CH3: black(red from control cable)/orange
CH4: black(red from control cable)/brown
RS485: yellow/A, green/B



Another IntelliFlo3/Pro3 data point — TX works, zero RX, ever

@El_Duderino (post 25) and @PatHush (post 28) — I’m in exactly your position, so here’s a fully documented third case in the hope it helps narrow this down.

Short version: IntelliPro3 VSF, Waveshare ESP32-S3-Relay-6CH, pentair_if_ic. Frames transmit perfectly. The pump has never returned a single byte.

Hardware / firmware

  • Pump: Pentair IntelliFlo/Pro3 VSF 1.5hp, provisioned March 2025
  • Controller SW 1.07.003 · Drive SW 1.06 · IoT SW 1.16 · Flow Table 0.06 · Comm Board HW D
  • Board: Waveshare ESP32-S3-Relay-6CH (onboard isolated RS485, auto direction — no flow_control_pin)
  • ESPHome 2026.7.4, UART GPIO17/GPIO18, 9600 8N1

Pump only — no chlorinator. I have no IntelliChlor on this bus. Takeover mode is enabled in the attached log since FreezerEagle calls it out as essential, but the result is identical with it off — I ran it both ways. (I realize that this mode may not be needed, but its a switch I could toggle, so I did.) The 10:02:50:... frames are the component’s IntelliChlor polling and are expected to go unanswered; the ones that matter are the two A5 pump requests per cycle.

Wiring

Two-conductor to DATA+ / DATA− only, per the RS-485 table in the pump manual (yellow=DATA+, green=DATA−; my cable is red/black in those positions). No ground, no +12V — same as rwlove’s confirmed-working 6CH install in post 29. I also tried A/B reversed. No change.

DMM readings across A+/B−, for whatever they’re worth

Condition At Waveshare At pump
Connected, pump running 1.88 V 1.88 V
Connected, pump unpowered 1.76 V 1.76 V
Pump disconnected 3.82 V 0.0 V

Waveshare open-circuit at 3.82V is its fail-safe bias with no load. Connecting the pump halves it to 1.88V, so the pump’s transceiver is presenting real input impedance — it’s electrically there. Identical readings at both ends prove continuity on both conductors. Positive differential (A high at idle) confirms correct polarity.

So the physical layer checks out as far as a multimeter can take it. What it can’t tell me is whether the pump ever actually transmits, or whether the board’s receiver works — for that I’d need a scope or a second RS-485 device.

What the bus actually shows

With uart: debug set to direction: BOTH, every polling cycle looks like this, and has across many sessions:

IF Sent: FF.00.FF.A5.00.60.10.07.00.01.1C (11)
>>> FF:00:FF:A5:00:60:10:07:00:01:1C
IF Sent: FF.00.FF.A5.00.60.10.04.01.00.01.1A (12)
>>> FF:00:FF:A5:00:60:10:04:01:00:01:1A

Counting the attached capture — 2m24s, five complete polling cycles: 45 frames out (>>>), 0 bytes in (<<<). Not malformed frames, not checksum errors — literally nothing inbound. The status request decodes correctly (dst 0x60 = automation address 1, src 0x10, cmd 0x07, checksum valid), so the transmit side is provably doing its job.

Everything ruled out on the pump side, in order

  1. Automation Address set to 1 in Pentair Home, saved — matches the 0x60 in the frames
  2. All programs deleted (one non-removable timed task disabled)
  3. Priming and Dry Start disabled under Advanced Settings → Priming Parameters
  4. Device removed from the Pentair Home app entirely
  5. Breaker cycled 60s

After removal the Connect LED flashes green and On/Stop shows amber/pink. Per the pump’s own labeling, magenta on Connect = automation control — it has never reached that state.

One thing I can’t close

No inbound byte has ever appeared, which means the RX path itself has never been proven alive. On this board’s auto-direction transceiver you don’t see an echo of your own TX, so “pump won’t answer” and “board can’t listen” look identical from the log. I don’t have a second RS-485 device to inject traffic and settle it. If anyone has a cheap way to prove RX on this board short of a USB-RS485 dongle, I’d take it.

Compile note for anyone on recent ESPHome

Unrelated to the above, but it cost me a while. pentair_if_ic.h unconditionally includes text_sensor.h and number.h. ESPHome only makes a core domain’s headers available if that domain appears somewhere in your config, so a pump-only YAML fails to build with:

fatal error: esphome/components/text_sensor/text_sensor.h: No such file or directory

Don’t patch the header — just declare the domains. A text_sensor: block (the pump’s program: is a real one worth having) and any number: block, even a template, resolves it. FreezerEagle’s own config declares number:, text_sensor:, and even an empty text:, which is why it builds cleanly on his end.

(New user, so I couldn’t add FreezerEagle or rwlove)

I was never able to get communication until I connected the ground from the rs485


And, I would have done that, per the install manual it says there is a ground (and +12v) connection available on the RS-485 port, but alas, my pump seems to be missing both the ground and the +12v connectors.

I only have the DATA+ and DATA- lines.

I’m just getting started with the community, so if I’m making some basic mistake, let me have it.

[Edit] - I did just connect the GND on the Waveshare RS-485 port to a shared ground w/the pump and other electronics/electric connections. Cycled both Pump Ctrl On and Off showed no change with no TX received.

Respects to all.

Wow! I am SO glad I found this. I have been using Home Assistant for about two years and ESPHome for about one year. I just recently started using this project. I have it successfully controlling my Pentair Intelliflo and Intellichlor (Intellichlor–40). I am using the same Waveshare 6 relay device as in the initial post. I do have a couple questions about things I haven’t gotten to work and about how you all are using it. Some of these may be due to me not understanding. The code for this is above and beyond anything I’ve ever written or throughly understood. I’ve been running my system off a mechanical timer for about 15 years and am now changing over to having this control.

Questions on getting the provided code to work as intended:

The first time I did this, I made many more changes. I think that is because the AI I was using for help lead me down the wrong path. I came back and can use almost everything as originally posted.

  1. I had to make changes to the external_components section of the pool-controller.yaml to get it to compile. I was getting the error: “Platform not found: ‘sensor.pentair_if_ic’.”. With the help of an AI, I changed it to:
external_components:
  - source: github://freezereagle/Pool-Controller@main
    components:
      - pentair_if_ic
      - custom_web_handler
  1. I had to comment out the custom web handler in the pool-controller.yaml file to get it to compile because I couldn’t find an index.html file to give it. Where can I get that file?

Questions on getting things to work:

  1. Some of the pump fields are not populating correctly. I get only zeros for pressure and flow rate and time remaining always shows one minute.

  2. It seems that this does not power down the chlorinator at the end of the day or when the Pump Stop button is pressed. Is that correct? Is that how you all are using it? I’m thinking of keeping the chlorinator on the mechanical timer or controlling its power with one of the relays. I assume the pump also stays on all time. Does leaving these components on all the time degrade them more rapidly?

What model is your Pentair Intelliflo? I’m still working on getting the automation via RS-485 to work.

When I owner-built my pool myself by hiring subs directly 4 years ago I was busy enough without going down this rabbit hole but thank you for doing it!. Does this control a heater? Which pump model are you using? I’d like to ditch my over-priced IntelliCenter, perhaps sell it, as I find it quirky but it is what I have right now.