在Home Assistant的pyscript中使用await遇TypeError问题求助
问题原因与解决方案
可能原因1:@service装饰器未声明异步模式
Home Assistant的pyscript对异步服务有特殊要求,默认情况下@service装饰的函数会以同步模式运行。如果你的get_counters是异步函数(async def)但未指定异步模式,HA会尝试同步执行它,导致内部await语句的上下文异常,甚至间接导致某些异步调用的返回值被错误转换为字符串。
解决方案:
给@service装饰器添加async_mode="async"参数,明确声明这是一个异步服务:
@service(async_mode="async") async def get_counters(): # 你的函数逻辑 token = await auth() # 后续操作
可能原因2:auth函数被环境变量/内置对象覆盖
在Home Assistant的环境中,可能存在同名的内置变量或实体被命名为auth,且其类型为字符串,导致你定义的async def auth()函数被覆盖。此时若代码中出现await auth(漏写括号)或错误引用auth变量的情况,就会尝试await一个字符串,触发报错。
解决方案:
- 检查代码中是否有
await auth(缺少括号)的写法,修正为await auth(); - 给你的auth函数重命名,比如改成
async def fetch_auth_token(),避免与HA内置对象冲突。
可能原因3:异步函数返回值处理差异
虽然本地用asyncio.run能正常运行,但HA的pyscript环境对异步函数的返回值处理有细微差异。如果你的auth函数内部有依赖本地环境的异步操作(比如本地文件读取、特定库的异步实现),在HA环境中可能无法正常返回可等待对象,反而直接返回了字符串。
解决方案:
- 检查
auth函数的内部逻辑,确保所有异步操作都正确使用await,示例:
async def auth(): async with aiohttp.ClientSession() as session: async with session.get("https://example.com/auth") as resp: token = await resp.text() return token
- 避免在
auth函数中直接返回未经过异步处理的字符串,确保函数始终返回由async def生成的协程对象。
内容的提问来源于stack exchange,提问作者LA_
相关产品推荐
相关产品推荐

