1 """MySensors platform that offers a Climate (MySensors-HVAC) component."""
3 from __future__
import annotations
21 from .
import setup_mysensors_platform
22 from .const
import MYSENSORS_DISCOVERY, DiscoveryInfo
23 from .entity
import MySensorsChildEntity
24 from .helpers
import on_unload
27 HVACMode.AUTO:
"AutoChangeOver",
28 HVACMode.COOL:
"CoolOn",
29 HVACMode.HEAT:
"HeatOn",
33 "AutoChangeOver": HVACMode.AUTO,
34 "CoolOn": HVACMode.COOL,
35 "HeatOn": HVACMode.HEAT,
39 FAN_LIST = [
"Auto",
"Min",
"Normal",
"Max"]
40 OPERATION_LIST = [HVACMode.OFF, HVACMode.AUTO, HVACMode.COOL, HVACMode.HEAT]
45 config_entry: ConfigEntry,
46 async_add_entities: AddEntitiesCallback,
48 """Set up this platform for a specific ConfigEntry(==Gateway)."""
51 """Discover and add a MySensors climate."""
57 async_add_entities=async_add_entities,
62 config_entry.entry_id,
65 MYSENSORS_DISCOVERY.format(config_entry.entry_id, Platform.CLIMATE),
72 """Representation of a MySensors HVAC."""
74 _attr_hvac_modes = OPERATION_LIST
75 _enable_turn_on_off_backwards_compatibility =
False
79 """Return the list of supported features."""
80 features = ClimateEntityFeature.TURN_OFF | ClimateEntityFeature.TURN_ON
81 set_req = self.gateway.const.SetReq
82 if set_req.V_HVAC_SPEED
in self._values:
83 features = features | ClimateEntityFeature.FAN_MODE
85 set_req.V_HVAC_SETPOINT_COOL
in self._values
86 and set_req.V_HVAC_SETPOINT_HEAT
in self._values
88 features = features | ClimateEntityFeature.TARGET_TEMPERATURE_RANGE
90 features = features | ClimateEntityFeature.TARGET_TEMPERATURE
95 """Return the unit of measurement."""
97 UnitOfTemperature.CELSIUS
98 if self.
hasshass.config.units
is METRIC_SYSTEM
99 else UnitOfTemperature.FAHRENHEIT
104 """Return the current temperature."""
105 value: str |
None = self._values.
get(self.gateway.const.SetReq.V_TEMP)
106 float_value: float |
None =
None
108 if value
is not None:
109 float_value =
float(value)
115 """Return the temperature we try to reach."""
116 set_req = self.gateway.const.SetReq
118 set_req.V_HVAC_SETPOINT_COOL
in self._values
119 and set_req.V_HVAC_SETPOINT_HEAT
in self._values
122 temp = self._values.
get(set_req.V_HVAC_SETPOINT_COOL)
124 temp = self._values.
get(set_req.V_HVAC_SETPOINT_HEAT)
125 return float(temp)
if temp
is not None else None
129 """Return the highbound target temperature we try to reach."""
130 set_req = self.gateway.const.SetReq
131 if set_req.V_HVAC_SETPOINT_HEAT
in self._values:
132 temp = self._values.
get(set_req.V_HVAC_SETPOINT_COOL)
133 return float(temp)
if temp
is not None else None
139 """Return the lowbound target temperature we try to reach."""
140 set_req = self.gateway.const.SetReq
141 if set_req.V_HVAC_SETPOINT_COOL
in self._values:
142 temp = self._values.
get(set_req.V_HVAC_SETPOINT_HEAT)
143 return float(temp)
if temp
is not None else None
149 """Return current operation ie. heat, cool, idle."""
150 return self._values.
get(self.value_type, HVACMode.HEAT)
154 """Return the fan setting."""
155 return self._values.
get(self.gateway.const.SetReq.V_HVAC_SPEED)
159 """List of available fan modes."""
163 """Set new target temperature."""
164 set_req = self.gateway.const.SetReq
165 temp = kwargs.get(ATTR_TEMPERATURE)
166 low = kwargs.get(ATTR_TARGET_TEMP_LOW)
167 high = kwargs.get(ATTR_TARGET_TEMP_HIGH)
168 heat = self._values.
get(set_req.V_HVAC_SETPOINT_HEAT)
169 cool = self._values.
get(set_req.V_HVAC_SETPOINT_COOL)
174 value_type = set_req.V_HVAC_SETPOINT_HEAT
175 elif cool
is not None:
177 value_type = set_req.V_HVAC_SETPOINT_COOL
178 if heat
is not None or cool
is not None:
179 updates = [(value_type, temp)]
180 elif all(val
is not None for val
in (low, high, heat, cool)):
182 (set_req.V_HVAC_SETPOINT_HEAT, low),
183 (set_req.V_HVAC_SETPOINT_COOL, high),
185 for value_type, value
in updates:
186 self.gateway.set_child_value(
187 self.node_id, self.child_id, value_type, value, ack=1
191 self._values[value_type] = value
195 """Set new target temperature."""
196 set_req = self.gateway.const.SetReq
197 self.gateway.set_child_value(
198 self.node_id, self.child_id, set_req.V_HVAC_SPEED, fan_mode, ack=1
202 self._values[set_req.V_HVAC_SPEED] = fan_mode
206 """Set new target temperature."""
207 self.gateway.set_child_value(
211 DICT_HA_TO_MYS[hvac_mode],
216 self._values[self.value_type] = hvac_mode
221 """Update the controller with the latest value from a sensor."""
223 self._values[self.value_type] = DICT_MYS_TO_HA[self._values[self.value_type]]
None async_set_hvac_mode(self, HVACMode hvac_mode)
None async_set_temperature(self, **Any kwargs)
str temperature_unit(self)
float|None target_temperature_high(self)
ClimateEntityFeature supported_features(self)
float|None target_temperature_low(self)
float|None current_temperature(self)
None async_set_fan_mode(self, str fan_mode)
float|None target_temperature(self)
list[str] fan_modes(self)
None async_write_ha_state(self)
web.Response get(self, web.Request request, str config_key)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
None on_unload(HomeAssistant hass, GatewayId gateway_id, Callable fnct)
None async_discover(DiscoveryInfo discovery_info)
list[MySensorsChildEntity]|None setup_mysensors_platform(HomeAssistant hass, Platform domain, DiscoveryInfo discovery_info, type[MySensorsChildEntity]|Mapping[SensorType, type[MySensorsChildEntity]] device_class,(tuple|None) device_args=None, Callable|None async_add_entities=None)
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)