Custom Component: Hayward Aquarite

Affected versions: 3.0.0 and 3.1.0. If you’re still on 2.x you’re not affected, whatever number of pools you have.

The bug arrived with the hub pattern in 3.0.0, which consolidated setup to one config entry per account. Before that, each pool had its own config entry with its own authentication object, so the token-refresh path had no contention. Afterwards all subscriptions share one auth object and race for it and only the winner learns that the token was refreshed, so the losers keep running on credentials that are about to expire.

Fixed in 3.1.1: sensors frozen for hours

The bug is real, I reproduced it on my own system, found the cause, and
3.1.1 fixes it. Thanks to everyone who reported it “the values just stop”
was exactly the right clue.

What was happening

The integration doesn’t poll. It holds real-time listeners that push a
fresh snapshot every few minutes. All of those listeners share one
authentication object, and the token behind it is rotated every 55 minutes.

That rotation was reported in a way only one listener could observe. The
others never learned their credentials had been replaced, kept listening on
a token that expired 5 minutes later, and went silently dead no error, no
warning, no entity marked unavailable. Your readings simply stopped moving.

A dead listener only came back at a later rotation it happened to win.
Each missed rotation cost exactly 50 minutes, and consecutive misses
compounded. Over 48 hours on my own system I measured 8 stretches longer
than an hour, the worst at 6 hours 57 minutes.

Affected versions: 3.0.0 and 3.1.0. Still on 2.x? You’re not affected,
whatever number of pools you have before 3.0.0 each pool had its own
config entry with its own authentication, so there was nothing to race for.
The hub pattern in 3.0.0 consolidated everything onto one shared object,
which is what made a long-dormant flaw reachable. Accounts with several
pools were hit harder, since more listeners compete each time.

What to do

Update to 3.1.1 via HACS and restart. No configuration change needed.

How to confirm it’s working

Enable debug logging under Settings > Devices & services > Aquarite, and
look for Resubscribing lines around each token rotation. Before 3.1.1 only
one appeared per rotation; from 3.1.1 every subscription gets one.

If you want to check for stalls in general, look for
Manually updated Aquarite Pool data one per snapshot. On my system
these land every 11 minutes; yours may differ. A gap of an hour or more is
the symptom this release fixes.

Hi @fdebrus,

quick question regarding heating control in Aquarite 3.1.1.

My VistaPool has Heating assigned to AUX4 and is connected to a BWT FI Connect 105 pool heat pump.

Filtration is scheduled from 07:00–21:00. The BWT has its own temperature setpoint of 27°C, so when filtration starts and the water is below 27°C, the heat pump can start heating automatically.

For PV optimization, I would like to keep filtration unchanged at 07:00–21:00, but only allow the heat pump to operate from 10:00–18:00.

Is it possible through Aquarite to explicitly enable/disable the Heating/AUX4 relay independently of Pump Mode and the filtration schedule?

And does “Heating Status” represent the actual physical state of the assigned AUX4 heating relay?

Thanks!

The open question is on the controller side, and I can’t answer it: when a relay is assigned to the Heating function, the VistaPool owns that output. It is quite likely to re-assert it from its own heating logic on the next cycle, which would leave you with Home Assistant and the controller fighting over the contact.

Rather than forcing the output, gate the demand. The integration exposes the Aquarite heating setpoint as a writable number the entity named Heating mode min temperature (it writes filtration.heating.temp). Drop it below current water temperature outside 10:00–18:00, and restore it inside the window.

Set your heatpump to 40 degres or something, so you only rely on the controller temperature setting.

That’s a safer path, others could work but need some real life testing and validation.