New Binding for iAquaLink internet connected pools (Jandy/Zodiac)

iAqualink uses a cloud based REST API which is undocumented, but if you do some simple google searches i’m sure you can find example projects (including this one) that show how to use it.

I have used REST API and was able to use few api functions like login or listing devices but when I am sending command for movement of pool cleaner or other device command ,
Its giving me that “Device is offline” in API response where I sent the correct device ID and device is online .

Any help or suggestions would be highly appreciated

Since the protocol is not documented, you will probably need to setup a man in the middle proxy and capture what the mobile app is sending, Everything I know about the protocol is part of the binding, which you can easily use as a guide.

Hi @Pravin_nerkar i can report I have the same issue with my Robot Vortex 5480 IQ.
Things says: “Service reports controller status as: Offline”
Test using different Serial numbers reported “no such serial” … Fo me it looks like currently those controllers for Robots are not found …

Via the APP everything works fine …

Setting up man in the middle logging etc is a little above my current Skillset. I hope there is somebody more geeky out there to find a clever solution

@luvstruck2000 If you can put the binding in TRACE logging and post the response listing devices right after login i can look at adding the device. @Pravin_nerkar was referring to his own application written in a different language , not anything todo with openHAB , which what my response was referring to about man in the middle.

Hi @digitaldan thank you in advance for your support:

Trace:
2022-03-16 15:04:49.497 [DEBUG] [nk.internal.handler.IAqualinkHandler] - SessionID HM8GBKL1DLZNFB6I70A8IOLAMX0ZELTM

2022-03-16 15:04:49.498 [TRACE] [qualink.internal.api.IAqualinkClient] - Trying https://r-api.iaqualink.net/devices.json?api_key=EOOEMOW4YR6QXXXX&authentication_token=K1TS0gc2HsEuBlaBXXXX&user_id=60XXXX

2022-03-16 15:04:50.095 [TRACE] [qualink.internal.api.IAqualinkClient] - Response HttpContentResponse[HTTP/1.1 200 OK - 317 bytes]

2022-03-16 15:04:55.098 [TRACE] [qualink.internal.api.IAqualinkClient] - Trying https://p-api.iaqualink.net/v1/mobile/session.json?actionID=command&command=get_home&serial=Q825K8FVXXXX&sessionID=HM8GBKL1DLZNFB6I70A8IOLAMX0ZXXXX

2022-03-16 15:04:55.430 [TRACE] [qualink.internal.api.IAqualinkClient] - Response HttpContentResponse[HTTP/1.1 200 OK - 396 bytes]

2022-03-16 15:04:55.437 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing ‘iaqualink:controller:ef5a69c7ee’ changed from INITIALIZING to OFFLINE (COMMUNICATION_ERROR): Service reports controller status as: Offline

I chagned some details to XXXX due to security …

Rertun of first request in browser is:
{“message”:"",“home_screen”:[{“status”:“Offline”},{“response”:“Error”},{“system_type”:""},{“temp_scale”:""},{“spa_temp”:""},{“pool_temp”:""},{“air_temp”:""},{“spa_set_point”:""},{“pool_set_point”:""},{“cover_pool”:""},{“freeze_protection”:""},{“spa_pump”:""},{“pool_pump”:""},{“spa_heater”:""},{“pool_heater”:""},{“solar_heater”:""},{“spa_salinity”:""},{“pool_salinity”:""},{“orp”:""},{“ph”:""}]}

here OFFLINE is given IAqua

second request:
[{“id”:440997,“serial_number”:“Q825K8FVXXXX”,“created_at”:“2022-03-01T17:20:00.000Z”,“updated_at”:“2022-03-01T17:20:16.000Z”,“name”:“ROBOT-7JT”,“device_type”:“i2d_robot”,“owner_id”:605874,“updating”:false,“firmware_version”:null,“target_firmware_version”:null,“update_firmware_start_at”:null,“last_activity_at”:null}]

I don’t know why IAqua is returning OFFLINE … Pool Roboter is online in the app …
In
https://iaqualink.zodiacpoolsystems.com/index.html#/owners-center
it is also states as being online …

i suppose that for the roboters this is an aother API
https://prod.zodiac-io.com/devices/v1/%24sn1/shadow
which I can not open

