Hayward AquaLogic / ProLogic automation

I’m not sure what it might be then. It’s sending the code for LeftRight (05), so it should unlock after a few seconds.

I know I shouldn’t have, but I upgraded HA yesterday, and since then the aqualogic_p4p8 component doesn’t work, all entities are unknown. Am I the only one with this issue?

Edit: I reverted back to 2025.6.3, restarted the EW11 and it works again

Edit2: went back to the 2025.8.0 container, and it now works. Go figure, maybe all I needed was a reboot of the EW11

I don’t normally upgrade to the .0 releases. I wait until .1 or .2. I’m on vacation next week, so I put all updates on hold until I’m back.

Glad you got it working again. Did you get any error messages in the log when it didn’t work?

I installed this yesterday and have an issue with the switches, any troubleshooting tips?

I setup the EW11 with the script, tested it with the remote emulator app. Sensors and switches work correctly.

I installed J4yDubs’ home assistant code and set it up. Sensors work properly but switches do nothing. I believe my system is a P4 . Any ideas?

The App and the Home Assistant code both work in the same way, so if the App is working, HA should work as well. are you seeing any errors in the log? try turning on the debugging and see if there’s anything in the logs that might be an issue.

Put this in your configuration.yaml

logger:
  default: warning
  logs:
    custom_components.aqualogic_p4p8: debug

Thanks for the tip! It was user error. I checked through the logs, noticed some “Unknown frame” logs and thought I should try P8. Turns out my system is P8. Everything works now! What is the difference between P4 and P8? The door on my cabinet calls my system a Hayward ECOMMAND 4.

Also, thoughts on making the repo compatible with HACS? Seems like it would only take some minor restructuring? I’m new to home assistant and pools but have software experience.

The main difference is the number of relays available. The p4 has 4 and the PS8 has 8. The commands are similar, but the PS8 has a couple extra bits. I haven’t heard of the Ecommand 4, but it good to know it works like a PS8.

I thought about adding it to HACS, but I just don’t have time to make the changes. First thing I’d do before that is move the config out of configuration.yaml and create a UI for it. I’d also change some of the switches to buttons. Then work on the changes needed for HACS. Anyone is more than welcome to do it. I don’t know when/if I’ll get it to.

Since the AquaLogic code is already a standard integration for Home Assistant, I’d lean towards the standard code being brought current and – as J4yDubs mentions – made configurable through the UI, rather than added to HACS.

Though, given in how many directions the original code has forked, I suspect it would be a significant effort to gather all the worthwhile updates into a single code line.

I wish I had the ability to do so.

Good to know!

Also, my EW11 has been installed for 2 days now and both days when I check the status in the morning, it has gone offline (not on my Wi-Fi network and not broadcasting its own). Yesterday, I fixed this by unplugging and re-plugging the ethernet to RS-485 cable to reboot it and it started working again. Did I get a bad EW11 or is this a configuration mistake?

When it is in this error state, both the green and yellow LEDs are flashing every ~0.3s in unison.
When it is working, the yellow LED flashes 5 times while the green LED stays on, then they turn off together and the cycle repeats.

I read the manual here EW11 - Google Drive

Looks like mine may be on the edge of my Wi-Fi network and be getting disconnected when the conditions are right. I bet mounting the antenna outside the pool controller box will boost the signal enough to not have this issue.

Is there a configuration option for it to automatically reconnect to Wi-Fi? I’m not seeing one.

If I can get some free time, I’ll take a look at cleaning things up. May be months from now.

The current integration for Pool and Spa is a bit awkward. My system has Pool, Spa, and Spillover. Toggling the “pool” switch actually loops through these 3 states. I have a card that shows it correctly by reading from the pool and spa states to show which of the 3 states the system is in.

That’s what I did with mine. I got a cable and mounted the antenna outside the box. Works well. I tried a different antenna (higher gain), but the supplied antenna worked better, so i returned the new one.

