The Hayward Omnilogic driver controls Hayward's HLBASE / HLPRO pool & spa controllers via the public Hayward customer-portal API. It authenticates against haywardomnilogic.com, polls telemetry for the configured MSP site, and dispatches equipment commands (filter pumps, lights, heaters, valves, auxiliary relays) on demand. It is cloud-only — there is no on-LAN protocol published by the vendor.
Status
Built against the public HAAPI XML endpoint. Read paths (Login, GetSiteList, GetMspConfigFile, GetTelemetryData) and write paths (SetUIEquipmentCmd, SetHeaterEnable, SetUIHeaterCmd, SetStandAloneLightShow) are implemented. Schedule create/update, chemistry control, and salt-system commands are not yet wired — capture the EquipmentIds with get_config and use the equipment-on/off path until they land.
Prerequisites
- Active account at https://www.haywardomnilogic.com — same credentials as the Omnilogic mobile app.
- The Omnilogic controller is registered to the account and visible in the mobile app.
- Outbound HTTPS from the GEM controller to
www.haywardomnilogic.com (port 443).
Setup
- Verify the mobile app works. If the Omnilogic mobile app cannot reach the controller, this driver cannot either — the cloud is the only published path home.
- Create the device under System > Devices with driver
hayward_omnilogic. Set:
username — your haywardomnilogic.com email
password — your haywardomnilogic.com password (stored encrypted)
- Verify connection. From the Script Console:
await gem.command({device: <device_id>, action: 'get_sites'});
You should see one or more entries like [{MspSystemID: 12345, ...}]. The driver auto-selects the first site if the account owns one site; otherwise set msp_system_id explicitly:
await gem.setAttribute('device', <device_id>, 'msp_system_id', '12345');
- Discover equipment IDs.
await gem.command({device: <device_id>, action: 'get_config'});
The response includes the full MSP configuration with EquipmentId values per pump / light / heater / aux. Note them down.
- (Optional) Create one zone per piece of equipment with
address set to the EquipmentId. The poller will surface state changes on each zone.
- Test a command.
await gem.command({device: <device_id>, action: 'set_equipment', address: 8, on: true});
Attributes
Device
| Attribute | Required | Type | Notes |
|---|
username | yes | string | Hayward portal email. |
password | yes | string (secure) | Hayward portal password. |
msp_system_id | no | string | Omnilogic site ID. Auto-discovered if the account owns a single site; required for multi-site accounts. |
polling_interval | no | int | Telemetry poll interval in ms. Default 60000, minimum 10000. |
request_timeout | no | int | HTTP request timeout in ms. Default 15000. |
Runtime-populated (read-only, written by the poller):
| Attribute | Type | Source |
|---|
air_temp_f | int | Backyard.@_airTemp from the parsed telemetry blob |
water_temp_f | int | BodyOfWater.@_waterTemp |
flow_state | string | BodyOfWater.@_flow |
system_status | string | Backyard.@_status |
Zone
Zone address is optional. If set, it must match an Omnilogic EquipmentId from get_config.
| Attribute | Type | Source |
|---|
state | string | on / off derived from the equipment's reported state attribute |
speed | int | for variable-speed pumps |
temp_f | int | for heater equipment items |
Commands
| Name | Args | Description |
|---|
get_sites | — | List MSP system IDs visible to the account. |
get_config | — | Full MSP configuration (equipment IDs, names, capabilities). |
get_telemetry | — | Current telemetry snapshot. Refreshes attributes. |
set_equipment | address, on | Turn an equipment item on/off. address = EquipmentId. |
set_heater | address, enabled | Enable/disable a heater. address = HeaterId. |
set_heater_setpoint | address, temperature | Set heater setpoint in Fahrenheit. |
set_light_show | address, show | Set a ColorLogic light show by integer show ID. |
Known limitations
- Cloud-only. There is no LAN path; all traffic goes through
haywardomnilogic.com.
- Telemetry can lag a real-world equipment change by 30–60 seconds.
- Schedule create / edit / delete is not yet implemented.
- Salt chlorinator setpoint, ORP/pH dosing, and chemistry feeder commands are not yet implemented.
- Multi-body-of-water sites (pool + separate spa) are partially handled — telemetry parses the first BodyOfWater; per-body command targeting needs the EquipmentId from
get_config.
Troubleshooting
| Symptom | Check |
|---|
login status 2 or http 401 on first connect | Email or password is wrong. Sign in at https://www.haywardomnilogic.com manually to confirm the credentials work. |
GetTelemetryData returns empty Parameters block | Omnilogic controller is offline (no WAN path home). Check the controller display + home wifi. |
set_equipment returns success but the pool equipment never reacts | EquipmentId is wrong, OR an active schedule is overriding the manual command. Verify the EquipmentId via get_config; pause schedules in the Omnilogic mobile app to test. |
connect timeout | GEM controller cannot reach www.haywardomnilogic.com. Check DNS + outbound 443. |
auth: re-auth: ... repeating in the device log | The portal is rejecting the credentials. Confirm the account is active and not locked out by a password policy. |