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

在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_

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:28:34