I moved where the antenna is in the box and so far no disconnects! If I have another disconnect, I’ll buy a cable and run it out of the box. Has your antenna stood up fine to UV/weather exposure?

I have not implemented the serial control (yet) but I do have an Aqua Connect controller. I have the following custom control that basically scrapes the web page presented by the Aqua Connect controller and presents switches and data to control my pool. I don’t have direct speed control but I can turn the filter pump and sweep on and off, monitor temperatures, and salt levels.

Add your IP address in two locations and should work.

# Aqua Connect Pool Control
sensor:
- platform: rest
  name: pool_panel
  unique_id: pool_panel_config
  resource: http://[YOUR IP ADDRESS]/WNewSt.htm
  scan_interval: 5
  value_template: "{{ value | regex_findall(' *(.*[^ ]) *xxx') | join(' ') }}"
- platform: template
  sensors:
    pool_temperature:
      friendly_name: "Pool Water Temperature"
      unique_id: pool_panel_water_temp
      attribute_templates:
        minute_last_updated: >-
          {% set panel = states('sensor.pool_panel') %}
          {% if panel not in ['unknown','unavailable'] and panel is search('(Pool|Spa) Temp') %}
            {{ now().minute }}
          {% else %}
            {{ state_attr('sensor.pool_temperature', 'minute_last_updated') }}
          {% endif %}
      availability_template: >-
        {% if now().minute - state_attr('sensor.pool_temperature', 'minute_last_updated') < 10 %} true {% else %} false {% endif %}
      value_template: >-
        {% set panel = states('sensor.pool_panel') %}
        {% if panel not in ['unknown','unavailable'] and panel is search('(Pool|Spa) Temp') %}
          {% set match = panel | regex_findall_index(' Temp +(\d+)', ignorecase=false) %}
          {% if match is not none %}
            {{ match | float }}
          {% else %}
          {% endif %}
        {% else %}
          {% set prev = states('sensor.pool_temperature') %}
          {% if prev not in ['unknown','unavailable'] %}
            {{ prev | float }}
          {% else %}
          {% endif %}
        {% endif %}
      device_class: temperature
      unit_of_measurement: "°F"

    air_temperature:
      friendly_name: "Pool Air Temperature"
      unique_id: pool_panel_air_temp
      value_template: >-
        {% set panel = states('sensor.pool_panel') %}
        {% if panel not in ['unknown','unavailable'] and panel is search('Air Temp') %}
          {% set match = panel | regex_findall_index('Air Temp +(\d+)', ignorecase=false) %}
          {% if match is not none %}
            {{ match | float }}
          {% else %}
            unknown
          {% endif %}
        {% else %}
          {% set prev = states('sensor.air_temperature') %}
          {% if prev not in ['unknown','unavailable'] %}
            {{ prev | float }}
          {% else %}
            unknown
          {% endif %}
        {% endif %}
      device_class: temperature
      unit_of_measurement: "°F"

    salt_level:
      friendly_name: "Pool Salt Level"
      unique_id: pool_panel_salt_level
      value_template: >-
        {% set panel = states('sensor.pool_panel') %}
        {% if panel not in ['unknown','unavailable', none] and panel is search('Salt Level') %}
          {% set match = panel | regex_findall_index('Salt Level +(\d+)', ignorecase=false) %}
          {% if match is not none %}
            {{ match | float }}
          {% else %}
            unknown
          {% endif %}
        {% else %}
          {% set prev = states('sensor.salt_level') %}
          {% if prev not in ['unknown','unavailable', none] %}
            {{ prev | float }}
          {% else %}
            unknown
          {% endif %}
        {% endif %}
      unit_of_measurement: "PPM"

