Hayward Omnilogic?

I see Omnilogic as a configured intergration via Settings > Devices & Services. I can’t seem to control my light or my heater. All that is listed is: Air Temp, Pool Water Temp, Pool Chlorinator, Pool Chlorinator Setting, Pool Filter Pump and Pool Filter Pump Speed.

Keep clicking through:
Settings > Devices & Services > OmniLogic Local > [x] Devices > Pool

I renamed my devices a while back, so they may be named slightly differently than yours. But you should have something like this:

I agree - amazing to see this converted to local control. Do you know if PH and ORP sensors/controls have been added yet? I’m moving into a new house soon with this system and would love to control it via HA.

Unfortunately, this is all I’m getting.

That’s not the HACS local integration. I think that’s the native HA integration which is no longer updated and is missing a bunch of functionality.

ah! i thank you for your patience! there’s definately a steep learning curve lol Thank you again!

I deleted the omnilogic add on, installed HACS and installed the omnilogic from there; it works beautifully. You are asked for your Hayward Omnilogic credentials, then your entire pool setup appears.

I am a noob to HA, and trying to catch up so that I can figure out how to change my pools blower motor and heater to be turned on for 1, 2 or 3 hours only (yes, this under this add on both my spa blower and heater can be turned on).

If anyone can help me with this, I’d appreciate it.

The local API features looks great. I am having trouble adding it. I am getting an unknown error.

IP was set as a static address. Verified thru windows:

In the setup entered that address and this is the result:

Turned windows firewall on the VM host off without any change (figured it could not hurt). If I enter a different address it shows failed to connect which is expected.

Anyone have ideas?

Not seeing a more substantive response, I’d start by checking the HA log (Settings → System → Logs) after the failure to see if you have any useful information there. In case you’re not aware, you can type “omnilogic” in the search box and then click on a log entry to potentially get more details.

Well the log shows showed failed to parse telemtry and then the details:

2024-01-23 20:43:01.040 ERROR (MainThread) [custom_components.omnilogic_local.config_flow] Unexpected exception: Failed to parse Telemetry: 15 validation errors for Telemetry
Chlorinator -> 0 -> @enable
  field required (type=value_error.missing)
ColorLogic-Light -> 0 -> @speed
  field required (type=value_error.missing)
ColorLogic-Light -> 0 -> @brightness
  field required (type=value_error.missing)
ColorLogic-Light -> 0 -> @specialEffect
  field required (type=value_error.missing)
Filter -> 0 -> @reportedFilterSpeed
  field required (type=value_error.missing)
Filter -> 0 -> @power
  field required (type=value_error.missing)
Filter -> 0 -> @lastSpeed
  field required (type=value_error.missing)
Filter -> 1 -> @reportedFilterSpeed
  field required (type=value_error.missing)
Filter -> 1 -> @power
  field required (type=value_error.missing)
Filter -> 1 -> @lastSpeed
  field required (type=value_error.missing)
Relay -> 0 -> @whyOn
  field required (type=value_error.missing)
VirtualHeater -> 0 -> @SolarSetPoint
  field required (type=value_error.missing)
VirtualHeater -> 0 -> @Mode
  field required (type=value_error.missing)
VirtualHeater -> 0 -> @SilentMode
  field required (type=value_error.missing)
VirtualHeater -> 0 -> @whyHeaterIsOn
  field required (type=value_error.missing)
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/site-packages/pyomnilogic_local/models/telemetry.py", line 237, in load_xml
    return Telemetry.parse_obj(data["STATUS"])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "pydantic/main.py", line 526, in pydantic.main.BaseModel.parse_obj
  File "pydantic/main.py", line 341, in pydantic.main.BaseModel.__init__
pydantic.error_wrappers.ValidationError: 15 validation errors for Telemetry
Chlorinator -> 0 -> @enable
  field required (type=value_error.missing)
ColorLogic-Light -> 0 -> @speed
  field required (type=value_error.missing)
ColorLogic-Light -> 0 -> @brightness
  field required (type=value_error.missing)
