mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 11:17:21 +00:00
Move evohome constants to separate module (#118471)
* move constants to const.py * make module docstring tweaks * move schemas back to init
This commit is contained in:
parent
ac979e9105
commit
46aa3ca97c
@ -1,6 +1,7 @@
|
|||||||
"""Support for (EMEA/EU-based) Honeywell TCC climate systems.
|
"""Support for (EMEA/EU-based) Honeywell TCC systems.
|
||||||
|
|
||||||
Such systems include evohome, Round Thermostat, and others.
|
Such systems provide heating/cooling and DHW and include Evohome, Round Thermostat, and
|
||||||
|
others.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
@ -10,7 +11,7 @@ from datetime import datetime, timedelta
|
|||||||
from http import HTTPStatus
|
from http import HTTPStatus
|
||||||
import logging
|
import logging
|
||||||
import re
|
import re
|
||||||
from typing import Any
|
from typing import Any, Final
|
||||||
|
|
||||||
import evohomeasync as ev1
|
import evohomeasync as ev1
|
||||||
from evohomeasync.schema import SZ_ID, SZ_SESSION_ID, SZ_TEMP
|
from evohomeasync.schema import SZ_ID, SZ_SESSION_ID, SZ_TEMP
|
||||||
@ -58,21 +59,31 @@ from homeassistant.helpers.storage import Store
|
|||||||
from homeassistant.helpers.typing import ConfigType
|
from homeassistant.helpers.typing import ConfigType
|
||||||
import homeassistant.util.dt as dt_util
|
import homeassistant.util.dt as dt_util
|
||||||
|
|
||||||
from .const import DOMAIN, GWS, STORAGE_KEY, STORAGE_VER, TCS, UTC_OFFSET
|
from .const import (
|
||||||
|
ACCESS_TOKEN,
|
||||||
|
ACCESS_TOKEN_EXPIRES,
|
||||||
|
ATTR_DURATION_DAYS,
|
||||||
|
ATTR_DURATION_HOURS,
|
||||||
|
ATTR_DURATION_UNTIL,
|
||||||
|
ATTR_SYSTEM_MODE,
|
||||||
|
ATTR_ZONE_TEMP,
|
||||||
|
CONF_LOCATION_IDX,
|
||||||
|
DOMAIN,
|
||||||
|
GWS,
|
||||||
|
REFRESH_TOKEN,
|
||||||
|
SCAN_INTERVAL_DEFAULT,
|
||||||
|
SCAN_INTERVAL_MINIMUM,
|
||||||
|
STORAGE_KEY,
|
||||||
|
STORAGE_VER,
|
||||||
|
TCS,
|
||||||
|
USER_DATA,
|
||||||
|
UTC_OFFSET,
|
||||||
|
EvoService,
|
||||||
|
)
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
ACCESS_TOKEN = "access_token"
|
CONFIG_SCHEMA: Final = vol.Schema(
|
||||||
ACCESS_TOKEN_EXPIRES = "access_token_expires"
|
|
||||||
REFRESH_TOKEN = "refresh_token"
|
|
||||||
USER_DATA = "user_data"
|
|
||||||
|
|
||||||
CONF_LOCATION_IDX = "location_idx"
|
|
||||||
|
|
||||||
SCAN_INTERVAL_DEFAULT = timedelta(seconds=300)
|
|
||||||
SCAN_INTERVAL_MINIMUM = timedelta(seconds=60)
|
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.Schema(
|
|
||||||
{
|
{
|
||||||
DOMAIN: vol.Schema(
|
DOMAIN: vol.Schema(
|
||||||
{
|
{
|
||||||
@ -88,22 +99,12 @@ CONFIG_SCHEMA = vol.Schema(
|
|||||||
extra=vol.ALLOW_EXTRA,
|
extra=vol.ALLOW_EXTRA,
|
||||||
)
|
)
|
||||||
|
|
||||||
ATTR_SYSTEM_MODE = "mode"
|
# system mode schemas are built dynamically when the services are regiatered
|
||||||
ATTR_DURATION_DAYS = "period"
|
|
||||||
ATTR_DURATION_HOURS = "duration"
|
|
||||||
|
|
||||||
ATTR_ZONE_TEMP = "setpoint"
|
RESET_ZONE_OVERRIDE_SCHEMA: Final = vol.Schema(
|
||||||
ATTR_DURATION_UNTIL = "duration"
|
{vol.Required(ATTR_ENTITY_ID): cv.entity_id}
|
||||||
|
)
|
||||||
SVC_REFRESH_SYSTEM = "refresh_system"
|
SET_ZONE_OVERRIDE_SCHEMA: Final = vol.Schema(
|
||||||
SVC_SET_SYSTEM_MODE = "set_system_mode"
|
|
||||||
SVC_RESET_SYSTEM = "reset_system"
|
|
||||||
SVC_SET_ZONE_OVERRIDE = "set_zone_override"
|
|
||||||
SVC_RESET_ZONE_OVERRIDE = "clear_zone_override"
|
|
||||||
|
|
||||||
|
|
||||||
RESET_ZONE_OVERRIDE_SCHEMA = vol.Schema({vol.Required(ATTR_ENTITY_ID): cv.entity_id})
|
|
||||||
SET_ZONE_OVERRIDE_SCHEMA = vol.Schema(
|
|
||||||
{
|
{
|
||||||
vol.Required(ATTR_ENTITY_ID): cv.entity_id,
|
vol.Required(ATTR_ENTITY_ID): cv.entity_id,
|
||||||
vol.Required(ATTR_ZONE_TEMP): vol.All(
|
vol.Required(ATTR_ZONE_TEMP): vol.All(
|
||||||
@ -114,7 +115,6 @@ SET_ZONE_OVERRIDE_SCHEMA = vol.Schema(
|
|||||||
),
|
),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
# system mode schemas are built dynamically, below
|
|
||||||
|
|
||||||
|
|
||||||
def _dt_local_to_aware(dt_naive: datetime) -> datetime:
|
def _dt_local_to_aware(dt_naive: datetime) -> datetime:
|
||||||
@ -358,14 +358,14 @@ def setup_service_functions(hass: HomeAssistant, broker: EvoBroker) -> None:
|
|||||||
|
|
||||||
async_dispatcher_send(hass, DOMAIN, payload)
|
async_dispatcher_send(hass, DOMAIN, payload)
|
||||||
|
|
||||||
hass.services.async_register(DOMAIN, SVC_REFRESH_SYSTEM, force_refresh)
|
hass.services.async_register(DOMAIN, EvoService.REFRESH_SYSTEM, force_refresh)
|
||||||
|
|
||||||
# Enumerate which operating modes are supported by this system
|
# Enumerate which operating modes are supported by this system
|
||||||
modes = broker.config[SZ_ALLOWED_SYSTEM_MODES]
|
modes = broker.config[SZ_ALLOWED_SYSTEM_MODES]
|
||||||
|
|
||||||
# Not all systems support "AutoWithReset": register this handler only if required
|
# Not all systems support "AutoWithReset": register this handler only if required
|
||||||
if [m[SZ_SYSTEM_MODE] for m in modes if m[SZ_SYSTEM_MODE] == SZ_AUTO_WITH_RESET]:
|
if [m[SZ_SYSTEM_MODE] for m in modes if m[SZ_SYSTEM_MODE] == SZ_AUTO_WITH_RESET]:
|
||||||
hass.services.async_register(DOMAIN, SVC_RESET_SYSTEM, set_system_mode)
|
hass.services.async_register(DOMAIN, EvoService.RESET_SYSTEM, set_system_mode)
|
||||||
|
|
||||||
system_mode_schemas = []
|
system_mode_schemas = []
|
||||||
modes = [m for m in modes if m[SZ_SYSTEM_MODE] != SZ_AUTO_WITH_RESET]
|
modes = [m for m in modes if m[SZ_SYSTEM_MODE] != SZ_AUTO_WITH_RESET]
|
||||||
@ -409,7 +409,7 @@ def setup_service_functions(hass: HomeAssistant, broker: EvoBroker) -> None:
|
|||||||
if system_mode_schemas:
|
if system_mode_schemas:
|
||||||
hass.services.async_register(
|
hass.services.async_register(
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
SVC_SET_SYSTEM_MODE,
|
EvoService.SET_SYSTEM_MODE,
|
||||||
set_system_mode,
|
set_system_mode,
|
||||||
schema=vol.Schema(vol.Any(*system_mode_schemas)),
|
schema=vol.Schema(vol.Any(*system_mode_schemas)),
|
||||||
)
|
)
|
||||||
@ -417,13 +417,13 @@ def setup_service_functions(hass: HomeAssistant, broker: EvoBroker) -> None:
|
|||||||
# The zone modes are consistent across all systems and use the same schema
|
# The zone modes are consistent across all systems and use the same schema
|
||||||
hass.services.async_register(
|
hass.services.async_register(
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
SVC_RESET_ZONE_OVERRIDE,
|
EvoService.RESET_ZONE_OVERRIDE,
|
||||||
set_zone_override,
|
set_zone_override,
|
||||||
schema=RESET_ZONE_OVERRIDE_SCHEMA,
|
schema=RESET_ZONE_OVERRIDE_SCHEMA,
|
||||||
)
|
)
|
||||||
hass.services.async_register(
|
hass.services.async_register(
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
SVC_SET_ZONE_OVERRIDE,
|
EvoService.SET_ZONE_OVERRIDE,
|
||||||
set_zone_override,
|
set_zone_override,
|
||||||
schema=SET_ZONE_OVERRIDE_SCHEMA,
|
schema=SET_ZONE_OVERRIDE_SCHEMA,
|
||||||
)
|
)
|
||||||
@ -612,7 +612,10 @@ class EvoDevice(Entity):
|
|||||||
return
|
return
|
||||||
if payload["unique_id"] != self._attr_unique_id:
|
if payload["unique_id"] != self._attr_unique_id:
|
||||||
return
|
return
|
||||||
if payload["service"] in (SVC_SET_ZONE_OVERRIDE, SVC_RESET_ZONE_OVERRIDE):
|
if payload["service"] in (
|
||||||
|
EvoService.SET_ZONE_OVERRIDE,
|
||||||
|
EvoService.RESET_ZONE_OVERRIDE,
|
||||||
|
):
|
||||||
await self.async_zone_svc_request(payload["service"], payload["data"])
|
await self.async_zone_svc_request(payload["service"], payload["data"])
|
||||||
return
|
return
|
||||||
await self.async_tcs_svc_request(payload["service"], payload["data"])
|
await self.async_tcs_svc_request(payload["service"], payload["data"])
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
"""Support for Climate devices of (EMEA/EU-based) Honeywell TCC systems."""
|
"""Support for Climate entities of the Evohome integration."""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
@ -37,19 +37,14 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
|||||||
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
|
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
|
||||||
import homeassistant.util.dt as dt_util
|
import homeassistant.util.dt as dt_util
|
||||||
|
|
||||||
from . import (
|
from . import EvoChild, EvoDevice
|
||||||
|
from .const import (
|
||||||
ATTR_DURATION_DAYS,
|
ATTR_DURATION_DAYS,
|
||||||
ATTR_DURATION_HOURS,
|
ATTR_DURATION_HOURS,
|
||||||
ATTR_DURATION_UNTIL,
|
ATTR_DURATION_UNTIL,
|
||||||
ATTR_SYSTEM_MODE,
|
ATTR_SYSTEM_MODE,
|
||||||
ATTR_ZONE_TEMP,
|
ATTR_ZONE_TEMP,
|
||||||
CONF_LOCATION_IDX,
|
CONF_LOCATION_IDX,
|
||||||
SVC_RESET_ZONE_OVERRIDE,
|
|
||||||
SVC_SET_SYSTEM_MODE,
|
|
||||||
EvoChild,
|
|
||||||
EvoDevice,
|
|
||||||
)
|
|
||||||
from .const import (
|
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
EVO_AUTO,
|
EVO_AUTO,
|
||||||
EVO_AUTOECO,
|
EVO_AUTOECO,
|
||||||
@ -61,6 +56,7 @@ from .const import (
|
|||||||
EVO_PERMOVER,
|
EVO_PERMOVER,
|
||||||
EVO_RESET,
|
EVO_RESET,
|
||||||
EVO_TEMPOVER,
|
EVO_TEMPOVER,
|
||||||
|
EvoService,
|
||||||
)
|
)
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
@ -200,11 +196,11 @@ class EvoZone(EvoChild, EvoClimateEntity):
|
|||||||
|
|
||||||
async def async_zone_svc_request(self, service: str, data: dict[str, Any]) -> None:
|
async def async_zone_svc_request(self, service: str, data: dict[str, Any]) -> None:
|
||||||
"""Process a service request (setpoint override) for a zone."""
|
"""Process a service request (setpoint override) for a zone."""
|
||||||
if service == SVC_RESET_ZONE_OVERRIDE:
|
if service == EvoService.RESET_ZONE_OVERRIDE:
|
||||||
await self._evo_broker.call_client_api(self._evo_device.reset_mode())
|
await self._evo_broker.call_client_api(self._evo_device.reset_mode())
|
||||||
return
|
return
|
||||||
|
|
||||||
# otherwise it is SVC_SET_ZONE_OVERRIDE
|
# otherwise it is EvoService.SET_ZONE_OVERRIDE
|
||||||
temperature = max(min(data[ATTR_ZONE_TEMP], self.max_temp), self.min_temp)
|
temperature = max(min(data[ATTR_ZONE_TEMP], self.max_temp), self.min_temp)
|
||||||
|
|
||||||
if ATTR_DURATION_UNTIL in data:
|
if ATTR_DURATION_UNTIL in data:
|
||||||
@ -386,9 +382,9 @@ class EvoController(EvoClimateEntity):
|
|||||||
|
|
||||||
Data validation is not required, it will have been done upstream.
|
Data validation is not required, it will have been done upstream.
|
||||||
"""
|
"""
|
||||||
if service == SVC_SET_SYSTEM_MODE:
|
if service == EvoService.SET_SYSTEM_MODE:
|
||||||
mode = data[ATTR_SYSTEM_MODE]
|
mode = data[ATTR_SYSTEM_MODE]
|
||||||
else: # otherwise it is SVC_RESET_SYSTEM
|
else: # otherwise it is EvoService.RESET_SYSTEM
|
||||||
mode = EVO_RESET
|
mode = EVO_RESET
|
||||||
|
|
||||||
if ATTR_DURATION_DAYS in data:
|
if ATTR_DURATION_DAYS in data:
|
||||||
|
@ -1,26 +1,60 @@
|
|||||||
"""Support for (EMEA/EU-based) Honeywell TCC climate systems."""
|
"""The constants of the Evohome integration."""
|
||||||
|
|
||||||
DOMAIN = "evohome"
|
from __future__ import annotations
|
||||||
|
|
||||||
STORAGE_VER = 1
|
from datetime import timedelta
|
||||||
STORAGE_KEY = DOMAIN
|
from enum import StrEnum, unique
|
||||||
|
from typing import Final
|
||||||
|
|
||||||
# The Parent's (i.e. TCS, Controller's) operating mode is one of:
|
DOMAIN: Final = "evohome"
|
||||||
EVO_RESET = "AutoWithReset"
|
|
||||||
EVO_AUTO = "Auto"
|
|
||||||
EVO_AUTOECO = "AutoWithEco"
|
|
||||||
EVO_AWAY = "Away"
|
|
||||||
EVO_DAYOFF = "DayOff"
|
|
||||||
EVO_CUSTOM = "Custom"
|
|
||||||
EVO_HEATOFF = "HeatingOff"
|
|
||||||
|
|
||||||
# The Children's operating mode is one of:
|
STORAGE_VER: Final = 1
|
||||||
EVO_FOLLOW = "FollowSchedule" # the operating mode is 'inherited' from the TCS
|
STORAGE_KEY: Final = DOMAIN
|
||||||
EVO_TEMPOVER = "TemporaryOverride"
|
|
||||||
EVO_PERMOVER = "PermanentOverride"
|
|
||||||
|
|
||||||
# These are used only to help prevent E501 (line too long) violations
|
# The Parent's (i.e. TCS, Controller) operating mode is one of:
|
||||||
GWS = "gateways"
|
EVO_RESET: Final = "AutoWithReset"
|
||||||
TCS = "temperatureControlSystems"
|
EVO_AUTO: Final = "Auto"
|
||||||
|
EVO_AUTOECO: Final = "AutoWithEco"
|
||||||
|
EVO_AWAY: Final = "Away"
|
||||||
|
EVO_DAYOFF: Final = "DayOff"
|
||||||
|
EVO_CUSTOM: Final = "Custom"
|
||||||
|
EVO_HEATOFF: Final = "HeatingOff"
|
||||||
|
|
||||||
UTC_OFFSET = "currentOffsetMinutes"
|
# The Children's (i.e. Dhw, Zone) operating mode is one of:
|
||||||
|
EVO_FOLLOW: Final = "FollowSchedule" # the operating mode is 'inherited' from the TCS
|
||||||
|
EVO_TEMPOVER: Final = "TemporaryOverride"
|
||||||
|
EVO_PERMOVER: Final = "PermanentOverride"
|
||||||
|
|
||||||
|
# These two are used only to help prevent E501 (line too long) violations
|
||||||
|
GWS: Final = "gateways"
|
||||||
|
TCS: Final = "temperatureControlSystems"
|
||||||
|
|
||||||
|
UTC_OFFSET: Final = "currentOffsetMinutes"
|
||||||
|
|
||||||
|
CONF_LOCATION_IDX: Final = "location_idx"
|
||||||
|
|
||||||
|
ACCESS_TOKEN: Final = "access_token"
|
||||||
|
ACCESS_TOKEN_EXPIRES: Final = "access_token_expires"
|
||||||
|
REFRESH_TOKEN: Final = "refresh_token"
|
||||||
|
USER_DATA: Final = "user_data"
|
||||||
|
|
||||||
|
SCAN_INTERVAL_DEFAULT: Final = timedelta(seconds=300)
|
||||||
|
SCAN_INTERVAL_MINIMUM: Final = timedelta(seconds=60)
|
||||||
|
|
||||||
|
ATTR_SYSTEM_MODE: Final = "mode"
|
||||||
|
ATTR_DURATION_DAYS: Final = "period"
|
||||||
|
ATTR_DURATION_HOURS: Final = "duration"
|
||||||
|
|
||||||
|
ATTR_ZONE_TEMP: Final = "setpoint"
|
||||||
|
ATTR_DURATION_UNTIL: Final = "duration"
|
||||||
|
|
||||||
|
|
||||||
|
@unique
|
||||||
|
class EvoService(StrEnum):
|
||||||
|
"""The Evohome services."""
|
||||||
|
|
||||||
|
REFRESH_SYSTEM: Final = "refresh_system"
|
||||||
|
SET_SYSTEM_MODE: Final = "set_system_mode"
|
||||||
|
RESET_SYSTEM: Final = "reset_system"
|
||||||
|
SET_ZONE_OVERRIDE: Final = "set_zone_override"
|
||||||
|
RESET_ZONE_OVERRIDE: Final = "clear_zone_override"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
"""Support for WaterHeater devices of (EMEA/EU) Honeywell TCC systems."""
|
"""Support for WaterHeater entities of the Evohome integration."""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user