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:
David Bonnes 2024-05-30 11:13:45 +01:00 committed by GitHub
parent ac979e9105
commit 46aa3ca97c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 103 additions and 70 deletions

View File

@ -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"])

View File

@ -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:

View File

@ -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"

View File

@ -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