Home Assistant Unofficial Reference 2024.12.1
knx_selector.py
Go to the documentation of this file.
1 """Selectors for KNX."""
2 
3 from enum import Enum
4 from typing import Any
5 
6 import voluptuous as vol
7 
8 from ..validation import ga_validator, maybe_ga_validator
9 from .const import CONF_DPT, CONF_GA_PASSIVE, CONF_GA_STATE, CONF_GA_WRITE
10 
11 
12 class GASelector:
13  """Selector for a KNX group address structure."""
14 
15  schema: vol.Schema
16 
17  def __init__(
18  self,
19  write: bool = True,
20  state: bool = True,
21  passive: bool = True,
22  write_required: bool = False,
23  state_required: bool = False,
24  dpt: type[Enum] | None = None,
25  ) -> None:
26  """Initialize the group address selector."""
27  self.writewrite = write
28  self.statestate = state
29  self.passivepassive = passive
30  self.write_requiredwrite_required = write_required
31  self.state_requiredstate_required = state_required
32  self.dptdpt = dpt
33 
34  self.schemaschema = self.build_schemabuild_schema()
35 
36  def __call__(self, data: Any) -> Any:
37  """Validate the passed data."""
38  return self.schemaschema(data)
39 
40  def build_schema(self) -> vol.Schema:
41  """Create the schema based on configuration."""
42  schema: dict[vol.Marker, Any] = {} # will be modified in-place
43  self._add_group_addresses_add_group_addresses(schema)
44  self._add_passive_add_passive(schema)
45  self._add_dpt_add_dpt(schema)
46  return vol.Schema(schema)
47 
48  def _add_group_addresses(self, schema: dict[vol.Marker, Any]) -> None:
49  """Add basic group address items to the schema."""
50 
51  def add_ga_item(key: str, allowed: bool, required: bool) -> None:
52  """Add a group address item validator to the schema."""
53  if not allowed:
54  schema[vol.Remove(key)] = object
55  return
56  if required:
57  schema[vol.Required(key)] = ga_validator
58  else:
59  schema[vol.Optional(key, default=None)] = maybe_ga_validator
60 
61  add_ga_item(CONF_GA_WRITE, self.writewrite, self.write_requiredwrite_required)
62  add_ga_item(CONF_GA_STATE, self.statestate, self.state_requiredstate_required)
63 
64  def _add_passive(self, schema: dict[vol.Marker, Any]) -> None:
65  """Add passive group addresses validator to the schema."""
66  if self.passivepassive:
67  schema[vol.Optional(CONF_GA_PASSIVE, default=list)] = vol.Any(
68  [ga_validator],
69  vol.All( # Coerce `None` to an empty list if passive is allowed
70  vol.IsFalse(), vol.SetTo(list)
71  ),
72  )
73  else:
74  schema[vol.Remove(CONF_GA_PASSIVE)] = object
75 
76  def _add_dpt(self, schema: dict[vol.Marker, Any]) -> None:
77  """Add DPT validator to the schema."""
78  if self.dptdpt is not None:
79  schema[vol.Required(CONF_DPT)] = vol.In({item.value for item in self.dptdpt})
80  else:
81  schema[vol.Remove(CONF_DPT)] = object
None __init__(self, bool write=True, bool state=True, bool passive=True, bool write_required=False, bool state_required=False, type[Enum]|None dpt=None)
Definition: knx_selector.py:25
None _add_dpt(self, dict[vol.Marker, Any] schema)
Definition: knx_selector.py:76
None _add_passive(self, dict[vol.Marker, Any] schema)
Definition: knx_selector.py:64
None _add_group_addresses(self, dict[vol.Marker, Any] schema)
Definition: knx_selector.py:48