1 """Provide the functionality to group entities.
3 Legacy group support will not be extended for new domains.
6 from __future__
import annotations
8 from dataclasses
import dataclass
9 from typing
import Protocol
39 async_process_integration_platforms,
42 from .const
import DOMAIN, REG_KEY
48 EXCLUDED_DOMAINS: set[Platform | str] = {
54 ON_OFF_STATES: dict[Platform | str, tuple[set[str], str, str]] = {
55 Platform.ALARM_CONTROL_PANEL: (
58 AlarmControlPanelState.ARMED_AWAY,
59 AlarmControlPanelState.ARMED_CUSTOM_BYPASS,
60 AlarmControlPanelState.ARMED_HOME,
61 AlarmControlPanelState.ARMED_NIGHT,
62 AlarmControlPanelState.ARMED_VACATION,
63 AlarmControlPanelState.TRIGGERED,
80 Platform.COVER: ({STATE_OPEN}, STATE_OPEN, STATE_CLOSED),
81 Platform.DEVICE_TRACKER: ({STATE_HOME}, STATE_HOME, STATE_NOT_HOME),
93 Platform.MEDIA_PLAYER: (
103 "person": ({STATE_HOME}, STATE_HOME, STATE_NOT_HOME),
104 "plant": ({STATE_PROBLEM}, STATE_PROBLEM, STATE_OK),
115 Platform.WATER_HEATER: (
132 """Set up the Group integration registry of integration platforms."""
136 hass, DOMAIN, _process_group_platform, wait_for_platforms=
True
141 """Define the format of group platforms."""
144 self, hass: HomeAssistant, registry: GroupIntegrationRegistry
146 """Describe group on off states."""
151 hass: HomeAssistant, domain: str, platform: GroupProtocol
153 """Process a group platform."""
154 platform.async_describe_on_off_states(hass, hass.data[REG_KEY])
157 @dataclass(frozen=True, slots=True)
159 """Dataclass to store a single state type."""
166 """Class to hold a registry of integrations."""
169 """Imitialize registry."""
171 self.on_off_mapping: dict[str, str] = {STATE_ON: STATE_OFF}
172 self.off_on_mapping: dict[str, str] = {STATE_OFF: STATE_ON}
173 self.on_states_by_domain: dict[str, set[str]] = {}
175 self.state_group_mapping: dict[str, SingleStateType] = {}
176 for domain, on_off_states
in ON_OFF_STATES.items():
181 """Exclude the current domain."""
187 domain: Platform | str,
189 default_on_state: str,
192 """Register on and off states for the current domain.
194 Legacy group support will not be extended for new domains.
196 for on_state
in on_states:
197 if on_state
not in self.on_off_mapping:
198 self.on_off_mapping[on_state] = off_state
200 if off_state
not in self.off_on_mapping:
201 self.off_on_mapping[off_state] = default_on_state
202 self.state_group_mapping[domain] =
SingleStateType(default_on_state, off_state)
204 self.on_states_by_domain[domain] = on_states
None on_off_states(self, Platform|str domain, set[str] on_states, str default_on_state, str off_state)
None exclude_domain(self, str domain)
None __init__(self, HomeAssistant hass)
None async_describe_on_off_states(self, HomeAssistant hass, GroupIntegrationRegistry registry)
bool add(self, _T matcher)
None _process_group_platform(HomeAssistant hass, str domain, GroupProtocol platform)
None async_setup(HomeAssistant hass)