From 50ab64f96a3a4e34dcb30c8d064e73b4ed9508b5 Mon Sep 17 00:00:00 2001 From: Robbe Bultynck Date: Fri, 27 Dec 2024 09:44:02 +0100 Subject: [PATCH] Fix block I/O in the event loop --- custom_components/maestro_mcz/__init__.py | 7 ++++--- .../maestro_mcz/maestro/controller/mocked_controller.py | 4 +++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/custom_components/maestro_mcz/__init__.py b/custom_components/maestro_mcz/__init__.py index 85c7581..0f60738 100644 --- a/custom_components/maestro_mcz/__init__.py +++ b/custom_components/maestro_mcz/__init__.py @@ -38,7 +38,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: pollling_interval = entry.options.get(CONF_POLLING_INTERVAL, DEFAULT_POLLING_INTERVAL) - mocked_files = has_mocked_files() + mocked_files = await has_mocked_files() if mocked_files is None: maestroapi: MaestroControllerInterface = MaestroController( @@ -77,10 +77,11 @@ async def _async_update_listener(hass: HomeAssistant, entry: ConfigEntry) -> Non """Handle options update.""" await hass.config_entries.async_reload(entry.entry_id) -def has_mocked_files() -> list[str] | None: +async def has_mocked_files() -> list[str] | None: try: + loop = asyncio.get_running_loop() folder_path = "config/custom_components/maestro_mcz/mocked" - files_in_dir = os.listdir(folder_path) + files_in_dir = await loop.run_in_executor(None, os.listdir, folder_path) if(files_in_dir is not None): return [folder_path + "/" + file for file in files_in_dir] else: diff --git a/custom_components/maestro_mcz/maestro/controller/mocked_controller.py b/custom_components/maestro_mcz/maestro/controller/mocked_controller.py index dd8a42f..e037854 100644 --- a/custom_components/maestro_mcz/maestro/controller/mocked_controller.py +++ b/custom_components/maestro_mcz/maestro/controller/mocked_controller.py @@ -1,5 +1,6 @@ import dataclasses import json +import asyncio from ..responses.state import State from ..responses.status import Status @@ -51,7 +52,8 @@ async def StoveInfo(self): if(self._file_paths is not None): for _file_path in self._file_paths: try: - f = open(_file_path) + loop = asyncio.get_running_loop() + f = await loop.run_in_executor(None, open, _file_path) data = json.load(f) devices = data["data"]["devices"] for stove in list(devices.values()):