Hayward AquaLogic / ProLogic automation

This looks interesting. Is the code available?

Jeff

Not yet, no… still finishing it up, and it is combined with all my other sensors/switchs. Let me see what I can do

Team, I have a Kvyeilry GLX-PCB-RITE Main Circuit Board & GLX-PCB-DSP Display Board Compatible with Hayward Goldline Aqua Rite Salt Chlorine Generators – Replacement for T-15, T-9, T-5, T-3 Salt Cells - Blue Amazon.com: Kvyeilry GLX-PCB-RITE Main Circuit Board & GLX-PCB-DSP Display Board Compatible with Hayward Goldline Aqua Rite Salt Chlorine Generators – Replacement for T-15, T-9, T-5, T-3 Salt Cells - Blue : Patio, Lawn & Garden. However I cannot see any data coming out of the RS485 pins. Is this a limitation of the board since it is NOT an OEM board.

Any advice or help would be great.

Thanks
Garry

Any updates on releasing some code?

Is there any way you can share a copy of the IOT Service installation? I've been trying to download this for some time now, and came across this post and saw you had backed one up. It's no longer available online. Thanks!

I was able to download it, but I'll put a copy on GitHub - J4yDubsHome/aqualogic: A python library to interface with a Hayward/Goldline AquaLogic/ProLogic pool controller. · GitHub

Edit: Too big for GitHub. Try this link: Download IOTService3.1.3.zip | LimeWire

Sorry, was away on vacation, and then went down the rabbit hole of turning into a full esphome component. Have not put it into GitHub yet, but do now have two months of running on it and have added the full menu support.

It's been years since I've used GitHub, so I need to get back into it or just DM me.

Sorry this took so long,
Paul

Turn-key ESPHome Solution for Hayward (and beyond) with Plug-and-Play Packages

Hi everyone,

I want to share a project I've been working on to move away from local scripts/hacks and toward a stable, central solution for pool automation. I’ve developed a platform-agnostic ESPHome component coupled with a plug-and-play package library.

For Hayward systems, should be very close to turn-key right now. Moving from a USB-serial Python setup to this native ESPHome approach drastically improved command delivery reliability for me—I haven't had a single missed button press since switching. The component precisely sends the command at a good time, so it doesn't need to repeat commands either.

