From 38bcdd0aebaa7813d8d2ebd23a38d10f1978b360 Mon Sep 17 00:00:00 2001 From: Daniel Nagy Date: Fri, 19 Apr 2024 11:48:33 +1000 Subject: [PATCH 1/2] Updated Readme with Min Firmware version. and Alternate BLE proxy details. --- README.md | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index b20bf65..0ab3c43 100644 --- a/README.md +++ b/README.md @@ -26,27 +26,33 @@ Please also support https://github.com/pbutterworth/astralpool_chlorinator for h | `sensor` | Show info from Astral Pool Halo Chlorinator API. | | `select` | Control the chlorinator mode (off/auto/manual) | - # Pre-Requisites + +### Astral Halo Minimum Firmware Version 2.2 + ## Hardware -1. Obtain an ESP32 dev board. The [M5Stack Atom Lite](https://shop.m5stack.com/products/atom-lite-esp32-development-kit?ref=NabuCasa) is a great choice for first timers. -2. Connect your ESP32 to your computer with a USB Data Cable. Double-check it actually *IS* actually a data cable and not just a charge cable. + +1. Obtain an ESP32 dev board. The [M5Stack Atom Lite](https://shop.m5stack.com/products/atom-lite-esp32-development-kit?ref=NabuCasa) is a great choice for first timers. If you are handy with a soldering iron, and you want a professional PoE powered BLE Proxy. Obtain a GL.iNet GL-S10, and follow the Instructions at [blakadder.com](https://blakadder.com/gl-s10) on how to converting it to a ESPHome Bluetooth Proxy. _The GL-S10 has a external antenna which will provide better range than a typical esp32 dev board_ +2. Connect your ESP32 to your computer with a USB Data Cable. Double-check it actually _IS_ actually a data cable and not just a charge cable. ## Install a Bluetooth Proxy to the ESP board + 3. Visit https://esphome.io/projects/?type=bluetooth. 4. Select "Bluetooth Proxy" and your device type. 5. Flash your device. 6. Join it to your WiFi network. -7. Add it to Home Assistant as an ESPHome device. You *do not* need the ESPHome server running, just the ESPHome device discovered. +7. Add it to Home Assistant as an ESPHome device. You _do not_ need the ESPHome server running, just the ESPHome device discovered. 8. Ping your device IP to confirm it's online. 9. Mount your ESP32 device close (recommend within ~1 meter for best performance) to your Halo Chlorinator and within WiFi network range. # Installation + Best experience is to install with HACS. [![Open your Home Assistant instance and open a repository inside the Home Assistant Community Store.](https://my.home-assistant.io/badges/hacs_repository.svg)](https://my.home-assistant.io/redirect/hacs_repository/?owner=DanielNagy&repository=astralpool_halo_chlorinator) ## Installation via HACS + 1. Open the HACS page on your Home Assistant Dashboard. 2. Select "Integrations". 3. From the 3 dots menu, select "Custom Repositories". @@ -55,12 +61,14 @@ Best experience is to install with HACS. 6. Restart HomeAssistant when instructed. ## Manual Installation + 1. Using the tool of choice open the directory (folder) for your HA configuration (where you find `configuration.yaml`). 2. If you do not have a `custom_components` directory (folder) there, you need to create it. 3. In the `custom_components` directory (folder) create a new folder called `astralpool_halo_chlorinator`. 4. Download _all_ the files from the `custom_components/astralpool_halo_chlorinator/` directory (folder) in this repository. 5. Place the files you downloaded in the new directory (folder) you created. 6. Using your HA configuration directory (folder) as a starting point you should now also have this: + ```text custom_components/astralpool_halo_chlorinator/translations/en.json custom_components/astralpool_halo_chlorinator/translations/fr.json @@ -78,10 +86,13 @@ custom_components/astralpool_halo_chlorinator/manifest.json custom_components/astralpool_halo_chlorinator/sensor.py custom_components/astralpool_halo_chlorinator/switch.py ``` + 7. Restart Home Assistant when instructed. # Configuration + ## Configuration is done in the Home Assistant UI + 1. Visit your [HomeAssistant Integrations Dashboard](https://my.home-assistant.io/redirect/integrations) [![Open your Home Assistant Integrations Dashboard.](https://my.home-assistant.io/badges/integrations.svg)](https://my.home-assistant.io/redirect/integrations/) @@ -89,9 +100,11 @@ custom_components/astralpool_halo_chlorinator/switch.py 2. Wait patiently for your chlorinator to be discovered (should only be a few seconds once HA has started up) 3. When the Halo device is detected in Home Assistant, you will see a new HCHLOR integration card with button for 'Configure'. 4. Go to your physical Halo Control Panel (the one near your pool) to start the pairing process. + - Take a mobile device or laptop with you so you can control Home Assistant and the Chlorinator from the same place. ## Pair Your HALO + 1. Open your Home Assistant Integrations page 2. Click the 'Configure' button on the newly discovered HCHLOR device. 3. Press submit to confirm 'add device'. @@ -101,36 +114,37 @@ custom_components/astralpool_halo_chlorinator/switch.py 7. Your Halo should now be added to HA as 1 new device with ~19 entities. Troubleshooting: + 1. The HA pairing discovery may either error or the circle might just spin forever. 2. If it errors, hit config / add / confirm again (whilst the Halo is still in pairing mode). 3. If it is spinning, just wait approx 30 seconds, then cancel it, and hit configure again. 4. Repeat as needed until the pairing is successful. - # Note + Halo only supports one concurrent Bluetooth or Cloud connection at any point in time. While Home Assistant is polling your Halo, you will not be able to use your mobile app to connect to the Halo either via Bluetooth or Cloud. -Likewise, while your mobile is connected, Home Assistant will not be able to poll the Halo. +Likewise, while your mobile is connected, Home Assistant will not be able to poll the Halo. If you need to access Halo from your mobile while Home Assistant is connected, you will have to wait for the poll to finish and then open your mobile connection. -* Open your mobile app and look for a 'blue dot' next to your chlorinator. -* If it is NOT there, HA is currently polling for data (takes 20 seconds to complete). -* As soon as the blue dot appears, you will be able to connect to it from your mobile. +- Open your mobile app and look for a 'blue dot' next to your chlorinator. +- If it is NOT there, HA is currently polling for data (takes 20 seconds to complete). +- As soon as the blue dot appears, you will be able to connect to it from your mobile. # Other interesting links ## Hidden Menu + Halo has a hidden system menu that allows you to display the actual ORP value on the Halo screen and also on the app screen. Here is a video on how to access the menu. https://www.youtube.com/watch?v=zaRFVSt8Hc4 - ## Pool Monitor Card + https://github.com/wilsto/pool-monitor-card The "Pool Monitor Card" is a home assistant plugin that display information of 12 pre-defined sensors of your swimming pool : temperature, pH, ORP levels and TDS but also if you need them : salinity, CYA, calcium, phosphate, alkalinity, free chlorine, total chlorine, filter pressure - ## Credits From 217e56a9a6536fbcbe4a18d58baeae70b1a9cf97 Mon Sep 17 00:00:00 2001 From: Daniel Nagy Date: Fri, 19 Apr 2024 16:08:49 +1000 Subject: [PATCH 2/2] Add PH Status. Fixed ph device classes --- .../astralpool_halo_chlorinator/manifest.json | 2 +- .../astralpool_halo_chlorinator/sensor.py | 27 ++++++++++++------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/custom_components/astralpool_halo_chlorinator/manifest.json b/custom_components/astralpool_halo_chlorinator/manifest.json index b93a08c..17174b9 100644 --- a/custom_components/astralpool_halo_chlorinator/manifest.json +++ b/custom_components/astralpool_halo_chlorinator/manifest.json @@ -19,7 +19,7 @@ "iot_class": "local_polling", "requirements": [ "bluetooth-data-tools>=0.4.0", - "pychlorinator>=0.2.10" + "pychlorinator>=0.2.11" ], "version": "0.1.7" } \ No newline at end of file diff --git a/custom_components/astralpool_halo_chlorinator/sensor.py b/custom_components/astralpool_halo_chlorinator/sensor.py index 5bbae4c..1b357eb 100644 --- a/custom_components/astralpool_halo_chlorinator/sensor.py +++ b/custom_components/astralpool_halo_chlorinator/sensor.py @@ -1,4 +1,5 @@ """Platform for sensor integration.""" + from __future__ import annotations import logging @@ -27,8 +28,8 @@ key="ph_measurement", icon="mdi:ph", name="pH", - native_unit_of_measurement=None, - device_class=None, + # native_unit_of_measurement="pH", + device_class=SensorDeviceClass.PH, state_class=SensorStateClass.MEASUREMENT, ), "mode": SensorEntityDescription( @@ -55,6 +56,14 @@ device_class=SensorDeviceClass.ENUM, state_class=None, ), + "ph_control_status": SensorEntityDescription( + key="ph_control_status", + icon="mdi:beaker-outline", + name="pH status", + native_unit_of_measurement=None, + device_class=SensorDeviceClass.ENUM, + state_class=None, + ), "info_message": SensorEntityDescription( key="info_message", icon="mdi:information-outline", @@ -67,8 +76,8 @@ key="ph_control_setpoint", icon="mdi:ph", name="pH setpoint", - native_unit_of_measurement=None, - device_class=None, + # native_unit_of_measurement="pH", + device_class=SensorDeviceClass.PH, state_class=SensorStateClass.MEASUREMENT, ), "chlorine_control_setpoint": SensorEntityDescription( @@ -108,8 +117,8 @@ icon="mdi:chart-line", name="Litres left to Filter", native_unit_of_measurement="L", - device_class=None, - state_class=SensorStateClass.MEASUREMENT, + device_class=SensorDeviceClass.VOLUME, + state_class=SensorStateClass.TOTAL, entity_category=EntityCategory.DIAGNOSTIC, ), "DosingPumpSecs": SensorEntityDescription( @@ -117,8 +126,8 @@ icon="mdi:chart-line", name="Dosing Pump today (ml)", native_unit_of_measurement="mL", - device_class=None, - state_class=SensorStateClass.MEASUREMENT, + device_class=SensorDeviceClass.VOLUME, + state_class=SensorStateClass.TOTAL, entity_category=EntityCategory.DIAGNOSTIC, ), "WaterTemp": SensorEntityDescription( @@ -126,7 +135,7 @@ icon="mdi:temperature-celsius", name="Water Temperature", native_unit_of_measurement="°C", - device_class="temperature", + device_class=SensorDeviceClass.TEMPERATURE, state_class=SensorStateClass.MEASUREMENT, ), "CellCurrentmA": SensorEntityDescription(