From fae53cf5b92d631737b91a448a2a7381274a0430 Mon Sep 17 00:00:00 2001 From: xiaochao Date: Sat, 12 Jul 2025 01:18:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=A3=9E=E7=89=9Bnas?= =?UTF-8?q?=E5=85=B3=E6=9C=BA=E5=90=8E=E9=87=8D=E5=90=AFhome=20assistant?= =?UTF-8?q?=E5=90=8E=EF=BC=8C=E9=A3=9E=E7=89=9Bnas=E5=BC=80=E6=9C=BA?= =?UTF-8?q?=E5=90=8E=E9=83=A8=E5=88=86=E5=AE=9E=E4=BD=93=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E4=B8=8D=E5=8F=AF=E7=94=A8=E7=9A=84=E9=97=AE=E9=A2=98=20?= =?UTF-8?q?=E5=8E=BB=E9=99=A4ssh=E8=BF=9E=E6=8E=A5=E6=95=B0=E9=99=90?= =?UTF-8?q?=E5=88=B6=E5=92=8C=E7=BC=93=E5=AD=98=E6=B8=85=E7=90=86=E6=97=B6?= =?UTF-8?q?=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- custom_components/fn_nas/__init__.py | 47 ++++++------------------- custom_components/fn_nas/coordinator.py | 20 +++++------ custom_components/fn_nas/manifest.json | 2 +- 3 files changed, 21 insertions(+), 48 deletions(-) diff --git a/custom_components/fn_nas/__init__.py b/custom_components/fn_nas/__init__.py index c49dcf4..3318ce4 100644 --- a/custom_components/fn_nas/__init__.py +++ b/custom_components/fn_nas/__init__.py @@ -15,63 +15,38 @@ _LOGGER = logging.getLogger(__name__) async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): config = {**entry.data, **entry.options} - - coordinator = FlynasCoordinator(hass, config, entry) - - setup_task = hass.async_create_task( - async_delayed_setup(hass, entry, coordinator), - f"fn_nas_setup_{entry.entry_id}" - ) - - + # 直接初始化,不阻塞等待NAS上线 + hass.data.setdefault(DOMAIN, {}) + hass.data[DOMAIN][entry.entry_id] = { + DATA_UPDATE_COORDINATOR: coordinator, + "ups_coordinator": None, + CONF_ENABLE_DOCKER: coordinator.config.get(CONF_ENABLE_DOCKER, False) + } + # 异步后台初始化 + hass.async_create_task(async_delayed_setup(hass, entry, coordinator)) return True async def async_delayed_setup(hass: HomeAssistant, entry: ConfigEntry, coordinator: FlynasCoordinator): try: - # 首先进行轻量级系统状态检测 - is_online = await coordinator.ping_system() - - if not is_online: - _LOGGER.warning("系统离线,等待系统上线...") - # 等待系统上线 - while not await coordinator.ping_system(): - await asyncio.sleep(30) - - _LOGGER.info("系统已上线,继续初始化飞牛NAS集成") - - # 系统在线,继续正常初始化 + # 不阻塞等待NAS上线,直接尝试刷新数据 await coordinator.async_config_entry_first_refresh() - - # 检查是否启用Docker,并初始化Docker管理器(如果有) enable_docker = coordinator.config.get(CONF_ENABLE_DOCKER, False) if enable_docker: - # 导入Docker管理器并初始化 from .docker_manager import DockerManager coordinator.docker_manager = DockerManager(coordinator) _LOGGER.debug("已启用Docker容器监控") else: coordinator.docker_manager = None _LOGGER.debug("未启用Docker容器监控") - ups_coordinator = UPSDataUpdateCoordinator(hass, coordinator.config, coordinator) await ups_coordinator.async_config_entry_first_refresh() - - hass.data.setdefault(DOMAIN, {}) - hass.data[DOMAIN][entry.entry_id] = { - DATA_UPDATE_COORDINATOR: coordinator, - "ups_coordinator": ups_coordinator, - CONF_ENABLE_DOCKER: enable_docker # 存储启用状态 - } - + hass.data[DOMAIN][entry.entry_id]["ups_coordinator"] = ups_coordinator await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) entry.async_on_unload(entry.add_update_listener(async_update_entry)) - _LOGGER.info("飞牛NAS集成初始化完成") - except Exception as e: _LOGGER.error("飞牛NAS集成初始化失败: %s", str(e)) - # 如果初始化失败,确保清理资源 await coordinator.async_disconnect() if hasattr(coordinator, '_ping_task') and coordinator._ping_task: coordinator._ping_task.cancel() diff --git a/custom_components/fn_nas/coordinator.py b/custom_components/fn_nas/coordinator.py index a655bce..a928100 100644 --- a/custom_components/fn_nas/coordinator.py +++ b/custom_components/fn_nas/coordinator.py @@ -111,10 +111,10 @@ class FlynasCoordinator(DataUpdateCoordinator): self.ssh_closed = False return True else: - _LOGGER.warning("切换到 root 会话失败,将使用 sudo") + # 切换到 root 会话失败,将使用 sudo self.use_sudo = True else: - _LOGGER.warning("非 root 用户且未提供 root 密码,将使用 sudo") + # 非 root 用户且未提供 root 密码,将使用 sudo self.use_sudo = True self.ssh_closed = False @@ -258,23 +258,21 @@ class FlynasCoordinator(DataUpdateCoordinator): async def _async_update_data(self): _LOGGER.debug("Starting data update...") - - # 先进行轻量级系统状态检测 is_online = await self.ping_system() self._system_online = is_online - - # 系统离线处理 if not is_online: _LOGGER.debug("系统离线,跳过数据更新") + # 修复:确保 self.data 结构有效 + if self.data is None or not isinstance(self.data, dict): + self.data = {} + if "system" not in self.data or not isinstance(self.data.get("system"), dict): + self.data["system"] = {} self.data["system"]["status"] = "off" - - # 启动监控任务(如果尚未启动) + # 启动后台监控任务(非阻塞) if not self._ping_task or self._ping_task.done(): self._ping_task = asyncio.create_task(self._monitor_system_status()) - - # 关闭SSH连接 await self.async_disconnect() - + # 直接返回空数据,不阻塞 return { "disks": [], "system": { diff --git a/custom_components/fn_nas/manifest.json b/custom_components/fn_nas/manifest.json index b92cee9..c6672c5 100644 --- a/custom_components/fn_nas/manifest.json +++ b/custom_components/fn_nas/manifest.json @@ -1,7 +1,7 @@ { "domain": "fn_nas", "name": "飞牛NAS", - "version": "1.3.1", + "version": "1.3.4", "documentation": "https://github.com/anxms/fn_nas", "dependencies": [], "codeowners": ["@anxms"],