Hi @nokyyz,

is there any progress on this topic?
I also got a new EXO IQ LS and now I’m having trouble to integrate the values into OpenHab.

@digitaldan have you already came across those devices (EXO IQ LS?)

THX!!

Hi @h0eferm, I have no news for EXO devices integration into iAqualink binding.
I don’t know if developments are in progress or are planned. If necessary, I can try to develop this functionality.

So the robots use a completely different API which is unfortunate, so its basically writing a whole new integration as opposed to an incremental feature. Not sure when i will be able to take a look at feasibility.

Ciao, since yesterday the API is not working for me when I want to update status (for example turn on/off the EXO IQ). It seems there’s a problem with the API as it returns Internal server error. Anyone with same issue?
Thanks2

I have not noticed any issues, when you say “API is not working”, do you mean our openhab binding is not working, the official client is not working, or something else ?

Ciao, I mean the API itself. I tried to use CURL to set a desired status of my EXO IQ and fron yesterday It returns internal sever error. For querying pH, temp, orp there is no issue. It seems the required API parameters to update settings have changed but I’m unable to run a sniffer in app iAqualink to get the new parameters.

How are the onetouch_n and aux_n channels supposed to be created? I have the iaqualink controller as a thing, which a bunch of working channels, but not the onetouch or aux. I can’t seem to manually create the items linked to those channels, either.

Are those channels not listed under the thing ?

No, does something need to be enabled either on the iAquaLink side or the thing to add them?

I do have them (enabled?) named in the iAquaLink web app:

Interestingly, in the log, it looks like the Binding knows about the onetouch (although the channels aren’t available):

15:18:44.084 [TRACE] [aqualink.internal.api.IAqualinkClient] - Trying https://p-api.iaqualink.net/v1/mobile/session.json?actionID=command&command=get_home&serial=QR85UYKDS5ZM&sessionID=1IZNVBZX08T8NCP8BXTAU9Z2HIQNIELV
15:18:45.145 [TRACE] [aqualink.internal.api.IAqualinkClient] - Response HttpContentResponse[HTTP/1.1 200 OK - 682 bytes]
15:18:45.147 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState status : Online
15:18:45.148 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState response : AQU='70','0B 00 01 02 03 05 06 07 08 0E 0F 1A 01 00 00 00 00 3C 00 66 00 3A 00 3E 00 00 00'
15:18:45.149 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState system_type : 0
15:18:45.150 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState temp_scale : F
15:18:45.151 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState spa_temp : 
15:18:45.152 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState pool_temp : 62
15:18:45.154 [TRACE] [ink.internal.handler.IAqualinkHandler] - updating channel iaqualink:controller:29fa50fd9e:pool_temp with state 62 °F (old state 63 °F)
15:18:45.156 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState air_temp : 58
15:18:45.162 [INFO ] [openhab.event.ItemStateChangedEvent  ] - Item 'iAquaLink_Pool_Controller_Pool_Temperature' changed from 63 °F to 62 °F
15:18:45.163 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState spa_set_point : 102
15:18:45.167 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState pool_set_point : 60
15:18:45.169 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState cover_pool : 
15:18:45.170 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState freeze_protection : 0
15:18:45.171 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState spa_pump : 0
15:18:45.172 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState pool_pump : 1
15:18:45.173 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState spa_heater : 0
15:18:45.174 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState spa_heater_status : off
15:18:45.175 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState pool_heater : 0
15:18:45.176 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState pool_heater_status : off
15:18:45.177 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState solar_heater : 
15:18:45.178 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState solar_heater_status : null
15:18:45.179 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState spa_salinity : 
15:18:45.180 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState pool_salinity : 
15:18:45.181 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState orp : 
15:18:45.182 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState ph : 
15:18:45.183 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState is_icl_present : absent
15:18:45.184 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState pool_chill_set_point : 
15:18:45.185 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState relay_count : 
15:18:45.186 [TRACE] [aqualink.internal.api.IAqualinkClient] - Trying https://p-api.iaqualink.net/v1/mobile/session.json?actionID=command&command=get_onetouch&serial=QR85UYKDS5ZM&sessionID=1IZNVBZX08T8NCP8BXTAU9Z2HIQNIELV
15:18:56.272 [TRACE] [aqualink.internal.api.IAqualinkClient] - Response HttpContentResponse[HTTP/1.1 200 OK - 490 bytes]
15:18:56.274 [TRACE] [aqualink.internal.api.IAqualinkClient] - Trying https://p-api.iaqualink.net/v1/mobile/session.json?actionID=command&command=get_devices&serial=QR85UYKDS5ZM&sessionID=1IZNVBZX08T8NCP8BXTAU9Z2HIQNIELV
15:18:56.389 [TRACE] [aqualink.internal.api.IAqualinkClient] - Response HttpContentResponse[HTTP/1.1 200 OK - 108 bytes]
15:18:56.390 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState onetouch_1 : 0
15:18:56.392 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState onetouch_2 : 0
15:18:56.393 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState onetouch_3 : 0
15:18:56.394 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState onetouch_4 : 0
15:18:56.395 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState onetouch_5 : 0
15:18:56.396 [TRACE] [ink.internal.handler.IAqualinkHandler] - updatedState onetouch_6 : 0

