1 """Climate on Zigbee Home Automation networks.
3 For more details on this platform, please refer to the documentation
4 at https://home-assistant.io/components/zha.climate/
7 from __future__
import annotations
9 from collections.abc
import Mapping
11 from typing
import Any
13 from zha.application.platforms.climate.const
import (
14 ClimateEntityFeature
as ZHAClimateEntityFeature,
15 HVACAction
as ZHAHVACAction,
16 HVACMode
as ZHAHVACMode,
21 ATTR_TARGET_TEMP_HIGH,
35 from .entity
import ZHAEntity
36 from .helpers
import (
39 async_add_entities
as zha_async_add_entities,
40 convert_zha_error_to_ha_error,
45 ZHA_TO_HA_HVAC_MODE = {
46 ZHAHVACMode.OFF: HVACMode.OFF,
47 ZHAHVACMode.AUTO: HVACMode.AUTO,
48 ZHAHVACMode.HEAT: HVACMode.HEAT,
49 ZHAHVACMode.COOL: HVACMode.COOL,
50 ZHAHVACMode.HEAT_COOL: HVACMode.HEAT_COOL,
51 ZHAHVACMode.DRY: HVACMode.DRY,
52 ZHAHVACMode.FAN_ONLY: HVACMode.FAN_ONLY,
55 ZHA_TO_HA_HVAC_ACTION = {
56 ZHAHVACAction.OFF: HVACAction.OFF,
57 ZHAHVACAction.HEATING: HVACAction.HEATING,
58 ZHAHVACAction.COOLING: HVACAction.COOLING,
59 ZHAHVACAction.DRYING: HVACAction.DRYING,
60 ZHAHVACAction.IDLE: HVACAction.IDLE,
61 ZHAHVACAction.FAN: HVACAction.FAN,
62 ZHAHVACAction.PREHEATING: HVACAction.PREHEATING,
68 config_entry: ConfigEntry,
69 async_add_entities: AddEntitiesCallback,
71 """Set up the Zigbee Home Automation sensor from config entry."""
73 entities_to_create = zha_data.platforms[Platform.CLIMATE]
79 zha_async_add_entities, async_add_entities, Thermostat, entities_to_create
82 config_entry.async_on_unload(unsub)
86 """Representation of a ZHA Thermostat device."""
88 _attr_precision = PRECISION_TENTHS
89 _attr_temperature_unit = UnitOfTemperature.CELSIUS
90 _attr_translation_key: str =
"thermostat"
91 _enable_turn_on_off_backwards_compatibility =
False
93 def __init__(self, entity_data: EntityData, **kwargs: Any) ->
None:
94 """Initialize the ZHA thermostat entity."""
95 super().
__init__(entity_data, **kwargs)
97 ZHA_TO_HA_HVAC_MODE[mode]
for mode
in self.entity_data.entity.hvac_modes
100 self.entity_data.entity.hvac_mode
103 self.entity_data.entity.hvac_action
107 zha_features: ZHAClimateEntityFeature = (
108 self.entity_data.entity.supported_features
111 if ZHAClimateEntityFeature.TARGET_TEMPERATURE
in zha_features:
112 features |= ClimateEntityFeature.TARGET_TEMPERATURE
113 if ZHAClimateEntityFeature.TARGET_TEMPERATURE_RANGE
in zha_features:
114 features |= ClimateEntityFeature.TARGET_TEMPERATURE_RANGE
115 if ZHAClimateEntityFeature.TARGET_HUMIDITY
in zha_features:
116 features |= ClimateEntityFeature.TARGET_HUMIDITY
117 if ZHAClimateEntityFeature.PRESET_MODE
in zha_features:
118 features |= ClimateEntityFeature.PRESET_MODE
119 if ZHAClimateEntityFeature.FAN_MODE
in zha_features:
120 features |= ClimateEntityFeature.FAN_MODE
121 if ZHAClimateEntityFeature.SWING_MODE
in zha_features:
122 features |= ClimateEntityFeature.SWING_MODE
123 if ZHAClimateEntityFeature.TURN_OFF
in zha_features:
124 features |= ClimateEntityFeature.TURN_OFF
125 if ZHAClimateEntityFeature.TURN_ON
in zha_features:
126 features |= ClimateEntityFeature.TURN_ON
132 """Return entity specific state attributes."""
133 state = self.entity_data.entity.state
137 "occupancy": state.get(
"occupancy"),
138 "occupied_cooling_setpoint": state.get(
"occupied_cooling_setpoint"),
139 "occupied_heating_setpoint": state.get(
"occupied_heating_setpoint"),
140 "pi_cooling_demand": state.get(
"pi_cooling_demand"),
141 "pi_heating_demand": state.get(
"pi_heating_demand"),
142 "system_mode": state.get(
"system_mode"),
143 "unoccupied_cooling_setpoint": state.get(
"unoccupied_cooling_setpoint"),
144 "unoccupied_heating_setpoint": state.get(
"unoccupied_heating_setpoint"),
150 """Return the current temperature."""
151 return self.entity_data.entity.current_temperature
155 """Return current FAN mode."""
156 return self.entity_data.entity.fan_mode
160 """Return supported FAN modes."""
161 return self.entity_data.entity.fan_modes
165 """Return current preset mode."""
166 return self.entity_data.entity.preset_mode
170 """Return supported preset modes."""
171 return self.entity_data.entity.preset_modes
175 """Return the temperature we try to reach."""
176 return self.entity_data.entity.target_temperature
180 """Return the upper bound temperature we try to reach."""
181 return self.entity_data.entity.target_temperature_high
185 """Return the lower bound temperature we try to reach."""
186 return self.entity_data.entity.target_temperature_low
190 """Return the maximum temperature."""
191 return self.entity_data.entity.max_temp
195 """Return the minimum temperature."""
196 return self.entity_data.entity.min_temp
200 """Entity state changed."""
202 self.entity_data.entity.hvac_mode
205 self.entity_data.entity.hvac_action
209 @convert_zha_error_to_ha_error
212 await self.entity_data.entity.async_set_fan_mode(fan_mode=fan_mode)
215 @convert_zha_error_to_ha_error
217 """Set new target operation mode."""
218 await self.entity_data.entity.async_set_hvac_mode(hvac_mode=hvac_mode)
221 @convert_zha_error_to_ha_error
223 """Set new preset mode."""
224 await self.entity_data.entity.async_set_preset_mode(preset_mode=preset_mode)
227 @convert_zha_error_to_ha_error
229 """Set new target temperature."""
230 await self.entity_data.entity.async_set_temperature(
231 target_temp_low=kwargs.get(ATTR_TARGET_TEMP_LOW),
232 target_temp_high=kwargs.get(ATTR_TARGET_TEMP_HIGH),
233 temperature=kwargs.get(ATTR_TEMPERATURE),
234 hvac_mode=kwargs.get(ATTR_HVAC_MODE),
None __init__(self, EntityData entity_data, **Any kwargs)
Mapping[str, Any]|None extra_state_attributes(self)
float|None current_temperature(self)
float|None target_temperature_low(self)
None async_set_hvac_mode(self, HVACMode hvac_mode)
float|None target_temperature(self)
None async_set_preset_mode(self, str preset_mode)
None async_set_temperature(self, **Any kwargs)
float|None target_temperature_high(self)
list[str]|None preset_modes(self)
list[str]|None fan_modes(self)
None _handle_entity_events(self, Any event)
None async_set_fan_mode(self, str fan_mode)
None async_write_ha_state(self)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
HAZHAData get_zha_data(HomeAssistant hass)
dict[str, Any] exclude_none_values(Mapping[str, Any] obj)
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)