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:

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

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

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:

here OFFLINE is given IAqua

second request:

I don’t know why IAqua is returning OFFLINE … Pool Roboter is online in the app …
it is also states as being online …

i suppose that for the roboters this is an aother API
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?)


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?

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
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
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
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.