Here is the response to get_devices, it looks to me like the auxillaries should be identified on startup. I rebooted a couple of times and the channels aren’t added.

{"message":"","devices_screen":[{"status":"Online"},{"response":"AQU='72','8|1|2|3|4|5|6|7|32|0|1|0|0|AUX1|0|1|0|0|AUX2|0|7|2|4|SPA LIGHT|0|7|2|4|POOL LIGHT|0|1|0|0|AUX5|0|1|0|0|AUX6|0|1|0|0|AUX7|0|1|0|0|EXTRA AUX'"},{"group":"1"},{"aux_1":[{"state":"0"},{"label":"AUX1"},{"icon":"aux_1_0.png"},{"type":"0"},{"subtype":"0"}]},{"aux_2":[{"state":"0"},{"label":"AUX2"},{"icon":"aux_1_0.png"},{"type":"0"},{"subtype":"0"}]},{"aux_3":[{"state":"0"},{"label":"SPA LIGHT"},{"icon":"aux_7_0.png"},{"type":"2"},{"subtype":"4"}]},{"aux_4":[{"state":"0"},{"label":"POOL LIGHT"},{"icon":"aux_7_0.png"},{"type":"2"},{"subtype":"4"}]},{"aux_5":[{"state":"0"},{"label":"AUX5"},{"icon":"aux_1_0.png"},{"type":"0"},{"subtype":"0"}]},{"aux_6":[{"state":"0"},{"label":"AUX6"},{"icon":"aux_1_0.png"},{"type":"0"},{"subtype":"0"}]},{"aux_7":[{"state":"0"},{"label":"AUX7"},{"icon":"aux_1_0.png"},{"type":"0"},{"subtype":"0"}]},{"aux_EA":[{"state":"0"},{"label":"EXTRA AUX"},{"icon":"aux_1_0.png"},{"type":"0"},{"subtype":"0"}]}],"icl_info_list":[]}

The API is returning that the one_touch buttons have a status of “0” which usually means they are not enabled (even though they may still work) . I have a feeling if you named them, they would return a status of “1”, which means enabled. In that iAqualink web interface, go to Menu → System Setup → One Touch Setup → Select Name and then select the one touch button you want to name, then on the right select a default name or type one in .

My System Setup page doesn’t have a OneTouch Setup. However, I have to confess that I don’t have water in the pool yet, nor have I tried to configure the Jandy remote. I’ve been doing some early setup with the iAqualink interface (where the Aux inputs can turn the lights on and off), but should probably wait for all the equipment to be setup.

Separately, the Binding and the iAqualink app frequently flip system status from offline to online. I had also connected the Alexa Skill to iAqualink. Have you seen issues with this REST API and multiple connections with the same credentials?

Ok, this is why the one touch buttons are not showing up, you need to configure your pool first, then the binding will have the right channels. Right now its doing the right thing and ignoring auxs/buttons/etc… that are not setup (like yours)

It’s possible, i don’t remember if thats the case, but it seems likely, their API is really really bad (i try to hide that in the binding). I personally use our openHAB Alexa skill for all of this i have not used theirs.

Their API can be flakey, polling will sometimes get server errors, although the binding always recovers, usually on the next poll cycle.