switch:
  - platform: template
    switches:
      pool_aux1:
        friendly_name: "Pool Sweep"
        unique_id: pool_aux1_switch
        value_template: "{{ states('sensor.pool_panel') is search(' +....[5EUe][^ ]*$') }}"
        turn_on:
          action: "rest_command.pool_panel"
          data:
            KeyId: "0A"
        turn_off:
          action: "rest_command.pool_panel"
          data:
            KeyId: "0A"
      pool_filter:
        friendly_name: "Pool Filter"
        unique_id: pool_filter_switch
        value_template: "{{ states('sensor.pool_panel') is search(' +.[5EUe][^ ]*$') }}"
        turn_on:
          action: "rest_command.pool_panel"
          data:
            KeyId: "08"
        turn_off:
          action: "rest_command.pool_panel"
          data:
            KeyId: "08"
      pool_fall:
        friendly_name: "Pool Water Fall"
        unique_id: pool_valve3_switch
        value_template: "{{ states('sensor.pool_panel') is search(' +...[5EUe][^ ]*$') }}"
        turn_on:
          action: "rest_command.pool_panel"
          data:
            KeyId: "11"
        turn_off:
          action: "rest_command.pool_panel"
          data:
            KeyId: "11"
rest_command:
  pool_panel:
    url: http://[YOUR IP ADDRESS]/WNewSt.htm
    method: POST
    payload: "KeyId={{KeyId}}"

I “borrowed” this from someone else but works good for basic control.

So far, so good. It’s been out there for 2 summers. I put it in the cabinet when I winterize the pool. I figure I’ll have to replace it at some point.

1 Like

I am having some issues with my AquaLogic integration when my HA Green joins the network (after a power outage for example) before my USR-TCP232-304. In that case, my HA never connects to the USR, doing a quick reload of my YAML config (where the USR config stands) doesn’t work either. The only way for me to connect again on the USR is to do a full restart of my HA.

Anyone having the same issue or found a work around?

Thanks

I just installed this aqualogic integration and using the waveshare RS485 to Ethernet (using hardwired). This integration installed flawlessly, very nice.

One thing I would like to add, HA logs all state changes. I would recommend if using J4yDubsHome code with ‘display’ entity enabled to disable logging. The screen changes state constantly, and when the time is displayed its every 100ms to make the semi-colon blink. HA is logging every change. So just to avoid bloat I’d disable all logging. This can be done in the configuration.yaml

recorder:
  exclude:
    entities:
      - sensor.aqualogic_display
logbook:
  exclude:
    entities:
      - sensor.aqualogic_display

-N

1 Like

Good evening! Interested in how you added entities for valve 3&4. And also maybe heater_1. I’m able to control them via cli.py but stumped on getting them added as entities. I don’t have a custom config - used the core and updated with some of your recommendations to get the switches working perfectly. (Big thanks to you and Wilson for getting me there.

Hi Blakiv!
I’ve been away from this stuff long enough to forget how it all fits together.
What files do you have in your aqualogic folder?

Here’s my list:
__init__.py __pycache__ core.py keys.py manifest.json sensor.py states.py switch.py
You would need to make mods to something in your build.

Hi - been using this for a while, and I’ve got a handful of other controls/sensors I use in my pool and pool area, and currently use ESPHome to handle all of those. I recently came across this device (WaveShare ESP32-S3-ETH-8DI-8RO). It has everything I need/want and an rs485 interface. I was wondering if anyone has looked at providing the Aqualogic component as an ESPHome component? Seems like it would solve latency issues completely, as the logic would run entirely on the esp32 controller, and HA integration would be simple, and would allow (in my use case) integration with other functions on one controller.

Just a thought…

1 Like

In case anyone is interested. I was able to do this with esphome using the Waveshare’s rs485 interface. I wrote all new code in cpp as lambda functions, and it works great! It’s local to the device, directly attached to the Hayward controller. No more rs485 to ethernet conversion. No delays, and great control. I have not written all the functions, just the ones I needed for my integration needs - All the status info, Pump controls, polaris controls, and lights. Gonna add more if I need more.
Adding a snapshot here of the available info from my pool controller. There are a lot more things on this device, but you can see all the Hayward stuff in the mix.