1 """Support for MAX! Thermostats via MAX! Cube."""
3 from __future__
import annotations
8 from maxcube.device
import (
9 MAX_DEVICE_MODE_AUTOMATIC,
10 MAX_DEVICE_MODE_BOOST,
11 MAX_DEVICE_MODE_MANUAL,
12 MAX_DEVICE_MODE_VACATION,
31 from .
import DATA_KEY
33 _LOGGER = logging.getLogger(__name__)
35 ATTR_VALVE_POSITION =
"valve_position"
47 MAX_TEMPERATURE = 30.0
53 add_entities: AddEntitiesCallback,
54 discovery_info: DiscoveryInfoType |
None =
None,
56 """Iterate through all MAX! Devices and add thermostats."""
60 for handler
in hass.data[DATA_KEY].values()
61 for device
in handler.cube.devices
62 if device.is_thermostat()
or device.is_wallthermostat()
67 """MAX! Cube ClimateEntity."""
69 _attr_hvac_modes = [HVACMode.OFF, HVACMode.AUTO, HVACMode.HEAT]
70 _attr_supported_features = (
71 ClimateEntityFeature.TARGET_TEMPERATURE
72 | ClimateEntityFeature.PRESET_MODE
73 | ClimateEntityFeature.TURN_OFF
74 | ClimateEntityFeature.TURN_ON
76 _enable_turn_on_off_backwards_compatibility =
False
79 """Initialize MAX! Cube ClimateEntity."""
80 room = handler.cube.room_by_id(device.room_id)
98 """Return the minimum temperature."""
99 temp = self.
_device_device.min_temperature
or MIN_TEMPERATURE
102 return max(temp, MIN_TEMPERATURE)
106 """Return the maximum temperature."""
107 return self.
_device_device.max_temperature
or MAX_TEMPERATURE
111 """Return the current temperature."""
112 return self.
_device_device.actual_temperature
116 """Return current operation mode."""
117 mode = self.
_device_device.mode
118 if mode
in (MAX_DEVICE_MODE_AUTOMATIC, MAX_DEVICE_MODE_BOOST):
121 mode == MAX_DEVICE_MODE_MANUAL
122 and self.
_device_device.target_temperature == OFF_TEMPERATURE
129 """Set new target hvac mode."""
130 if hvac_mode == HVACMode.OFF:
131 self.
_set_target_set_target(MAX_DEVICE_MODE_MANUAL, OFF_TEMPERATURE)
132 elif hvac_mode == HVACMode.HEAT:
134 self.
_set_target_set_target(MAX_DEVICE_MODE_MANUAL, temp)
135 elif hvac_mode == HVACMode.AUTO:
136 self.
_set_target_set_target(MAX_DEVICE_MODE_AUTOMATIC,
None)
138 raise ValueError(f
"unsupported HVAC mode {hvac_mode}")
140 def _set_target(self, mode: int |
None, temp: float |
None) ->
None:
141 """Set the mode and/or temperature of the thermostat.
143 @param mode: this is the mode to change to.
144 @param temp: the temperature to target.
146 Both parameters are optional. When mode is undefined, it keeps
147 the previous mode. When temp is undefined, it fetches the
148 temperature from the weekly schedule when mode is
149 MAX_DEVICE_MODE_AUTOMATIC and keeps the previous
150 temperature otherwise.
154 self.
_cubehandle_cubehandle.cube.set_temperature_mode(self.
_device_device, temp, mode)
155 except (TimeoutError, OSError):
156 _LOGGER.error(
"Setting HVAC mode failed")
160 """Return the current running hvac operation if supported."""
163 if self.
_device_device.is_thermostat():
164 valve = self.
_device_device.valve_position
165 elif self.
_device_device.is_wallthermostat():
167 room = cube.room_by_id(self.
_device_device.room_id)
168 for device
in cube.devices_by_room(room):
169 if device.is_thermostat()
and device.valve_position > 0:
170 valve = device.valve_position
177 return HVACAction.HEATING
183 """Return the temperature we try to reach."""
184 temp = self.
_device_device.target_temperature
190 """Set new target temperatures."""
191 if (temp := kwargs.get(ATTR_TEMPERATURE))
is None:
193 f
"No {ATTR_TEMPERATURE} parameter passed to set_temperature method."
199 """Return the current preset mode."""
200 if self.
_device_device.mode == MAX_DEVICE_MODE_MANUAL:
201 if self.
_device_device.target_temperature == self.
_device_device.comfort_temperature:
202 return PRESET_COMFORT
203 if self.
_device_device.target_temperature == self.
_device_device.eco_temperature:
205 if self.
_device_device.target_temperature == ON_TEMPERATURE:
207 elif self.
_device_device.mode == MAX_DEVICE_MODE_BOOST:
209 elif self.
_device_device.mode == MAX_DEVICE_MODE_VACATION:
214 """Set new operation mode."""
215 if preset_mode == PRESET_COMFORT:
216 self.
_set_target_set_target(MAX_DEVICE_MODE_MANUAL, self.
_device_device.comfort_temperature)
217 elif preset_mode == PRESET_ECO:
218 self.
_set_target_set_target(MAX_DEVICE_MODE_MANUAL, self.
_device_device.eco_temperature)
219 elif preset_mode == PRESET_ON:
220 self.
_set_target_set_target(MAX_DEVICE_MODE_MANUAL, ON_TEMPERATURE)
221 elif preset_mode == PRESET_AWAY:
222 self.
_set_target_set_target(MAX_DEVICE_MODE_VACATION,
None)
223 elif preset_mode == PRESET_BOOST:
224 self.
_set_target_set_target(MAX_DEVICE_MODE_BOOST,
None)
225 elif preset_mode == PRESET_NONE:
226 self.
_set_target_set_target(MAX_DEVICE_MODE_AUTOMATIC,
None)
228 raise ValueError(f
"unsupported preset mode {preset_mode}")
232 """Return the optional state attributes."""
233 if not self.
_device_device.is_thermostat():
235 return {ATTR_VALVE_POSITION: self.
_device_device.valve_position}
238 """Get latest data from MAX! Cube."""
HVACMode|None hvac_mode(self)
def current_temperature(self)
None set_temperature(self, **Any kwargs)
None set_hvac_mode(self, HVACMode hvac_mode)
None _set_target(self, int|None mode, float|None temp)
None set_preset_mode(self, str preset_mode)
HVACAction|None hvac_action(self)
def target_temperature(self)
def __init__(self, handler, device)
def extra_state_attributes(self)
None add_entities(AsusWrtRouter router, AddEntitiesCallback async_add_entities, set[str] tracked)
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)