1 """Support for HitachiAirToAirHeatPump."""
3 from __future__
import annotations
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"
35 AUTO_PIVOT_TEMPERATURE = 25
36 AUTO_TEMPERATURE_CHANGE_MIN = TEMP_AUTO_MIN - AUTO_PIVOT_TEMPERATURE
37 AUTO_TEMPERATURE_CHANGE_MAX = TEMP_AUTO_MAX - AUTO_PIVOT_TEMPERATURE
39 OVERKIZ_TO_HVAC_MODES: dict[str, HVACMode] = {
40 OverkizCommandParam.AUTOHEATING: HVACMode.AUTO,
41 OverkizCommandParam.AUTOCOOLING: HVACMode.AUTO,
42 OverkizCommandParam.ON: HVACMode.HEAT,
43 OverkizCommandParam.OFF: HVACMode.OFF,
44 OverkizCommandParam.HEATING: HVACMode.HEAT,
45 OverkizCommandParam.FAN: HVACMode.FAN_ONLY,
46 OverkizCommandParam.DEHUMIDIFY: HVACMode.DRY,
47 OverkizCommandParam.COOLING: HVACMode.COOL,
50 HVAC_MODES_TO_OVERKIZ: dict[HVACMode, str] = {
51 HVACMode.AUTO: OverkizCommandParam.AUTO,
52 HVACMode.HEAT: OverkizCommandParam.HEATING,
53 HVACMode.OFF: OverkizCommandParam.HEATING,
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.HI: FAN_HIGH,
72 OverkizCommandParam.LOW: FAN_LOW,
73 OverkizCommandParam.LO: FAN_LOW,
74 OverkizCommandParam.MEDIUM: FAN_MEDIUM,
75 OverkizCommandParam.MED: FAN_MEDIUM,
76 OverkizCommandParam.SILENT: OverkizCommandParam.SILENT,
79 FAN_MODES_TO_OVERKIZ: dict[str, str] = {
80 FAN_AUTO: OverkizCommandParam.AUTO,
81 FAN_HIGH: OverkizCommandParam.HI,
82 FAN_LOW: OverkizCommandParam.LO,
83 FAN_MEDIUM: OverkizCommandParam.MED,
84 FAN_SILENT: OverkizCommandParam.SILENT,
89 """Representation of Hitachi Air To Air HeatPump."""
91 _attr_hvac_modes = [*HVAC_MODES_TO_OVERKIZ]
92 _attr_fan_modes = [*FAN_MODES_TO_OVERKIZ]
93 _attr_preset_modes = [PRESET_NONE, PRESET_HOLIDAY_MODE]
94 _attr_swing_modes = [*SWING_MODES_TO_OVERKIZ]
95 _attr_target_temperature_step = 1.0
96 _attr_temperature_unit = UnitOfTemperature.CELSIUS
97 _attr_translation_key = DOMAIN
98 _enable_turn_on_off_backwards_compatibility =
False
101 self, device_url: str, coordinator: OverkizDataUpdateCoordinator
104 super().
__init__(device_url, coordinator)
107 ClimateEntityFeature.TARGET_TEMPERATURE
108 | ClimateEntityFeature.FAN_MODE
109 | ClimateEntityFeature.PRESET_MODE
110 | ClimateEntityFeature.TURN_OFF
111 | ClimateEntityFeature.TURN_ON
114 if self.
devicedevice.states.get(OverkizState.OVP_SWING):
122 """Return hvac operation ie. heat, cool mode."""
124 main_op_state := self.
devicedevice.states[OverkizState.OVP_MAIN_OPERATION]
125 )
and main_op_state.value_as_str:
126 if main_op_state.value_as_str.lower() == OverkizCommandParam.OFF:
130 mode_change_state := self.
devicedevice.states[OverkizState.OVP_MODE_CHANGE]
131 )
and mode_change_state.value_as_str:
134 sanitized_value = mode_change_state.value_as_str.replace(
" ",
"").lower()
135 return OVERKIZ_TO_HVAC_MODES[sanitized_value]
140 """Set new target hvac mode."""
141 if hvac_mode == HVACMode.OFF:
142 await self.
_global_control_global_control(main_operation=OverkizCommandParam.OFF)
145 main_operation=OverkizCommandParam.ON,
146 hvac_mode=HVAC_MODES_TO_OVERKIZ[hvac_mode],
151 """Return the fan setting."""
153 state := self.
devicedevice.states[OverkizState.OVP_FAN_SPEED]
154 )
and state.value_as_str:
155 return OVERKIZ_TO_FAN_MODES[state.value_as_str]
160 """Set new target fan mode."""
161 await self.
_global_control_global_control(fan_mode=FAN_MODES_TO_OVERKIZ[fan_mode])
165 """Return the swing setting."""
166 if (state := self.
devicedevice.states[OverkizState.OVP_SWING])
and state.value_as_str:
167 return OVERKIZ_TO_SWING_MODES[state.value_as_str]
172 """Set new target swing operation."""
173 await self.
_global_control_global_control(swing_mode=SWING_MODES_TO_OVERKIZ[swing_mode])
177 """Return the target temperature."""
179 temperature := self.
devicedevice.states[OverkizState.CORE_TARGET_TEMPERATURE]
180 )
and temperature.value_as_int:
181 return temperature.value_as_int
187 """Return current temperature."""
189 state := self.
devicedevice.states[OverkizState.OVP_ROOM_TEMPERATURE]
190 )
and state.value_as_int:
191 return state.value_as_int
196 """Set new temperature."""
197 await self.
_global_control_global_control(target_temperature=
int(kwargs[ATTR_TEMPERATURE]))
201 """Return the current preset mode, e.g., home, away, temp."""
203 state := self.
devicedevice.states[OverkizState.CORE_HOLIDAYS_MODE]
204 )
and state.value_as_str:
205 if state.value_as_str == OverkizCommandParam.ON:
206 return PRESET_HOLIDAY_MODE
208 if state.value_as_str == OverkizCommandParam.OFF:
214 """Set new preset mode."""
215 if preset_mode == PRESET_HOLIDAY_MODE:
216 await self.
executorexecutor.async_execute_command(
217 OverkizCommand.SET_HOLIDAYS,
218 OverkizCommandParam.ON,
220 if preset_mode == PRESET_NONE:
221 await self.
executorexecutor.async_execute_command(
222 OverkizCommand.SET_HOLIDAYS,
223 OverkizCommandParam.OFF,
229 """Return auto/manu mode."""
231 state := self.
devicedevice.states[OverkizState.CORE_AUTO_MANU_MODE]
232 )
and state.value_as_str:
233 return state.value_as_str
239 """Return temperature change state."""
241 state := self.
devicedevice.states[OverkizState.OVP_TEMPERATURE_CHANGE]
242 )
and state.value_as_int:
243 return state.value_as_int
249 """Return the minimum temperature."""
256 """Return the maximum temperature."""
262 self, value: str |
None, state_name: str, fallback_value: str
264 """Return a parameter value which will be accepted in a command by Overkiz.
266 Overkiz doesn't accept commands with undefined parameters. This function
267 is guaranteed to return a `str` which is the provided `value` if set, or
268 the current device state if set, or the provided `fallback_value` otherwise.
272 if (state := self.
devicedevice.states[state_name])
is not None and (
273 value := state.value_as_str
276 return fallback_value
280 main_operation: str |
None =
None,
281 target_temperature: int |
None =
None,
282 fan_mode: str |
None =
None,
283 hvac_mode: str |
None =
None,
284 swing_mode: str |
None =
None,
285 leave_home: str |
None =
None,
287 """Execute globalControl command with all parameters.
289 There is no option to only set a single parameter, without passing
294 main_operation, OverkizState.OVP_MAIN_OPERATION, OverkizCommandParam.ON
298 OverkizState.OVP_FAN_SPEED,
299 OverkizCommandParam.AUTO,
303 if fan_mode
not in FAN_MODES_TO_OVERKIZ.values():
304 fan_mode = FAN_MODES_TO_OVERKIZ[OVERKIZ_TO_FAN_MODES[fan_mode]]
308 OverkizState.OVP_MODE_CHANGE,
309 OverkizCommandParam.AUTO,
311 if hvac_mode.replace(
" ",
"")
in [
314 OverkizCommandParam.AUTOCOOLING,
315 OverkizCommandParam.AUTOHEATING,
317 hvac_mode = OverkizCommandParam.AUTO
321 OverkizState.OVP_SWING,
322 OverkizCommandParam.STOP,
327 None, OverkizState.CORE_AUTO_MANU_MODE, OverkizCommandParam.MANU
330 auto_manu_mode = OverkizCommandParam.OFF
333 temperature_command =
None
335 if hvac_mode == OverkizCommandParam.AUTO:
338 temperature_change = 0
340 if target_temperature:
341 temperature_change = target_temperature - AUTO_PIVOT_TEMPERATURE
346 temperature_change =
min(
347 max(temperature_change, AUTO_TEMPERATURE_CHANGE_MIN),
348 AUTO_TEMPERATURE_CHANGE_MAX,
351 temperature_command = temperature_change
354 temperature_command = target_temperature
364 await self.
executorexecutor.async_execute_command(
365 OverkizCommand.GLOBAL_CONTROL, *command_data
float|None target_temperature(self)
HVACMode|None hvac_mode(self)
str|None preset_mode(self)
None async_set_hvac_mode(self, HVACMode hvac_mode)
None __init__(self, str device_url, OverkizDataUpdateCoordinator coordinator)
int|None target_temperature(self)
None async_set_preset_mode(self, str preset_mode)
str|None swing_mode(self)
None async_set_temperature(self, **Any kwargs)
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)
str _control_backfill(self, str|None value, str state_name, str fallback_value)
None async_set_fan_mode(self, str fan_mode)
None async_set_swing_mode(self, str swing_mode)
str|None auto_manu_mode(self)
int|None current_temperature(self)
str|None preset_mode(self)
int|None temperature_change(self)