From 39e46d7114f646e41f792ee257acdb8259e2449b Mon Sep 17 00:00:00 2001 From: awfvantets Date: Sun, 5 Jul 2026 22:13:08 +0200 Subject: [PATCH 1/3] Add support for ALTHRSQ800WRF (Salus UG800 / Altech ecosystem) --- pyit600/gateway.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pyit600/gateway.py b/pyit600/gateway.py index e034931..9eb29b1 100644 --- a/pyit600/gateway.py +++ b/pyit600/gateway.py @@ -532,9 +532,9 @@ async def _refresh_climate_devices(self, devices: List[Any], send_callback=False target_temperature=(ther["HeatingSetpoint_x100"] / 100) if is_heating else (ther["CoolingSetpoint_x100"] / 100), max_temp=(ther.get("MaxHeatSetpoint_x100", 4000) / 100) if is_heating else (ther.get("MaxCoolSetpoint_x100", 4000) / 100), min_temp=(ther.get("MinHeatSetpoint_x100", 500) / 100) if is_heating else (ther.get("MinCoolSetpoint_x100", 500) / 100), - hvac_mode=HVAC_MODE_HEAT if ther["SystemMode"] == 4 else HVAC_MODE_COOL if ther["SystemMode"] == 3 else HVAC_MODE_AUTO, + hvac_mode=HVAC_MODE_OFF if scomm["HoldType"] == 7 else HVAC_MODE_HEAT if ther["SystemMode"] == 4 else HVAC_MODE_COOL if ther["SystemMode"] == 3 else HVAC_MODE_AUTO, hvac_action=CURRENT_HVAC_OFF if scomm["HoldType"] == 7 else CURRENT_HVAC_IDLE if ther["RunningState"] == 0 else CURRENT_HVAC_HEAT if is_heating and ther["RunningState"] == 33 else CURRENT_HVAC_HEAT_IDLE if is_heating else CURRENT_HVAC_COOL if ther["RunningState"] == 66 else CURRENT_HVAC_COOL_IDLE, - hvac_modes=[HVAC_MODE_HEAT, HVAC_MODE_COOL, HVAC_MODE_AUTO], + hvac_modes=[HVAC_MODE_OFF, HVAC_MODE_HEAT, HVAC_MODE_COOL, HVAC_MODE_AUTO], preset_mode=PRESET_OFF if scomm["HoldType"] == 7 else PRESET_PERMANENT_HOLD if scomm["HoldType"] == 2 else PRESET_ECO if scomm["HoldType"] == 10 else PRESET_TEMPORARY_HOLD if scomm["HoldType"] == 1 else PRESET_FOLLOW_SCHEDULE, preset_modes=[PRESET_OFF, PRESET_PERMANENT_HOLD, PRESET_ECO, PRESET_TEMPORARY_HOLD, PRESET_FOLLOW_SCHEDULE], fan_mode=FAN_MODE_OFF if fan_mode == 0 else FAN_MODE_HIGH if fan_mode == 3 else FAN_MODE_MEDIUM if fan_mode == 2 else FAN_MODE_LOW if fan_mode == 1 else FAN_MODE_AUTO, # fan_mode == 5 => FAN_MODE_AUTO @@ -750,7 +750,7 @@ async def set_climate_device_preset(self, device_id: str, preset: str) -> None: _LOGGER.error("Cannot set mode: climate device not found with the specified id: %s", device_id) return - if device.model == 'FC600': + if device.model in ('FC600', 'ALTHRSQ800WRF'): request_data = { "sComm": { "SetHoldType": 7 if preset == PRESET_OFF else 10 if preset == PRESET_ECO else 2 if preset == PRESET_PERMANENT_HOLD else 1 if preset == PRESET_TEMPORARY_HOLD else 0 } } else: request_data = { "sIT600TH": { "SetHoldType": 7 if preset == PRESET_OFF else 2 if preset == PRESET_PERMANENT_HOLD else 0 } } @@ -777,8 +777,8 @@ async def set_climate_device_mode(self, device_id: str, mode: str) -> None: _LOGGER.error("Cannot set mode: device not found with the specified id: %s", device_id) return - if device.model == 'FC600': - request_data = { "sTherS": { "SetSystemMode": 4 if mode == HVAC_MODE_HEAT else 3 if mode == HVAC_MODE_COOL else HVAC_MODE_AUTO } } + if device.model in ('FC600', 'ALTHRSQ800WRF'): + request_data = { "sComm": { "SetHoldType": 7 } } if mode == HVAC_MODE_OFF else { "sComm": { "SetHoldType": 2 }, "sTherS": { "SetSystemMode": 4 if mode == HVAC_MODE_HEAT else 3 if mode == HVAC_MODE_COOL else 1 } } else: request_data = { "sIT600TH": { "SetHoldType": 7 if mode == HVAC_MODE_OFF else 0 } } @@ -852,7 +852,7 @@ async def set_climate_device_temperature(self, device_id: str, setpoint_celsius: _LOGGER.error("Cannot set mode: climate device not found with the specified id: %s", device_id) return - if device.model == 'FC600': + if device.model in ('FC600', 'ALTHRSQ800WRF'): if device.hvac_mode == HVAC_MODE_COOL: request_data = { "sTherS": { "SetCoolingSetpoint_x100": int(self.round_to_half(setpoint_celsius) * 100) } } else: From b9682a4cec1864f05be45a7a95e2162827fd4f64 Mon Sep 17 00:00:00 2001 From: awfvantets Date: Mon, 6 Jul 2026 09:19:01 +0200 Subject: [PATCH 2/3] Detect running state via Zigbee bitmask (fixes hvac_action on ALTHRSQ800WRF) --- pyit600/gateway.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyit600/gateway.py b/pyit600/gateway.py index 9eb29b1..eafd35a 100644 --- a/pyit600/gateway.py +++ b/pyit600/gateway.py @@ -533,7 +533,7 @@ async def _refresh_climate_devices(self, devices: List[Any], send_callback=False max_temp=(ther.get("MaxHeatSetpoint_x100", 4000) / 100) if is_heating else (ther.get("MaxCoolSetpoint_x100", 4000) / 100), min_temp=(ther.get("MinHeatSetpoint_x100", 500) / 100) if is_heating else (ther.get("MinCoolSetpoint_x100", 500) / 100), hvac_mode=HVAC_MODE_OFF if scomm["HoldType"] == 7 else HVAC_MODE_HEAT if ther["SystemMode"] == 4 else HVAC_MODE_COOL if ther["SystemMode"] == 3 else HVAC_MODE_AUTO, - hvac_action=CURRENT_HVAC_OFF if scomm["HoldType"] == 7 else CURRENT_HVAC_IDLE if ther["RunningState"] == 0 else CURRENT_HVAC_HEAT if is_heating and ther["RunningState"] == 33 else CURRENT_HVAC_HEAT_IDLE if is_heating else CURRENT_HVAC_COOL if ther["RunningState"] == 66 else CURRENT_HVAC_COOL_IDLE, + hvac_action=CURRENT_HVAC_OFF if scomm["HoldType"] == 7 else CURRENT_HVAC_HEAT if ther["RunningState"] & 1 else CURRENT_HVAC_COOL if ther["RunningState"] & 2 else CURRENT_HVAC_IDLE, hvac_modes=[HVAC_MODE_OFF, HVAC_MODE_HEAT, HVAC_MODE_COOL, HVAC_MODE_AUTO], preset_mode=PRESET_OFF if scomm["HoldType"] == 7 else PRESET_PERMANENT_HOLD if scomm["HoldType"] == 2 else PRESET_ECO if scomm["HoldType"] == 10 else PRESET_TEMPORARY_HOLD if scomm["HoldType"] == 1 else PRESET_FOLLOW_SCHEDULE, preset_modes=[PRESET_OFF, PRESET_PERMANENT_HOLD, PRESET_ECO, PRESET_TEMPORARY_HOLD, PRESET_FOLLOW_SCHEDULE], From 566366e5def94fd117e154e901f7d78f9475cf8d Mon Sep 17 00:00:00 2001 From: awfvantets Date: Mon, 6 Jul 2026 09:19:48 +0200 Subject: [PATCH 3/3] Fix invalid hvac_action strings (not valid HA HVACAction values) --- pyit600/const.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyit600/const.py b/pyit600/const.py index 2bb5d05..acb0a4a 100644 --- a/pyit600/const.py +++ b/pyit600/const.py @@ -28,9 +28,9 @@ # HVAC states CURRENT_HVAC_OFF = "off" CURRENT_HVAC_HEAT = "heating" -CURRENT_HVAC_HEAT_IDLE = "heating (idling)" +CURRENT_HVAC_HEAT_IDLE = "idle" CURRENT_HVAC_COOL = "cooling" -CURRENT_HVAC_COOL_IDLE = "cooling (idling)" +CURRENT_HVAC_COOL_IDLE = "idle" CURRENT_HVAC_IDLE = "idle" # Supported presets