1 """Support for HitachiAirToAirHeatPump."""
3 from __future__
import annotations
5 from typing
import Any, cast
7 from pyoverkiz.enums
import OverkizCommand, OverkizCommandParam, OverkizState
25 from ..const
import DOMAIN
26 from ..coordinator
import OverkizDataUpdateCoordinator
27 from ..entity
import OverkizEntity
29 PRESET_HOLIDAY_MODE =
"holiday_mode"
31 FAN_SPEED_STATE = OverkizState.HLRRWIFI_FAN_SPEED
32 LEAVE_HOME_STATE = OverkizState.HLRRWIFI_LEAVE_HOME
33 MAIN_OPERATION_STATE = OverkizState.HLRRWIFI_MAIN_OPERATION
34 MODE_CHANGE_STATE = OverkizState.HLRRWIFI_MODE_CHANGE
35 ROOM_TEMPERATURE_STATE = OverkizState.HLRRWIFI_ROOM_TEMPERATURE
36 SWING_STATE = OverkizState.HLRRWIFI_SWING
38 OVERKIZ_TO_HVAC_MODES: dict[str, HVACMode] = {
39 OverkizCommandParam.AUTOHEATING: HVACMode.AUTO,
40 OverkizCommandParam.AUTOCOOLING: HVACMode.AUTO,
41 OverkizCommandParam.ON: HVACMode.HEAT,
42 OverkizCommandParam.OFF: HVACMode.OFF,
43 OverkizCommandParam.HEATING: HVACMode.HEAT,
44 OverkizCommandParam.FAN: HVACMode.FAN_ONLY,
45 OverkizCommandParam.DEHUMIDIFY: HVACMode.DRY,
46 OverkizCommandParam.COOLING: HVACMode.COOL,
47 OverkizCommandParam.AUTO: HVACMode.AUTO,
50 HVAC_MODES_TO_OVERKIZ: dict[HVACMode, str] = {
51 HVACMode.AUTO: OverkizCommandParam.AUTO,
52 HVACMode.HEAT: OverkizCommandParam.HEATING,
53 HVACMode.OFF: OverkizCommandParam.AUTO,
54 HVACMode.FAN_ONLY: OverkizCommandParam.FAN,
55 HVACMode.DRY: OverkizCommandParam.DEHUMIDIFY,
56 HVACMode.COOL: OverkizCommandParam.COOLING,
59 OVERKIZ_TO_SWING_MODES: dict[str, str] = {
60 OverkizCommandParam.BOTH: SWING_BOTH,
61 OverkizCommandParam.HORIZONTAL: SWING_HORIZONTAL,
62 OverkizCommandParam.STOP: SWING_OFF,
63 OverkizCommandParam.VERTICAL: SWING_VERTICAL,
66 SWING_MODES_TO_OVERKIZ = {v: k
for k, v
in OVERKIZ_TO_SWING_MODES.items()}
68 OVERKIZ_TO_FAN_MODES: dict[str, str] = {
69 OverkizCommandParam.AUTO: FAN_AUTO,
70 OverkizCommandParam.HIGH: FAN_HIGH,
71 OverkizCommandParam.LOW: FAN_LOW,
72 OverkizCommandParam.MEDIUM: FAN_MEDIUM,
73 OverkizCommandParam.SILENT: FAN_SILENT,
76 FAN_MODES_TO_OVERKIZ: dict[str, str] = {
77 FAN_AUTO: OverkizCommandParam.AUTO,
78 FAN_HIGH: OverkizCommandParam.HIGH,
79 FAN_LOW: OverkizCommandParam.LOW,
80 FAN_MEDIUM: OverkizCommandParam.MEDIUM,
81 FAN_SILENT: OverkizCommandParam.SILENT,
86 """Representation of Hitachi Air To Air HeatPump."""
88 _attr_hvac_modes = [*HVAC_MODES_TO_OVERKIZ]
89 _attr_preset_modes = [PRESET_NONE, PRESET_HOLIDAY_MODE]
90 _attr_swing_modes = [*SWING_MODES_TO_OVERKIZ]
91 _attr_target_temperature_step = 1.0
92 _attr_temperature_unit = UnitOfTemperature.CELSIUS
93 _attr_translation_key = DOMAIN
94 _enable_turn_on_off_backwards_compatibility =
False
97 self, device_url: str, coordinator: OverkizDataUpdateCoordinator
100 super().
__init__(device_url, coordinator)
103 ClimateEntityFeature.TARGET_TEMPERATURE
104 | ClimateEntityFeature.FAN_MODE
105 | ClimateEntityFeature.PRESET_MODE
106 | ClimateEntityFeature.TURN_OFF
107 | ClimateEntityFeature.TURN_ON
110 if self.
devicedevice.states.get(SWING_STATE):
118 """Return hvac operation ie. heat, cool mode."""
120 main_op_state := self.
devicedevice.states[MAIN_OPERATION_STATE]
121 )
and main_op_state.value_as_str:
122 if main_op_state.value_as_str.lower() == OverkizCommandParam.OFF:
126 mode_change_state := self.
devicedevice.states[MODE_CHANGE_STATE]
127 )
and mode_change_state.value_as_str:
128 sanitized_value = mode_change_state.value_as_str.lower()
129 return OVERKIZ_TO_HVAC_MODES[sanitized_value]
134 """Set new target hvac mode."""
135 if hvac_mode == HVACMode.OFF:
136 await self.
_global_control_global_control(main_operation=OverkizCommandParam.OFF)
139 main_operation=OverkizCommandParam.ON,
140 hvac_mode=HVAC_MODES_TO_OVERKIZ[hvac_mode],
145 """Return the fan setting."""
146 if (state := self.
devicedevice.states[FAN_SPEED_STATE])
and state.value_as_str:
147 return OVERKIZ_TO_FAN_MODES[state.value_as_str]
153 """Return the list of available fan modes."""
154 return [*FAN_MODES_TO_OVERKIZ]
157 """Set new target fan mode."""
158 await self.
_global_control_global_control(fan_mode=FAN_MODES_TO_OVERKIZ[fan_mode])
162 """Return the swing setting."""
163 if (state := self.
devicedevice.states[SWING_STATE])
and state.value_as_str:
164 return OVERKIZ_TO_SWING_MODES[state.value_as_str]
169 """Set new target swing operation."""
170 await self.
_global_control_global_control(swing_mode=SWING_MODES_TO_OVERKIZ[swing_mode])
174 """Return the temperature."""
176 temperature := self.
devicedevice.states[OverkizState.CORE_TARGET_TEMPERATURE]
177 )
and temperature.value_as_int:
178 return temperature.value_as_int
184 """Return current temperature."""
185 if (state := self.
devicedevice.states[ROOM_TEMPERATURE_STATE])
and state.value_as_int:
186 return state.value_as_int
191 """Set new temperature."""
192 temperature = cast(float, kwargs.get(ATTR_TEMPERATURE))
197 """Return the current preset mode, e.g., home, away, temp."""
198 if (state := self.
devicedevice.states[LEAVE_HOME_STATE])
and state.value_as_str:
199 if state.value_as_str == OverkizCommandParam.ON:
200 return PRESET_HOLIDAY_MODE
202 if state.value_as_str == OverkizCommandParam.OFF:
208 """Set new preset mode."""
209 if preset_mode == PRESET_HOLIDAY_MODE:
210 await self.
_global_control_global_control(leave_home=OverkizCommandParam.ON)
212 if preset_mode == PRESET_NONE:
213 await self.
_global_control_global_control(leave_home=OverkizCommandParam.OFF)
216 self, value: str |
None, state_name: str, fallback_value: str
218 """Overkiz doesn't accept commands with undefined parameters. This function is guaranteed to return a `str` which is the provided `value` if set, or the current device state if set, or the provided `fallback_value` otherwise."""
221 state = self.
devicedevice.states[state_name]
222 if state
and state.value_as_str:
223 return state.value_as_str
224 return fallback_value
228 main_operation: str |
None =
None,
229 target_temperature: int |
None =
None,
230 fan_mode: str |
None =
None,
231 hvac_mode: str |
None =
None,
232 swing_mode: str |
None =
None,
233 leave_home: str |
None =
None,
235 """Execute globalControl command with all parameters. There is no option to only set a single parameter, without passing all other values."""
238 main_operation, MAIN_OPERATION_STATE, OverkizCommandParam.ON
245 OverkizCommandParam.AUTO,
250 OverkizCommandParam.AUTO,
253 hvac_mode.replace(
" ",
"")
255 OverkizCommandParam.AUTOCOOLING,
256 OverkizCommandParam.AUTOHEATING,
259 hvac_mode = OverkizCommandParam.AUTO
264 OverkizCommandParam.STOP,
270 OverkizCommandParam.OFF,
282 await self.
executorexecutor.async_execute_command(
283 OverkizCommand.GLOBAL_CONTROL, *command_data
float|None target_temperature(self)
None __init__(self, str device_url, OverkizDataUpdateCoordinator coordinator)
int|None target_temperature(self)
None async_set_swing_mode(self, str swing_mode)
None async_set_hvac_mode(self, HVACMode hvac_mode)
None async_set_temperature(self, **Any kwargs)
None async_set_fan_mode(self, str fan_mode)
str _control_backfill(self, str|None value, str state_name, str fallback_value)
str|None swing_mode(self)
str|None preset_mode(self)
int|None current_temperature(self)
None _global_control(self, str|None main_operation=None, int|None target_temperature=None, str|None fan_mode=None, str|None hvac_mode=None, str|None swing_mode=None, str|None leave_home=None)
None async_set_preset_mode(self, str preset_mode)
list[str]|None fan_modes(self)