Viron Astral Pool ChlorinatorGo integration

Massive thanks to @pbutterworth and those that helped.

This is awesome!

Installed flawlessly. Autodiscovered within 5 min of restart. All I had to do was install HACS custom repository and add integration.

I already had an esp32 near the chlorinator that controlled the chook coop door and was ble proxy for a switchbot bot that turned on and off my pool cleaner (dolphin x30). I use blueconnect for other pool chemistry so I can compare the orp and ph.

My only feedback is that it would be useful to insert instructions on how to get the access code (and case sensitivity) into the GitHub / HACS doco so people donā€™t have to find this page.

Awesome work! Thank you. :beers:

1 Like

A couple of follow up questions:

  1. The horrible lcd display on the unit shows the actual current orp value but sensors in HA integration only shows chlorine status (e.g. low). Whilst I canā€™t see actual orp value in the app, could it be made available via integration?

  2. Has anyone had success in upgrading chlorinator firmware? Iā€™m running 5.6 and app says 5.9 is available. I get to the install new firmware menu on the unit and it says ā€˜press bothā€™ with arrow to the timer and middle buttons. Nothing happens.

Hi @thetastate

  1. The interface is a bit weird when it comes to ORP. It doesnā€™t just report a value, but instead reports statistics on the highest/lowers ORP level. No idea when/how the statistics are reset. This data is actually being fetched, but I donā€™t post it anywhere in HA. Lemme add some more sensors, thereā€™s quite a few parametersā€¦ Have a look in pychlorinator/chlorinator_parsers.py to get an idea of the info that is retreived.

  2. Firmware installation involves putting the chlorinator into bootloader mode (pretty much the process you described) - then you need to go to the ClorinatorGo app and do the rest from there. Tip: go to the home screen in the app (donā€™t connect to chlorinator), and press the ? button.

You can also turn on debug logging and see the data in the log. Hereā€™s mine:

'mode': <Modes.ManualOn: 1>, 
'pump_speed': <SpeedLevels.High: 2>, 
'active_timer': 0, 
'info_message': <InfoMessages.NoMessage: 0>, 
'_reserved': 0, 
'flags': 32, 
'ph_measurement': 7.7, 
'chlorine_control_status': <ChlorineControlStatuses.Ok: 4>, 
'time_hours': 12, 
'time_minutes': 35, 
'time_seconds': 2, 
'chemistry_values_current': False, 
'chemistry_values_valid': True, 
'spa_selection': False, 
'pump_is_priming': False, 
'pump_is_operating': True, 
'cell_is_operating': True, 
'user_settings_has_changed': False, 
'sanitising_until_next_timer_tomorrow': False, 
'default_manual_on_speed': <SpeedLevels.High: 2>, 
'ph_control_setpoint': 7.3, 
'chlorine_control_setpoint': 650, 
'is_no_timer_model': False, 
'is_timer_master_present_in_system': False, 
'minimum_manual_acid_setpoint': 0, 
'maximum_manual_acid_setpoint': 10, 
'minimum_manual_chlorine_setpoint': 0, 
'maximum_manual_chlorine_setpoint': 8, 
'minimum_ph_setpoint': 4.0, 
'maximum_ph_setpoint': 10.0, 
'minimum_orp_setpoint': 200, 
'maximum_orp_setpoint': 800, 
'ph_control_type': <PhControlTypes.Automatic: 2>, 
'chlorine_control_type': <ChlorineControlTypes.Automatic: 2>, 
'cell_size': 25, 
'acid_pump_size': 5, 
'filter_pump_size': 0.1, 
'reversal_period': 4, 
'pool_volume': b'\xd8\xd6\x00', 
'spa_volume': 1000, 
'threespeed_pump_enabled': False, 
'ai_mode_enabled': False, 
'volume_units': <VolumeUnitsTypes.Litres: 0>, 
'lighting_enabled': False, 
'dosing_capable_unit': True, 
'pump_timers': 
    [<pychlorinator.chlorinator_parsers.PumpTimer object at 0x7f585225c0>,
     <pychlorinator.chlorinator_parsers.PumpTimer object at 0x7f58521630>, 
     <pychlorinator.chlorinator_parsers.PumpTimer object at 0x7f58522650>, 
     <pychlorinator.chlorinator_parsers.PumpTimer object at 0x7f58521960>], 
'highest_ph_measured': 8.8, 
'lowest_ph_measured': 4.2, 
'highest_orp_measured': 900, 
'lowest_orp_measured': 252, 
'cell_reversal_count': 730, 
'cell_running_time': datetime.timedelta(days=191, seconds=79200), 
'low_salt_cell_running_time': datetime.timedelta(days=18, seconds=28800), 
'previous_days_cell_load': 0, 
'acid_dosing_inhibit_time_remaining': 0, 
'acid_dosing_inhibit_status': <AcidDosingInhibitStatuses.NotInhibited: 0>}

The statistics stuff seems pretty useless.

2 Likes

On chlorinator firmware, has anyone found any release notes published anywhere?

HA integration release notes here:

Hit the compare button between two releases to see the commits, and the code diffs.

Python package that interfaces with the chlorinator releases here:

