From c3b5e819c5805cbcb186a6baa16a144fef2f838b Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 13 Mar 2024 19:18:15 -1000 Subject: [PATCH] Fix group loading too late resulting in incorrect state (#113262) --- homeassistant/bootstrap.py | 1 + homeassistant/components/air_quality/__init__.py | 2 ++ .../components/alarm_control_panel/__init__.py | 1 + homeassistant/components/binary_sensor/__init__.py | 2 ++ homeassistant/components/climate/__init__.py | 1 + homeassistant/components/cover/__init__.py | 2 ++ homeassistant/components/device_tracker/__init__.py | 1 + homeassistant/components/fan/__init__.py | 2 ++ homeassistant/components/group/__init__.py | 10 +++++++--- homeassistant/components/group/config_flow.py | 8 +++++--- homeassistant/components/group/const.py | 2 ++ homeassistant/components/humidifier/__init__.py | 1 + homeassistant/components/light/__init__.py | 2 ++ homeassistant/components/lock/__init__.py | 2 ++ homeassistant/components/media_player/__init__.py | 1 + homeassistant/components/person/__init__.py | 2 ++ homeassistant/components/plant/__init__.py | 1 + homeassistant/components/remote/__init__.py | 2 ++ homeassistant/components/sensor/__init__.py | 1 + homeassistant/components/switch/__init__.py | 1 + homeassistant/components/vacuum/__init__.py | 13 ++++++++----- homeassistant/components/vacuum/const.py | 8 ++++++++ homeassistant/components/vacuum/group.py | 2 +- homeassistant/components/water_heater/__init__.py | 2 ++ homeassistant/components/water_heater/const.py | 8 ++++++++ homeassistant/components/water_heater/group.py | 2 +- homeassistant/components/weather/__init__.py | 1 + 27 files changed, 68 insertions(+), 13 deletions(-) create mode 100644 homeassistant/components/vacuum/const.py create mode 100644 homeassistant/components/water_heater/const.py diff --git a/homeassistant/bootstrap.py b/homeassistant/bootstrap.py index 416b26f01d7..294a5551496 100644 --- a/homeassistant/bootstrap.py +++ b/homeassistant/bootstrap.py @@ -36,6 +36,7 @@ from .components import ( device_automation as device_automation_pre_import, # noqa: F401 diagnostics as diagnostics_pre_import, # noqa: F401 file_upload as file_upload_pre_import, # noqa: F401 + group as group_pre_import, # noqa: F401 history as history_pre_import, # noqa: F401 http, # not named pre_import since it has requirements image_upload as image_upload_import, # noqa: F401 - not named pre_import since it has requirements diff --git a/homeassistant/components/air_quality/__init__.py b/homeassistant/components/air_quality/__init__.py index b7104d46152..a25874f0c2f 100644 --- a/homeassistant/components/air_quality/__init__.py +++ b/homeassistant/components/air_quality/__init__.py @@ -17,6 +17,8 @@ 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 + _LOGGER: Final = logging.getLogger(__name__) ATTR_AQI: Final = "air_quality_index" diff --git a/homeassistant/components/alarm_control_panel/__init__.py b/homeassistant/components/alarm_control_panel/__init__.py index a4f950d4db2..37a2fa6a315 100644 --- a/homeassistant/components/alarm_control_panel/__init__.py +++ b/homeassistant/components/alarm_control_panel/__init__.py @@ -33,6 +33,7 @@ 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/binary_sensor/__init__.py b/homeassistant/components/binary_sensor/__init__.py index 4fd99c309bc..b9f612257b6 100644 --- a/homeassistant/components/binary_sensor/__init__.py +++ b/homeassistant/components/binary_sensor/__init__.py @@ -28,6 +28,8 @@ 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 + if TYPE_CHECKING: from functools import cached_property else: diff --git a/homeassistant/components/climate/__init__.py b/homeassistant/components/climate/__init__.py index c4faed875e9..7265b5192e8 100644 --- a/homeassistant/components/climate/__init__.py +++ b/homeassistant/components/climate/__init__.py @@ -42,6 +42,7 @@ 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 ( # noqa: F401 _DEPRECATED_HVAC_MODE_AUTO, _DEPRECATED_HVAC_MODE_COOL, diff --git a/homeassistant/components/cover/__init__.py b/homeassistant/components/cover/__init__.py index 3261ee90f29..aed0680bad3 100644 --- a/homeassistant/components/cover/__init__.py +++ b/homeassistant/components/cover/__init__.py @@ -44,6 +44,8 @@ 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 + if TYPE_CHECKING: from functools import cached_property else: diff --git a/homeassistant/components/device_tracker/__init__.py b/homeassistant/components/device_tracker/__init__.py index 4081e669b00..e16712acf95 100644 --- a/homeassistant/components/device_tracker/__init__.py +++ b/homeassistant/components/device_tracker/__init__.py @@ -14,6 +14,7 @@ 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/fan/__init__.py b/homeassistant/components/fan/__init__.py index aeb3a6c89df..d39e38f8e25 100644 --- a/homeassistant/components/fan/__init__.py +++ b/homeassistant/components/fan/__init__.py @@ -40,6 +40,8 @@ from homeassistant.util.percentage import ( ranged_value_to_percentage, ) +from . import group as group_pre_import # noqa: F401 + if TYPE_CHECKING: from functools import cached_property else: diff --git a/homeassistant/components/group/__init__.py b/homeassistant/components/group/__init__.py index 55a4ab4ad17..778c4da9c9f 100644 --- a/homeassistant/components/group/__init__.py +++ b/homeassistant/components/group/__init__.py @@ -52,9 +52,11 @@ from homeassistant.helpers.reload import async_reload_integration_platforms from homeassistant.helpers.typing import ConfigType from homeassistant.loader import bind_hass -from .const import CONF_HIDE_MEMBERS +from .const import ( + CONF_HIDE_MEMBERS, + DOMAIN, # noqa: F401 +) -DOMAIN = "group" GROUP_ORDER = "group_order" ENTITY_ID_FORMAT = DOMAIN + ".{}" @@ -241,7 +243,9 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: hass.data[REG_KEY] = GroupIntegrationRegistry() - await async_process_integration_platforms(hass, DOMAIN, _process_group_platform) + await async_process_integration_platforms( + hass, DOMAIN, _process_group_platform, wait_for_platforms=True + ) await _async_process_config(hass, config) diff --git a/homeassistant/components/group/config_flow.py b/homeassistant/components/group/config_flow.py index 71243ffbd74..237eb570417 100644 --- a/homeassistant/components/group/config_flow.py +++ b/homeassistant/components/group/config_flow.py @@ -4,7 +4,7 @@ from __future__ import annotations from collections.abc import Callable, Coroutine, Mapping from functools import partial -from typing import Any, cast +from typing import TYPE_CHECKING, Any, cast import voluptuous as vol @@ -22,9 +22,11 @@ from homeassistant.helpers.schema_config_entry_flow import ( entity_selector_without_own_entities, ) -from . import DOMAIN, GroupEntity +if TYPE_CHECKING: + from . import GroupEntity + from .binary_sensor import CONF_ALL, async_create_preview_binary_sensor -from .const import CONF_HIDE_MEMBERS, CONF_IGNORE_NON_NUMERIC +from .const import CONF_HIDE_MEMBERS, CONF_IGNORE_NON_NUMERIC, DOMAIN from .cover import async_create_preview_cover from .event import async_create_preview_event from .fan import async_create_preview_fan diff --git a/homeassistant/components/group/const.py b/homeassistant/components/group/const.py index 3ef280b2770..e64358181ca 100644 --- a/homeassistant/components/group/const.py +++ b/homeassistant/components/group/const.py @@ -2,3 +2,5 @@ CONF_HIDE_MEMBERS = "hide_members" CONF_IGNORE_NON_NUMERIC = "ignore_non_numeric" + +DOMAIN = "group" diff --git a/homeassistant/components/humidifier/__init__.py b/homeassistant/components/humidifier/__init__.py index 97f78aba21c..5dba7d8e32c 100644 --- a/homeassistant/components/humidifier/__init__.py +++ b/homeassistant/components/humidifier/__init__.py @@ -34,6 +34,7 @@ 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 ( # noqa: F401 _DEPRECATED_DEVICE_CLASS_DEHUMIDIFIER, _DEPRECATED_DEVICE_CLASS_HUMIDIFIER, diff --git a/homeassistant/components/light/__init__.py b/homeassistant/components/light/__init__.py index 0a41ca2a84e..610dc662369 100644 --- a/homeassistant/components/light/__init__.py +++ b/homeassistant/components/light/__init__.py @@ -34,6 +34,8 @@ from homeassistant.helpers.typing import ConfigType from homeassistant.loader import bind_hass import homeassistant.util.color as color_util +from . import group as group_pre_import # noqa: F401 + if TYPE_CHECKING: from functools import cached_property else: diff --git a/homeassistant/components/lock/__init__.py b/homeassistant/components/lock/__init__.py index f17c81aed20..da342410308 100644 --- a/homeassistant/components/lock/__init__.py +++ b/homeassistant/components/lock/__init__.py @@ -42,6 +42,8 @@ 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 + if TYPE_CHECKING: from functools import cached_property else: diff --git a/homeassistant/components/media_player/__init__.py b/homeassistant/components/media_player/__init__.py index 4bb026ffc0d..cc768232287 100644 --- a/homeassistant/components/media_player/__init__.py +++ b/homeassistant/components/media_player/__init__.py @@ -63,6 +63,7 @@ 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/person/__init__.py b/homeassistant/components/person/__init__.py index d75531d3052..08fff3a652e 100644 --- a/homeassistant/components/person/__init__.py +++ b/homeassistant/components/person/__init__.py @@ -57,6 +57,8 @@ 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 + _LOGGER = logging.getLogger(__name__) ATTR_SOURCE = "source" diff --git a/homeassistant/components/plant/__init__.py b/homeassistant/components/plant/__init__.py index efa0b45d25c..076f93faf7b 100644 --- a/homeassistant/components/plant/__init__.py +++ b/homeassistant/components/plant/__init__.py @@ -32,6 +32,7 @@ from homeassistant.helpers.event import ( 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/remote/__init__.py b/homeassistant/components/remote/__init__.py index fffbc913fe8..e8f100a1e8c 100644 --- a/homeassistant/components/remote/__init__.py +++ b/homeassistant/components/remote/__init__.py @@ -37,6 +37,8 @@ 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 + if TYPE_CHECKING: from functools import cached_property else: diff --git a/homeassistant/components/sensor/__init__.py b/homeassistant/components/sensor/__init__.py index e56037e3cee..0b2eb911cf2 100644 --- a/homeassistant/components/sensor/__init__.py +++ b/homeassistant/components/sensor/__init__.py @@ -70,6 +70,7 @@ 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/switch/__init__.py b/homeassistant/components/switch/__init__.py index 86c67248eea..e8fcaf1223e 100644 --- a/homeassistant/components/switch/__init__.py +++ b/homeassistant/components/switch/__init__.py @@ -33,6 +33,7 @@ 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 if TYPE_CHECKING: diff --git a/homeassistant/components/vacuum/__init__.py b/homeassistant/components/vacuum/__init__.py index cdac8c553ff..1be2c6c6796 100644 --- a/homeassistant/components/vacuum/__init__.py +++ b/homeassistant/components/vacuum/__init__.py @@ -35,6 +35,14 @@ 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 ( # noqa: F401 + STATE_CLEANING, + STATE_DOCKED, + STATE_ERROR, + STATE_RETURNING, +) + if TYPE_CHECKING: from functools import cached_property else: @@ -64,11 +72,6 @@ SERVICE_PAUSE = "pause" SERVICE_STOP = "stop" -STATE_CLEANING = "cleaning" -STATE_DOCKED = "docked" -STATE_RETURNING = "returning" -STATE_ERROR = "error" - STATES = [STATE_CLEANING, STATE_DOCKED, STATE_RETURNING, STATE_ERROR] DEFAULT_NAME = "Vacuum cleaner robot" diff --git a/homeassistant/components/vacuum/const.py b/homeassistant/components/vacuum/const.py new file mode 100644 index 00000000000..f623d313b1a --- /dev/null +++ b/homeassistant/components/vacuum/const.py @@ -0,0 +1,8 @@ +"""Support for vacuum cleaner robots (botvacs).""" + +STATE_CLEANING = "cleaning" +STATE_DOCKED = "docked" +STATE_RETURNING = "returning" +STATE_ERROR = "error" + +STATES = [STATE_CLEANING, STATE_DOCKED, STATE_RETURNING, STATE_ERROR] diff --git a/homeassistant/components/vacuum/group.py b/homeassistant/components/vacuum/group.py index 71aecfbabc5..e856bd460c0 100644 --- a/homeassistant/components/vacuum/group.py +++ b/homeassistant/components/vacuum/group.py @@ -4,7 +4,7 @@ from homeassistant.components.group import GroupIntegrationRegistry from homeassistant.const import STATE_OFF, STATE_ON from homeassistant.core import HomeAssistant, callback -from . import STATE_CLEANING, STATE_ERROR, STATE_RETURNING +from .const import STATE_CLEANING, STATE_ERROR, STATE_RETURNING @callback diff --git a/homeassistant/components/water_heater/__init__.py b/homeassistant/components/water_heater/__init__.py index dad3bd8c48b..5bd414ee53e 100644 --- a/homeassistant/components/water_heater/__init__.py +++ b/homeassistant/components/water_heater/__init__.py @@ -42,6 +42,8 @@ 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 + if TYPE_CHECKING: from functools import cached_property else: diff --git a/homeassistant/components/water_heater/const.py b/homeassistant/components/water_heater/const.py new file mode 100644 index 00000000000..5bf0816348c --- /dev/null +++ b/homeassistant/components/water_heater/const.py @@ -0,0 +1,8 @@ +"""Support for water heater devices.""" + +STATE_ECO = "eco" +STATE_ELECTRIC = "electric" +STATE_PERFORMANCE = "performance" +STATE_HIGH_DEMAND = "high_demand" +STATE_HEAT_PUMP = "heat_pump" +STATE_GAS = "gas" diff --git a/homeassistant/components/water_heater/group.py b/homeassistant/components/water_heater/group.py index 16387d5abd7..7ae13131210 100644 --- a/homeassistant/components/water_heater/group.py +++ b/homeassistant/components/water_heater/group.py @@ -4,7 +4,7 @@ from homeassistant.components.group import GroupIntegrationRegistry from homeassistant.const import STATE_OFF from homeassistant.core import HomeAssistant, callback -from . import ( +from .const import ( STATE_ECO, STATE_ELECTRIC, STATE_GAS, diff --git a/homeassistant/components/weather/__init__.py b/homeassistant/components/weather/__init__.py index 5c4c53079ba..76dc0508545 100644 --- a/homeassistant/components/weather/__init__.py +++ b/homeassistant/components/weather/__init__.py @@ -61,6 +61,7 @@ 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 ( # noqa: F401 ATTR_WEATHER_APPARENT_TEMPERATURE, ATTR_WEATHER_CLOUD_COVERAGE,