From 66faeb28d7d3e7a9543bc2b01cf6d35f143e5593 Mon Sep 17 00:00:00 2001 From: Jan Bouwhuis Date: Tue, 18 Jun 2024 20:01:16 +0200 Subject: [PATCH] Fix late group platform registration (#119789) * Fix late group platform registration * use a callback instead * Run thread safe * Not working domain filter * Also update if a group has nested group's * Only update if the siingle state type key could change * Avoid redundant regisister hooks * Use set, add comment * Revert changes * Keep callback cleanup const * Cleanup after dependencies * Preimport and cleanup excluded domains * Revert test changes as we assume early set up now * Migrate alarm_control_panel * Migrate climate * Migrate cover * Migrate device_tracker * Migrate lock * Migrate media_player * Migrate person * Migrate plant * Migrate vacuum * Migrate water_heater * Remove water_heater group_pre_import * Use Platform enum if possible * Also use platform enum for excluded domains * Set registry to self._registry * move deregistering call back hook to async_added_to_hass * Add comment * Do no pass mutable reference to EXCLUDED_DOMAINS * Remove unneeded type hint --- .../components/air_quality/__init__.py | 1 - homeassistant/components/air_quality/group.py | 20 --- .../alarm_control_panel/__init__.py | 1 - .../components/alarm_control_panel/group.py | 43 ------ homeassistant/components/climate/__init__.py | 1 - homeassistant/components/climate/group.py | 33 ----- homeassistant/components/cover/__init__.py | 1 - homeassistant/components/cover/group.py | 22 --- .../components/device_tracker/__init__.py | 1 - .../components/device_tracker/group.py | 21 --- homeassistant/components/group/__init__.py | 6 +- homeassistant/components/group/entity.py | 13 +- homeassistant/components/group/manifest.json | 12 -- homeassistant/components/group/registry.py | 132 +++++++++++++++++- homeassistant/components/lock/__init__.py | 1 - homeassistant/components/lock/group.py | 39 ------ .../components/media_player/__init__.py | 1 - .../components/media_player/group.py | 37 ----- homeassistant/components/person/__init__.py | 1 - homeassistant/components/person/group.py | 21 --- homeassistant/components/plant/__init__.py | 1 - homeassistant/components/plant/group.py | 21 --- homeassistant/components/sensor/__init__.py | 1 - homeassistant/components/sensor/group.py | 20 --- homeassistant/components/vacuum/__init__.py | 1 - homeassistant/components/vacuum/group.py | 31 ---- .../components/water_heater/__init__.py | 1 - .../components/water_heater/group.py | 42 ------ homeassistant/components/weather/__init__.py | 1 - homeassistant/components/weather/group.py | 20 --- 30 files changed, 140 insertions(+), 406 deletions(-) delete mode 100644 homeassistant/components/air_quality/group.py delete mode 100644 homeassistant/components/alarm_control_panel/group.py delete mode 100644 homeassistant/components/climate/group.py delete mode 100644 homeassistant/components/cover/group.py delete mode 100644 homeassistant/components/device_tracker/group.py delete mode 100644 homeassistant/components/lock/group.py delete mode 100644 homeassistant/components/media_player/group.py delete mode 100644 homeassistant/components/person/group.py delete mode 100644 homeassistant/components/plant/group.py delete mode 100644 homeassistant/components/sensor/group.py delete mode 100644 homeassistant/components/vacuum/group.py delete mode 100644 homeassistant/components/water_heater/group.py delete mode 100644 homeassistant/components/weather/group.py diff --git a/homeassistant/components/air_quality/__init__.py b/homeassistant/components/air_quality/__init__.py index e33fbd34367..78f2616a74d 100644 --- a/homeassistant/components/air_quality/__init__.py +++ b/homeassistant/components/air_quality/__init__.py @@ -17,7 +17,6 @@ from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity_component import EntityComponent from homeassistant.helpers.typing import ConfigType, StateType -from . import group as group_pre_import # noqa: F401 from .const import DOMAIN _LOGGER: Final = logging.getLogger(__name__) diff --git a/homeassistant/components/air_quality/group.py b/homeassistant/components/air_quality/group.py deleted file mode 100644 index 8dc92ef6d07..00000000000 --- a/homeassistant/components/air_quality/group.py +++ /dev/null @@ -1,20 +0,0 @@ -"""Describe group states.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from homeassistant.core import HomeAssistant, callback - -if TYPE_CHECKING: - from homeassistant.components.group import GroupIntegrationRegistry - -from .const import DOMAIN - - -@callback -def async_describe_on_off_states( - hass: HomeAssistant, registry: GroupIntegrationRegistry -) -> None: - """Describe group on off states.""" - registry.exclude_domain(DOMAIN) diff --git a/homeassistant/components/alarm_control_panel/__init__.py b/homeassistant/components/alarm_control_panel/__init__.py index 48ea72c46d9..f33e168c031 100644 --- a/homeassistant/components/alarm_control_panel/__init__.py +++ b/homeassistant/components/alarm_control_panel/__init__.py @@ -34,7 +34,6 @@ from homeassistant.helpers.entity import Entity, EntityDescription from homeassistant.helpers.entity_component import EntityComponent from homeassistant.helpers.typing import ConfigType -from . import group as group_pre_import # noqa: F401 from .const import ( # noqa: F401 _DEPRECATED_FORMAT_NUMBER, _DEPRECATED_FORMAT_TEXT, diff --git a/homeassistant/components/alarm_control_panel/group.py b/homeassistant/components/alarm_control_panel/group.py deleted file mode 100644 index 5504294c4b9..00000000000 --- a/homeassistant/components/alarm_control_panel/group.py +++ /dev/null @@ -1,43 +0,0 @@ -"""Describe group states.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from homeassistant.const import ( - STATE_ALARM_ARMED_AWAY, - STATE_ALARM_ARMED_CUSTOM_BYPASS, - STATE_ALARM_ARMED_HOME, - STATE_ALARM_ARMED_NIGHT, - STATE_ALARM_ARMED_VACATION, - STATE_ALARM_TRIGGERED, - STATE_OFF, - STATE_ON, -) -from homeassistant.core import HomeAssistant, callback - -from .const import DOMAIN - -if TYPE_CHECKING: - from homeassistant.components.group import GroupIntegrationRegistry - - -@callback -def async_describe_on_off_states( - hass: HomeAssistant, registry: GroupIntegrationRegistry -) -> None: - """Describe group on off states.""" - registry.on_off_states( - DOMAIN, - { - STATE_ON, - STATE_ALARM_ARMED_AWAY, - STATE_ALARM_ARMED_CUSTOM_BYPASS, - STATE_ALARM_ARMED_HOME, - STATE_ALARM_ARMED_NIGHT, - STATE_ALARM_ARMED_VACATION, - STATE_ALARM_TRIGGERED, - }, - STATE_ON, - STATE_OFF, - ) diff --git a/homeassistant/components/climate/__init__.py b/homeassistant/components/climate/__init__.py index 9084a138350..ac6297dc5b6 100644 --- a/homeassistant/components/climate/__init__.py +++ b/homeassistant/components/climate/__init__.py @@ -45,7 +45,6 @@ from homeassistant.helpers.typing import ConfigType from homeassistant.loader import async_get_issue_tracker, async_suggest_report_issue from homeassistant.util.unit_conversion import TemperatureConverter -from . import group as group_pre_import # noqa: F401 from .const import ( # noqa: F401 _DEPRECATED_HVAC_MODE_AUTO, _DEPRECATED_HVAC_MODE_COOL, diff --git a/homeassistant/components/climate/group.py b/homeassistant/components/climate/group.py deleted file mode 100644 index 927bd2768f2..00000000000 --- a/homeassistant/components/climate/group.py +++ /dev/null @@ -1,33 +0,0 @@ -"""Describe group states.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from homeassistant.const import STATE_OFF, STATE_ON -from homeassistant.core import HomeAssistant, callback - -from .const import DOMAIN, HVACMode - -if TYPE_CHECKING: - from homeassistant.components.group import GroupIntegrationRegistry - - -@callback -def async_describe_on_off_states( - hass: HomeAssistant, registry: GroupIntegrationRegistry -) -> None: - """Describe group on off states.""" - registry.on_off_states( - DOMAIN, - { - STATE_ON, - HVACMode.HEAT, - HVACMode.COOL, - HVACMode.HEAT_COOL, - HVACMode.AUTO, - HVACMode.FAN_ONLY, - }, - STATE_ON, - STATE_OFF, - ) diff --git a/homeassistant/components/cover/__init__.py b/homeassistant/components/cover/__init__.py index 9e3184b4822..852c5fd9cae 100644 --- a/homeassistant/components/cover/__init__.py +++ b/homeassistant/components/cover/__init__.py @@ -45,7 +45,6 @@ from homeassistant.helpers.entity_component import EntityComponent from homeassistant.helpers.typing import ConfigType from homeassistant.loader import bind_hass -from . import group as group_pre_import # noqa: F401 from .const import DOMAIN _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/cover/group.py b/homeassistant/components/cover/group.py deleted file mode 100644 index 8d7b860bc94..00000000000 --- a/homeassistant/components/cover/group.py +++ /dev/null @@ -1,22 +0,0 @@ -"""Describe group states.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from homeassistant.const import STATE_CLOSED, STATE_OPEN -from homeassistant.core import HomeAssistant, callback - -from .const import DOMAIN - -if TYPE_CHECKING: - from homeassistant.components.group import GroupIntegrationRegistry - - -@callback -def async_describe_on_off_states( - hass: HomeAssistant, registry: GroupIntegrationRegistry -) -> None: - """Describe group on off states.""" - # On means open, Off means closed - registry.on_off_states(DOMAIN, {STATE_OPEN}, STATE_OPEN, STATE_CLOSED) diff --git a/homeassistant/components/device_tracker/__init__.py b/homeassistant/components/device_tracker/__init__.py index ca78b1cbdc5..92c961eb148 100644 --- a/homeassistant/components/device_tracker/__init__.py +++ b/homeassistant/components/device_tracker/__init__.py @@ -14,7 +14,6 @@ from homeassistant.helpers.deprecation import ( from homeassistant.helpers.typing import ConfigType from homeassistant.loader import bind_hass -from . import group as group_pre_import # noqa: F401 from .config_entry import ( # noqa: F401 ScannerEntity, TrackerEntity, diff --git a/homeassistant/components/device_tracker/group.py b/homeassistant/components/device_tracker/group.py deleted file mode 100644 index 8143251e7fa..00000000000 --- a/homeassistant/components/device_tracker/group.py +++ /dev/null @@ -1,21 +0,0 @@ -"""Describe group states.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from homeassistant.const import STATE_HOME, STATE_NOT_HOME -from homeassistant.core import HomeAssistant, callback - -from .const import DOMAIN - -if TYPE_CHECKING: - from homeassistant.components.group import GroupIntegrationRegistry - - -@callback -def async_describe_on_off_states( - hass: HomeAssistant, registry: GroupIntegrationRegistry -) -> None: - """Describe group on off states.""" - registry.on_off_states(DOMAIN, {STATE_HOME}, STATE_HOME, STATE_NOT_HOME) diff --git a/homeassistant/components/group/__init__.py b/homeassistant/components/group/__init__.py index a0f8d2b9a39..f89bf67861d 100644 --- a/homeassistant/components/group/__init__.py +++ b/homeassistant/components/group/__init__.py @@ -265,16 +265,16 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: if ATTR_ADD_ENTITIES in service.data: delta = service.data[ATTR_ADD_ENTITIES] entity_ids = set(group.tracking) | set(delta) - await group.async_update_tracked_entity_ids(entity_ids) + group.async_update_tracked_entity_ids(entity_ids) if ATTR_REMOVE_ENTITIES in service.data: delta = service.data[ATTR_REMOVE_ENTITIES] entity_ids = set(group.tracking) - set(delta) - await group.async_update_tracked_entity_ids(entity_ids) + group.async_update_tracked_entity_ids(entity_ids) if ATTR_ENTITIES in service.data: entity_ids = service.data[ATTR_ENTITIES] - await group.async_update_tracked_entity_ids(entity_ids) + group.async_update_tracked_entity_ids(entity_ids) if ATTR_NAME in service.data: group.set_name(service.data[ATTR_NAME]) diff --git a/homeassistant/components/group/entity.py b/homeassistant/components/group/entity.py index 785895ff11a..1b2db35531f 100644 --- a/homeassistant/components/group/entity.py +++ b/homeassistant/components/group/entity.py @@ -133,6 +133,7 @@ class Group(Entity): tracking: tuple[str, ...] trackable: tuple[str, ...] single_state_type_key: SingleStateType | None + _registry: GroupIntegrationRegistry def __init__( self, @@ -261,7 +262,8 @@ class Group(Entity): """Test if any member has an assumed state.""" return self._assumed_state - async def async_update_tracked_entity_ids( + @callback + def async_update_tracked_entity_ids( self, entity_ids: Collection[str] | None ) -> None: """Update the member entity IDs. @@ -284,7 +286,7 @@ class Group(Entity): self.single_state_type_key = None return - registry: GroupIntegrationRegistry = self.hass.data[REG_KEY] + registry = self._registry excluded_domains = registry.exclude_domains tracking: list[str] = [] @@ -313,7 +315,6 @@ class Group(Entity): registry.state_group_mapping[self.entity_id] = self.single_state_type_key else: self.single_state_type_key = None - self.async_on_remove(self._async_deregister) self.trackable = tuple(trackable) self.tracking = tuple(tracking) @@ -321,7 +322,7 @@ class Group(Entity): @callback def _async_deregister(self) -> None: """Deregister group entity from the registry.""" - registry: GroupIntegrationRegistry = self.hass.data[REG_KEY] + registry = self._registry if self.entity_id in registry.state_group_mapping: registry.state_group_mapping.pop(self.entity_id) @@ -363,8 +364,10 @@ class Group(Entity): async def async_added_to_hass(self) -> None: """Handle addition to Home Assistant.""" + self._registry = self.hass.data[REG_KEY] self._set_tracked(self._entity_ids) self.async_on_remove(start.async_at_start(self.hass, self._async_start)) + self.async_on_remove(self._async_deregister) async def async_will_remove_from_hass(self) -> None: """Handle removal from Home Assistant.""" @@ -405,7 +408,7 @@ class Group(Entity): entity_id = new_state.entity_id domain = new_state.domain state = new_state.state - registry: GroupIntegrationRegistry = self.hass.data[REG_KEY] + registry = self._registry self._assumed[entity_id] = bool(new_state.attributes.get(ATTR_ASSUMED_STATE)) if domain not in registry.on_states_by_domain: diff --git a/homeassistant/components/group/manifest.json b/homeassistant/components/group/manifest.json index a2045f370b1..7ead19414af 100644 --- a/homeassistant/components/group/manifest.json +++ b/homeassistant/components/group/manifest.json @@ -1,18 +1,6 @@ { "domain": "group", "name": "Group", - "after_dependencies": [ - "alarm_control_panel", - "climate", - "cover", - "device_tracker", - "lock", - "media_player", - "person", - "plant", - "vacuum", - "water_heater" - ], "codeowners": ["@home-assistant/core"], "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/group", diff --git a/homeassistant/components/group/registry.py b/homeassistant/components/group/registry.py index 4ce89a4c725..c17a19e24fd 100644 --- a/homeassistant/components/group/registry.py +++ b/homeassistant/components/group/registry.py @@ -8,7 +8,41 @@ from __future__ import annotations from dataclasses import dataclass from typing import Protocol -from homeassistant.const import STATE_OFF, STATE_ON +from homeassistant.components.climate import HVACMode +from homeassistant.components.vacuum import STATE_CLEANING, STATE_ERROR, STATE_RETURNING +from homeassistant.components.water_heater import ( + STATE_ECO, + STATE_ELECTRIC, + STATE_GAS, + STATE_HEAT_PUMP, + STATE_HIGH_DEMAND, + STATE_PERFORMANCE, +) +from homeassistant.const import ( + STATE_ALARM_ARMED_AWAY, + STATE_ALARM_ARMED_CUSTOM_BYPASS, + STATE_ALARM_ARMED_HOME, + STATE_ALARM_ARMED_NIGHT, + STATE_ALARM_ARMED_VACATION, + STATE_ALARM_TRIGGERED, + STATE_CLOSED, + STATE_HOME, + STATE_IDLE, + STATE_LOCKED, + STATE_LOCKING, + STATE_NOT_HOME, + STATE_OFF, + STATE_OK, + STATE_ON, + STATE_OPEN, + STATE_OPENING, + STATE_PAUSED, + STATE_PLAYING, + STATE_PROBLEM, + STATE_UNLOCKED, + STATE_UNLOCKING, + Platform, +) from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.integration_platform import ( async_process_integration_platforms, @@ -16,6 +50,92 @@ from homeassistant.helpers.integration_platform import ( from .const import DOMAIN, REG_KEY +# EXCLUDED_DOMAINS and ON_OFF_STATES are considered immutable +# in respect that new platforms should not be added. +# The the only maintenance allowed here is +# if existing platforms add new ON or OFF states. +EXCLUDED_DOMAINS: set[Platform | str] = { + Platform.AIR_QUALITY, + Platform.SENSOR, + Platform.WEATHER, +} + +ON_OFF_STATES: dict[Platform | str, tuple[set[str], str, str]] = { + Platform.ALARM_CONTROL_PANEL: ( + { + STATE_ON, + STATE_ALARM_ARMED_AWAY, + STATE_ALARM_ARMED_CUSTOM_BYPASS, + STATE_ALARM_ARMED_HOME, + STATE_ALARM_ARMED_NIGHT, + STATE_ALARM_ARMED_VACATION, + STATE_ALARM_TRIGGERED, + }, + STATE_ON, + STATE_OFF, + ), + Platform.CLIMATE: ( + { + STATE_ON, + HVACMode.HEAT, + HVACMode.COOL, + HVACMode.HEAT_COOL, + HVACMode.AUTO, + HVACMode.FAN_ONLY, + }, + STATE_ON, + STATE_OFF, + ), + Platform.COVER: ({STATE_OPEN}, STATE_OPEN, STATE_CLOSED), + Platform.DEVICE_TRACKER: ({STATE_HOME}, STATE_HOME, STATE_NOT_HOME), + Platform.LOCK: ( + { + STATE_LOCKING, + STATE_OPEN, + STATE_OPENING, + STATE_UNLOCKED, + STATE_UNLOCKING, + }, + STATE_UNLOCKED, + STATE_LOCKED, + ), + Platform.MEDIA_PLAYER: ( + { + STATE_ON, + STATE_PAUSED, + STATE_PLAYING, + STATE_IDLE, + }, + STATE_ON, + STATE_OFF, + ), + "person": ({STATE_HOME}, STATE_HOME, STATE_NOT_HOME), + "plant": ({STATE_PROBLEM}, STATE_PROBLEM, STATE_OK), + Platform.VACUUM: ( + { + STATE_ON, + STATE_CLEANING, + STATE_RETURNING, + STATE_ERROR, + }, + STATE_ON, + STATE_OFF, + ), + Platform.WATER_HEATER: ( + { + STATE_ON, + STATE_ECO, + STATE_ELECTRIC, + STATE_PERFORMANCE, + STATE_HIGH_DEMAND, + STATE_HEAT_PUMP, + STATE_GAS, + }, + STATE_ON, + STATE_OFF, + ), +} + async def async_setup(hass: HomeAssistant) -> None: """Set up the Group integration registry of integration platforms.""" @@ -61,8 +181,10 @@ class GroupIntegrationRegistry: self.on_off_mapping: dict[str, str] = {STATE_ON: STATE_OFF} self.off_on_mapping: dict[str, str] = {STATE_OFF: STATE_ON} self.on_states_by_domain: dict[str, set[str]] = {} - self.exclude_domains: set[str] = set() + self.exclude_domains = EXCLUDED_DOMAINS.copy() self.state_group_mapping: dict[str, SingleStateType] = {} + for domain, on_off_states in ON_OFF_STATES.items(): + self.on_off_states(domain, *on_off_states) @callback def exclude_domain(self, domain: str) -> None: @@ -71,7 +193,11 @@ class GroupIntegrationRegistry: @callback def on_off_states( - self, domain: str, on_states: set[str], default_on_state: str, off_state: str + self, + domain: Platform | str, + on_states: set[str], + default_on_state: str, + off_state: str, ) -> None: """Register on and off states for the current domain. diff --git a/homeassistant/components/lock/__init__.py b/homeassistant/components/lock/__init__.py index 55f48fd8d22..21533353ac7 100644 --- a/homeassistant/components/lock/__init__.py +++ b/homeassistant/components/lock/__init__.py @@ -45,7 +45,6 @@ from homeassistant.helpers.entity import Entity, EntityDescription from homeassistant.helpers.entity_component import EntityComponent from homeassistant.helpers.typing import ConfigType, StateType -from . import group as group_pre_import # noqa: F401 from .const import DOMAIN _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/lock/group.py b/homeassistant/components/lock/group.py deleted file mode 100644 index ad5ee15c2bd..00000000000 --- a/homeassistant/components/lock/group.py +++ /dev/null @@ -1,39 +0,0 @@ -"""Describe group states.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from homeassistant.const import ( - STATE_LOCKED, - STATE_LOCKING, - STATE_OPEN, - STATE_OPENING, - STATE_UNLOCKED, - STATE_UNLOCKING, -) -from homeassistant.core import HomeAssistant, callback - -from .const import DOMAIN - -if TYPE_CHECKING: - from homeassistant.components.group import GroupIntegrationRegistry - - -@callback -def async_describe_on_off_states( - hass: HomeAssistant, registry: GroupIntegrationRegistry -) -> None: - """Describe group on off states.""" - registry.on_off_states( - DOMAIN, - { - STATE_LOCKING, - STATE_OPEN, - STATE_OPENING, - STATE_UNLOCKED, - STATE_UNLOCKING, - }, - STATE_UNLOCKED, - STATE_LOCKED, - ) diff --git a/homeassistant/components/media_player/__init__.py b/homeassistant/components/media_player/__init__.py index b90de95a489..3679b5f89c5 100644 --- a/homeassistant/components/media_player/__init__.py +++ b/homeassistant/components/media_player/__init__.py @@ -64,7 +64,6 @@ from homeassistant.helpers.network import get_url from homeassistant.helpers.typing import ConfigType from homeassistant.loader import bind_hass -from . import group as group_pre_import # noqa: F401 from .browse_media import BrowseMedia, async_process_play_media_url # noqa: F401 from .const import ( # noqa: F401 ATTR_APP_ID, diff --git a/homeassistant/components/media_player/group.py b/homeassistant/components/media_player/group.py deleted file mode 100644 index 1ac5f6aa594..00000000000 --- a/homeassistant/components/media_player/group.py +++ /dev/null @@ -1,37 +0,0 @@ -"""Describe group states.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from homeassistant.const import ( - STATE_IDLE, - STATE_OFF, - STATE_ON, - STATE_PAUSED, - STATE_PLAYING, -) -from homeassistant.core import HomeAssistant, callback - -from .const import DOMAIN - -if TYPE_CHECKING: - from homeassistant.components.group import GroupIntegrationRegistry - - -@callback -def async_describe_on_off_states( - hass: HomeAssistant, registry: GroupIntegrationRegistry -) -> None: - """Describe group on off states.""" - registry.on_off_states( - DOMAIN, - { - STATE_ON, - STATE_PAUSED, - STATE_PLAYING, - STATE_IDLE, - }, - STATE_ON, - STATE_OFF, - ) diff --git a/homeassistant/components/person/__init__.py b/homeassistant/components/person/__init__.py index 55c37f1c36c..0779140a091 100644 --- a/homeassistant/components/person/__init__.py +++ b/homeassistant/components/person/__init__.py @@ -53,7 +53,6 @@ from homeassistant.helpers.storage import Store from homeassistant.helpers.typing import ConfigType from homeassistant.loader import bind_hass -from . import group as group_pre_import # noqa: F401 from .const import DOMAIN _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/person/group.py b/homeassistant/components/person/group.py deleted file mode 100644 index 8143251e7fa..00000000000 --- a/homeassistant/components/person/group.py +++ /dev/null @@ -1,21 +0,0 @@ -"""Describe group states.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from homeassistant.const import STATE_HOME, STATE_NOT_HOME -from homeassistant.core import HomeAssistant, callback - -from .const import DOMAIN - -if TYPE_CHECKING: - from homeassistant.components.group import GroupIntegrationRegistry - - -@callback -def async_describe_on_off_states( - hass: HomeAssistant, registry: GroupIntegrationRegistry -) -> None: - """Describe group on off states.""" - registry.on_off_states(DOMAIN, {STATE_HOME}, STATE_HOME, STATE_NOT_HOME) diff --git a/homeassistant/components/plant/__init__.py b/homeassistant/components/plant/__init__.py index 4f35f9eb281..afce1207add 100644 --- a/homeassistant/components/plant/__init__.py +++ b/homeassistant/components/plant/__init__.py @@ -35,7 +35,6 @@ from homeassistant.helpers.event import async_track_state_change_event from homeassistant.helpers.typing import ConfigType from homeassistant.util import dt as dt_util -from . import group as group_pre_import # noqa: F401 from .const import ( ATTR_DICT_OF_UNITS_OF_MEASUREMENT, ATTR_MAX_BRIGHTNESS_HISTORY, diff --git a/homeassistant/components/plant/group.py b/homeassistant/components/plant/group.py deleted file mode 100644 index 93944659e03..00000000000 --- a/homeassistant/components/plant/group.py +++ /dev/null @@ -1,21 +0,0 @@ -"""Describe group states.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from homeassistant.const import STATE_OK, STATE_PROBLEM -from homeassistant.core import HomeAssistant, callback - -from .const import DOMAIN - -if TYPE_CHECKING: - from homeassistant.components.group import GroupIntegrationRegistry - - -@callback -def async_describe_on_off_states( - hass: HomeAssistant, registry: GroupIntegrationRegistry -) -> None: - """Describe group on off states.""" - registry.on_off_states(DOMAIN, {STATE_PROBLEM}, STATE_PROBLEM, STATE_OK) diff --git a/homeassistant/components/sensor/__init__.py b/homeassistant/components/sensor/__init__.py index 7e7eaf8aef2..689be1100f6 100644 --- a/homeassistant/components/sensor/__init__.py +++ b/homeassistant/components/sensor/__init__.py @@ -68,7 +68,6 @@ from homeassistant.helpers.typing import UNDEFINED, ConfigType, StateType, Undef from homeassistant.util import dt as dt_util from homeassistant.util.enum import try_parse_enum -from . import group as group_pre_import # noqa: F401 from .const import ( # noqa: F401 _DEPRECATED_STATE_CLASS_MEASUREMENT, _DEPRECATED_STATE_CLASS_TOTAL, diff --git a/homeassistant/components/sensor/group.py b/homeassistant/components/sensor/group.py deleted file mode 100644 index 8dc92ef6d07..00000000000 --- a/homeassistant/components/sensor/group.py +++ /dev/null @@ -1,20 +0,0 @@ -"""Describe group states.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from homeassistant.core import HomeAssistant, callback - -if TYPE_CHECKING: - from homeassistant.components.group import GroupIntegrationRegistry - -from .const import DOMAIN - - -@callback -def async_describe_on_off_states( - hass: HomeAssistant, registry: GroupIntegrationRegistry -) -> None: - """Describe group on off states.""" - registry.exclude_domain(DOMAIN) diff --git a/homeassistant/components/vacuum/__init__.py b/homeassistant/components/vacuum/__init__.py index b50068de149..f68f9a4f082 100644 --- a/homeassistant/components/vacuum/__init__.py +++ b/homeassistant/components/vacuum/__init__.py @@ -34,7 +34,6 @@ from homeassistant.helpers.icon import icon_for_battery_level from homeassistant.helpers.typing import ConfigType from homeassistant.loader import bind_hass -from . import group as group_pre_import # noqa: F401 from .const import DOMAIN, STATE_CLEANING, STATE_DOCKED, STATE_ERROR, STATE_RETURNING _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/vacuum/group.py b/homeassistant/components/vacuum/group.py deleted file mode 100644 index 43d77995d1c..00000000000 --- a/homeassistant/components/vacuum/group.py +++ /dev/null @@ -1,31 +0,0 @@ -"""Describe group states.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from homeassistant.const import STATE_OFF, STATE_ON -from homeassistant.core import HomeAssistant, callback - -if TYPE_CHECKING: - from homeassistant.components.group import GroupIntegrationRegistry - -from .const import DOMAIN, STATE_CLEANING, STATE_ERROR, STATE_RETURNING - - -@callback -def async_describe_on_off_states( - hass: HomeAssistant, registry: GroupIntegrationRegistry -) -> None: - """Describe group on off states.""" - registry.on_off_states( - DOMAIN, - { - STATE_ON, - STATE_CLEANING, - STATE_RETURNING, - STATE_ERROR, - }, - STATE_ON, - STATE_OFF, - ) diff --git a/homeassistant/components/water_heater/__init__.py b/homeassistant/components/water_heater/__init__.py index d6871947b77..1623b391e53 100644 --- a/homeassistant/components/water_heater/__init__.py +++ b/homeassistant/components/water_heater/__init__.py @@ -42,7 +42,6 @@ from homeassistant.helpers.temperature import display_temp as show_temp from homeassistant.helpers.typing import ConfigType from homeassistant.util.unit_conversion import TemperatureConverter -from . import group as group_pre_import # noqa: F401 from .const import DOMAIN DEFAULT_MIN_TEMP = 110 diff --git a/homeassistant/components/water_heater/group.py b/homeassistant/components/water_heater/group.py deleted file mode 100644 index c4e415462e4..00000000000 --- a/homeassistant/components/water_heater/group.py +++ /dev/null @@ -1,42 +0,0 @@ -"""Describe group states.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from homeassistant.const import STATE_OFF, STATE_ON -from homeassistant.core import HomeAssistant, callback - -if TYPE_CHECKING: - from homeassistant.components.group import GroupIntegrationRegistry - -from .const import ( - DOMAIN, - STATE_ECO, - STATE_ELECTRIC, - STATE_GAS, - STATE_HEAT_PUMP, - STATE_HIGH_DEMAND, - STATE_PERFORMANCE, -) - - -@callback -def async_describe_on_off_states( - hass: HomeAssistant, registry: GroupIntegrationRegistry -) -> None: - """Describe group on off states.""" - registry.on_off_states( - DOMAIN, - { - STATE_ON, - STATE_ECO, - STATE_ELECTRIC, - STATE_PERFORMANCE, - STATE_HIGH_DEMAND, - STATE_HEAT_PUMP, - STATE_GAS, - }, - STATE_ON, - STATE_OFF, - ) diff --git a/homeassistant/components/weather/__init__.py b/homeassistant/components/weather/__init__.py index b73cbd97654..b3ce52510d2 100644 --- a/homeassistant/components/weather/__init__.py +++ b/homeassistant/components/weather/__init__.py @@ -47,7 +47,6 @@ from homeassistant.util.dt import utcnow from homeassistant.util.json import JsonValueType from homeassistant.util.unit_system import US_CUSTOMARY_SYSTEM -from . import group as group_pre_import # noqa: F401 from .const import ( ATTR_WEATHER_APPARENT_TEMPERATURE, ATTR_WEATHER_CLOUD_COVERAGE, diff --git a/homeassistant/components/weather/group.py b/homeassistant/components/weather/group.py deleted file mode 100644 index 8dc92ef6d07..00000000000 --- a/homeassistant/components/weather/group.py +++ /dev/null @@ -1,20 +0,0 @@ -"""Describe group states.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from homeassistant.core import HomeAssistant, callback - -if TYPE_CHECKING: - from homeassistant.components.group import GroupIntegrationRegistry - -from .const import DOMAIN - - -@callback -def async_describe_on_off_states( - hass: HomeAssistant, registry: GroupIntegrationRegistry -) -> None: - """Describe group on off states.""" - registry.exclude_domain(DOMAIN)