ColorLogic-Light -> 0 -> @specialEffect
  field required (type=value_error.missing)
Filter -> 0 -> @reportedFilterSpeed
  field required (type=value_error.missing)
Filter -> 0 -> @power
  field required (type=value_error.missing)
Filter -> 0 -> @lastSpeed
  field required (type=value_error.missing)
Filter -> 1 -> @reportedFilterSpeed
  field required (type=value_error.missing)
Filter -> 1 -> @power
  field required (type=value_error.missing)
Filter -> 1 -> @lastSpeed
  field required (type=value_error.missing)
Relay -> 0 -> @whyOn
  field required (type=value_error.missing)
VirtualHeater -> 0 -> @SolarSetPoint
  field required (type=value_error.missing)
VirtualHeater -> 0 -> @Mode
  field required (type=value_error.missing)
VirtualHeater -> 0 -> @SilentMode
  field required (type=value_error.missing)
VirtualHeater -> 0 -> @whyHeaterIsOn
  field required (type=value_error.missing)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/config/custom_components/omnilogic_local/config_flow.py", line 105, in async_step_user
    await validate_input(self.hass, user_input)
  File "/config/custom_components/omnilogic_local/config_flow.py", line 51, in validate_input
    telemetry = await omni.async_get_telemetry()
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/pyomnilogic_local/models/util.py", line 43, in wrapper
    return pydantic_type.load_xml(resp_body)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/pyomnilogic_local/models/telemetry.py", line 239, in load_xml
    raise OmniParsingException(f"Failed to parse Telemetry: {exc}") from exc
pyomnilogic_local.exceptions.OmniParsingException: Failed to parse Telemetry: 15 validation errors for Telemetry
Chlorinator -> 0 -> @enable
  field required (type=value_error.missing)
ColorLogic-Light -> 0 -> @speed
  field required (type=value_error.missing)
ColorLogic-Light -> 0 -> @brightness
  field required (type=value_error.missing)
ColorLogic-Light -> 0 -> @specialEffect
  field required (type=value_error.missing)
Filter -> 0 -> @reportedFilterSpeed
  field required (type=value_error.missing)
Filter -> 0 -> @power
  field required (type=value_error.missing)
Filter -> 0 -> @lastSpeed
  field required (type=value_error.missing)
Filter -> 1 -> @reportedFilterSpeed
  field required (type=value_error.missing)
Filter -> 1 -> @power
  field required (type=value_error.missing)
Filter -> 1 -> @lastSpeed
  field required (type=value_error.missing)
Relay -> 0 -> @whyOn
  field required (type=value_error.missing)
VirtualHeater -> 0 -> @SolarSetPoint
  field required (type=value_error.missing)
VirtualHeater -> 0 -> @Mode
  field required (type=value_error.missing)
VirtualHeater -> 0 -> @SilentMode
  field required (type=value_error.missing)
VirtualHeater -> 0 -> @whyHeaterIsOn
  field required (type=value_error.missing)

Tried Nmap to see the open ports. All were closed except 23. So that is likely the reason for the unexpected error. The old Hayward Omnilogic integration uses a cloud version and worked fine.

I can telnet to the Hayward device but only receive a few options: (I am in way over my head here)

Telnet 10.1.10.125 23
Typed help and received

Registered Commands:

quit
sleep
ipconfig
iperf
start
stop
kill
load
tryload
unload
proclist
help


