Hayward AquaLogic / ProLogic automation

I found the best way to have Home Assistant manage the heater is to give Home Assistant full control of the heater. Have a read through this post (of mine) above and the five that follow it.

After implementing the generic thermostat in 2022, I’ve never looked back.

If that can work for your usage, it makes voice automations simple.

Hi all - I’m finding my way back to this thread after a few years. My integration has been working really well up until a most recent upgrade to Home Assistant 2025.5.3. Curious if others here are finding the aqualogic integration failing recently

Here’s the error in my logs: Detected blocking call to import_module with args (‘custom_components.aqualogic.sensor’,)

Going to start digging, but thought I’d post to see if someone has already solved this!

I’m not seeing any errors and I’m on 2025.5.3. You can give my fork a shot. I did do a bunch of cleanup and fixing errors. Or if you find the problem in the code you have, look to see if it’s different in mine.

Thanks for the share - I was able to hack my way through it - looking at your code I think you made some potentially more elegant fixes than I did. The const imports in my sensor.py file definitely needed cleaning up (it was throwing errors attempting to use “POWER_WATT”, “TEMP_CELSIUS”, and “TEMP_FAHRENHEIT”.

Appreciate the quick response!

Would be awesome to include VSP for Spa as well.

Thanks for this stuff. Everything is working great under HA, but I cannot get the Configuration Menu to unlock. I press the menu button to get to the “Configuration Menu-Locked”, then press and release the right arrow. Nothing happens. Am I missing something?

Are you using my code base (aqualogic_p4p8)? If so, it should work. There’s special code to handle this. When the menu reads “Configuration Menu-Locked”, there’s code that looks for a right key press and then unlocks it. Which do you have, a p4 or p8? I’ve only tested it with a P4. I just tried it and it unlocked. It take a few seconds to happen though.

I am using your latest code. I’ve got a P8.

I wonder if the P8 uses a different code than the P4 then?

This is the code that is getting called:

# MOD Begin
           self._append_data(frame, self.FRAME_TYPE_LOCAL_WIRED_KEY_EVENT)
           if self._p4p8 == 'p8':
               self._append_data(frame, b'\x00\x00')
           if self._configmenu and key.value == Keys.RIGHT:
               self._append_data(frame, b'\x05\x00\x05\x00')
               self._configmenu = False
           else:
               self._append_data(frame, key.value.to_bytes(2, byteorder='little'))
               self._append_data(frame, key.value.to_bytes(2, byteorder='little'))
           if self._p4p8 == 'p8':
               self._append_data(frame, b'\x00\x00')
# MOD End

It’s basically just waiting for a Right key to be pressed and then sends self._append_data(frame, b’\x05\x00\x05\x00’). I don’t have a P8, so it’s hard to say what it’s expecting. If you turn on debugging and then do it at the keypad, it might show you the code that was sent.

The other thing to look for is that it says “Configuration Menu-Locked” on the display. That’s what the code is watching for.

                        elif parts[0] == 'Configuration' and parts[1] == 'Menu-Locked':
                            self._configmenu = True

I just tried at the keyboard. I need to hold down both the Right and Left keys to get it unlocked. Here is the output from the HA log:

e[36m2025-07-25 19:43:17.783 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274800.087: Display update: Configuration
Menu-Lockede[0m
e[36m2025-07-25 19:43:17.982 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274800.287: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:17.983 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274800.287: Local Wired Key: b'0400000004000000'e[0m
e[36m2025-07-25 19:43:18.093 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274800.397: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:18.093 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274800.398: Local Wired Key: b'0500000001000000'e[0m
e[36m2025-07-25 19:43:18.164 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274800.469: Display update: Configuration
Menu-Lockede[0m
e[36m2025-07-25 19:43:18.204 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274800.508: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:18.204 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274800.509: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:18.281 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274800.585: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:18.281 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274800.585: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:18.381 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274800.685: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:18.381 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274800.686: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:18.479 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274800.784: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:18.479 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274800.784: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:18.581 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274800.886: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:18.581 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274800.886: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:18.680 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274800.984: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:18.680 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274800.985: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:18.781 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274801.086: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:18.781 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274801.086: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:18.879 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274801.183: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:18.879 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274801.184: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:18.979 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274801.283: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:18.979 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274801.283: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:19.079 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274801.384: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:19.079 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274801.384: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:19.184 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274801.488: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:19.184 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274801.488: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:19.281 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274801.585: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:19.281 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274801.585: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:19.385 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274801.690: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:19.385 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274801.690: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:19.500 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274801.804: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:19.500 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274801.805: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:19.613 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274801.917: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:19.613 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274801.917: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:19.704 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.008: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:19.704 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.009: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:19.812 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.116: Display update: Configuration
Menu-Lockede[0m
e[36m2025-07-25 19:43:19.830 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.135: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:19.830 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.135: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:19.902 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.206: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:19.902 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.206: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:20.002 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.307: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:20.003 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.307: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:20.107 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.411: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:20.107 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.411: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:20.197 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.501: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:20.197 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.501: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:20.296 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.601: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:20.296 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.601: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:20.395 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.700: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:20.395 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.700: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:20.495 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.800: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:20.495 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.800: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:20.603 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.907: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:20.603 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.908: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:20.695 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274802.999: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:20.695 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274803.000: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:20.797 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274803.101: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:20.797 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274803.101: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:20.892 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274803.196: Unknown frame: b'0104' b'1a'e[0m
e[36m2025-07-25 19:43:20.892 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274803.197: Display update: Configuration
Menu-Unlockede[0m
e[36m2025-07-25 19:43:20.915 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274803.219: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:20.915 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274803.219: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:20.995 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274803.300: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:20.996 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274803.300: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:21.034 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274803.338: Unknown frame: b'0104' b'1a'e[0m
e[36m2025-07-25 19:43:21.095 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274803.400: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:21.096 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274803.400: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:21.200 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274803.505: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:21.200 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274803.505: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:21.251 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274803.556: Unknown frame: b'0104' b'35'e[0m
e[36m2025-07-25 19:43:21.296 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274803.601: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:21.296 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274803.601: Local Wired Key: b'0500000000000000'e[0m
e[36m2025-07-25 19:43:21.395 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274803.700: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:21.395 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274803.700: Local Wired Key: b'0400000000000000'e[0m
e[36m2025-07-25 19:43:21.800 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274804.104: Display update: Configuration
Menu-Unlockede[0m
e[36m2025-07-25 19:43:23.808 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274806.113: Display update: Configuration
Menu-Unlockede[0m
e[36m2025-07-25 19:43:25.797 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274808.102: Display update: Configuration
Menu-Unlockede[0m
e[36m2025-07-25 19:43:27.798 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274810.102: Display update: Configuration
Menu-Unlockede[0m
e[36m2025-07-25 19:43:29.796 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274812.101: Display update: Configuration
Menu-Unlockede[0m
e[36m2025-07-25 19:43:31.795 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274814.100: Display update: Configuration
Menu-Unlockede[0m
e[36m2025-07-25 19:43:32.002 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274814.306: Unknown frame: b'0101' b''e[0m
e[36m2025-07-25 19:43:32.002 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274814.306: Unknown frame: b'008c' b'01000000000000000000'e[0m
e[36m2025-07-25 19:43:33.797 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 274816.102: Display update: Configuration
Menu-Unlockede[0m

I made two small changes to try out. I changed keys.py to add the LEFTRIGHT key and core.py to change the Config Menu logic to use the LEFTRIGHT key. It was hardcoded before.

Download those two files or make the changes below:

Add LEFTRIGHT to keys.py

    LEFT = 0x0004
    LEFTRIGHT = 0x0005
    SERVICE = 0x0008

In core.py starting on line 480, replace the MOD block with this

# MOD Begin
            if self._configmenu and key.value == Keys.RIGHT:
                #self._append_data(frame, b'\x05\x00\x05\x00') #Added LEFTRIGHT to keys.py
                key = Keys.LEFTRIGHT
                self._configmenu = False
            self._append_data(frame, self.FRAME_TYPE_LOCAL_WIRED_KEY_EVENT)
            if self._p4p8 == 'p8':
                self._append_data(frame, b'\x00\x00')
            else:
                self._append_data(frame, key.value.to_bytes(2, byteorder='little'))
                self._append_data(frame, key.value.to_bytes(2, byteorder='little'))
            if self._p4p8 == 'p8':
                self._append_data(frame, b'\x00\x00')
# MOD End

Not sure if that will do it or not, but it’s worth a try.

Something doesn’t work, as the whole integration goes wonky. I’m editing my existing files, and when I apply the changes in the integration, it causes delays and doesn’t work correctly. Change back and all good.

Make sure the else: is above the #MOD Begin. It looks like the code in Github has an extra carriage return in it compared to my local code, so the MOD block would start on line 481 in your code. The else is on line 480.

The change is pretty minor and shouldn’t affect anything else. It’s working for me.

Here’s the full code block:

    def _get_key_event_frame(self, key):
        frame = bytearray()
        frame.append(self.FRAME_DLE)
        frame.append(self.FRAME_STX)

        if key.value > 0xffff:
            self._append_data(frame, self.FRAME_TYPE_WIRELESS_KEY_EVENT)
            self._append_data(frame, b'\x01')
            self._append_data(frame, key.value.to_bytes(4, byteorder='little'))
            self._append_data(frame, key.value.to_bytes(4, byteorder='little'))
            self._append_data(frame, b'\x00')
        else:
# MOD Begin
            if self._configmenu and key.value == Keys.RIGHT:
                #self._append_data(frame, b'\x05\x00\x05\x00') #Added LEFTRIGHT to keys.py
                key = Keys.LEFTRIGHT
                self._configmenu = False
            self._append_data(frame, self.FRAME_TYPE_LOCAL_WIRED_KEY_EVENT)
            if self._p4p8 == 'p8':
                self._append_data(frame, b'\x00\x00')
            else:
                self._append_data(frame, key.value.to_bytes(2, byteorder='little'))
                self._append_data(frame, key.value.to_bytes(2, byteorder='little'))
            if self._p4p8 == 'p8':
                self._append_data(frame, b'\x00\x00')
# MOD End

        crc = 0
        for byte in frame:
            crc += byte
        self._append_data(frame, crc.to_bytes(2, byteorder='big'))

        frame.append(self.FRAME_DLE)
        frame.append(self.FRAME_ETX)

        return frame

I was pretty sure my edits were good, but I opted to download your two files to make sure. Now running your core and keys files. When I press the a button the integration hangs. When I revert to original core and keys files everything works fine (without the option to unlock config menu).

Here are the debug lines from the log.

e[36m2025-07-26 13:26:43.684 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338605.988: Display update: Friday
1:26Pe[0m
e[36m2025-07-26 13:26:45.701 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338608.005: Display update: Pool Temp 89°Fe[0m
e[36m2025-07-26 13:26:47.701 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338610.005: Display update: Pool Temp 89°Fe[0m
e[36m2025-07-26 13:26:49.701 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338612.005: Display update: Air Temp 94°Fe[0m
e[36m2025-07-26 13:26:52.101 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338614.405: Display update: Air Temp 94°Fe[0m
e[36m2025-07-26 13:26:53.705 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338616.009: Display update: Heater1
Manual Offe[0m
e[36m2025-07-26 13:26:55.711 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338618.015: Display update: Heater1
Manual Offe[0m
e[36m2025-07-26 13:26:58.116 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338620.420: Display update: Friday
1:26Pe[0m
e[36m2025-07-26 13:26:59.700 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338622.004: Display update: Friday
1:26Pe[0m
e[36m2025-07-26 13:27:01.700 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338624.005: Display update: Pool Temp 89°Fe[0m
e[36m2025-07-26 13:27:05.142 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338627.447: Display update: Pool Temp 89°Fe[0m
e[36m2025-07-26 13:27:05.703 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338628.007: Display update: Air Temp 94°Fe[0m
e[36m2025-07-26 13:27:07.712 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338630.016: Display update: Air Temp 94°Fe[0m
e[32m2025-07-26 13:27:09.626 INFO (Thread-2) [custom_components.aqualogic_p4p8.core] 338631.930: Sent: b'100200020000000000141003'e[0m
e[36m2025-07-26 13:27:09.626 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338631.930: Unknown frame: b'0407' b''e[0m
e[36m2025-07-26 13:27:09.626 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338631.930: Unknown frame: b'0004' b'02'e[0m
e[32m2025-07-26 13:27:19.635 INFO (Thread-2) [custom_components.aqualogic_p4p8.core] socket timeoute[0m
e[32m2025-07-26 13:27:19.635 INFO (Thread-2) [custom_components.aqualogic_p4p8] Connection to 192.168.20.171:8899 loste[0m
e[32m2025-07-26 13:27:43.923 INFO (Thread-2) [custom_components.aqualogic_p4p8.core] Socket Error (Connect): [Errno 113] Host is unreachablee[0m
e[32m2025-07-26 13:27:43.923 INFO (Thread-2) [custom_components.aqualogic_p4p8.core] Connected to 192.168.20.171:8899e[0m
e[32m2025-07-26 13:27:43.924 INFO (Thread-2) [custom_components.aqualogic_p4p8.core] Socket Error (Process): [Errno 107] Socket not connectede[0m
e[32m2025-07-26 13:27:43.924 INFO (Thread-2) [custom_components.aqualogic_p4p8] Connection to 192.168.20.171:8899 loste[0m
e[32m2025-07-26 13:27:53.934 INFO (Thread-2) [custom_components.aqualogic_p4p8.core] Connected to 192.168.20.171:8899e[0m
e[36m2025-07-26 13:27:55.729 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338678.033: Display update: Air Temp 94°Fe[0m
e[36m2025-07-26 13:27:56.314 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338678.619: Display update: Air Temp 95°Fe[0m
e[36m2025-07-26 13:27:57.735 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338680.039: Display update: Heater1
Manual Offe[0m
e[36m2025-07-26 13:27:59.729 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338682.033: Display update: Heater1
Manual Offe[0m
e[36m2025-07-26 13:28:01.731 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338684.035: Display update: Friday
1:27Pe[0m
e[36m2025-07-26 13:28:03.727 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338686.032: Display update: Friday
1:27Pe[0m
e[36m2025-07-26 13:28:05.728 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338688.032: Display update: Pool Temp 89°Fe[0m
e[36m2025-07-26 13:28:08.206 DEBUG (Thread-2) [custom_components.aqualogic_p4p8.core] 338690.510: Display update: Pool Temp 89°Fe[0m

The send string isn’t correct for any keys. Missing some bits in the middle:

From the original core.py version, at the exit from your MOD (line 480) I have frame set to:
Sent: b’100200020000020002000000’e

From the new version, at the exit from your new MOD I have frame:
Sent: b’1002000200000000’

I’m working on figuring out where we are dropping ‘20002000000’ at the end of the string.

Strange. I just downloaded the core.py and keys.py just to make sure and they work fine for me. It almost looks like it’s using the P4 keys instead of the P8.

Can you diff the original working core.py and the new one to see if there are any other differences? Or send them to me and I’ll look.

I see the issue. When I moved the If statement for the Config menu up in the code, I left the else. It should have been removed. I was still working OK because I don’t have a P8 and was dropping to the else. If you have a P8 it wouldn’t append the key press because it would skip the else.

Try the code below.

# MOD Begin
            if self._configmenu and key.value == Keys.RIGHT:
                #self._append_data(frame, b'\x05\x00\x05\x00') #Added LEFTRIGHT to keys.py
                key = Keys.LEFTRIGHT
                self._configmenu = False
            self._append_data(frame, self.FRAME_TYPE_LOCAL_WIRED_KEY_EVENT)
            if self._p4p8 == 'p8':
                self._append_data(frame, b'\x00\x00')
            self._append_data(frame, key.value.to_bytes(2, byteorder='little'))
            self._append_data(frame, key.value.to_bytes(2, byteorder='little'))
            if self._p4p8 == 'p8':
                self._append_data(frame, b'\x00\x00')
# MOD End

Hey, thanks again for all the debugging help.

I’ve started digging in a little deeper. I noticed you were missing an else yesterday, but I decided to explore another route.

I checked the AquaLogic manuals, and it appears both the P4 and P8 use the same code to unlock the Configuration Menu. The manual says you need to hold the Left+Right buttons for 5 seconds. When I try this on the wired keypad, that’s exactly what happens — if I just tap the buttons, it doesn’t unlock. So it’s not surprising that a single simulated keypress doesn’t work either.

I added a loop to send the frame 25 times with a 200ms delay between each one, but it still doesn’t unlock. I’m starting to wonder if the EW11 is buffering or slowing things down, making it look like 25 quick press/release cycles instead of a continuous hold.

Based on what I found (and confirmed with ChatGPT), simulating a key hold should involve repeatedly sending the exact same frame — essentially mimicking the key being held down. But even with that, I haven’t gotten it to work.

Any ideas?

Try the code above. I think it might work. The old code wouldn’t work with the P8 because it was bypassing the section that added b’\x00\x00 to the start and end of the key that the P8 requires. This new code should do that.

Nope, still no unlock. Code works, just no unlock.