From 018d59a892823ee0548cb1db6bdcf0f02e972484 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Mon, 22 Sep 2025 16:08:07 +0200 Subject: [PATCH] Drop hass argument from service extraction helpers (#152738) --- homeassistant/components/amcrest/services.py | 2 +- homeassistant/components/fritz/services.py | 7 ++--- .../components/google_mail/services.py | 2 +- .../components/homeassistant/__init__.py | 2 +- .../components/homeassistant/scene.py | 2 +- homeassistant/components/miele/services.py | 7 ++--- homeassistant/components/recorder/services.py | 10 +++---- homeassistant/components/sonos/services.py | 2 +- homeassistant/helpers/entity_component.py | 2 +- homeassistant/helpers/entity_platform.py | 2 +- homeassistant/helpers/service.py | 27 +++++++++---------- 11 files changed, 33 insertions(+), 32 deletions(-) diff --git a/homeassistant/components/amcrest/services.py b/homeassistant/components/amcrest/services.py index 084761c4978f..6b4ca8ade535 100644 --- a/homeassistant/components/amcrest/services.py +++ b/homeassistant/components/amcrest/services.py @@ -41,7 +41,7 @@ def async_setup_services(hass: HomeAssistant) -> None: if call.data.get(ATTR_ENTITY_ID) == ENTITY_MATCH_NONE: return [] - call_ids = await async_extract_entity_ids(hass, call) + call_ids = await async_extract_entity_ids(call) entity_ids = [] for entity_id in hass.data[DATA_AMCREST][CAMERAS]: if entity_id not in call_ids: diff --git a/homeassistant/components/fritz/services.py b/homeassistant/components/fritz/services.py index bba80eadf984..43d10ee7f0aa 100644 --- a/homeassistant/components/fritz/services.py +++ b/homeassistant/components/fritz/services.py @@ -31,11 +31,12 @@ SERVICE_SCHEMA_SET_GUEST_WIFI_PW = vol.Schema( async def _async_set_guest_wifi_password(service_call: ServiceCall) -> None: """Call Fritz set guest wifi password service.""" - hass = service_call.hass - target_entry_ids = await async_extract_config_entry_ids(hass, service_call) + target_entry_ids = await async_extract_config_entry_ids(service_call) target_entries: list[FritzConfigEntry] = [ loaded_entry - for loaded_entry in hass.config_entries.async_loaded_entries(DOMAIN) + for loaded_entry in service_call.hass.config_entries.async_loaded_entries( + DOMAIN + ) if loaded_entry.entry_id in target_entry_ids ] diff --git a/homeassistant/components/google_mail/services.py b/homeassistant/components/google_mail/services.py index 129e04590d93..d8287ea35a17 100644 --- a/homeassistant/components/google_mail/services.py +++ b/homeassistant/components/google_mail/services.py @@ -51,7 +51,7 @@ async def _extract_gmail_config_entries( ) -> list[GoogleMailConfigEntry]: return [ entry - for entry_id in await async_extract_config_entry_ids(call.hass, call) + for entry_id in await async_extract_config_entry_ids(call) if (entry := call.hass.config_entries.async_get_entry(entry_id)) and entry.domain == DOMAIN ] diff --git a/homeassistant/components/homeassistant/__init__.py b/homeassistant/components/homeassistant/__init__.py index 32fe690f0f19..d0892df399d3 100644 --- a/homeassistant/components/homeassistant/__init__.py +++ b/homeassistant/components/homeassistant/__init__.py @@ -339,7 +339,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: # noqa: reload_entries: set[str] = set() if ATTR_ENTRY_ID in call.data: reload_entries.add(call.data[ATTR_ENTRY_ID]) - reload_entries.update(await async_extract_config_entry_ids(hass, call)) + reload_entries.update(await async_extract_config_entry_ids(call)) if not reload_entries: raise ValueError("There were no matching config entries to reload") await asyncio.gather( diff --git a/homeassistant/components/homeassistant/scene.py b/homeassistant/components/homeassistant/scene.py index aec9b9cd06b6..33ae659f0f6d 100644 --- a/homeassistant/components/homeassistant/scene.py +++ b/homeassistant/components/homeassistant/scene.py @@ -272,7 +272,7 @@ async def async_setup_platform( async def delete_service(call: ServiceCall) -> None: """Delete a dynamically created scene.""" - entity_ids = await async_extract_entity_ids(hass, call) + entity_ids = await async_extract_entity_ids(call) for entity_id in entity_ids: scene = platform.entities.get(entity_id) diff --git a/homeassistant/components/miele/services.py b/homeassistant/components/miele/services.py index 517b489173d3..da8ee861f46d 100644 --- a/homeassistant/components/miele/services.py +++ b/homeassistant/components/miele/services.py @@ -58,11 +58,12 @@ _LOGGER = logging.getLogger(__name__) async def _extract_config_entry(service_call: ServiceCall) -> MieleConfigEntry: """Extract config entry from the service call.""" - hass = service_call.hass - target_entry_ids = await async_extract_config_entry_ids(hass, service_call) + target_entry_ids = await async_extract_config_entry_ids(service_call) target_entries: list[MieleConfigEntry] = [ loaded_entry - for loaded_entry in hass.config_entries.async_loaded_entries(DOMAIN) + for loaded_entry in service_call.hass.config_entries.async_loaded_entries( + DOMAIN + ) if loaded_entry.entry_id in target_entry_ids ] if not target_entries: diff --git a/homeassistant/components/recorder/services.py b/homeassistant/components/recorder/services.py index ca92a2131d87..4e38d1f0a4d0 100644 --- a/homeassistant/components/recorder/services.py +++ b/homeassistant/components/recorder/services.py @@ -89,8 +89,7 @@ SERVICE_GET_STATISTICS_SCHEMA = vol.Schema( async def _async_handle_purge_service(service: ServiceCall) -> None: """Handle calls to the purge service.""" - hass = service.hass - instance = hass.data[DATA_INSTANCE] + instance = service.hass.data[DATA_INSTANCE] kwargs = service.data keep_days = kwargs.get(ATTR_KEEP_DAYS, instance.keep_days) repack = cast(bool, kwargs[ATTR_REPACK]) @@ -101,14 +100,15 @@ async def _async_handle_purge_service(service: ServiceCall) -> None: async def _async_handle_purge_entities_service(service: ServiceCall) -> None: """Handle calls to the purge entities service.""" - hass = service.hass - entity_ids = await async_extract_entity_ids(hass, service) + entity_ids = await async_extract_entity_ids(service) domains = service.data.get(ATTR_DOMAINS, []) keep_days = service.data.get(ATTR_KEEP_DAYS, 0) entity_globs = service.data.get(ATTR_ENTITY_GLOBS, []) entity_filter = generate_filter(domains, list(entity_ids), [], [], entity_globs) purge_before = dt_util.utcnow() - timedelta(days=keep_days) - hass.data[DATA_INSTANCE].queue_task(PurgeEntitiesTask(entity_filter, purge_before)) + service.hass.data[DATA_INSTANCE].queue_task( + PurgeEntitiesTask(entity_filter, purge_before) + ) async def _async_handle_enable_service(service: ServiceCall) -> None: diff --git a/homeassistant/components/sonos/services.py b/homeassistant/components/sonos/services.py index e2ec1bffdce0..883835a7c866 100644 --- a/homeassistant/components/sonos/services.py +++ b/homeassistant/components/sonos/services.py @@ -43,7 +43,7 @@ def async_setup_services(hass: HomeAssistant) -> None: ) entities = await service.async_extract_entities( - hass, platform_entities.values(), service_call + platform_entities.values(), service_call ) if not entities: diff --git a/homeassistant/helpers/entity_component.py b/homeassistant/helpers/entity_component.py index c7c602d088b8..2baeb31bdc80 100644 --- a/homeassistant/helpers/entity_component.py +++ b/homeassistant/helpers/entity_component.py @@ -240,7 +240,7 @@ class EntityComponent[_EntityT: entity.Entity = entity.Entity]: This method must be run in the event loop. """ return await service.async_extract_entities( - self.hass, self.entities, service_call, expand_group + self.entities, service_call, expand_group ) @callback diff --git a/homeassistant/helpers/entity_platform.py b/homeassistant/helpers/entity_platform.py index bf089dae765c..2587a197005b 100644 --- a/homeassistant/helpers/entity_platform.py +++ b/homeassistant/helpers/entity_platform.py @@ -1068,7 +1068,7 @@ class EntityPlatform: This method must be run in the event loop. """ return await service.async_extract_entities( - self.hass, self.entities.values(), service_call, expand_group + self.entities.values(), service_call, expand_group ) @callback diff --git a/homeassistant/helpers/service.py b/homeassistant/helpers/service.py index c5379f607f6f..aeba4b28cce3 100644 --- a/homeassistant/helpers/service.py +++ b/homeassistant/helpers/service.py @@ -379,22 +379,21 @@ def async_prepare_call_from_config( } -@bind_hass +@deprecated_hass_argument(breaks_in_ha_version="2026.10") def extract_entity_ids( - hass: HomeAssistant, service_call: ServiceCall, expand_group: bool = True + service_call: ServiceCall, expand_group: bool = True ) -> set[str]: """Extract a list of entity ids from a service call. Will convert group entity ids to the entity ids it represents. """ return asyncio.run_coroutine_threadsafe( - async_extract_entity_ids(hass, service_call, expand_group), hass.loop + async_extract_entity_ids(service_call, expand_group), service_call.hass.loop ).result() -@bind_hass +@deprecated_hass_argument(breaks_in_ha_version="2026.10") async def async_extract_entities[_EntityT: Entity]( - hass: HomeAssistant, entities: Iterable[_EntityT], service_call: ServiceCall, expand_group: bool = True, @@ -410,7 +409,7 @@ async def async_extract_entities[_EntityT: Entity]( selector_data = target_helpers.TargetSelectorData(service_call.data) referenced = target_helpers.async_extract_referenced_entity_ids( - hass, selector_data, expand_group + service_call.hass, selector_data, expand_group ) combined = referenced.referenced | referenced.indirectly_referenced @@ -432,9 +431,9 @@ async def async_extract_entities[_EntityT: Entity]( return found -@bind_hass +@deprecated_hass_argument(breaks_in_ha_version="2026.10") async def async_extract_entity_ids( - hass: HomeAssistant, service_call: ServiceCall, expand_group: bool = True + service_call: ServiceCall, expand_group: bool = True ) -> set[str]: """Extract a set of entity ids from a service call. @@ -442,7 +441,7 @@ async def async_extract_entity_ids( """ selector_data = target_helpers.TargetSelectorData(service_call.data) referenced = target_helpers.async_extract_referenced_entity_ids( - hass, selector_data, expand_group + service_call.hass, selector_data, expand_group ) return referenced.referenced | referenced.indirectly_referenced @@ -463,17 +462,17 @@ def async_extract_referenced_entity_ids( return SelectedEntities(**dataclasses.asdict(selected)) -@bind_hass +@deprecated_hass_argument(breaks_in_ha_version="2026.10") async def async_extract_config_entry_ids( - hass: HomeAssistant, service_call: ServiceCall, expand_group: bool = True + service_call: ServiceCall, expand_group: bool = True ) -> set[str]: """Extract referenced config entry ids from a service call.""" selector_data = target_helpers.TargetSelectorData(service_call.data) referenced = target_helpers.async_extract_referenced_entity_ids( - hass, selector_data, expand_group + service_call.hass, selector_data, expand_group ) - ent_reg = entity_registry.async_get(hass) - dev_reg = device_registry.async_get(hass) + ent_reg = entity_registry.async_get(service_call.hass) + dev_reg = device_registry.async_get(service_call.hass) config_entry_ids: set[str] = set() # Some devices may have no entities