Nmap results:

Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-02 21:59 Eastern Standard Time
NSE: Loaded 156 scripts for scanning.
NSE: Script Pre-scanning.
Initiating NSE at 21:59
Completed NSE at 21:59, 0.00s elapsed
Initiating NSE at 21:59
Completed NSE at 21:59, 0.00s elapsed
Initiating NSE at 21:59
Completed NSE at 21:59, 0.00s elapsed
Initiating ARP Ping Scan at 21:59
Scanning 10.1.10.125 [1 port]
Completed ARP Ping Scan at 21:59, 0.06s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 21:59
Completed Parallel DNS resolution of 1 host. at 21:59, 0.00s elapsed
Initiating SYN Stealth Scan at 21:59
Scanning HaywardOmniLogicMSP002362011684.localdomain (10.1.10.125) [1000 ports]
Discovered open port 23/tcp on 10.1.10.125
Completed SYN Stealth Scan at 21:59, 0.28s elapsed (1000 total ports)
Initiating Service scan at 21:59
Scanning 1 service on HaywardOmniLogicMSP002362011684.localdomain (10.1.10.125)
Completed Service scan at 22:00, 46.09s elapsed (1 service on 1 host)
Initiating OS detection (try #1) against HaywardOmniLogicMSP002362011684.localdomain (10.1.10.125)
Retrying OS detection (try #2) against HaywardOmniLogicMSP002362011684.localdomain (10.1.10.125)
Retrying OS detection (try #3) against HaywardOmniLogicMSP002362011684.localdomain (10.1.10.125)
Retrying OS detection (try #4) against HaywardOmniLogicMSP002362011684.localdomain (10.1.10.125)
Retrying OS detection (try #5) against HaywardOmniLogicMSP002362011684.localdomain (10.1.10.125)
NSE: Script scanning 10.1.10.125.
Initiating NSE at 22:00
Completed NSE at 22:00, 7.02s elapsed
Initiating NSE at 22:00
Completed NSE at 22:00, 0.00s elapsed
Initiating NSE at 22:00
Completed NSE at 22:00, 0.00s elapsed
Nmap scan report for HaywardOmniLogicMSP002362011684.localdomain (10.1.10.125)
Host is up (0.0030s latency).
Not shown: 999 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
23/tcp open  telnet
| fingerprint-strings: 
|   GenericLines, SIPOptions: 
|     Nucleus Shell ***
|_    SHELL:>
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port23-TCP:V=7.94%I=7%D=2/2%Time=65BDAC28%P=i686-pc-windows-windows%r(N
SF:ULL,18,"\xff\xfe\0\xff\xfc\0\xff\xfe\x01\xff\xfc\x01\xff\xfd\x03\xff\xf
SF:b\x03\xff\xfd\x18\xff\xfd\x1f")%r(GenericLines,40,"\xff\xfe\0\xff\xfc\0
SF:\xff\xfe\x01\xff\xfc\x01\xff\xfd\x03\xff\xfb\x03\xff\xfd\x18\xff\xfd\x1
SF:f\r\n\n\*\*\*\x20Nucleus\x20Shell\x20\*\*\*\r\n\r\nMSP\x20SHELL:\\>")%r
SF:(tn3270,24,"\xff\xfe\0\xff\xfc\0\xff\xfe\x01\xff\xfc\x01\xff\xfd\x03\xf
SF:f\xfb\x03\xff\xfd\x18\xff\xfd\x1f\xff\xfa\x18\x01\xff\xf0\xff\xfe\x19\x
SF:ff\xfc\x19")%r(GetRequest,18,"\xff\xfe\0\xff\xfc\0\xff\xfe\x01\xff\xfc\
SF:x01\xff\xfd\x03\xff\xfb\x03\xff\xfd\x18\xff\xfd\x1f")%r(RPCCheck,18,"\x
SF:ff\xfe\0\xff\xfc\0\xff\xfe\x01\xff\xfc\x01\xff\xfd\x03\xff\xfb\x03\xff\
SF:xfd\x18\xff\xfd\x1f")%r(Help,18,"\xff\xfe\0\xff\xfc\0\xff\xfe\x01\xff\x
SF:fc\x01\xff\xfd\x03\xff\xfb\x03\xff\xfd\x18\xff\xfd\x1f")%r(SIPOptions,4
SF:0,"\xff\xfe\0\xff\xfc\0\xff\xfe\x01\xff\xfc\x01\xff\xfd\x03\xff\xfb\x03
SF:\xff\xfd\x18\xff\xfd\x1f\r\n\n\*\*\*\x20Nucleus\x20Shell\x20\*\*\*\r\n\
SF:r\nMSP\x20SHELL:\\>")%r(NCP,18,"\xff\xfe\0\xff\xfc\0\xff\xfe\x01\xff\xf
SF:c\x01\xff\xfd\x03\xff\xfb\x03\xff\xfd\x18\xff\xfd\x1f");
MAC Address: 00:23:62:01:16:84 (Goldline Controls)
No exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).
TCP/IP fingerprint:
OS:SCAN(V=7.94%E=4%D=2/2%OT=23%CT=1%CU=32600%PV=Y%DS=1%DC=D%G=Y%M=002362%TM
OS:=65BDAC63%P=i686-pc-windows-windows)SEQ(SP=103%GCD=1%ISR=104%TI=I%CI=I%I
OS:I=I%SS=S%TS=7)SEQ(SP=103%GCD=1%ISR=108%TI=I%CI=I%II=I%SS=S%TS=7)SEQ(SP=1
OS:04%GCD=1%ISR=105%TI=I%CI=I%II=I%SS=S%TS=7)SEQ(SP=FB%GCD=1%ISR=106%TI=I%C
OS:I=I%II=I%SS=S%TS=7)OPS(O1=M5A8SW0T11N%O2=M5A8SW0T11N%O3=M5A8W0T11NNN%O4=
OS:M5A8SW0T11N%O5=M5A8SW0T11N%O6=M5A8ST11)WIN(W1=3E80%W2=3E80%W3=3E80%W4=3E
OS:80%W5=3E80%W6=3E80)ECN(R=N)T1(R=Y%DF=Y%T=40%S=O%A=S+%F=AS%RD=0%Q=)T2(R=N
OS:)T3(R=Y%DF=Y%T=40%W=3E80%S=O%A=S+%F=AS%O=M5A8SW0T11N%RD=0%Q=)T4(R=Y%DF=Y
OS:%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%R
OS:D=0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T7(R=Y%DF=Y%T=40%W=0%
OS:S=Z%A=S%F=AR%O=%RD=0%Q=)U1(R=Y%DF=N%T=40%IPL=38%UN=0%RIPL=G%RID=G%RIPCK=
OS:G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD=S)

Uptime guess: 4.425 days (since Mon Jan 29 11:49:02 2024)
Network Distance: 1 hop
TCP Sequence Prediction: Difficulty=259 (Good luck!)
IP ID Sequence Generation: Incremental

TRACEROUTE
HOP RTT     ADDRESS
1   3.01 ms HaywardOmniLogicMSP002362011684.localdomain (10.1.10.125)

NSE: Script Post-scanning.
Initiating NSE at 22:00
Completed NSE at 22:00, 0.00s elapsed
Initiating NSE at 22:00
Completed NSE at 22:00, 0.00s elapsed
Initiating NSE at 22:00
Completed NSE at 22:00, 0.00s elapsed
Read data files from: C:\Program Files (x86)\Nmap
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 67.76 seconds
           Raw packets sent: 1111 (52.798KB) | Rcvd: 1072 (44.862KB)

The local API uses UDP so you will not see an open TCP port using an nmap scan. I can confirm my unit looks the same.

The log you posted showing the metadata parsing failure looks like it just implies that the retrieval of the metadata failed, so we’ll need to determine why. Were there any earlier log events showing “connection” problems, timeouts, etc? Could it be as simple as the address of the MSP being entered incorrectly?

You could try using tcpdump to capture the udp traffic with the MSP. It’s normally on port 10444 but you can just keep it simple using something like:

sudo tcpdump -s 0 -A host 10.1.10.125 and udp

You should see periodic XML-coded requests and mostly binary responses (which I believe are compressed data). I’ll see if I can find some workable local diagnostic commands or recommendations for other logs to check.

Laur,

Thanks for the reply and trying to help. I did a Nmap scan for UDP. It only shows 5353 open. Tried this as the port while installing the integration and it failed to connect. I will build a Linux VM to try the command you suggested (not sure if it will produce any additional details). Here are the results of the from Nmap UDP scan

**Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-03 16:13 Eastern Standard Time
Initiating ARP Ping Scan at 16:13
Scanning 10.1.10.125 [1 port]
Completed ARP Ping Scan at 16:13, 0.03s elapsed (1 total hosts)
Initiating Parallel DNS resolution of 1 host. at 16:13
Completed Parallel DNS resolution of 1 host. at 16:13, 0.00s elapsed
Initiating UDP Scan at 16:13
Scanning HaywardOmniLogicMSP002362011684.localdomain (10.1.10.125) [1000 ports]
Increasing send delay for 10.1.10.125 from 0 to 50 due to 11 out of 16 dropped probes since last increase.
Increasing send delay for 10.1.10.125 from 50 to 100 due to max_successful_tryno increase to 4
Increasing send delay for 10.1.10.125 from 100 to 200 due to max_successful_tryno increase to 5
UDP Scan Timing: About 14.47% done; ETC: 16:16 (0:03:03 remaining)
UDP Scan Timing: About 28.66% done; ETC: 16:16 (0:02:32 remaining)
UDP Scan Timing: About 43.01% done; ETC: 16:16 (0:02:01 remaining)
UDP Scan Timing: About 57.19% done; ETC: 16:16 (0:01:31 remaining)
UDP Scan Timing: About 71.63% done; ETC: 16:16 (0:01:00 remaining)
Completed UDP Scan at 16:16, 214.54s elapsed (1000 total ports)
Nmap scan report for HaywardOmniLogicMSP002362011684.localdomain (10.1.10.125)
Host is up (0.00075s latency).
Not shown: 999 closed udp ports (port-unreach)
PORT     STATE         SERVICE
5353/udp open|filtered zeroconf
MAC Address: 00:23:62:01:16:84 (Goldline Controls)

Read data files from: C:\Program Files (x86)\Nmap
Nmap done: 1 IP address (1 host up) scanned in 214.65 seconds
           Raw packets sent: 1136 (54.028KB) | Rcvd: 1032 (57.764KB)
**

That only scanned 1000 ports, so probably didn’t include the right one. Consider adding port numbers like this, to make sure it probes what we already know is the right udp port (10444):

$ sudo nmap -sU -p 10440-10449  192.168.XXX.XXX 
Starting Nmap 7.80 ( https://nmap.org ) at 2024-02-03 14:37 PST
Nmap scan report for HaywardOmniLogicMSPxxx (192.168.XXX.XXX)
Host is up (0.00062s latency).

PORT      STATE         SERVICE
10440/udp closed        unknown
10441/udp closed        unknown
10442/udp closed        unknown
10443/udp closed        unknown
10444/udp open|filtered unknown
10445/udp closed        unknown
10446/udp closed        unknown
10447/udp closed        unknown
10448/udp closed        unknown
10449/udp closed        unknown
MAC Address: 00:23:62:xx:xx:xx (Goldline Controls)

Nmap done: 1 IP address (1 host up) scanned in 2.59 seconds

Tried Linux but I was getting a cap file. So used Wireshark instead. Here are the results of the traffic between Home Assistant and Hayward.

Could not save them here or a PDF so embedded in a web page.

WireShark output

OK so that trace confirms that the integration is talking to your MSP - it has retrieved the MSP configuration, then it requested and received the telemetry (current measurements and states), then reported the exception on parsing of the telemetry. Possibly there is something in your system’s configuration that the code isn’t equipped to handle. You could turn on debug logging and see what shows up there.

Maybe @cryptk (the developer) is still tuned in here but it’s an old thread and as they have not chimed in yet you might just open an issue with the project to get some assistance diagnosing it further. Issues · cryptk/haomnilogic-local · GitHub

Laur,

Thank you for the suggestion. I did open an issue on Github. It looks like the develop is still active on there.

This integration has been working like a charm for a couple of years for me, but recently entities occasionally go “unavailable” and I need to reload the integration. I created an automation to reload it when that happens and that is working, but obviously that should not be necessary. Anyone else have to reload routinely recently?

Yes, same here. No issues at all for a long time. Just recently I need to reload due to unavailable entities.

1 Like