Home Assistant Unofficial Reference 2024.12.1
device_condition.py
Go to the documentation of this file.
1 """Provide the device conditions for Select."""
2 
3 from __future__ import annotations
4 
5 import voluptuous as vol
6 
8  async_get_entity_registry_entry_or_raise,
9 )
10 from homeassistant.const import (
11  CONF_CONDITION,
12  CONF_DEVICE_ID,
13  CONF_DOMAIN,
14  CONF_ENTITY_ID,
15  CONF_FOR,
16  CONF_TYPE,
17 )
18 from homeassistant.core import HomeAssistant, callback
19 from homeassistant.exceptions import HomeAssistantError
20 from homeassistant.helpers import (
21  condition,
22  config_validation as cv,
23  entity_registry as er,
24 )
25 from homeassistant.helpers.config_validation import DEVICE_CONDITION_BASE_SCHEMA
26 from homeassistant.helpers.entity import get_capability
27 from homeassistant.helpers.typing import ConfigType, TemplateVarsType
28 
29 from .const import ATTR_OPTIONS, CONF_OPTION, DOMAIN
30 
31 # nypy: disallow-any-generics
32 
33 CONDITION_TYPES = {"selected_option"}
34 
35 CONDITION_SCHEMA = DEVICE_CONDITION_BASE_SCHEMA.extend(
36  {
37  vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid,
38  vol.Required(CONF_TYPE): vol.In(CONDITION_TYPES),
39  vol.Required(CONF_OPTION): str,
40  vol.Optional(CONF_FOR): cv.positive_time_period_dict,
41  }
42 )
43 
44 
46  hass: HomeAssistant, device_id: str
47 ) -> list[dict[str, str]]:
48  """List device conditions for Select devices."""
49  registry = er.async_get(hass)
50  return [
51  {
52  CONF_CONDITION: "device",
53  CONF_DEVICE_ID: device_id,
54  CONF_DOMAIN: DOMAIN,
55  CONF_ENTITY_ID: entry.id,
56  CONF_TYPE: "selected_option",
57  }
58  for entry in er.async_entries_for_device(registry, device_id)
59  if entry.domain == DOMAIN
60  ]
61 
62 
63 @callback
65  hass: HomeAssistant, config: ConfigType
66 ) -> condition.ConditionCheckerType:
67  """Create a function to test a device condition."""
68 
69  registry = er.async_get(hass)
70  entity_id = er.async_resolve_entity_id(registry, config[CONF_ENTITY_ID])
71 
72  @callback
73  def test_is_state(hass: HomeAssistant, variables: TemplateVarsType) -> bool:
74  """Test if an entity is a certain state."""
75  return condition.state(
76  hass, entity_id, config[CONF_OPTION], config.get(CONF_FOR)
77  )
78 
79  return test_is_state
80 
81 
83  hass: HomeAssistant, config: ConfigType
84 ) -> dict[str, vol.Schema]:
85  """List condition capabilities."""
86 
87  try:
88  entry = async_get_entity_registry_entry_or_raise(hass, config[CONF_ENTITY_ID])
89  options = get_capability(hass, entry.entity_id, ATTR_OPTIONS) or []
90  except HomeAssistantError:
91  options = []
92 
93  return {
94  "extra_fields": vol.Schema(
95  {
96  vol.Required(CONF_OPTION): vol.In(options),
97  vol.Optional(CONF_FOR): cv.positive_time_period_dict,
98  }
99  )
100  }
er.RegistryEntry async_get_entity_registry_entry_or_raise(HomeAssistant hass, str entity_registry_id)
Definition: __init__.py:332
list[dict[str, str]] async_get_conditions(HomeAssistant hass, str device_id)
dict[str, vol.Schema] async_get_condition_capabilities(HomeAssistant hass, ConfigType config)
condition.ConditionCheckerType async_condition_from_config(HomeAssistant hass, ConfigType config)
Any|None get_capability(HomeAssistant hass, str entity_id, str capability)
Definition: entity.py:139