Skip to content

Commit d3dfa8b

Browse files
committed
Initial EvoHome implementation
1 parent 619aed3 commit d3dfa8b

File tree

1 file changed

+102
-0
lines changed

1 file changed

+102
-0
lines changed
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
"""Support for EvoHomeController."""
2+
3+
from datetime import timedelta
4+
5+
from pyoverkiz.enums import OverkizCommand, OverkizCommandParam, OverkizState
6+
7+
from homeassistant.components.climate import (
8+
PRESET_NONE,
9+
ClimateEntity,
10+
ClimateEntityFeature,
11+
HVACMode,
12+
)
13+
from homeassistant.const import UnitOfTemperature
14+
import homeassistant.util.dt as dt_util
15+
16+
from ..entity import OverkizDataUpdateCoordinator, OverkizEntity
17+
18+
PRESET_DAY_OFF = "day-off"
19+
PRESET_HOLIDAYS = "holidays"
20+
21+
OVERKIZ_TO_HVAC_MODES: dict[str, HVACMode] = {
22+
OverkizCommandParam.AUTO: HVACMode.AUTO,
23+
OverkizCommandParam.OFF: HVACMode.OFF,
24+
}
25+
HVAC_MODES_TO_OVERKIZ = {v: k for k, v in OVERKIZ_TO_HVAC_MODES.items()}
26+
27+
OVERKIZ_TO_PRESET_MODES: dict[str, str] = {
28+
OverkizCommandParam.DAY_OFF: PRESET_DAY_OFF,
29+
OverkizCommandParam.HOLIDAYS: PRESET_HOLIDAYS,
30+
}
31+
PRESET_MODES_TO_OVERKIZ = {v: k for k, v in OVERKIZ_TO_PRESET_MODES.items()}
32+
33+
34+
class EvoHomeController(OverkizEntity, ClimateEntity):
35+
"""Representation of EvoHomeController device."""
36+
37+
_attr_hvac_modes = [*HVAC_MODES_TO_OVERKIZ]
38+
_attr_preset_modes = [*PRESET_MODES_TO_OVERKIZ]
39+
_attr_supported_features = (
40+
ClimateEntityFeature.PRESET_MODE | ClimateEntityFeature.TURN_OFF
41+
)
42+
_attr_temperature_unit = UnitOfTemperature.CELSIUS
43+
44+
def __init__(
45+
self, device_url: str, coordinator: OverkizDataUpdateCoordinator
46+
) -> None:
47+
"""Init method."""
48+
super().__init__(device_url, coordinator)
49+
50+
if self._attr_device_info:
51+
self._attr_device_info["manufacturer"] = "EvoHome"
52+
53+
@property
54+
def hvac_mode(self) -> HVACMode:
55+
"""Return hvac operation ie. heat, cool mode."""
56+
operating_mode = self.executor.select_state(
57+
OverkizState.RAMSES_RAMSES_OPERATING_MODE
58+
)
59+
60+
if operating_mode in OVERKIZ_TO_HVAC_MODES:
61+
return OVERKIZ_TO_HVAC_MODES[operating_mode]
62+
63+
if operating_mode in OVERKIZ_TO_PRESET_MODES:
64+
return HVACMode.HEAT
65+
66+
return HVACMode.OFF
67+
68+
async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None:
69+
"""Set new target hvac mode."""
70+
await self.executor.async_execute_command(
71+
OverkizCommand.SET_OPERATING_MODE, HVAC_MODES_TO_OVERKIZ[hvac_mode]
72+
)
73+
74+
@property
75+
def preset_mode(self) -> str | None:
76+
"""Return the current preset mode, e.g., home, away, temp."""
77+
if (
78+
state := self.device.states[OverkizState.RAMSES_RAMSES_OPERATING_MODE]
79+
) and state.value_as_str in OVERKIZ_TO_PRESET_MODES:
80+
return OVERKIZ_TO_PRESET_MODES[state.value_as_str]
81+
82+
return PRESET_NONE
83+
84+
async def async_set_preset_mode(self, preset_mode: str) -> None:
85+
"""Set new preset mode."""
86+
if preset_mode == PRESET_DAY_OFF:
87+
today_end_of_day = dt_util.now().replace(
88+
hour=0, minute=0, second=0, microsecond=0
89+
) + timedelta(days=1)
90+
time_interval = today_end_of_day
91+
92+
if preset_mode == PRESET_HOLIDAYS:
93+
one_week_from_now = dt_util.now().replace(
94+
hour=0, minute=0, second=0, microsecond=0
95+
) + timedelta(days=7)
96+
time_interval = one_week_from_now
97+
98+
await self.executor.async_execute_command(
99+
OverkizCommand.SET_OPERATING_MODE,
100+
PRESET_MODES_TO_OVERKIZ[preset_mode],
101+
time_interval.strftime("%Y/%m/%d %H:%M"),
102+
)

0 commit comments

Comments
 (0)