2 Likes

I finally got my new Atom up and running with ESP32 and located near my chlorinator.

After adding the custom repository to HACS, install of v0.1.10 was seamless. Immediately detected my chlorinator.
On quick piece of feedback would be to put some info on the connection dialog (see below) advising that the chlorinatorā€™s Bluetooth access code needs to be added (in uppercase per your earlier post). A new user that hadnā€™t been keeping track of this thread might not find this obvious!

msedge_4PPsLY02yC

Something that would be nice to have for the future:

  1. Current firmware of chlorinator

  2. Latest firmware available (as reported by app)

  3. A chlorinator firmware update entity that compares the above two items and advise up-to-date or a new version available.

Is anyone here familiar with Home Assistant config flows?
Iā€™d like to implement some of the suggested improvements regarding entering the access code from the chlorinator, but I just canā€™t figure it outā€¦

Do you have any more write up on the setup here? Would be interested in potentially setting up something similarā€¦

No sorry, I didnā€™t do a write up but they are all basic sensors in esphome (esphome.io). Happy to share information if you need. The load cell I just used a 10kg one and measured one side of a basic platform (iā€™ve made another one for my gas cylinders but iā€™m still hunting for why my values fluctuate alot, I think its a connection issue).

For the pool level and temp probe, I 3d printed housing that clamps to the paver. it was very bespoke but I can hunt down the STL if you want it.

Thanks @pbutterworth. Saw this thread, bought a ESP32 bluetooth proxy and had the integration setup in a few minutes. Great stuff.

1 Like

Hi guys,

Anyone has made any progress with AstralPool Halo?

Thanks.

Is there a way to utilise the Wi-Fi connection with this, or only the Bluetooth aspect?

The Viron eQuilibrium chlorinators which which this integration works, doesnā€™t have Wi-Fi, so bluetooth was the only option.
If you have a chlorinator model with Wi-Fi, I imagine it might be a lot easier to integrate?

I have the Halo version (Halo Chlor 25), which looks to be exactly the same setup/app as the Viron but has Bluetooth and wifi/LAN. It is outside the range of my HA Bluetooth, so I am either looking to get a BT proxy setup to bounce it back to HA or need to try to figure out how to expose it over the Wi-Fi network.

There are two different protocol versions by the looks of the source code. Have a feeling the Halo uses the ā€˜otherā€™ protocol. You can tell which by the BLE characteristic (use nRF Connect)
Check out post 94 for more chit-chat on this topic: Viron Astral Pool ChlorinatorGo integration - #95 by farsonic
It probably wouldnā€™t be a huge lift for someone in the know to extend pychlorinator to support the other protocolā€¦

1 Like

The new Halo app seems to have changed quite a bit compared to the old one. Most attributes are now received via notifications instead of directly reading from GATT attributes. The Halo is now supposed to replace Connect 10 and acts like a hub to all other equipments. As a result, it has more functionalities and exposes more attributes. I think itā€™s pretty impractical to make pychlorinator work with the Halo.

I have a Halo installed here and perhaps I need to start investigating how this works :slight_smile:

  • ok, I just sniffed the traffic from the WIFI side of the box and traffic is encrypted using SSL/TLS to Internet based server. Comms from the app on the iPhone are directly to the cloud also, there is no direct communication from client device to the chlorinator. So, unless we proxy and intercept this traffic (might be okay for status) it might be difficult to impersonate the cloud platform.

Looks like the Halo is Wifi and Bluetooth. If I were you, Iā€™d be packet sniffing the ethernet comms between the app and the Halo (if any) using wireshark to see whatā€™s going on. In the likely scenario that there is some sort of authentication, then next port-of-call is to get the android apk for the app, decompile and start sifting though the code.

If youā€™re getting push notifications and/or the app works even when you arenā€™t home, then it might be that the app never talks to the chlorinator directly, and all comms are going through a cloud service. In which case, youā€™d have to reverse engineer the fluidra cloud API (harder?).

By the looks of it, the UI for the Chlor GO app is very similar to the ChlorinatorGO app, leading me to suspect that itā€™s using more-or-less the same code-base (.NET Xamarin based).

Iā€™ve been running wireshark between the APP and the Chlorinator and there is no direct comms at allā€¦it is all being passed two and from the cloud service. Just captured the bluetooth communications from the Chlorinator.

Scanner On.
Device Scanned.
Connected.
Discovered 45000001-98B7-4E29-A03F-160174643002 Services.
Discovered Characteristics 45000001-98B7-4E29-A03F-160174643002, 45000002-98B7-4E29-A03F-160174643002, 45000003-98B7-4E29-A03F-160174643002 and 45000004-98B7-4E29-A03F-160174643002 for Service 45000001-98B7-4E29-A03F-160174643002.
Characteristic 45000001-98B7-4E29-A03F-160174643002 has no Descriptors.
Characteristic 45000002-98B7-4E29-A03F-160174643002 has no Descriptors.
Discovered Client Characteristic Configuration for Characteristic 45000003-98B7-4E29-A03F-160174643002
Characteristic 45000004-98B7-4E29-A03F-160174643002 has no Descriptors.
Disconnected.
Scanner Off.