The project is split into two parts:

  1. The Core Component (rs485_frame): A general, protocol-agnostic RS485 frame handler for ESPHome. It deals with the low-level bus timing and framing. It’s currently in review (ESPHome PR #16758 / Docs PR #6719).
  2. The Configuration Ecosystem (The main focus): rs485_frame-examples. This is a collection of ESPHome package-based configurations.

Why this approach?

  • Plug-and-Play YAML: The goal is to build a shared repository of known-good equipment handlers. You just select the YAML elements that match your specific pool setup—no component code changes required to add or tweak features.
  • Built-in Protocol Analysis: If your hardware variation isn't fully mapped yet, the component includes reverse-engineering helpers. It automatically analyzes bus payloads, frame timing, and serial parameters to help you map out your specific system right from the logs.

(@prockeo , this may be similar to your component which looks like it would also have relay controls. Reach out if you want to collaborate.)

Just wanted to share a ESPHome component that I've been running for few years now and had finally had some time to polish and share.

This is ESPHome component that is meant to talk directly to the pool automation controller. I've built a board with ESP32 + RS485 module + 12v->3.3v voltage converter and it all sits in my outside panel where pool controller is.

The component supports 2 types of button presses, toggle which uses retries and looks at specific sensor flags to ensure that action is completed (HEATER_AUTO, LIGHTS) and send which just fires event once but without guarantees (MENU/LEFT/RIGHT)

I do not run HA, but have been using this with OpenHab thru MQTT.

This probably does not handle every single system out there as I was focusing on my own use case and also shout out to Sean Wilson for the original python library that I tried to get working few years back but wanted something more integrated, most of the protocol is taken/based from his code.

This looks great but I don't see an option to set P4 vs P8. Do you know what model you are using?

I am using PS4 controller, and its connected to the same header on the board as Hayward VS900 pump.
I think most of the features should work by default, there is detailed logging available to help identify and add additional features.

10:58:38 [D] [aqualogicproto:384] Key Released: Key=0 Packet: 00 8c 01 00 00 00 00 00 00 00 00 00
10:58:39 [D] [aqualogicproto:278] Display Update Line1(Pool Temp 79_F) Line2()
10:58:41 [D] [aqualogicproto:393] Unknown Frame: 04 07
10:58:41 [D] [aqualogicproto:393] Unknown Frame: 00 04 02
10:58:41 [D] [aqualogicproto:393] Unknown Frame: 04 a0
10:58:41 [D] [aqualogicproto:393] Unknown Frame: 00 04 30 33 30 30 20
10:58:41 [D] [aqualogicproto:278] Display Update Line1(Pool Temp 80_F) Line2()
10:58:41 [D] [aqualogicproto:393] Unknown Frame: 04 ae
10:58:41 [D] [aqualogicproto:393] Unknown Frame: 00 04 77 6c
10:58:41 [D] [aqualogicproto:278] Display Update Line1(Pool Temp 79_F) Line2()
10:58:43 [D] [aqualogicproto:278] Display Update Line1(Pool Temp 80_F) Line2()
10:58:44 [D] [aqualogicproto:278] Display Update Line1(Air Temp 81_F) Line2()
10:58:50 [D] [aqualogicproto:278] Display Update Line1(Pool Chlorinator) Line2(25%)
10:58:56 [D] [aqualogicproto:278] Display Update Line1(Salt Level) Line2(2200 PPM)
10:58:57 [D] [aqualogicproto:373] Key Event: Key1=0 Key2=0 Packet: 00 8c 01 00 00 00 00 00 00 00 00 00
10:58:58 [D] [aqualogicproto:384] Key Released: Key=0 Packet: 00 8c 01 00 00 00 00 00 00 00 00 00
10:59:02 [D] [aqualogicproto:278] Display Update Line1(Gas Heater) Line2(Auto Control)
10:59:08 [D] [aqualogicproto:278] Display Update Line1(Filter Pump Speed) Line2(65% Gas Heater)
10:59:11 [D] [aqualogicproto:393] Unknown Frame: 04 07
10:59:11 [D] [aqualogicproto:393] Unknown Frame: 00 04 02
10:59:11 [D] [aqualogicproto:393] Unknown Frame: 04 a0
10:59:11 [D] [aqualogicproto:393] Unknown Frame: 00 04 30 33 30 30 20
10:59:11 [D] [aqualogicproto:393] Unknown Frame: 04 ae
10:59:11 [D] [aqualogicproto:393] Unknown Frame: 00 04 77 6c
10:59:14 [D] [aqualogicproto:278] Display Update Line1(Friday) Line2(10:59A)

@AndreiR ,It seems you're needing retries and possibly seeing "without guarantees" problems. There's a precise timing window in which to send commands, and the buffering/delays of the IO, USB, etc makes this hard with the python library. The ESPHome-based solutions should be able to avoid retry and failed sends almost entirely: I do not believe I've ever had a failed send and never retry. I'd love it if you took a look at my ESPHome implementation to see if it works for your system, but am not sure of the details of how you tie to MQTT. Or you can try to see how I managed the timing of sending messages after the keep-alive.

@blulite , I believe my implementation should work as well. It's written in a way that we should be able to customize it to your system without changing the ESPHome component - but instead all in your device yaml.

@b3nj1 : Absolutely agree, that is one of the reason that I've re-written everything in C++ and have it run right next to the pool controller. During development I've debugged signals with oscilloscope and have confirmed that my code usually responds with queued command in less than 10ms after keep alive packet. You still need retries, because you are not guaranteed to be the only party on the line. My pump periodically sends status updates and I've seen times that both pump and my module send commands/responses at the same time - leading to retry, and the more devices you have sharing the bus, the more of these will happen.

That's interesting. I also have a VSP pump, and again, as far as I can tell, I don't have collisions. My ESPHome component has a sniffer mode where it collects stats. My VSP reports out at 28-33ms after the keep alive frame, so it's always avoided. It's 0C01 here, and 'd-ref' is to the time from last keep-alive. In theory, you can flash my sniffer mode and see what you get. I'd actually really appreciate it :smiley:

FWIW, my ESP is about 20 feet of cable from my controller (will improve that soon).

[20:56:10.952][I][rs485_frame.stats:210]: RS485 sniffer stats over 30002 ms (sorted by count):
[20:56:10.953][I][rs485_frame.stats:215]:   type  cnt    d-ref(min/med/max)    d-same(min/med/max)   payloads
[20:56:10.953][I][rs485_frame.stats:242]:   0101   301        -     -     -       59   100   134   1 unique
[20:56:10.953][I][rs485_frame.stats:242]:   0C01    15       28    31    33     1996  2000  2020   1 unique
[20:56:10.953][I][rs485_frame.stats:242]:   000C    15       37    37    38     1999  2000  2016   1 unique
[20:56:10.953][I][rs485_frame.stats:242]:   040A    15       81    82    86     1995  2000  2017   1 unique
[20:56:10.953][I][rs485_frame.stats:242]:   0102    15       90    90    95     1995  2000  2016   1 unique
[20:56:10.953][I][rs485_frame.stats:242]:   0103    15      119   119   120     1999  2000  2017   1 unique
[20:56:10.953][I][rs485_frame.stats:242]:   0004     3       34    35    36       98   103   103   3 unique
[20:56:10.953][I][rs485_frame.stats:242]:   0407     1       33    33    33        -     -     -   1 unique
[20:56:10.953][I][rs485_frame.stats:242]:   04A0     1       32    32    32        -     -     -   1 unique
[20:56:10.953][I][rs485_frame.stats:242]:   04AE     1       28    28    28        -     -     -   1 unique
[20:56:10.953][I][rs485_frame.stats:275]:   0101 payloads:
[20:56:10.953][I][rs485_frame.stats:286]:       301 @ 01 01 00 14  |....|
[20:56:10.953][I][rs485_frame.stats:275]:   0C01 payloads:
[20:56:10.953][I][rs485_frame.stats:286]:        15 @ 0C 01 00 00 00 1F  |......|
[20:56:10.953][I][rs485_frame.stats:275]:   000C payloads:
[20:56:10.953][I][rs485_frame.stats:286]:        15 @ 00 0C 00 00 00 00 00 00 1E  |.........|
[20:56:10.954][I][rs485_frame.stats:275]:   040A payloads:
[20:56:10.954][I][rs485_frame.stats:286]:        15 @ 04 0A 83 00 02 08 00 00 00 00 00 00 00 03 20 20 20 20 20 20 53 65 74 74 69 6E 67 73 20 20 20 20  |..............      Settings    |
[20:56:10.954][I][rs485_frame.stats:275]:   0102 payloads:
[20:56:10.954][I][rs485_frame.stats:286]:        15 @ 01 02 08 00 00 00 00 00 00 00 00 1D  |............|
[20:56:10.954][I][rs485_frame.stats:275]:   0103 payloads:
[20:56:10.954][I][rs485_frame.stats:286]:        15 @ 01 03 20 20 20 20 20 20 53 65 74 74 69 6E 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4D 65  |..      Settings              Me|
[20:56:10.954][I][rs485_frame.stats:275]:   0004 payloads:
[20:56:10.954][I][rs485_frame.stats:286]:         1 @ 00 04 02 00 18  |.....|
[20:56:10.954][I][rs485_frame.stats:286]:         1 @ 00 04 30 33 30 30 20 00 F9  |..0300 .y|
[20:56:10.954][I][rs485_frame.stats:286]:         1 @ 00 04 CC 6D 01 4F  |..Lm.O|
[20:56:10.954][I][rs485_frame.stats:275]:   0407 payloads:
[20:56:10.954][I][rs485_frame.stats:286]:         1 @ 04 07 00 1D  |....|
[20:56:10.954][I][rs485_frame.stats:275]:   04A0 payloads:
[20:56:10.954][I][rs485_frame.stats:286]:         1 @ 04 A0 00 B6  |. .6|
[20:56:10.956][I][rs485_frame.stats:275]:   04AE payloads:
[20:56:10.956][I][rs485_frame.stats:286]:         1 @ 04 AE 00 C4  |...D|

Is there any way you can share a copy of the IOT Service installation? I've been trying to download this for some time now, and came across this post and saw you had backed one up. It's no longer available online. Thanks!

Hi all. I have an Aquaconnect (Home Connect) remote system and it works great but I would like to add this functionality to my HA. I purchased a USR-TCP-485 module from Amazon. Hooked it up and I can see the status of the pool which is great however I cannot get any of the switches to work. When I click on the Switch to turn the filter off, the state remains ON. I have a Prologic 4 board so not sure if the Omnilogic HA integration allows me to change the state of the switches. Any guidance would be greatly appreciated. Attached are the items I have along with a screenshot of the RS485 web interface - it shows its connected to HA (10.0.1.10). I would like to be able to control the pool, not just view current status. Thanks.

Does anyone have the old firmware for the EW11? The new version doesn’t support scripting or setting the gap down to 2.

Try this link to download the IOT Service.

Surprising to hear that they would remove scripting. That was was of the key supported features they listed. I looked around, but it doesn’t look like I’ve ever updated the firmware.

Apparently it is a change after 1.44. But finding an old version is becoming a problem. I have emailed support to see if they can send one. Timings aren’t good enough to trigger the Aqua Plus. But return status is perfect.