From c122e32d20d6e4b518dc4732fe9216ecbffb5be8 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 13 Mar 2024 23:45:11 -1000 Subject: [PATCH] Fix telegram_bot doing blocking I/O in the event loop to import platforms (#113383) --- .../components/telegram_bot/__init__.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/telegram_bot/__init__.py b/homeassistant/components/telegram_bot/__init__.py index ba9cd88eacc..7534f56ef4d 100644 --- a/homeassistant/components/telegram_bot/__init__.py +++ b/homeassistant/components/telegram_bot/__init__.py @@ -3,7 +3,6 @@ from __future__ import annotations import asyncio -import importlib import io from ipaddress import ip_network import logging @@ -41,6 +40,7 @@ from homeassistant.core import HomeAssistant, ServiceCall from homeassistant.exceptions import TemplateError import homeassistant.helpers.config_validation as cv from homeassistant.helpers.typing import ConfigType +from homeassistant.loader import async_get_loaded_integration _LOGGER = logging.getLogger(__name__) @@ -355,15 +355,21 @@ async def load_data( async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up the Telegram bot component.""" - if not config[DOMAIN]: + domain_config: list[dict[str, Any]] = config[DOMAIN] + + if not domain_config: return False - for p_config in config[DOMAIN]: + platforms = await async_get_loaded_integration(hass, DOMAIN).async_get_platforms( + {p_config[CONF_PLATFORM] for p_config in domain_config} + ) + + for p_config in domain_config: # Each platform config gets its own bot bot = initialize_bot(p_config) - p_type = p_config.get(CONF_PLATFORM) + p_type: str = p_config[CONF_PLATFORM] - platform = importlib.import_module(f".{p_config[CONF_PLATFORM]}", __name__) + platform = platforms[p_type] _LOGGER.info("Setting up %s.%s", DOMAIN, p_type) try: