Viron Astral Pool ChlorinatorGo integration

Fantastic… can see the heater now but can’t set the value.

So it’s all almost independent when it comes to pumps.

  • Filter Pump (Filter, Chlorinator, Heater)
  • Cleaning Pump (infloor & skimmer
  • Solar Pump
  • Spa Jets Pump

I couldn’t see any pump / valve / GPO naming in the data struct although this is present in the app and chlorinator itself. This makes it hard to work out what is going on with the GPOs but I suspect he ordering is Hub first and then Expand although that is just a logical guess.

The filter pump plugs in to the Chlorinator and I think that is pretty obvious in the data struct
The cleaning pump is plugged in to GPO1 on the Halo Hub (Suspect it’s GPO1)
The spa blower is plugged in to GPO2 on the Halo Hub (Suspect it’s GPO2)
The solar pump is plugged in to GPO1 on the Halo Expand (Suspect it’s GPO3)
The spa jets pump is plugged in to GPO2 om the Halo Expand (Suspect it’s GPO4)

Correct. It is only reporting status.
I’m working on code so you are able to set the heater mode, like the current selection for chlorinator mode. Just need to work out the associated data that needs to be sent.

So you’ve highlighted an error on how i parse the GPO data which i knew about, but put it on the back burner.

Short answer is, the Halo sends multiple GPO messages all with the same command ID, each message contains a Index. The way it is currently being parsed is that only the last message data is saved as it has been over written everytime the message has come through.

ie from your log above.

 'OutletEnabled': 1,
 'GPOFunction': <GPOFunctionValues.Equipment: 0>,
 'GPOName': <GPONameValues.Blower: 7>,
 'GPOLightingZone': 0,

But again - this is only status information. No control yet.

It’s all still very much a work in progress :smiley:

1 Like

Amazing work Daniel!

I was going to go and change the statuses of all those items and capture the data structs but it sounds unnecessary given what you’re saying about the way the messages are indexed and overwriting

1 Like

image

No new features. Just fixed the parsing of the GPO/Valve/Relay messages. So debug log will give you a clearer indication of what is what now … I hope :slight_smile:

Yes, so the data structure being returned is index 0 or 1. (no 2, or 3), but also a device type being connect7 or connect8… device connect7 could be the Hub, and device connect8 could be the Xpand.

Force a update information in hacks for this add-in, and the debug logs should clear it up 100% for certain. (please provide an updated Log extract again)

1 Like

Here it is… this makes a lot more sense now

type or p2024-01-31 15:51:36.898 DEBUG (MainThread) [custom_components.astralpool_halo_chlorinator.coordinator] halo_ble_client finish: {'AIModeActive': False, 'AIWaterTurns': 10, 'AcidControlSetpoint': 5, 'AcidDosingDisabled': False, 'AcidPumpSize': 55, 'AutoEnabledBitfield': 2027, 'AutoEnabledFilterPump': True, 'BoardTemp': 54.3, 'BootloaderVersionMajor': 0, 'BootloaderVersionMinor': 1, 'CalibrateState': <CalibrateStatesValues.Idle: 0>, 'CellCurrentmA': 5996, 'CellIsReversing': False, 'CellModel': <CellModelValues.Model_35: 2>, 'CellReversalCount': 34, 'CellRunningTime': 151, 'ChlorineControlType': <ChlorineControlTypes.Automatic: 2>, 'ChloroWater': 6519.8, 'CoolingAvailable': False, 'DefaultManualOnSpeed': 2, 'DeviceProtocol': <DeviceProtocol.NextGen: 2>, 'DeviceProtocolRevision': 0, 'DeviceType': <DeviceType.Chlorinator: 1>, 'DeviceVersion': 4, 'Differential': 70, 'DoseDisableTimeMins': 0, 'DosingPumpOn': False, 'DosingPumpSecs': 290, 'EquipmentEnabled': 1, 'FilterPumpMins': 294, 'FilterPumpMode': 1, 'FilterPumpSize': 0, 'FilterPumpSpeed': <SpeedLevels.High: 2>, 'FilterPumpThreeSpeed': 0, 'FirmwareVersionMajor': 1, 'FirmwareVersionMinor': 3, 'Flag': 64, 'Flags': 2, 'GPO1_AutoEnabled': True, 'GPO1_Function': <GPOFunctionValues.Solar: 2>, 'GPO1_LightingZone': 0, 'GPO1_Mode': <GPOMode.NotEnabled: 255>, 'GPO1_Name': <GPONameValues.NoName: 0>, 'GPO1_OutletEnabled': 1, 'GPO1_State': True, 'GPO1_UseTimers': 1, 'GPO2_AutoEnabled': False, 'GPO2_Function': <GPOFunctionValues.Equipment: 0>, 'GPO2_LightingZone': 0, 'GPO2_Mode': <GPOMode.Off: 0>, 'GPO2_Name': <GPONameValues.Jets: 8>, 'GPO2_OutletEnabled': 1, 'GPO2_State': False, 'GPO2_UseTimers': 0, 'GPO3_AutoEnabled': True, 'GPO3_Function': <GPOFunctionValues.Equipment: 0>, 'GPO3_LightingZone': 0, 'GPO3_Mode': <GPOMode.Auto: 1>, 'GPO3_Name': <GPONameValues.CleaningPump: 2>, 'GPO3_OutletEnabled': 1, 'GPO3_State': True, 'GPO3_UseTimers': 1, 'GPO4_AutoEnabled': False, 'GPO4_Function': <GPOFunctionValues.Equipment: 0>, 'GPO4_LightingZone': 0, 'GPO4_Mode': <GPOMode.Off: 0>, 'GPO4_Name': <GPONameValues.Blower: 7>, 'GPO4_OutletEnabled': 1, 'GPO4_State': False, 'GPO4_UseTimers': 0, 'General': <GeneralValues.DisplayORP|DosingEnabled|PumpProtectEnable|EnableCleaningInterlock|DisplayPH: 6752>, 'GeneralServiceRequired': False, 'HardwareVersion': 1, 'HeatPumpMode': <HeatpumpModeValues.Heating: 1>, 'Heater': 27.0, 'HeaterCooldownEventOccurredFlag': 0, 'HeaterCooldownState': 0, 'HeaterEnabled': 1, 'HeaterError': 0, 'HeaterFlame': False, 'HeaterForced': <HeaterForcedEnum.NotForced: 0>, 'HeaterForcedTimeHrs': 0, 'HeaterForcedTimeMins': 0, 'HeaterGasValve': False, 'HeaterLockout': False, 'HeaterMinPumpSpeed': <SpeedLevels.Low: 0>, 'HeaterMode': <Mode.Off: 0>, 'HeaterOn': False, 'HeaterPressure': True, 'HeaterPumpEnabled': 0, 'HeaterPumpInstalled': 0, 'HeaterPumpMode': <Mode.Auto: 1>, 'HeaterPumpThreeSpeed': 0, 'HeaterPumpTimerBit': 0, 'HeaterSetpoint': 30, 'HeaterStatusFlag': 2, 'HeaterWaterTemp': 27.0, 'HeaterWaterTempValid': <TempValidEnum.IsValid: 1>, 'HighestOrpMeasured': 860, 'HighestPhMeasured': 8.2, 'IgnitionServiceRequired': False, 'Ignore': 0, 'Index': 3, 'IsCelLReversed': False, 'IsCellRunning': True, 'IsCoolingFanOn': False, 'IsFahrenheit': 0, 'IsInPoolSelection': False, 'IsLightOutputOn': False, 'LightingColour_1': 0, 'LightingColour_2': 0, 'LightingColour_3': 0, 'LightingColour_4': 0, 'LightingEnabled': 0, 'LightingMode_1': <Mode.Off: 0>, 'LightingMode_2': <Mode.Off: 0>, 'LightingMode_3': <Mode.Off: 0>, 'LightingMode_4': <Mode.Off: 0>, 'LightingState_1': <ZoneStateFlagsValues: 0>, 'LightingState_2': <ZoneStateFlagsValues: 0>, 'LightingState_3': <ZoneStateFlagsValues: 0>, 'LightingState_4': <ZoneStateFlagsValues: 0>, 'LightingZoneName_1': <ZoneNamesValues.Pool: 0>, 'LightingZoneName_2': <ZoneNamesValues.Spa: 1>, 'LightingZoneName_3': <ZoneNamesValues.Other: 7>, 'LightingZoneName_4': <ZoneNamesValues.Other: 7>, 'LowSaltCellRunningTime': 0, 'LowestOrpMeasured': 0, 'LowestPhMeasured': 0.0, 'MainText': <MainTextValues.Sanitising: 1>, 'MaintenanceTaskReturnCode': <TaskReturnCodesValues.OK: 0>, 'MaintenanceTaskState': <TaskStatesValues.NoTask: 0>, 'MaximumManualAcidSetpoint': 10, 'MaximumManualChlorineSetpoint': 8, 'MaximumOrpSetpoint': 800, 'MaximumPhSetpoint': 10.0, 'MinimumManualAcidSetpoint': 0, 'MinimumManualChlorineSetpoint': 0, 'MinimumOrpSetpoint': 100, 'MinimumPhSetpoint': 3.0, 'ModeAfterComplete': <Mode.Off: 0>, 'ModeGPO1': 255, 'ModeGPO2': 0, 'ModeGPO3': 1, 'ModeGPO4': 0, 'ModeRelay1': 255, 'ModeRelay2': 255, 'ModeValve1': 255, 'ModeValve2': 255, 'ModeValve3': 0, 'ModeValve4': 255, 'Model': 0, 'NumZonesInUse': 1, 'ORPMeasurement': 636, 'OnBoardLightEnabled': 0, 'OrpControlSetpoint': 650, 'OrpControlType': <ChlorineControlTypes.Automatic: 2>, 'ParameterGPO1': 0, 'ParameterGPO2': 0, 'ParameterGPO3': 0, 'ParameterGPO4': 0, 'ParameterRelay1': 0, 'ParameterRelay2': 0, 'ParameterValve1': 0, 'ParameterValve2': 0, 'ParameterValve3': 0, 'ParameterValve4': 0, 'PhControlSetpoint': 7.6, 'PhControlType': <PhControlTypes.Automatic: 2>, 'PhMeasurement': 7.7, 'PoolChlorineControlSetpoint': 4, 'PoolLeftFilter': 17290, 'PoolVolume': 50000, 'PowerBoardRuntime': (134,), 'PreviousDaysCellLoad': 88, 'RealCelllevel': 8, 'Relay1_Action': 0, 'Relay1_AutoEnabled': True, 'Relay1_Enabled': 0, 'Relay1_Mode': <GPOMode.NotEnabled: 255>, 'Relay1_Name': <RelayNameValue.Relay1: 0>, 'Relay1_State': False, 'Relay1_UseTimers': 1, 'Relay2_AutoEnabled': True, 'Relay2_Mode': <GPOMode.NotEnabled: 255>, 'Relay2_State': False, 'RemainingCooldownTime': 0, 'ReversalPeriod': 4, 'SerialNumber': 12345678, 'SolarEnableExclPeriod': 1, 'SolarEnableFlush': 1, 'SolarEnabled': 1, 'SolarFlag': 17, 'SolarFlushActive': False, 'SolarFlushTimeHR': 14, 'SolarFlushTimeMin': 0, 'SolarMessage': <SolarMessageValues.SolarHeatingActive: 2>, 'SolarMode': <Mode.Auto: 1>, 'SolarPumpStartHR': 20, 'SolarPumpStartMin': 0, 'SolarPumpState': True, 'SolarPumpStopHR': 7, 'SolarPumpStopMin': 0, 'SolarRoof': 50.3, 'SolarRoofTemp': 503, 'SolarRoofTempValid': <TempValidEnum.IsValid: 1>, 'SolarSeason': 1, 'SolarSpecTemp': 0, 'SolarTemp': 32, 'SolarWater': 26.7, 'SolarWaterTemp': 267, 'SolarWaterTempValid': <TempValidEnum.IsValid: 1>, 'SpaChlorineControlSetpoint': 1, 'SpaLeftFilter': 2800, 'SpaVolume': 2800, 'StateBitfield': 75, 'StateFilterPump': True, 'SubText1': <SubText1Values.ORPIsGreen: 3>, 'SubText1Chlorine': 3, 'SubText2': <SubText2Values.PHIsGreen: 3>, 'SubText2Ph': 3, 'SubText3': <SubText3Values.NoneValue: 0>, 'SubText3BytesData': [b'\x00\x00'], 'SubText3TimerInfo': 0, 'SubText4ErrorInfo': 0, 'TargetMode': 0, 'TaskTimeRemaining': 0, 'TempDisplayed': <TempDisplayedValues.BoardTemp|ChloroWater: 5>, 'TempSupports': <TempSupportsValues.BoardTemp|WaterTemp|SolarWater|SolarRoof|Heater: 59>, 'TotalHeaterCooldownTime': 300, 'ValueToDisplay': 0, 'Valve1_AutoEnabled': True, 'Valve1_Enabled': 1, 'Valve1_Mode': <GPOMode.NotEnabled: 255>, 'Valve1_Name': <ValveNameValue.Pool: 2>, 'Valve1_State': False, 'Valve1_UseTimers': 1, 'Valve2_AutoEnabled': True, 'Valve2_Enabled': 1, 'Valve2_Mode': <GPOMode.NotEnabled: 255>, 'Valve2_Name': <ValveNameValue.Spa: 3>, 'Valve2_State': True, 'Valve2_UseTimers': 1, 'Valve3_AutoEnabled': True, 'Valve3_Enabled': 1, 'Valve3_Mode': <GPOMode.Off: 0>, 'Valve3_Name': <ValveNameValue.Other: 1>, 'Valve3_State': False, 'Valve3_UseTimers': 1, 'Valve4_AutoEnabled': True, 'Valve4_Enabled': 0, 'Valve4_Mode': <GPOMode.NotEnabled: 255>, 'Valve4_Name': <ValveNameValue.NoneValue: 0>, 'Valve4_State': False, 'Valve4_UseTimers': 1, 'VolumeUnits': <VolumeUnitsValues.Litres: 0>, 'WaterTemp': 27.0, 'WaterTempValid': <TempValidEnum.IsValid: 1>, 'ZoneColours': b'\x00\x00\x00\x00', 'ZoneIsMulticolourFlags': <ZoneIsMulticolourFlagsValues.Zone1IsMulticolour|Zone2IsMulticolour|Zone3IsMulticolour|Zone4IsMulticolour: 15>, 'ZoneModes': b'\x00\x00\x00\x00', 'ZoneNames': b'\x00\x01\x07\x07', 'ZoneStateFlags': 0, 'cell_is_operating': True, 'chlorine_control_setpoint': 650, 'chlorine_control_status': <SubText1Values.ORPIsGreen: 3>, 'chlorine_control_type': <ChlorineControlTypes.Automatic: 2>, 'info_message': <MainTextValues.Sanitising: 1>, 'mode': <Mode.Auto: 1>, 'ph_control_setpoint': 7.6, 'ph_control_type': <PhControlTypes.Automatic: 2>, 'ph_measurement': 7.7, 'pump_is_operating': True, 'pump_speed': <SpeedLevels.High: 2>}aste code here

Halo Chlor Go app updated to v1.5,
Halo Chlor firmware updated to V2.

Safe to firmware update, intergration still works.

Brings new features, notablity Heat demand which allows filtration / heater to run outside of sanitation hours.

1 Like

Thanks for the info!
I went and upgraded my firmware tonight from v1.3 to 2.0.

Can’t say I noticed any new or changed features, and I still can’t run the filter pump on low while still sanitising.

Did you find any release notes anywhere?

Look at the changes in the mobile app on the App Store.

I don’t think the pump moves enough volume to effectively run the chlorinator on low.

Ah yep, thanks, I see that. The app change log but not the firmware change log.

App update doesn’t change the pump/Chlorinator behaviour though.

It absolutely does.
Low speed on my pump runs at 1300rpm, which is way more than sufficient to move water over the cell.

I wrote to Fluidra, here is their reply:

https://forums.whirlpool.net.au/thread/3n1j44wx?p=2#r73778303

Edit: sorry, I’ve just re-read this post and realised I might have come across overly blunt and harsh. My apologies, that was not my intention.

All good. I just assumed default low speed rpm, and mine doesn’t look to be moving much water. :joy:

I saw your post on pools Australia fb group, hopefully Matt takes notice.

1 Like

For those who have upgraded their halo to firmware v2, have you had any issues?

Version 0.1.5 released.
Give you abililty to turn heater on or off (if your system is setup with a heater)

image

Unfortunately, There’s no easy way to integrate temperature control from HA.

The Halo BLE protocol does not have a set temp command. It literally only has IncreaseSetpoint and DecreaseSetpoint based on the + and - buttons in the Heater page.

image

So, in order to be able to intergrate a Temperature setpoint change service, I would need to take the current set point, and the requested set point, create a for loop based on the difference, and then send the IncreaseSetpoint or DecreaseSetpoint command X times.

Not really ideal, and I see it being error prone.

Personally I think Heater ON / OFF is good enough, If you want setpoint control, please use the Halo App :slight_smile:

Also - not battle tested. I don’t have my heater hooked up yet. So literally just enabled heater as a “relay output”.

1 Like

Nope, no issues. The upgrade took about 5 mins and works fine.

Great to hear ha integration is working well with v2 firmware. I only upgraded mine yesterday as I wanted to test some new commands from v2 in the older firmware to see how it behaves.

Hey Daniel, what do you think about exposing the raw setpoint increase / decrease functions? So HA would work the same way as the app and on device UI where you can’t enter a temp, just move it up or down.

I assume that would t work with some of the standard HA temp controls but could still be setup effectively in a custom card.

They’re already there in the parser. But the problem is, you couldn’t just expose a - or + button like the app in HA due to the async way it handles the gui request. Only the first request will be sent to the halo, and the rest will likely bomb out due to the connection being busy as the halo will only allow one concurrent connection unlike typical Bluetooth devices.

The only way I see it happening is via the above method above, so that it will send all the increase or decrease setpoint commands sequenced in the one single connection. At least that way it can be exposed as a proper climate setpoint allowing service requests from automations.

Not impossible, just challenging in the world of being new to Home assistant integration development.

1 Like

my integration has stopped working for some unbeknown reason. when this has happened previously it was typically bluetooth connectivity failing, but this is not the case. i have an ESP32 bluetooth proxy working for other services. I have tried reinstalling the integration with no luck. I may have coincided with an upgrade to HA. anyone else had a similar problem?

  • Core2024.2.1
  • Supervisor2024.01.1
  • Operating System11.5
  • Frontend20240207.1

@xarmoda, updating ha core now. Will let you know how I go…

@xarmoda, have all the same versions as you. Working fine. Maybe restart the proxy? Others have had problems with that…

the proxy is the usual culprit. it isnt this time. i’ll keep at it.