From 5187fbb4b7b9f9a4511fae36f91aa22ad91df869 Mon Sep 17 00:00:00 2001 From: Pierre-Luc Milord <46912935+plmilord@users.noreply.github.com> Date: Sun, 26 May 2024 14:38:14 -0400 Subject: [PATCH] Spa Client v3.0 - Added fault log sensor (shows last fault message in list) - Updated lighting entity to handle color mode requirements - Code cleanup --- README.md | 5 +- custom_components/spaclient/__init__.py | 11 +- custom_components/spaclient/const.py | 24 + custom_components/spaclient/light.py | 12 +- custom_components/spaclient/manifest.json | 2 +- custom_components/spaclient/sensor.py | 60 + custom_components/spaclient/spaclient.py | 1380 +++++++++++---------- custom_components/spaclient/switch.py | 2 +- images/preview.png | Bin 46046 -> 68736 bytes 9 files changed, 851 insertions(+), 645 deletions(-) create mode 100644 custom_components/spaclient/sensor.py diff --git a/README.md b/README.md index bcdf9a8..8220c03 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Since the event where my spa emptied when it was -30°C outside and it took me a while to find out (luckily, more fear than harm!)... I tried to find a solution to better supervise my spa! Initially, I wanted to replicate my iPhone's **Coast Spas** App in Home Assistant so that I could create notifications, track, control and automate/script some stuff. I was also looking to replicate my home automation in the **Home** App to simplify my family's access to all my different platforms. Home Assistant was the perfect fit for that! -**Spa Client** is inspired by several similar projects and the work of many people. With version 2.0, several elements have been improved in order to represent the App **Coast Spas** as faithfully as possible. During installation, all the components are created according to the configuration of your spa! +**Spa Client** is inspired by several similar projects and the work of many people. With version 2.0 and later, several elements have been improved in order to represent the App **Coast Spas** as faithfully as possible. During installation, all the components are created according to the configuration of your spa! ## What you need @@ -64,6 +64,7 @@ Filter Cycle 2 Begins | Time | ✓ | N/A Filter Cycle 2 Runs | Time | ✓ | N/A Filter Cycle 2 Status | Binary sensor | ✓ | Begins, Runs, Ends Heat Mode | Switch | ✓ | Ready, Rest, Ready in Rest +Last Known Fault | Sensor | ✓ | N/A Light 1 | Light | ✓ | False, True Light 2 | Light | ? | False, True Mister | Switch | ? | Off, On @@ -90,7 +91,6 @@ Time sync with Home Assistant | ✓ - [ ] Bring back the ability to configure this custom component via the entries in configuration.yaml - [ ] Change the way I update entities (from polling mode to subscribing to updates) -- [ ] Implement the other spa messages (fault log, gfi test, etc.) ### Completed @@ -99,6 +99,7 @@ Time sync with Home Assistant | ✓ - [x] Allow the installation of this custom component through the Home Assistant integrations menu (use of config_flow.py) - [x] Create an icon and logo for this custom component - [x] Customize entity IDs with **Spa Client** custom name to allow multiple integrations in the same Home Assistant instance +- [x] Implement the other spa messages (fault log, gfi test, etc.) - [x] Investigate why it takes so long to load the component on an RPi (~2s on docker; ~85s on RPi3) - [x] Manage the availability of entities while not connected diff --git a/custom_components/spaclient/__init__.py b/custom_components/spaclient/__init__.py index 6afdb44..84fc6e8 100644 --- a/custom_components/spaclient/__init__.py +++ b/custom_components/spaclient/__init__.py @@ -67,16 +67,19 @@ async def async_setup_entry(hass, config_entry): if not connected: raise ConfigEntryNotReady - await spa.send_module_identification_request() - await spa.send_configuration_request() - await spa.send_information_request() await spa.send_additional_information_request() + await spa.send_configuration_request() + await spa.send_fault_log_request() await spa.send_filter_cycles_request() + await spa.send_gfci_test_request() + await spa.send_information_request() + await spa.send_module_identification_request() + await spa.send_preferences_request() await update_listener(hass, config_entry) - hass.loop.create_task(spa.read_all_msg()) hass.loop.create_task(spa.keep_alive_call()) + hass.loop.create_task(spa.read_all_msg()) for component in SPACLIENT_COMPONENTS: hass.async_create_task(hass.config_entries.async_forward_entry_setup(config_entry, component)) diff --git a/custom_components/spaclient/const.py b/custom_components/spaclient/const.py index f87735a..f3129c2 100644 --- a/custom_components/spaclient/const.py +++ b/custom_components/spaclient/const.py @@ -14,15 +14,39 @@ "binary_sensor", "climate", "light", + "sensor", "switch", "time", ] +FAULT_MSG = { + 15: "Sensors are out of sync", + 16: "The water flow is low", + 17: "The water flow has failed", + 18: "The settings have been reset", + 19: "Priming Mode", + 20: "The clock has failed", + 21: "The settings have been reset", + 22: "Program memory failure", + 26: "Sensors are out of sync -- Call for service", + 27: "The heater is dry", + 28: "The heater may be dry", + 29: "The water is too hot", + 30: "The heater is too hot", + 31: "Sensor A Fault", + 32: "Sensor B Fault", + 34: "A pump may be stuck on", + 35: "Hot fault", + 36: "The GFCI test failed", + 37: "Standby Mode (Hold Mode)" +} + ICONS = { "Auxiliary 1": "mdi:numeric-1-circle-outline", "Auxiliary 2": "mdi:numeric-2-circle-outline", "Blower": "mdi:weather-windy", "Circulation Pump": "mdi:fan", + "Fault Log": "mdi:archive-alert", "Filter Cycle": "mdi:sync", "Heat Mode": "mdi:alpha-r", "Mister": "mdi:auto-fix", diff --git a/custom_components/spaclient/light.py b/custom_components/spaclient/light.py index 2e0b0aa..756c539 100644 --- a/custom_components/spaclient/light.py +++ b/custom_components/spaclient/light.py @@ -3,7 +3,7 @@ from . import SpaClientDevice from .const import _LOGGER, DOMAIN, SPA from datetime import timedelta -from homeassistant.components.light import LightEntity +from homeassistant.components.light import ColorMode, LightEntity SCAN_INTERVAL = timedelta(seconds=1) @@ -42,6 +42,16 @@ def name(self): """Return the name of the device.""" return 'Light ' + str(self._light_num) + @property + def color_mode(self): + """Return the color mode of the light.""" + return ColorMode.ONOFF + + @property + def supported_color_modes(self): + """Return supported color modes.""" + return [ColorMode.ONOFF] + @property def is_on(self): """Return true if light is on.""" diff --git a/custom_components/spaclient/manifest.json b/custom_components/spaclient/manifest.json index f631ed7..418ab39 100644 --- a/custom_components/spaclient/manifest.json +++ b/custom_components/spaclient/manifest.json @@ -6,5 +6,5 @@ "documentation": "https://github.com/plmilord/Hass.io-custom-component-spaclient", "iot_class": "local_push", "issue_tracker": "https://github.com/plmilord/Hass.io-custom-component-spaclient/issues", - "version": "2.83" + "version": "3.0" } \ No newline at end of file diff --git a/custom_components/spaclient/sensor.py b/custom_components/spaclient/sensor.py new file mode 100644 index 0000000..fec7076 --- /dev/null +++ b/custom_components/spaclient/sensor.py @@ -0,0 +1,60 @@ +"""Support for Spa Client sensors.""" +# Import the device class from the component that you want to support +from . import SpaClientDevice +from .const import _LOGGER, DOMAIN, ICONS, FAULT_MSG, SPA +from datetime import timedelta +from homeassistant.components.sensor import SensorEntity + +SCAN_INTERVAL = timedelta(seconds=1) + + +async def async_setup_entry(hass, config_entry, async_add_entities): + """Set up the Spa Client sensors.""" + + spaclient = hass.data[DOMAIN][config_entry.entry_id][SPA] + entities = [] + + entities.append(SpaFaultLog(spaclient, config_entry)) + + async_add_entities(entities, True) + + +class SpaFaultLog(SpaClientDevice, SensorEntity): + """Representation of a sensor.""" + + def __init__(self, spaclient, config_entry): + """Initialize the device.""" + super().__init__(spaclient, config_entry) + self._spaclient = spaclient + self._sensor_type = None + self._icon = ICONS.get('Fault Log') + + @property + def unique_id(self) -> str: + """Return a unique ID.""" + return f"{self._spaclient.get_macaddr().replace(':', '')}#fault_log" + + @property + def device_class(self): + """Return the class of this sensor.""" + return self._sensor_type + + @property + def name(self): + """Return the name of the sensor.""" + return 'Last Known Fault' + + @property + def icon(self): + """Return the icon of the device.""" + return self._icon + + @property + def native_value(self): + """Return the state of this sensor.""" + return FAULT_MSG.get(self._spaclient.get_fault_log_msg_code()) + + @property + def available(self) -> bool: + """Return True if entity is available.""" + return self._spaclient.get_gateway_status() diff --git a/custom_components/spaclient/spaclient.py b/custom_components/spaclient/spaclient.py index d6f8c81..7a333ac 100644 --- a/custom_components/spaclient/spaclient.py +++ b/custom_components/spaclient/spaclient.py @@ -12,11 +12,11 @@ class spaclient: def __init__(self, host_ip): - """ socket variables """ - self.is_connected = False - self.l = Lock() - self.s = None - self.host_ip = host_ip + """ Socket variables """ + self.socket_is_connected = False + self.socket_l = Lock() + self.socket_s = None + self.socket_host_ip = host_ip """ Status update variable """ self.status_chunk_array = [] @@ -49,63 +49,90 @@ def __init__(self, host_ip): self.set_temp = 0 """ Information variables """ - self.model_name = "Unknown" - self.cfg_sig = "Unknown" - self.sw_vers = "Unknown" - self.setup = 0 - self.ssid = "Unknown" - self.heater_voltage = "Unknown" - self.heater_type = "Unknown" - self.dip_switch = "0000000000000000" + self.info_model_name = "Unknown" + self.info_cfg_sig = "Unknown" + self.info_sw_vers = "Unknown" + self.info_setup = 0 + self.info_ssid = "Unknown" + self.info_heater_voltage = "Unknown" + self.info_heater_type = "Unknown" + self.info_dip_switch = "0000000000000000" self.information_loaded = False """ Configuration variables """ - self.pump_array = [0, 0, 0, 0, 0, 0] - self.light_array = [0, 0] - self.circ_pump_array = [0] - self.blower_array = [0] - self.mister_array = [0] - self.aux_array = [0, 0] + self.cfg_pump_array = [0, 0, 0, 0, 0, 0] + self.cfg_light_array = [0, 0] + self.cfg_circ_pump_array = [0] + self.cfg_blower_array = [0] + self.cfg_mister_array = [0] + self.cfg_aux_array = [0, 0] self.configuration_loaded = False """ Module identification variables """ - self.macaddr = "Unknown" - self.idigi_device_id = "Unknown" + self.id_macaddr = "Unknown" + self.id_mac_oui = "Unknown" + self.id_mac_nic = "Unknown" self.module_identification_loaded = False """ Filter cycles variables """ - self.filter1_begins_hour = 0 - self.filter1_begins_minute = 0 - self.filter1_runs_hour = 0 - self.filter1_runs_minute = 0 - self.filter2_enabled = 0 - self.filter2_begins_hour = 0 - self.filter2_begins_minute = 0 - self.filter2_runs_hour = 0 - self.filter2_runs_minute = 0 + self.filter_1_begins_hour = 0 + self.filter_1_begins_minute = 0 + self.filter_1_runs_hour = 0 + self.filter_1_runs_minute = 0 + self.filter_2_enabled = 0 + self.filter_2_begins_hour = 0 + self.filter_2_begins_minute = 0 + self.filter_2_runs_hour = 0 + self.filter_2_runs_minute = 0 self.filter_cycles_loaded = False """ Additional information variables """ - self.low_range_min = 0 - self.low_range_max = 0 - self.high_range_min = 0 - self.high_range_max = 0 - self.nb_of_pumps = 0 + self.add_info_low_range_min = 0 + self.add_info_low_range_max = 0 + self.add_info_high_range_min = 0 + self.add_info_high_range_max = 0 + self.add_info_nb_of_pumps = 0 self.additional_information_loaded = False + """ Preferences variables """ + self.pref_reminder = "Off" + self.pref_temp_scale = "Fahrenheit" + self.pref_clock_mode = "24 Hr" + self.pref_clean_up_cycle = 0 + self.pref_dolphin_address = 0 + self.pref_m8_ai = "Off" + self.preferences_loaded = False + + """ Fault log variables """ + self.fault_log_total_entries = 0 + self.fault_log_entry_nb = 0 + self.fault_log_msg_code = 0 + self.fault_log_days_ago = 0 + self.fault_log_msg_hour = 0 + self.fault_log_msg_minute = 0 + self.fault_log_todo = 0 + self.fault_log_set_temp = 0 + self.fault_log_sensor_a_temp = 0 + self.fault_log_sensor_b_temp = 0 + self.fault_log_loaded = False + + """ GFCI test variables """ + self.gfci_test_result = 0 + self.gfci_test_loaded = False + async def get_socket(self): - if self.s is None: - self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.s.settimeout(5) + if self.socket_s is None: + self.socket_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.socket_s.settimeout(5) try: - self.s.connect((self.host_ip, 4257)) + self.socket_s.connect((self.socket_host_ip, 4257)) return True except (socket.timeout, socket.error) as e: #_LOGGER.error("Socket connection error: %s", e) #Validation point - self.is_connected = False - self.s.close() - self.s = None + self.socket_is_connected = False + self.socket_s.close() + self.socket_s = None return True async def validate_connection(self): @@ -113,17 +140,369 @@ async def validate_connection(self): await self.get_socket() - if self.s is not None: - while count < 20 or self.is_connected == False: + if self.socket_s is not None: + while count < 20 or self.socket_is_connected == False: self.read_msg() await asyncio.sleep(.1) count += 1 - if self.is_connected == False: - self.s.close() - self.s = None + if self.socket_is_connected == False: + self.socket_s.close() + self.socket_s = None + + return self.socket_is_connected + + async def keep_alive_call(self): + while True: + if self.socket_s is None: + await self.get_socket() + else: + await self.send_fault_log_request() + await asyncio.sleep(30) + + def compute_checksum(self, length, payload): + crc = 0xb5 + for cur in range(length): + for i in range(8): + bit = crc & 0x80 + crc = ((crc << 1) & 0xff) | ((payload[cur] >> (7 - i)) & 0x01) + if bit: + crc = crc ^ 0x07 + crc &= 0xff + for i in range(8): + bit = crc & 0x80 + crc = (crc << 1) & 0xff + if bit: + crc ^= 0x07 + return crc ^ 0x02 + + def read_msg(self): + self.socket_l.acquire() + + try: + len_chunk = self.socket_s.recv(2) + except (socket.timeout, socket.error) as e: + #_LOGGER.error("self.socket_s.recv(2) error = %s", e) #Validation point + self.socket_is_connected = False + self.socket_l.release() + self.socket_s.close() + self.socket_s = None + return True + + if len_chunk == b'~' or len_chunk == b'' or len(len_chunk) == 0: + self.socket_l.release() + return True + + length = len_chunk[1] + + if int(length) == 0: + self.socket_l.release() + return True + + try: + chunk = self.socket_s.recv(length) + except (socket.timeout, socket.error) as e: + #_LOGGER.error("self.socket_s.recv(length) error = %s", e) #Validation point + self.socket_is_connected = False + self.socket_l.release() + self.socket_s.close() + self.socket_s = None + return True + + self.socket_l.release() + + if chunk != self.status_chunk_array: + if chunk[0:3] == b'\xff\xaf\x13' and ((self.information_loaded and self.additional_information_loaded and self.preferences_loaded and self.configuration_loaded and self.module_identification_loaded) or (self.socket_is_connected == False)): + #_LOGGER.info("Status update = %s", chunk[3:]) #Validation point + self.parse_status_update(chunk[3:]) + self.status_chunk_array = chunk + self.socket_is_connected = True + return True + + if chunk[0:3] == b'\x0a\xbf\x23': + #_LOGGER.info("Filter cycles response = %s", chunk[3:]) #Validation point + self.parse_filter_cycles_response(chunk[3:]) + return True + + if chunk[0:3] == b'\x0a\xbf\x24' and self.information_loaded != True: + #_LOGGER.info("Information response = %s", chunk[3:]) #Validation point + self.parse_information_response(chunk[3:]) + return True + + if chunk[0:3] == b'\x0a\xbf\x25' and self.additional_information_loaded != True: + #_LOGGER.info("Additional information response = %s", chunk[3:]) #Validation point + self.parse_additional_information_response(chunk[3:]) + return True + + if chunk[0:3] == b'\x0a\xbf\x26' and self.preferences_loaded != True: + #_LOGGER.info("Preferences response = %s", chunk[3:]) #Validation point + self.parse_preferences_response(chunk[3:]) + return True + + if chunk[0:3] == b'\x0a\xbf\x28': + #_LOGGER.info("Fault log response = %s", chunk[3:]) #Validation point + self.parse_fault_log_response(chunk[3:]) + return True + + if chunk[0:3] == b'\x0a\xbf\x2b': + #_LOGGER.info("GFCI test response = %s", chunk[3:]) #Validation point + self.parse_gfci_test_response(chunk[3:]) + return True + + if chunk[0:3] == b'\x0a\xbf\x2e' and self.configuration_loaded != True: + #_LOGGER.info("Configuration response = %s", chunk[3:]) #Validation point + self.parse_configuration_response(chunk[3:]) + return True + + if chunk[0:3] == b'\x0a\xbf\x94' and self.module_identification_loaded != True: + #_LOGGER.info("Module identification response = %s", chunk[3:]) #Validation point + self.parse_module_identification_response(chunk[3:]) + return True + + return True + + async def read_all_msg(self): + while True: + if self.socket_s is not None: + self.read_msg() + await asyncio.sleep(.1) + + + def parse_additional_information_response(self, byte_array): + """ Parse additional information response. + + SSID Length + M100_210 V6.0 14 + M100_225 V36.0 14 + M100_201 V44.0 15 + + 00 01 02 03 04 05 06 07 08 + MS ML MT MT MT 00 01 LL LH HL HH 06 07 08 CS ME + 7E 0E 0A BF 25 7E + + 00: ? + 01: ? + LL: Low Low - Low range temperature's minimum in Fahrenheit + LH: Low High - Low range temperature's maximum in Fahrenheit + HL: High Low - High range temperature's minimum in Fahrenheit + HH: High High - High range temperature's maximum in Fahrenheit + 06: ? + 07: Number of pumps + 08: ? + + """ + + self.add_info_low_range_min = byte_array[2] + self.add_info_low_range_max = byte_array[3] + self.add_info_high_range_min = byte_array[4] + self.add_info_high_range_max = byte_array[5] + + self.add_info_nb_of_pumps = ( + (byte_array[7] & 0x01) + + (byte_array[7] >> 1 & 0x01) + + (byte_array[7] >> 2 & 0x01) + + (byte_array[7] >> 3 & 0x01) + + (byte_array[7] >> 4 & 0x01) + + (byte_array[7] >> 5 & 0x01) + ) + + self.additional_information_loaded = True + + def parse_configuration_response(self, byte_array): + """ Parse a panel config response. + + 00 01 02 03 04 05 + MS ML MT MT MT 00 01 02 03 04 05 CS ME + 7E 0B 0A BF 2E 7E + + 00: P4P3P2P1 - Pumps 1-4 (0 = None, 1 = 1-speed, 2 = 2-speed) + 01: P6xxxxP5 - Pumps 5-6 (0 = None, 1 = 1-speed, 2 = 2-speed) + 02: L2xxxxL1 - Lights (0 = None, 1 = Present) + 03: CxxxxxBL - Circulation pump, Blower (0 = None, 1 = Present) + 04: xxMIxxAA - Mister, Aux2, Aux1 (0 = None, 1 = Present) + 05: ? + + """ + + self.cfg_pump_array[0] = int((byte_array[0] & 0x03)) + self.cfg_pump_array[1] = int((byte_array[0] & 0x0c) >> 2) + self.cfg_pump_array[2] = int((byte_array[0] & 0x30) >> 4) + self.cfg_pump_array[3] = int((byte_array[0] & 0xc0) >> 6) + self.cfg_pump_array[4] = int((byte_array[1] & 0x03)) + self.cfg_pump_array[5] = int((byte_array[1] & 0xc0) >> 6) + + self.cfg_light_array[0] = int((byte_array[2] & 0x03) != 0) + self.cfg_light_array[1] = int((byte_array[2] & 0xc0) != 0) + + self.cfg_circ_pump_array[0] = int((byte_array[3] & 0x80) != 0) + self.cfg_blower_array[0] = int((byte_array[3] & 0x03) != 0) + self.cfg_mister_array[0] = int((byte_array[4] & 0x30) != 0) + + self.cfg_aux_array[0] = int((byte_array[4] & 0x01) != 0) + self.cfg_aux_array[1] = int((byte_array[4] & 0x02) != 0) + + self.configuration_loaded = True + + def parse_fault_log_response(self, byte_array): + """ Parse fault log response. + + 00 01 02 03 04 05 06 07 08 09 + MS ML MT MT MT 00 01 02 03 04 05 06 07 08 09 CS ME + 7E 0F 0A BF 28 7E + + 00: Total Entries (0-24) + 01: Entry Number (0-23 (0=Entry #1)) + 02: Message Code + 03: Days Ago (0-255?) + 04: Time: Hour (0-23) + 05: Time: Minute (0-59) + 06: Flags TODO + 07: Set Temperature (Temperature scaled by Temperature Scale) + 08: Sensor A Temperature (Temperature scaled by Temperature Scale) + 09: Sensor B Temperature (Temperature scaled by Temperature Scale) + + """ + self.fault_log_total_entries = byte_array[0] + self.fault_log_entry_nb = byte_array[1] + self.fault_log_msg_code = byte_array[2] + self.fault_log_days_ago = byte_array[3] + self.fault_log_msg_hour = byte_array[4] + self.fault_log_msg_minute = byte_array[5] + self.fault_log_todo = byte_array[6] + self.fault_log_set_temp = byte_array[7] + self.fault_log_sensor_a_temp = byte_array[8] + self.fault_log_sensor_b_temp = byte_array[9] + + self.fault_log_loaded = True + + def parse_filter_cycles_response(self, byte_array): + """ Parse filter cycles response. + + 00 01 02 03 04 05 06 07 + MS ML MT MT MT 1H 1M 1D 1E 2H 2M 2D 2E CS ME + 7E 0D 0A BF 23 7E + + 1H: Filter 1 begins hour (0-23) + 1M: Filter 1 begins minute (0-59) + 1D: Filter 1 runs hour (0-23) + 1E: Filter 1 runs minute (0-59) + 2H: Filter 2 begins hour (0-23), masking out the high order bit, which is used as an enable/disable flag + 2M: Filter 2 begins minute (0-59) + 2D: Filter 2 runs hour (0-23) + 2E: Filter 2 runs minute (0-59) + + """ + + self.filter_1_begins_hour = byte_array[0] + self.filter_1_begins_minute = byte_array[1] + self.filter_1_runs_hour = byte_array[2] + self.filter_1_runs_minute = byte_array[3] + self.filter_2_enabled = byte_array[4] >> 7 + self.filter_2_begins_hour = byte_array[4] ^ (self.filter_2_enabled << 7) + self.filter_2_begins_minute = byte_array[5] + self.filter_2_runs_hour = byte_array[6] + self.filter_2_runs_minute = byte_array[7] + + self.filter_cycles_loaded = True + + def parse_gfci_test_response(self, byte_array): + """ Parse fault log response. + + 00 + MS ML MT MT MT 00 CS ME + 7E 06 0A BF 2B 7E + + 00: 0x00 = N/A ? or FAIL? + 0x01 = PASS + + """ + + self.gfci_test_result = byte_array[0] + + self.gfci_test_loaded = True + + def parse_information_response(self, byte_array): + """ Parse information response. + + 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 + MS ML MT MT MT I0 I1 V0 V1 M0 M1 M2 M3 M4 M5 M6 M7 SU S0 S1 S2 S3 HV HT D0 D1 CS ME + 7E 1A 0A BF 24 7E + + I0-I1: Software ID (SSID) (Displayed (in decimal) as "M_ V[.]" + V0-V1 + M0-M7: System Model Number (ASCII-encoded string) + SU : Current Configuration Setup Number + S1-S3: Configuration Signature (Checksum of the system configuration file) + HV : Heat Voltage (0x01 = 240, other = Unknown) + HT : Heater Type (0x0A = Standard, other = Unknown) + D0-D1: DIP Switch Settings (bit 0 of Byte 19 is position 1) + + """ + + model = [byte_array[4], byte_array[5], byte_array[6], byte_array[7], byte_array[8], byte_array[9], byte_array[10], byte_array[11]] + model_name = "".join(map(chr, model)) + self.info_model_name = model_name.strip() + + self.info_sw_vers = f"{str(byte_array[2])}.{str(byte_array[3])}" + self.info_setup = byte_array[12] + self.info_ssid = f"M{str(byte_array[0])}_{str(byte_array[1])} V{self.info_sw_vers}" + self.info_cfg_sig = f"{byte_array[13]:x}{byte_array[14]:x}{byte_array[15]:x}{byte_array[16]:x}" + self.info_heater_voltage = 240 if byte_array[17] == 0x01 else "Unknown" + self.info_heater_type = "Standard" if byte_array[18] == 0x0A else "Unknown" + self.info_dip_switch = f"{byte_array[19]:08b}{byte_array[20]:08b}" + + self.information_loaded = True + + def parse_module_identification_response(self, byte_array): + """ Parse a module identification response. + + 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 + MS ML MT MT MT 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 CS ME + 7E 1E 0A BF 94 7E + + 00-02: ? + 03-08: MAC Address + 09-16: ? (0) + 17-19: MAC Address Organizationally Unique Identifier (OUI) (Balboa Instruments = 00:15:27) + 20-21: ? (0xFF) + 22-24: MAC Address Network Interface Controller (NIC) (Specific) + + """ + + self.id_macaddr = f"{byte_array[3]:02x}:{byte_array[4]:02x}:{byte_array[5]:02x}:{byte_array[6]:02x}:{byte_array[7]:02x}:{byte_array[8]:02x}" + self.id_mac_oui = f"{byte_array[17]:02x}:{byte_array[18]:02x}:{byte_array[19]:02x}" + self.id_mac_nic = f"{byte_array[22]:02x}:{byte_array[23]:02x}:{byte_array[24]:02x}" + + self.module_identification_loaded = True + + def parse_preferences_response(self, byte_array): + """ Parse preferences response. + + 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 + MS ML MT MT MT 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 CS ME + 7E 17 0A BF 26 7E + + 00: ? + 01: Reminders (0 = OFF, 1 = ON) + 02: ? + 03: Temperature Scale (0 = Fahrenheit, 1 = Celsius) + 04: Clock Mode (0 = 12 hour time, 1 = 24 hour time) + 05: Clean-up Cycle (0 = OFF, 1-8 (30 minute increments)) + 06: Dolphin Address (0 = None, 1-7 = Address) + 07: ? + 08: M8 Artificial Intelligence (0 = OFF, 1 = ON) + 09-17: ? + + """ + + self.pref_reminder = ("Off", "On")[byte_array[1] & 0x01] + self.pref_temp_scale = ("Fahrenheit", "Celsius")[byte_array[3] & 0x01] + self.pref_clock_mode = ("12 Hr", "24 Hr")[byte_array[4] & 0x01] + self.pref_clean_up_cycle = byte_array[5] + self.pref_dolphin_address = byte_array[6] + self.pref_m8_ai = ("Off", "On")[byte_array[8] & 0x01] - return self.is_connected + self.preferences_loaded = True def parse_status_update(self, byte_array): """ Parse a status update from the spa. @@ -131,7 +510,10 @@ def parse_status_update(self, byte_array): SSID Length M100_210 V6.0 28 M100_220 V20.0 29 + M100_225 V36.0 29 M100_201 V44.0 32 + M100_201 V47.0 32 + M100_220 V50.0 32 MS: Message Start (always 0x7e "~") ML: Message Length @@ -150,16 +532,16 @@ def parse_status_update(self, byte_array): 0x17 = Test Mode F1: 0x00 = Idle 0x01 = Priming Mode - 0x02 = Post-Settings Reset? + 0x02 = Fault? 0x03 = Reminder 0x04 = Stage 1? 0x05 = Stage 3? 0x42 = Stage 2? CT: Current Temperature (divide by two if in Celsius; 0xFF if unknown) - HH: Hour (always 0-24, even in 12 hour mode; flag is used to control display) + HH: Hour (always 0-23, even in 12 hour mode; flag is used to control display) MM: Minute (0-59) F2: 0x03 = Heating Mode (0 = Ready, 1 = Rest, 3 = Ready in rest) - 06: Reminder Type (0x00 = None, 0x0A = Check the pH, 0x09 = Check the sanitizer) + 06: Reminder Type (0x00 = None, 0x04 = Clean filter, 0x0A = Check the pH, 0x09 = Check the sanitizer, 0x1E = Fault?) TA: Sensor A Temperature / Hold Timer (Minutes if Hold Mode else Temperature (scaled by Temperature Scale) if A/B Temps else 0x00) TB: Sensor B Temperature (0x00 if A/B Temps if OFF else Temperature (scaled by Temperature Scale)) F3: 0x01 = Temperature Scale (0 = Fahrenheit, 1 = Celsius) @@ -228,219 +610,103 @@ def parse_status_update(self, byte_array): self.aux2 = flag6 & 0x10 self.set_temp = byte_array[20] - def parse_filter_cycles_response(self, byte_array): - """ Parse filter cycles response. - 00 01 02 03 04 05 06 07 - MS ML MT MT MT 1H 1M 1D 1E 2H 2M 2D 2E CS ME - 7E 0D 0A BF 23 7E - - 1H: Filter 1 begins hour (always 0-24) - 1M: Filter 1 begins minute - 1D: Filter 1 runs hour - 1E: Filter 1 runs minute - 2H: Filter 2 begins hour, masking out the high order bit, which is used as an enable/disable flag - 2M: Filter 2 begins minute - 2D: Filter 2 runs hour - 2E: Filter 2 runs minute - - """ - - self.filter1_begins_hour = byte_array[0] - self.filter1_begins_minute = byte_array[1] - self.filter1_runs_hour = byte_array[2] - self.filter1_runs_minute = byte_array[3] - self.filter2_enabled = byte_array[4] >> 7 - self.filter2_begins_hour = byte_array[4] ^ (self.filter2_enabled << 7) - self.filter2_begins_minute = byte_array[5] - self.filter2_runs_hour = byte_array[6] - self.filter2_runs_minute = byte_array[7] - - self.filter_cycles_loaded = True - - def parse_information_response(self, byte_array): - """ Parse information response. - - 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 - MS ML MT MT MT I0 I1 V0 V1 M0 M1 M2 M3 M4 M5 M6 M7 SU S0 S1 S2 S3 HV HT D0 D1 CS ME - 7E 1A 0A BF 24 7E - - I0-I1: Software ID (SSID) (Displayed (in decimal) as "M_ V[.]" - V0-V1 - M0-M7: System Model Number (ASCII-encoded string) - SU : Current Configuration Setup Number - S1-S3: Configuration Signature (Checksum of the system configuration file) - HV : Heat Voltage (0x01 = 240, other = Unknown) - HT : Heater Type (0x0A = Standard, other = Unknown) - D0-D1: DIP Switch Settings (bit 0 of Byte 19 is position 1) - - """ - - model = [byte_array[4], byte_array[5], byte_array[6], byte_array[7], byte_array[8], byte_array[9], byte_array[10], byte_array[11]] - model_name = "".join(map(chr, model)) - self.model_name = model_name.strip() - - self.sw_vers = f"{str(byte_array[2])}.{str(byte_array[3])}" - self.setup = byte_array[12] - self.ssid = f"M{str(byte_array[0])}_{str(byte_array[1])} V{self.sw_vers}" - self.cfg_sig = f"{byte_array[13]:x}{byte_array[14]:x}{byte_array[15]:x}{byte_array[16]:x}" - self.heater_voltage = 240 if byte_array[17] == 0x01 else "Unknown" - self.heater_type = "Standard" if byte_array[18] == 0x0A else "Unknown" - self.dip_switch = f"{byte_array[19]:08b}{byte_array[20]:08b}" - - self.information_loaded = True - - def parse_additional_information_response(self, byte_array): - """ Parse additional information response. - - 00 01 02 03 04 05 06 07 08 - MS ML MT MT MT 00 01 LL LH HL HH 06 07 08 CS ME - 7E 0E 0A BF 25 7E - - 00: ? - 01: ? - LL: Low Low - Low range temperature's minimum in Fahrenheit - LH: Low High - Low range temperature's maximum in Fahrenheit - HL: High Low - High range temperature's minimum in Fahrenheit - HH: High High - High range temperature's maximum in Fahrenheit - 06: ? - 07: Number of pumps - 08: ? - - """ - - self.low_range_min = byte_array[2] - self.low_range_max = byte_array[3] - self.high_range_min = byte_array[4] - self.high_range_max = byte_array[5] - - self.nb_of_pumps = ( - (byte_array[7] & 0x01) - + (byte_array[7] >> 1 & 0x01) - + (byte_array[7] >> 2 & 0x01) - + (byte_array[7] >> 3 & 0x01) - + (byte_array[7] >> 4 & 0x01) - + (byte_array[7] >> 5 & 0x01) - ) - - self.additional_information_loaded = True - - def parse_preferences_response(self, byte_array): - """ Parse preferences response. - - 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 - MS ML MT MT MT 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 CS ME - 7E 17 0A BF 26 7E - - 00: ? - 01: Reminders (0 = OFF, 1 = OFF) - 02: ? - 03: Temperature Scale (0 = 1°F, 1 = 0.5°C) - 04: Clock Mode (0 = 12-hour, 1 = 24-hour) - 05: Clean-up Cycle (0 = OFF, 1-8 (30 minute increments)) - 06: Dolphin Address (0 = None, 1-7 = Address) - 07: ? - 08: M8 Artificial Intelligence (0 = OFF, 1 = ON) - 09-17: ? - - """ - - return True - - def parse_fault_log_response(self, byte_array): - """ Parse fault log response. - - 00 01 02 03 04 05 06 07 08 09 - MS ML MT MT MT 00 01 02 03 04 05 06 07 08 09 CS ME - 7E 0F 0A BF 28 7E - - 00: Total Entries (0-24) - 01: Entry Number (0-23 (0=Entry #1)) - 02: Message Code - 03: Days Ago (0-255?) - 04: Time: Hour (0-24) - 05: Time: Minute (0-59) - 06: Flags TODO - 07: Set Temperature (Temperature scaled by Temperature Scale) - 08: Sensor A Temperature (Temperature scaled by Temperature Scale) - 09: Sensor B Temperature (Temperature scaled by Temperature Scale) - - """ - - return True - - def parse_gfci_test_response(self, byte_array): - """ Parse fault log response. - - 00 - MS ML MT MT MT 00 CS ME - 7E 06 0A BF 2B 7E + def get_aux(self, aux_num): + if aux_num == 1: + return self.get_aux1() + else: + return self.get_aux2() - 00: 0x00 = N/A ? or FAIL? - 0x01 = PASS + def get_aux_list(self): + return self.cfg_aux_array - """ + def get_aux1(self): + return self.aux1 - return True + def get_aux2(self): + return self.aux2 - def parse_configuration_response(self, byte_array): - """ Parse a panel config response. + def get_blower(self): + return self.blower - 00 01 02 03 04 05 - MS ML MT MT MT 00 01 02 03 04 05 CS ME - 7E 0B 0A BF 2E 7E + def get_blower_list(self): + return self.cfg_blower_array - 00: P4P3P2P1 - Pumps 1-4 (0 = None, 1 = 1-speed, 2 = 2-speed) - 01: P6xxxxP5 - Pumps 5-6 (0 = None, 1 = 1-speed, 2 = 2-speed) - 02: L2xxxxL1 - Lights (0 = None, 1 = Present) - 03: CxxxxxBL - Circulation pump, Blower (0 = None, 1 = Present) - 04: xxMIxxAA - Mister, Aux2, Aux1 (0 = None, 1 = Present) - 05: ? + def get_circ_pump(self): + return self.circ_pump - """ + def get_circ_pump_list(self): + return self.cfg_circ_pump_array - self.pump_array[0] = int((byte_array[0] & 0x03)) - self.pump_array[1] = int((byte_array[0] & 0x0c) >> 2) - self.pump_array[2] = int((byte_array[0] & 0x30) >> 4) - self.pump_array[3] = int((byte_array[0] & 0xc0) >> 6) - self.pump_array[4] = int((byte_array[1] & 0x03)) - self.pump_array[5] = int((byte_array[1] & 0xc0) >> 6) + def get_current_temp(self): + return self.current_temp - self.light_array[0] = int((byte_array[2] & 0x03) != 0) - self.light_array[1] = int((byte_array[2] & 0xc0) != 0) + def get_current_time(self): + return "%d:%02d" % (self.hour, self.minute) - self.circ_pump_array[0] = int((byte_array[3] & 0x80) != 0) - self.blower_array[0] = int((byte_array[3] & 0x03) != 0) - self.mister_array[0] = int((byte_array[4] & 0x30) != 0) + def get_fault_log_msg_code(self): + return self.fault_log_msg_code - self.aux_array[0] = int((byte_array[4] & 0x01) != 0) - self.aux_array[1] = int((byte_array[4] & 0x02) != 0) + def get_filter_begins(self, filter_num): + if filter_num == 1: + return "%02d:%02d" % (self.filter_1_begins_hour, self.filter_1_begins_minute) + else: + return "%02d:%02d" % (self.filter_2_begins_hour, self.filter_2_begins_minute) - self.configuration_loaded = True + def get_filter_begins_hour(self, filter_num): + if filter_num == 1: + return self.filter_1_begins_hour + else: + return self.filter_2_begins_hour - def parse_module_identification_response(self, byte_array): - """ Parse a module identification response. + def get_filter_begins_minute(self, filter_num): + if filter_num == 1: + return self.filter_1_begins_minute + else: + return self.filter_2_begins_minute - 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 - MS ML MT MT MT 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 CS ME - 7E 1E 0A BF 94 7E + def get_filter_ends(self, filter_num): + if filter_num == 1: + if self.filter_1_begins_hour + self.filter_1_runs_hour >= 24: + return "%02d:%02d" % (self.filter_1_begins_hour + self.filter_1_runs_hour - 24, self.filter_1_begins_minute + self.filter_1_runs_minute) + return "%02d:%02d" % (self.filter_1_begins_hour + self.filter_1_runs_hour, self.filter_1_begins_minute + self.filter_1_runs_minute) + else: + if self.filter_2_begins_hour + self.filter_2_runs_hour >= 24: + return "%02d:%02d" % (self.filter_2_begins_hour + self.filter_2_runs_hour - 24, self.filter_2_begins_minute + self.filter_2_runs_minute) + return "%02d:%02d" % (self.filter_2_begins_hour + self.filter_2_runs_hour, self.filter_2_begins_minute + self.filter_2_runs_minute) - 00-02: ? - 03-08: MAC address - 09-24: iDigi device id (used to communicate with Balboa cloud API) + def get_filter_mode(self, filter_num): + if filter_num == 1: + if self.filter_mode == 1 or self.filter_mode == 3: + return True + else: + if self.filter_mode == 2 or self.filter_mode == 3: + return True + return False - """ + def get_filter_runs(self, filter_num): + if filter_num == 1: + return f"{self.filter_1_runs_hour} hours | {self.filter_1_runs_minute} minutes" + else: + return f"{self.filter_2_runs_hour} hours | {self.filter_2_runs_minute} minutes" - self.macaddr = f"{byte_array[3]:02x}:{byte_array[4]:02x}:{byte_array[5]:02x}:{byte_array[6]:02x}:{byte_array[7]:02x}:{byte_array[8]:02x}" - self.idigi_device_id = f"{byte_array[9:13].hex()}-{byte_array[13:17].hex()}-{byte_array[17:21].hex()}-{byte_array[21:25].hex()}".upper() + def get_filter_runs_hour(self, filter_num): + if filter_num == 1: + return self.filter_1_runs_hour + else: + return self.filter_2_runs_hour - self.module_identification_loaded = True + def get_filter_runs_minute(self, filter_num): + if filter_num == 1: + return self.filter_1_runs_minute + else: + return self.filter_2_runs_minute - def get_current_temp(self): - return self.current_temp + def get_filter2_enabled(self): + return self.filter_2_enabled - def get_current_time(self): - return "%d:%02d" % (self.hour, self.minute) + def get_gateway_status(self): + return self.socket_is_connected def get_heat_mode(self): return self.heat_mode @@ -448,46 +714,11 @@ def get_heat_mode(self): def get_heating(self): return self.heating - def get_temp_range(self): - return self.temp_range - - def get_pump(self, pump_num): - if pump_num == 1: - return self.get_pump1() - elif pump_num == 2: - return self.get_pump2() - elif pump_num == 3: - return self.get_pump3() - elif pump_num == 4: - return self.get_pump4() - elif pump_num == 5: - return self.get_pump5() - else: - return self.get_pump6() - - def get_pump1(self): - return self.pump1 - - def get_pump2(self): - return self.pump2 - - def get_pump3(self): - return self.pump3 - - def get_pump4(self): - return self.pump4 - - def get_pump5(self): - return self.pump5 - - def get_pump6(self): - return self.pump6 - - def get_circ_pump(self): - return self.circ_pump + def get_high_range_max(self): + return self.add_info_high_range_max - def get_blower(self): - return self.blower + def get_high_range_min(self): + return self.add_info_high_range_min def get_light(self, light_num): if light_num == 1: @@ -495,236 +726,119 @@ def get_light(self, light_num): else: return self.get_light2() + def get_light_list(self): + return self.cfg_light_array + def get_light1(self): return self.light1 def get_light2(self): return self.light2 - def get_mister(self): - return self.mister - - def get_aux(self, aux_num): - if aux_num == 1: - return self.get_aux1() - else: - return self.get_aux2() - - def get_aux1(self): - return self.aux1 - - def get_aux2(self): - return self.aux2 - - def get_set_temp(self): - return self.set_temp - - def get_low_range_min(self): - return self.low_range_min - def get_low_range_max(self): - return self.low_range_max - - def get_high_range_min(self): - return self.high_range_min - - def get_high_range_max(self): - return self.high_range_max + return self.add_info_low_range_max - def get_pump_list(self): - return self.pump_array - - def get_light_list(self): - return self.light_array + def get_low_range_min(self): + return self.add_info_low_range_min - def get_circ_pump_list(self): - return self.circ_pump_array + def get_macaddr(self): + return self.id_macaddr - def get_blower_list(self): - return self.blower_array + def get_mister(self): + return self.mister def get_mister_list(self): - return self.mister_array - - def get_aux_list(self): - return self.aux_array + return self.cfg_mister_array def get_model_name(self): - return self.model_name - - def get_ssid(self): - return self.ssid - - def get_macaddr(self): - return self.macaddr - - def get_gateway_status(self): - return self.is_connected - - def get_filter_begins_hour(self, filter_num): - if filter_num == 1: - return self.filter1_begins_hour - else: - return self.filter2_begins_hour - - def get_filter_begins_minute(self, filter_num): - if filter_num == 1: - return self.filter1_begins_minute - else: - return self.filter2_begins_minute - - def get_filter_runs_hour(self, filter_num): - if filter_num == 1: - return self.filter1_runs_hour - else: - return self.filter2_runs_hour - - def get_filter_runs_minute(self, filter_num): - if filter_num == 1: - return self.filter1_runs_minute - else: - return self.filter2_runs_minute - - def get_filter_begins(self, filter_num): - if filter_num == 1: - return "%02d:%02d" % (self.filter1_begins_hour, self.filter1_begins_minute) - else: - return "%02d:%02d" % (self.filter2_begins_hour, self.filter2_begins_minute) - - def get_filter_runs(self, filter_num): - if filter_num == 1: - return f"{self.filter1_runs_hour} hours | {self.filter1_runs_minute} minutes" - else: - return f"{self.filter2_runs_hour} hours | {self.filter2_runs_minute} minutes" - - def get_filter_ends(self, filter_num): - if filter_num == 1: - if self.filter1_begins_hour + self.filter1_runs_hour >= 24: - return "%02d:%02d" % (self.filter1_begins_hour + self.filter1_runs_hour - 24, self.filter1_begins_minute + self.filter1_runs_minute) - return "%02d:%02d" % (self.filter1_begins_hour + self.filter1_runs_hour, self.filter1_begins_minute + self.filter1_runs_minute) - else: - if self.filter2_begins_hour + self.filter2_runs_hour >= 24: - return "%02d:%02d" % (self.filter2_begins_hour + self.filter2_runs_hour - 24, self.filter2_begins_minute + self.filter2_runs_minute) - return "%02d:%02d" % (self.filter2_begins_hour + self.filter2_runs_hour, self.filter2_begins_minute + self.filter2_runs_minute) + return self.info_model_name - def get_filter_mode(self, filter_num): - if filter_num == 1: - if self.filter_mode == 1 or self.filter_mode == 3: - return True - else: - if self.filter_mode == 2 or self.filter_mode == 3: - return True - return False - - def get_filter2_enabled(self): - return self.filter2_enabled - - def compute_checksum(self, length, payload): - crc = 0xb5 - for cur in range(length): - for i in range(8): - bit = crc & 0x80 - crc = ((crc << 1) & 0xff) | ((payload[cur] >> (7 - i)) & 0x01) - if bit: - crc = crc ^ 0x07 - crc &= 0xff - for i in range(8): - bit = crc & 0x80 - crc = (crc << 1) & 0xff - if bit: - crc ^= 0x07 - return crc ^ 0x02 + def get_pump(self, pump_num): + if pump_num == 1: + return self.get_pump1() + elif pump_num == 2: + return self.get_pump2() + elif pump_num == 3: + return self.get_pump3() + elif pump_num == 4: + return self.get_pump4() + elif pump_num == 5: + return self.get_pump5() + else: + return self.get_pump6() - def read_msg(self): - self.l.acquire() + def get_pump_list(self): + return self.cfg_pump_array - try: - len_chunk = self.s.recv(2) - except (socket.timeout, socket.error) as e: - #_LOGGER.error("self.s.recv(2) error = %s", e) #Validation point - self.is_connected = False - self.l.release() - self.s.close() - self.s = None - return True + def get_pump1(self): + return self.pump1 - if len_chunk == b'~' or len_chunk == b'' or len(len_chunk) == 0: - self.l.release() - return True + def get_pump2(self): + return self.pump2 - length = len_chunk[1] + def get_pump3(self): + return self.pump3 - if int(length) == 0: - self.l.release() - return True + def get_pump4(self): + return self.pump4 - try: - chunk = self.s.recv(length) - except (socket.timeout, socket.error) as e: - #_LOGGER.error("self.s.recv(length) error = %s", e) #Validation point - self.is_connected = False - self.l.release() - self.s.close() - self.s = None - return True + def get_pump5(self): + return self.pump5 - self.l.release() + def get_pump6(self): + return self.pump6 - if chunk != self.status_chunk_array: - if chunk[0:3] == b'\xff\xaf\x13' and ((self.module_identification_loaded and self.configuration_loaded and self.information_loaded and self.additional_information_loaded) or (self.is_connected == False)): - #_LOGGER.info("Status update = %s", chunk[3:]) #Validation point - self.parse_status_update(chunk[3:]) - self.status_chunk_array = chunk - self.is_connected = True - return True + def get_set_temp(self): + return self.set_temp - if chunk[0:3] == b'\x0a\xbf\x23': - #_LOGGER.info("Filter cycles response = %s", chunk[3:]) #Validation point - self.parse_filter_cycles_response(chunk[3:]) - return True + def get_ssid(self): + return self.info_ssid - if chunk[0:3] == b'\x0a\xbf\x24' and self.information_loaded != True: - #_LOGGER.info("Information response = %s", chunk[3:]) #Validation point - self.parse_information_response(chunk[3:]) - return True + def get_temp_range(self): + return self.temp_range - if chunk[0:3] == b'\x0a\xbf\x25' and self.additional_information_loaded != True: - #_LOGGER.info("Additional information response = %s", chunk[3:]) #Validation point - self.parse_additional_information_response(chunk[3:]) - return True - if chunk[0:3] == b'\x0a\xbf\x26': - #_LOGGER.info("Preferences response = %s", chunk[3:]) #Validation point - self.parse_preferences_response(chunk[3:]) - return True + async def send_additional_information_request(self): + self.send_message(b'\x0a\xbf\x22', b'\x04' + b'\x00' + b'\x00') + while self.additional_information_loaded == False: + self.read_msg() - if chunk[0:3] == b'\x0a\xbf\x28': - #_LOGGER.info("Fault log response = %s", chunk[3:]) #Validation point - self.parse_fault_log_response(chunk[3:]) - return True + async def send_configuration_request(self): + self.send_message(b'\x0a\xbf\x22', b'\x00' + b'\x00' + b'\x01') + while self.configuration_loaded == False: + self.read_msg() - if chunk[0:3] == b'\x0a\xbf\x2b': - #_LOGGER.info("GFCI test response = %s", chunk[3:]) #Validation point - self.parse_gfci_test_response(chunk[3:]) - return True + async def send_fault_log_request(self): + self.send_message(b'\x0a\xbf\x22', b'\x20' + b'\x00' + b'\x00') + while self.fault_log_loaded == False: + self.read_msg() - if chunk[0:3] == b'\x0a\xbf\x2e' and self.configuration_loaded != True: - #_LOGGER.info("Configuration response = %s", chunk[3:]) #Validation point - self.parse_configuration_response(chunk[3:]) - return True + def send_filter_cycles_config(self): + self.send_message(b'\x0a\xbf\x23', + bytes([self.filter_1_begins_hour]) + + bytes([self.filter_1_begins_minute]) + + bytes([self.filter_1_runs_hour]) + + bytes([self.filter_1_runs_minute]) + + bytes([int(self.filter_2_enabled << 7) + self.filter_2_begins_hour]) + + bytes([self.filter_2_begins_minute]) + + bytes([self.filter_2_runs_hour]) + + bytes([self.filter_2_runs_minute]) + ) - if chunk[0:3] == b'\x0a\xbf\x94' and self.module_identification_loaded != True: - #_LOGGER.info("Module identification response = %s", chunk[3:]) #Validation point - self.parse_module_identification_response(chunk[3:]) - return True + async def send_filter_cycles_request(self): + self.send_message(b'\x0a\xbf\x22', b'\x01' + b'\x00' + b'\x00') + while self.filter_cycles_loaded == False: + self.read_msg() - return True + async def send_gfci_test_request(self): + self.send_message(b'\x0a\xbf\x22', b'\x80' + b'\x00' + b'\x00') + while self.gfci_test_loaded == False: + self.read_msg() - async def read_all_msg(self): - while True: - if self.s is not None: - self.read_msg() - await asyncio.sleep(.1) + async def send_information_request(self): + self.send_message(b'\x0a\xbf\x22', b'\x02' + b'\x00' + b'\x00') + while self.information_loaded == False: + self.read_msg() def send_message(self, type, payload): length = 5 + len(payload) @@ -734,14 +848,14 @@ def send_message(self, type, payload): try: #_LOGGER.info("send_message : %s", message) #Validation point - self.s.send(message) + self.socket_s.send(message) return True except (socket.timeout, socket.error) as e: - #_LOGGER.error("self.s.send(message) error = %s", e) #Validation point - self.is_connected = False - self.l.release() - self.s.close() - self.s = None + #_LOGGER.error("self.socket_s.send(message) error = %s", e) #Validation point + self.socket_is_connected = False + self.socket_l.release() + self.socket_s.close() + self.socket_s = None return True async def send_module_identification_request(self): @@ -749,19 +863,34 @@ async def send_module_identification_request(self): while self.module_identification_loaded == False: self.read_msg() - async def keep_alive_call(self): - while True: - if self.s is None: - await self.get_socket() - else: - self.send_message(b'\x0a\xbf\x04', bytes()) - await asyncio.sleep(30) + async def send_preferences_request(self): + self.send_message(b'\x0a\xbf\x22', b'\x08' + b'\x00' + b'\x00') + while self.preferences_loaded == False: + self.read_msg() def send_toggle_message(self, item): self.send_message(b'\x0a\xbf\x11', bytes([item]) + b'\x00') - async def set_temperature(self, temp): - self.send_message(b'\x0a\xbf\x20', bytes([int(temp)])) + + def set_aux(self, aux_num, value): + aux_val = self.aux1 + aux_code = 0x16 + if aux_num == 2: + aux_val = self.aux2 + aux_code = 0x17 + if aux_val == value: + return + self.send_toggle_message(aux_code) + if aux_num == 1: + self.aux1 = value + if aux_num == 2: + self.aux2 = value + + def set_blower(self, value): + if self.blower == value: + return + self.send_toggle_message(0x0c) + self.blower = value async def set_current_time(self): now = dt_util.utcnow() @@ -771,49 +900,59 @@ async def set_current_time(self): else: self.send_message(b'\x0a\xbf\x21', bytes([now.hour]) + bytes([now.minute])) - async def send_configuration_request(self): - self.send_message(b'\x0a\xbf\x22', b'\x00' + b'\x00' + b'\x01') - while self.configuration_loaded == False: - self.read_msg() - - async def send_filter_cycles_request(self): - self.send_message(b'\x0a\xbf\x22', b'\x01' + b'\x00' + b'\x00') - while self.filter_cycles_loaded == False: - self.read_msg() - - async def send_information_request(self): - self.send_message(b'\x0a\xbf\x22', b'\x02' + b'\x00' + b'\x00') - while self.information_loaded == False: - self.read_msg() + def set_filter_cycle_begins_time(self, filter_num, value): + if filter_num == 1: + self.filter_1_begins_hour = value.hour + self.filter_1_begins_minute = value.minute + if filter_num == 2: + self.filter_2_begins_hour = value.hour + self.filter_2_begins_minute = value.minute + self.send_filter_cycles_config() - async def send_additional_information_request(self): - self.send_message(b'\x0a\xbf\x22', b'\x04' + b'\x00' + b'\x00') - while self.additional_information_loaded == False: - self.read_msg() + def set_filter_cycle_runs_time(self, filter_num, value): + if filter_num == 1: + self.filter_1_runs_hour = value.hour + self.filter_1_runs_minute = value.minute + if filter_num == 2: + self.filter_2_runs_hour = value.hour + self.filter_2_runs_minute = value.minute + self.send_filter_cycles_config() - def send_preferences_request(self): #Not use yet! - self.send_message(b'\x0a\xbf\x22', b'\x08' + b'\x00' + b'\x00') + def set_filter2_enabled(self, value): + self.filter_2_enabled = value + self.send_filter_cycles_config() - def send_fault_log_request(self): #Not use yet! - self.send_message(b'\x0a\xbf\x22', b'\x20' + b'\x00' + b'\x00') + def set_heat_mode(self, value): + if self.heat_mode == value: + return + self.send_toggle_message(0x51) + self.heat_mode = value - def send_gfci_test_request(self): #Not use yet! - self.send_message(b'\x0a\xbf\x22', b'\x80' + b'\x00' + b'\x00') + def set_hold_mode(self, value): + if self.hold_mode == value: + return + self.send_toggle_message(0x3c) + self.hold_mode = value - def send_filter_cycle_config(self): #Not use yet! - self.send_message(b'\x0a\xbf\x23', - bytes([self.filter1_begins_hour]) + - bytes([self.filter1_begins_minute]) + - bytes([self.filter1_runs_hour]) + - bytes([self.filter1_runs_minute]) + - bytes([int(self.filter2_enabled << 7) + self.filter2_begins_hour]) + - bytes([self.filter2_begins_minute]) + - bytes([self.filter2_runs_hour]) + - bytes([self.filter2_runs_minute]) - ) + def set_light(self, light_num, value): + light_val = self.light1 + light_code = 0x11 + if light_num == 2: + light_val = self.light2 + light_code = 0x12 + if light_val == value: + return + self.send_toggle_message(light_code) + if light_num == 1: + self.light1 = value + if light_num == 2: + self.light2 = value - def set_temperature_scale(self, temperature_scale): #Not use yet! - self.send_message(b'\x0a\xbf\x27', bytes([]) + bytes([])) + def set_mister(self, value): + if self.mister == value: + return + self.send_toggle_message(0x0e) + self.mister = value def set_pump(self, pump_num, value): pump_val = self.pump1 @@ -849,95 +988,28 @@ def set_pump(self, pump_num, value): if pump_num == 6: self.pump6 = value - def set_blower(self, value): - if self.blower == value: - return - self.send_toggle_message(0x0c) - self.blower = value - - def set_mister(self, value): - if self.mister == value: - return - self.send_toggle_message(0x0e) - self.mister = value - - def set_light(self, light_num, value): - light_val = self.light1 - light_code = 0x11 - if light_num == 2: - light_val = self.light2 - light_code = 0x12 - if light_val == value: - return - self.send_toggle_message(light_code) - if light_num == 1: - self.light1 = value - if light_num == 2: - self.light2 = value - - def set_aux(self, aux_num, value): - aux_val = self.aux1 - aux_code = 0x16 - if aux_num == 2: - aux_val = self.aux2 - aux_code = 0x17 - if aux_val == value: - return - self.send_toggle_message(aux_code) - if aux_num == 1: - self.aux1 = value - if aux_num == 2: - self.aux2 = value - - def set_hold_mode(self, value): - if self.hold_mode == value: - return - self.send_toggle_message(0x3c) - self.hold_mode = value - def set_temp_range(self, value): if self.temp_range == value: return self.send_toggle_message(0x50) self.temp_range = value - def set_heat_mode(self, value): - if self.heat_mode == value: - return - self.send_toggle_message(0x51) - self.heat_mode = value - - def set_filter_cycle_begins_time(self, filter_num, value): - if filter_num == 1: - self.filter1_begins_hour = value.hour - self.filter1_begins_minute = value.minute - if filter_num == 2: - self.filter2_begins_hour = value.hour - self.filter2_begins_minute = value.minute - self.send_filter_cycle_config() + async def set_temperature(self, temp): + self.send_message(b'\x0a\xbf\x20', bytes([int(temp)])) - def set_filter_cycle_runs_time(self, filter_num, value): - if filter_num == 1: - self.filter1_runs_hour = value.hour - self.filter1_runs_minute = value.minute - if filter_num == 2: - self.filter2_runs_hour = value.hour - self.filter2_runs_minute = value.minute - self.send_filter_cycle_config() + def set_temperature_scale(self, temperature_scale): #Not use yet! + self.send_message(b'\x0a\xbf\x27', bytes([]) + bytes([])) - def set_filter2_enabled(self, value): - self.filter2_enabled = value - self.send_filter_cycle_config() def print_variables(self): _LOGGER.info("") _LOGGER.info("======================") _LOGGER.info("<< socket variables >>") _LOGGER.info("======================") - _LOGGER.info("self.is_connected = %s", self.is_connected) - _LOGGER.info("self.l = %s", self.l) - _LOGGER.info("self.s = %s", self.s) - _LOGGER.info("self.host_ip = %s", self.host_ip) + _LOGGER.info("self.socket_is_connected = %s", self.socket_is_connected) + _LOGGER.info("self.socket_l = %s", self.socket_l) + _LOGGER.info("self.socket_s = %s", self.socket_s) + _LOGGER.info("self.socket_host_ip = %s", self.socket_host_ip) _LOGGER.info("") _LOGGER.info("=============================") @@ -974,58 +1046,94 @@ def print_variables(self): _LOGGER.info("<< Information variables >>") _LOGGER.info("===========================") _LOGGER.info("self.information_loaded = %s", self.information_loaded) - _LOGGER.info("self.model_name = %s", self.model_name) - _LOGGER.info("self.cfg_sig = %s", self.cfg_sig) - _LOGGER.info("self.sw_vers = %s", self.sw_vers) - _LOGGER.info("self.setup = %s", self.setup) - _LOGGER.info("self.ssid = %s", self.ssid) - _LOGGER.info("self.heater_voltage = %s", self.heater_voltage) - _LOGGER.info("self.heater_type = %s", self.heater_type) - _LOGGER.info("self.dip_switch = %s", self.dip_switch) + _LOGGER.info("self.info_model_name = %s", self.info_model_name) + _LOGGER.info("self.info_cfg_sig = %s", self.info_cfg_sig) + _LOGGER.info("self.info_sw_vers = %s", self.info_sw_vers) + _LOGGER.info("self.info_setup = %s", self.info_setup) + _LOGGER.info("self.info_ssid = %s", self.info_ssid) + _LOGGER.info("self.info_heater_voltage = %s", self.info_heater_voltage) + _LOGGER.info("self.info_heater_type = %s", self.info_heater_type) + _LOGGER.info("self.info_dip_switch = %s", self.info_dip_switch) _LOGGER.info("") _LOGGER.info("=============================") _LOGGER.info("<< Configuration variables >>") _LOGGER.info("=============================") _LOGGER.info("self.configuration_loaded = %s", self.configuration_loaded) - _LOGGER.info("self.pump_array = %s", self.pump_array) - _LOGGER.info("self.light_array = %s", self.light_array) - _LOGGER.info("self.circ_pump_array = %s", self.circ_pump_array) - _LOGGER.info("self.blower_array = %s", self.blower_array) - _LOGGER.info("self.mister_array = %s", self.mister_array) - _LOGGER.info("self.aux_array = %s", self.aux_array) + _LOGGER.info("self.cfg_pump_array = %s", self.cfg_pump_array) + _LOGGER.info("self.cfg_light_array = %s", self.cfg_light_array) + _LOGGER.info("self.cfg_circ_pump_array = %s", self.cfg_circ_pump_array) + _LOGGER.info("self.cfg_blower_array = %s", self.cfg_blower_array) + _LOGGER.info("self.cfg_mister_array = %s", self.cfg_mister_array) + _LOGGER.info("self.cfg_aux_array = %s", self.cfg_aux_array) _LOGGER.info("") _LOGGER.info("=====================================") _LOGGER.info("<< Module identification variables >>") _LOGGER.info("=====================================") _LOGGER.info("self.module_identification_loaded = %s", self.module_identification_loaded) - _LOGGER.info("self.macaddr = %s", self.macaddr) - _LOGGER.info("self.idigi_device_id = %s", self.idigi_device_id) + _LOGGER.info("self.id_macaddr = %s", self.id_macaddr) + _LOGGER.info("self.id_mac_oui = %s", self.id_mac_oui) + _LOGGER.info("self.id_mac_nic = %s", self.id_mac_nic) _LOGGER.info("") _LOGGER.info("=============================") _LOGGER.info("<< Filter cycles variables >>") _LOGGER.info("=============================") _LOGGER.info("self.filter_cycles_loaded = %s", self.filter_cycles_loaded) - _LOGGER.info("self.filter1_begins_hour = %s", self.filter1_begins_hour) - _LOGGER.info("self.filter1_begins_minute = %s", self.filter1_begins_minute) - _LOGGER.info("self.filter1_runs_hour = %s", self.filter1_runs_hour) - _LOGGER.info("self.filter1_runs_minute = %s", self.filter1_runs_minute) - _LOGGER.info("self.filter2_enabled = %s", self.filter2_enabled) - _LOGGER.info("self.filter2_begins_hour = %s", self.filter2_begins_hour) - _LOGGER.info("self.filter2_begins_minute = %s", self.filter2_begins_minute) - _LOGGER.info("self.filter2_runs_hour = %s", self.filter2_runs_hour) - _LOGGER.info("self.filter2_runs_minute = %s", self.filter2_runs_minute) + _LOGGER.info("self.filter_1_begins_hour = %s", self.filter_1_begins_hour) + _LOGGER.info("self.filter_1_begins_minute = %s", self.filter_1_begins_minute) + _LOGGER.info("self.filter_1_runs_hour = %s", self.filter_1_runs_hour) + _LOGGER.info("self.filter_1_runs_minute = %s", self.filter_1_runs_minute) + _LOGGER.info("self.filter_2_enabled = %s", self.filter_2_enabled) + _LOGGER.info("self.filter_2_begins_hour = %s", self.filter_2_begins_hour) + _LOGGER.info("self.filter_2_begins_minute = %s", self.filter_2_begins_minute) + _LOGGER.info("self.filter_2_runs_hour = %s", self.filter_2_runs_hour) + _LOGGER.info("self.filter_2_runs_minute = %s", self.filter_2_runs_minute) _LOGGER.info("") _LOGGER.info("======================================") _LOGGER.info("<< Additional information variables >>") _LOGGER.info("======================================") _LOGGER.info("self.additional_information_loaded = %s", self.additional_information_loaded) - _LOGGER.info("self.low_range_min = %s", self.low_range_min) - _LOGGER.info("self.low_range_max = %s", self.low_range_max) - _LOGGER.info("self.high_range_min = %s", self.high_range_min) - _LOGGER.info("self.high_range_max = %s", self.high_range_max) - _LOGGER.info("self.nb_of_pumps = %s", self.nb_of_pumps) + _LOGGER.info("self.add_info_low_range_min = %s", self.add_info_low_range_min) + _LOGGER.info("self.add_info_low_range_max = %s", self.add_info_low_range_max) + _LOGGER.info("self.add_info_high_range_min = %s", self.add_info_high_range_min) + _LOGGER.info("self.add_info_high_range_max = %s", self.add_info_high_range_max) + _LOGGER.info("self.add_info_nb_of_pumps = %s", self.add_info_nb_of_pumps) + + _LOGGER.info("") + _LOGGER.info("===========================") + _LOGGER.info("<< Preferences variables >>") + _LOGGER.info("===========================") + _LOGGER.info("self.preferences_loaded = %s", self.preferences_loaded) + _LOGGER.info("self.pref_reminder = %s", self.pref_reminder) + _LOGGER.info("self.pref_temp_scale = %s", self.pref_temp_scale) + _LOGGER.info("self.pref_clock_mode = %s", self.pref_clock_mode) + _LOGGER.info("self.pref_clean_up_cycle = %s", self.pref_clean_up_cycle) + _LOGGER.info("self.pref_dolphin_address = %s", self.pref_dolphin_address) + _LOGGER.info("self.pref_m8_ai = %s", self.pref_m8_ai) + + _LOGGER.info("") + _LOGGER.info("=========================") + _LOGGER.info("<< Fault log variables >>") + _LOGGER.info("=========================") + _LOGGER.info("self.fault_log_loaded = %s", self.fault_log_loaded) + _LOGGER.info("self.fault_log_total_entries = %s", self.fault_log_total_entries) + _LOGGER.info("self.fault_log_entry_nb = %s", self.fault_log_entry_nb) + _LOGGER.info("self.fault_log_msg_code = %s", self.fault_log_msg_code) + _LOGGER.info("self.fault_log_days_ago = %s", self.fault_log_days_ago) + _LOGGER.info("self.fault_log_msg_hour = %s", self.fault_log_msg_hour) + _LOGGER.info("self.fault_log_msg_minute = %s", self.fault_log_msg_minute) + _LOGGER.info("self.fault_log_todo = %s", self.fault_log_todo) + _LOGGER.info("self.fault_log_set_temp = %s", self.fault_log_set_temp) + _LOGGER.info("self.fault_log_sensor_a_temp = %s", self.fault_log_sensor_a_temp) + _LOGGER.info("self.fault_log_sensor_b_temp = %s", self.fault_log_sensor_b_temp) + + _LOGGER.info("") + _LOGGER.info("=========================") + _LOGGER.info("<< GFCI test variables >>") + _LOGGER.info("=========================") + _LOGGER.info("self.gfci_test_loaded = %s", self.gfci_test_loaded) + _LOGGER.info("self.gfci_test_result = %s", self.gfci_test_result) _LOGGER.info("") diff --git a/custom_components/spaclient/switch.py b/custom_components/spaclient/switch.py index f55f42a..cd76d43 100644 --- a/custom_components/spaclient/switch.py +++ b/custom_components/spaclient/switch.py @@ -78,7 +78,7 @@ async def async_turn_on(self, **kwargs): """Send the on command.""" #_LOGGER.info("Pump %s status %s", self._pump_num, self._spaclient.get_pump(self._pump_num)) #_LOGGER.info("Turning On Pump %s", self._pump_num) - if self._spaclient.pump_array[self._pump_num - 1] == 1: + if self._spaclient.cfg_pump_array[self._pump_num - 1] == 1: return self._spaclient.set_pump(self._pump_num, "High") self._spaclient.set_pump(self._pump_num, "Low") diff --git a/images/preview.png b/images/preview.png index 678f230c710495d80cbd9cb92f28a2fa5c1cc713..b562c44fb169f7edf644d3f0f682e95174c9a880 100644 GIT binary patch literal 68736 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 Iw)*ow0Dhu*0{{R3 literal 46046 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