@digitaldan, first let me thank you for your efforts for the community creating and maintaining that binding! I would really like to use it, but currently have a problem setting it up:

Using the iAqualink app I am able to connect to the heat pump and to change values with it. This everything is fine using the app.

But when I connect via the binding I get the information, that the heat pump is offline.

I activated log level trace for the binding and enabled the corresponding thing:

2023-06-30 23:25:44.272 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'iaqualink:controller:8be6834641' changed from UNINITIALIZED (DISABLED) to INITIALIZING

2023-06-30 23:25:45.048 [DEBUG] [nk.internal.handler.IAqualinkHandler] - SessionID xxxxxxxxxxx

2023-06-30 23:25:45.051 [TRACE] [qualink.internal.api.IAqualinkClient] - Trying https://r-api.iaqualink.net/devices.json?api_key=xxxxxxxxxx&authentication_token=xxxxxxxx&user_id=xxxxxx

2023-06-30 23:25:45.457 [TRACE] [qualink.internal.api.IAqualinkClient] - Response HttpContentResponse[HTTP/1.1 200 OK - 307 bytes]

2023-06-30 23:25:45.462 [DEBUG] [nk.internal.handler.IAqualinkHandler] - Using serial number xxxxxxxxx

2023-06-30 23:25:50.465 [TRACE] [qualink.internal.api.IAqualinkClient] - Trying https://p-api.iaqualink.net/v1/mobile/session.json?actionID=command&command=get_home&serial=xxxxxxx&sessionID=xxxxxxxxxxxxxxxxxxx

2023-06-30 23:25:50.806 [TRACE] [qualink.internal.api.IAqualinkClient] - Response HttpContentResponse[HTTP/1.1 200 OK - 579 bytes]

2023-06-30 23:25:50.814 [INFO ] [ab.event.ThingStatusInfoChangedEvent] - Thing 'iaqualink:controller:8be6834641' changed from INITIALIZING to OFFLINE (COMMUNICATION_ERROR): Service reports controller status as: Offline

When I try the iAqualink.net-Links directly, I get the following answers:

[{"id":xxxxx,"serial_number":"xxxxxxxx","created_at":"2022-09-05T06:27:11.000Z","updated_at":"2022-09-05T06:27:11.000Z","name":"Pool-WP","device_type":"hpm","owner_id":xxxxxxx,"updating":false,"firmware_version":null,"target_firmware_version":null,"update_firmware_start_at":null,"last_activity_at":null}]

and

{"message":"","serial":"xxxxxx","home_screen":[{"status":"Offline"},{"response":"Error"},{"system_type":""},{"temp_scale":""},{"spa_temp":""},{"pool_temp":""},{"air_temp":""},{"spa_set_point":""},{"pool_set_point":""},{"cover_pool":""},{"freeze_protection":""},{"spa_pump":""},{"pool_pump":""},{"spa_heater":""},{"pool_heater":""},{"solar_heater":""},{"spa_salinity":""},{"pool_salinity":""},{"orp":""},{"ph":""},{"is_icl_present":"absent"},{"icl_custom_color_info":[]},{"heatpump_info":{}},{"pool_chill_set_point":""},{"swc_info":{"isswcPresent":false}},{"relay_count":""}]}

The serial number that is logged by the binding is the same as the one that is printed in the side menu of the app. I also tried to configure this serial explicitly in the bindings configuration … with the same result.

When I login to https://iaqualink.zodiacpoolsystems.com the same serial as above is shown and here the status of the heat pump is also mentioned as “offline”. I asked the Zodiac support for this, but they answered that the state here was always and is always “offline” - thus a normal behaviour.

Do you have any idea why it doesn’t work in my case?

Thats strange that the service is reporting it as offline, even in their own web app. In the webapp ( https://iaqualink.zodiacpoolsystems.com) are you able to click the “home” button and manage your pool directly? Also you are mentioning the heat pump, do you have a Jandy Pool controller, or is this a stand alone heatpump with some type of internet connection? I ask b/c I have not run into that case yet, but i know they did something with a robo vacuum cleaner ( i think they acquired the company ), and it actually had its own API that is different then iAqualink, so does not work with this binding, but does show up in their mobile app.