You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Home Assistant中使用HACS-Pyscript读取文件报错的解决方案咨询

解决Home Assistant Pyscript中无法使用open()读取文件的问题

嘿,我刚好碰到过类似的坑,来帮你搞定!

你遇到的name 'open' is not defined错误,核心原因是Pyscript在Home Assistant的运行环境里有沙箱限制——为了系统安全,原生Python的open()函数被禁用了,不能直接用来操作文件。不过别担心,Pyscript专门提供了安全的文件操作工具来解决这个问题。

可行解决方案:使用Pyscript的fs模块

Pyscript内置了fs模块,专门用于HA环境下的文件读写操作,完美替代原生open()。修改你的代码如下:

import json
import logging
from pymongo import MongoClient
import fs  # 导入Pyscript专属的文件系统模块

# 初始化日志对象
logger = logging.getLogger()
URI = "mongodb://localhost:27017"
client = MongoClient(URI)
logger.info("Working 1...")
db = client["local_db"]
col = db["devices"]
logger.info("Working 2...")

# 用fs.open替代原生open,配合with语句确保文件正确关闭
with fs.open("/config/.storage/core.device_registry", "r") as file:
    device_registry_data = json.load(file)
logger.info("Working 3...")

# 现在可以用device_registry_data处理JSON内容了
# 示例:打印注册表中的设备总数
# logger.info(f"已注册设备数量: {len(device_registry_data['data']['devices'])}")

额外优化提示:更优雅的获取设备信息方式

其实你要读取的core.device_registry是Home Assistant的内置设备注册表文件,如果你只是想获取设备数据,完全不用直接读文件——可以通过HA的原生能力获取,更可靠也更符合HA的设计逻辑:

# 通过Pyscript的hass对象直接调用HA服务获取设备注册表
device_registry = await hass.services.async_call(
    "homeassistant", "get_device_registry", {}
)

# 或者用更简洁的方式(取决于你的Pyscript版本)
from homeassistant.helpers.device_registry import async_get as async_get_device_registry
device_registry = async_get_device_registry(hass)

这种方法会自动处理文件格式变化、权限等问题,比直接读文件更稳定。

内容的提问来源于stack exchange,提问作者Kapil Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 14:17:37