1 """Support for control of Elk-M1 connected thermostats."""
3 from __future__
import annotations
7 from elkm1_lib.const
import ThermostatFan, ThermostatMode, ThermostatSetting
8 from elkm1_lib.elements
import Element
9 from elkm1_lib.thermostats
import Thermostat
12 ATTR_TARGET_TEMP_HIGH,
25 from .
import ElkM1ConfigEntry
26 from .const
import DOMAIN
27 from .entity
import ElkEntity, create_elk_entities
36 HASS_TO_ELK_HVAC_MODES = {
37 HVACMode.OFF: (ThermostatMode.OFF, ThermostatFan.AUTO),
38 HVACMode.HEAT: (ThermostatMode.HEAT,
None),
39 HVACMode.COOL: (ThermostatMode.COOL,
None),
40 HVACMode.HEAT_COOL: (ThermostatMode.AUTO,
None),
41 HVACMode.FAN_ONLY: (ThermostatMode.OFF, ThermostatFan.ON),
43 ELK_TO_HASS_HVAC_MODES = {
44 ThermostatMode.OFF: HVACMode.OFF,
45 ThermostatMode.COOL: HVACMode.COOL,
46 ThermostatMode.HEAT: HVACMode.HEAT,
47 ThermostatMode.EMERGENCY_HEAT: HVACMode.HEAT,
48 ThermostatMode.AUTO: HVACMode.HEAT_COOL,
50 HASS_TO_ELK_FAN_MODES = {
51 FAN_AUTO: (
None, ThermostatFan.AUTO),
52 FAN_ON: (
None, ThermostatFan.ON),
54 ELK_TO_HASS_FAN_MODES = {
55 ThermostatFan.AUTO: FAN_AUTO,
56 ThermostatFan.ON: FAN_ON,
62 config_entry: ElkM1ConfigEntry,
63 async_add_entities: AddEntitiesCallback,
65 """Create the Elk-M1 thermostat platform."""
66 elk_data = config_entry.runtime_data
68 entities: list[ElkEntity] = []
70 elk_data, elk.thermostats,
"thermostat", ElkThermostat, entities
76 """Representation of an Elk-M1 Thermostat."""
78 _attr_precision = PRECISION_WHOLE
79 _attr_supported_features = (
80 ClimateEntityFeature.FAN_MODE
81 | ClimateEntityFeature.AUX_HEAT
82 | ClimateEntityFeature.TARGET_TEMPERATURE_RANGE
83 | ClimateEntityFeature.TURN_OFF
84 | ClimateEntityFeature.TURN_ON
88 _attr_hvac_modes = SUPPORT_HVAC
89 _attr_hvac_mode: HVACMode |
None =
None
90 _attr_target_temperature_step = 1
91 _attr_fan_modes = [FAN_AUTO, FAN_ON]
93 _enable_turn_on_off_backwards_compatibility =
False
97 """Return the temperature unit."""
98 return self._temperature_unit
102 """Return the current temperature."""
103 return self.
_element_element.current_temp
107 """Return the temperature we are trying to reach."""
110 ThermostatMode.EMERGENCY_HEAT,
112 return self.
_element_element.heat_setpoint
113 if self.
_element_element.mode == ThermostatMode.COOL:
114 return self.
_element_element.cool_setpoint
119 """Return the high target temperature."""
120 return self.
_element_element.cool_setpoint
124 """Return the low target temperature."""
125 return self.
_element_element.heat_setpoint
129 """Return the current humidity."""
130 return self.
_element_element.humidity
134 """Return if aux heater is on."""
135 return self.
_element_element.mode == ThermostatMode.EMERGENCY_HEAT
139 """Return the fan setting."""
140 if self.
_element_element.fan
is None:
142 return ELK_TO_HASS_FAN_MODES[self.
_element_element.fan]
144 def _elk_set(self, mode: ThermostatMode |
None, fan: ThermostatFan |
None) ->
None:
146 self.
_element_element.set(ThermostatSetting.MODE, mode)
148 self.
_element_element.set(ThermostatSetting.FAN, fan)
151 """Set thermostat operation mode."""
152 thermostat_mode, fan_mode = HASS_TO_ELK_HVAC_MODES[hvac_mode]
153 self.
_elk_set_elk_set(thermostat_mode, fan_mode)
156 """Turn auxiliary heater on."""
161 breaks_in_ha_version=
"2025.4.0",
164 translation_key=
"migrate_aux_heat",
165 severity=IssueSeverity.WARNING,
167 self.
_elk_set_elk_set(ThermostatMode.EMERGENCY_HEAT,
None)
170 """Turn auxiliary heater off."""
175 breaks_in_ha_version=
"2025.4.0",
178 translation_key=
"migrate_aux_heat",
179 severity=IssueSeverity.WARNING,
181 self.
_elk_set_elk_set(ThermostatMode.HEAT,
None)
184 """Set new target fan mode."""
185 thermostat_mode, elk_fan_mode = HASS_TO_ELK_FAN_MODES[fan_mode]
186 self.
_elk_set_elk_set(thermostat_mode, elk_fan_mode)
189 """Set new target temperature."""
190 low_temp = kwargs.get(ATTR_TARGET_TEMP_LOW)
191 high_temp = kwargs.get(ATTR_TARGET_TEMP_HIGH)
192 if low_temp
is not None:
193 self.
_element_element.set(ThermostatSetting.HEAT_SETPOINT, round(low_temp))
194 if high_temp
is not None:
195 self.
_element_element.set(ThermostatSetting.COOL_SETPOINT, round(high_temp))
198 if self.
_element_element.mode
is None:
204 and self.
_element_element.fan == ThermostatFan.ON
None async_set_hvac_mode(self, HVACMode hvac_mode)
None _elk_set(self, ThermostatMode|None mode, ThermostatFan|None fan)
int|None current_humidity(self)
None async_turn_aux_heat_off(self)
str temperature_unit(self)
float|None target_temperature_low(self)
None async_set_fan_mode(self, str fan_mode)
float|None target_temperature_high(self)
float|None current_temperature(self)
None async_turn_aux_heat_on(self)
float|None target_temperature(self)
None async_set_temperature(self, **Any kwargs)
None _element_changed(self, Element element, Any changeset)
None async_setup_entry(HomeAssistant hass, ElkM1ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
list[ElkEntity]|None create_elk_entities(ELKM1Data elk_data, Iterable[Element] elk_elements, str element_type, Any class_, list[ElkEntity] entities)
None async_create_issue(HomeAssistant hass, str entry_id)