1
0
mirror of https://github.com/home-assistant/core.git synced 2026-07-14 10:03:52 +01:00
Files
2026-07-09 12:31:31 +02:00

179 lines
5.5 KiB
Python

"""Services for the ecobee integration."""
from typing import TYPE_CHECKING
import voluptuous as vol
from homeassistant.const import ATTR_ENTITY_ID
from homeassistant.core import HomeAssistant, ServiceCall, callback
from homeassistant.helpers import config_validation as cv
from .const import DOMAIN
from .util import ecobee_date, ecobee_time
if TYPE_CHECKING:
from .climate import Thermostat
ATTR_COOL_TEMP = "cool_temp"
ATTR_END_DATE = "end_date"
ATTR_END_TIME = "end_time"
ATTR_FAN_MIN_ON_TIME = "fan_min_on_time"
ATTR_FAN_MODE = "fan_mode"
ATTR_HEAT_TEMP = "heat_temp"
ATTR_RESUME_ALL = "resume_all"
ATTR_START_DATE = "start_date"
ATTR_START_TIME = "start_time"
ATTR_VACATION_NAME = "vacation_name"
DEFAULT_RESUME_ALL = False
DATA_THERMOSTATS = "thermostats"
SERVICE_CREATE_VACATION = "create_vacation"
SERVICE_DELETE_VACATION = "delete_vacation"
SERVICE_RESUME_PROGRAM = "resume_program"
SERVICE_SET_FAN_MIN_ON_TIME = "set_fan_min_on_time"
DTGROUP_START_INCLUSIVE_MSG = (
f"{ATTR_START_DATE} and {ATTR_START_TIME} must be specified together"
)
DTGROUP_END_INCLUSIVE_MSG = (
f"{ATTR_END_DATE} and {ATTR_END_TIME} must be specified together"
)
CREATE_VACATION_SCHEMA = vol.Schema(
{
vol.Required(ATTR_ENTITY_ID): cv.entity_id,
vol.Required(ATTR_VACATION_NAME): vol.All(cv.string, vol.Length(max=12)),
vol.Required(ATTR_COOL_TEMP): vol.Coerce(float),
vol.Required(ATTR_HEAT_TEMP): vol.Coerce(float),
vol.Inclusive(
ATTR_START_DATE, "dtgroup_start", msg=DTGROUP_START_INCLUSIVE_MSG
): ecobee_date,
vol.Inclusive(
ATTR_START_TIME, "dtgroup_start", msg=DTGROUP_START_INCLUSIVE_MSG
): ecobee_time,
vol.Inclusive(
ATTR_END_DATE, "dtgroup_end", msg=DTGROUP_END_INCLUSIVE_MSG
): ecobee_date,
vol.Inclusive(
ATTR_END_TIME, "dtgroup_end", msg=DTGROUP_END_INCLUSIVE_MSG
): ecobee_time,
vol.Optional(ATTR_FAN_MODE, default="auto"): vol.Any("auto", "on"),
vol.Optional(ATTR_FAN_MIN_ON_TIME, default=0): vol.All(
int, vol.Range(min=0, max=60)
),
}
)
DELETE_VACATION_SCHEMA = vol.Schema(
{
vol.Required(ATTR_ENTITY_ID): cv.entity_id,
vol.Required(ATTR_VACATION_NAME): vol.All(cv.string, vol.Length(max=12)),
}
)
RESUME_PROGRAM_SCHEMA = vol.Schema(
{
vol.Optional(ATTR_ENTITY_ID): cv.entity_ids,
vol.Optional(ATTR_RESUME_ALL, default=DEFAULT_RESUME_ALL): cv.boolean,
}
)
SET_FAN_MIN_ON_TIME_SCHEMA = vol.Schema(
{
vol.Optional(ATTR_ENTITY_ID): cv.entity_ids,
vol.Required(ATTR_FAN_MIN_ON_TIME): vol.Coerce(int),
}
)
@callback
def _async_get_thermostats(hass: HomeAssistant) -> list[Thermostat]:
"""Return loaded ecobee thermostat entities."""
# pylint: disable-next=home-assistant-use-runtime-data
return hass.data[DOMAIN][DATA_THERMOSTATS]
def _create_vacation_service(call: ServiceCall) -> None:
"""Create a vacation on the target thermostat."""
for thermostat in _async_get_thermostats(call.hass):
if thermostat.entity_id == call.data[ATTR_ENTITY_ID]:
thermostat.create_vacation(call.data)
thermostat.schedule_update_ha_state(True)
break
def _delete_vacation_service(call: ServiceCall) -> None:
"""Delete a vacation on the target thermostat."""
for thermostat in _async_get_thermostats(call.hass):
if thermostat.entity_id == call.data[ATTR_ENTITY_ID]:
thermostat.delete_vacation(call.data[ATTR_VACATION_NAME])
thermostat.schedule_update_ha_state(True)
break
def _fan_min_on_time_set_service(call: ServiceCall) -> None:
"""Set the minimum fan on time on the target thermostats."""
entity_id = call.data.get(ATTR_ENTITY_ID)
thermostats = _async_get_thermostats(call.hass)
if entity_id:
thermostats = [
thermostat
for thermostat in thermostats
if thermostat.entity_id in entity_id
]
for thermostat in thermostats:
thermostat.set_fan_min_on_time(str(call.data[ATTR_FAN_MIN_ON_TIME]))
thermostat.schedule_update_ha_state(True)
def _resume_program_set_service(call: ServiceCall) -> None:
"""Resume the program on the target thermostats."""
entity_id = call.data.get(ATTR_ENTITY_ID)
thermostats = _async_get_thermostats(call.hass)
if entity_id:
thermostats = [
thermostat
for thermostat in thermostats
if thermostat.entity_id in entity_id
]
for thermostat in thermostats:
thermostat.resume_program(call.data.get(ATTR_RESUME_ALL))
thermostat.schedule_update_ha_state(True)
@callback
def async_setup_services(hass: HomeAssistant) -> None:
"""Register ecobee services."""
# pylint: disable-next=home-assistant-use-runtime-data
hass.data.setdefault(DOMAIN, {})[DATA_THERMOSTATS] = []
hass.services.async_register(
DOMAIN,
SERVICE_CREATE_VACATION,
_create_vacation_service,
schema=CREATE_VACATION_SCHEMA,
)
hass.services.async_register(
DOMAIN,
SERVICE_DELETE_VACATION,
_delete_vacation_service,
schema=DELETE_VACATION_SCHEMA,
)
hass.services.async_register(
DOMAIN,
SERVICE_SET_FAN_MIN_ON_TIME,
_fan_min_on_time_set_service,
schema=SET_FAN_MIN_ON_TIME_SCHEMA,
)
hass.services.async_register(
DOMAIN,
SERVICE_RESUME_PROGRAM,
_resume_program_set_service,
schema=RESUME_PROGRAM_SCHEMA,
)