hass-cli v1.0.0 升级踩坑记:4 个 bug 和一个意外发现

2026-07-25

hass-cli v1.0.0 升级踩坑记:4 个 bug 和一个意外发现

为什么写这篇

Home Assistant 有 Web 界面,有 REST API,有 WebSocket——为什么还要折腾命令行?

因为上周家里的 47 个灯突然全显示 unavailable。在 Web 界面逐个检查集成状态花了 20 分钟,而一条命令就能搞定。

hass-cli integration list
# 发现 xiaomi_miot 状态为 not_loaded → 根因找到了

这就是 hass-cli 的价值。v1.0.0 刚发布,带了几个好用的新命令,但也踩了不少坑。这篇记录从升级到实际使用的全过程。

hass-cli 是什么

Home Assistant 的官方命令行工具,PyPI 包名 homeassistant-cli。注意和 Supervisor CLI(Go 写的,命令叫 ha)区分。

三种方式对比:

方式 优点 缺点 适合场景
Web 界面 直观 批量操作慢,调试不便 日常控制
curl 零依赖 需手动构造请求 脚本/快速测试
hass-cli 实体/集成/设备探索,实时事件监控,多输出格式 需安装 pip 包 调试、批量操作、问题排查

安装

我的方式:uv + Python 3.13

uv python install 3.13
uv venv ~/.venvs/hass-cli --python 3.13
uv pip install homeassistant-cli==1.0.0

验证:

~/.venvs/hass-cli/bin/hass-cli --version
# 1.0.0

其他方式

如果你的环境已有 Python 3.13,直接 pip install homeassistant-cli==1.0.0 也行。用 Docker 的话,可以跑一个带 Python 3.13 的容器安装——但我建议装在本地,因为 CLI 需要持久化的 HA token,容器重启会丢。

便捷用法

别每次都敲全路径,加个 alias:

alias ha-cli='~/.venvs/hass-cli/bin/hass-cli --server "http://YOUR_HA_IP:8123" --token "$HASS_TOKEN"'

这样后续所有命令都用 ha-cli 代替 hass-cli --server ... --token ...

v1.0.0 新增了什么

从 0.9.6 升上来,最实用的三个新命令:

命令 作用 值得升级的理由
integration list 查看所有集成的加载状态 一条命令定位设备离线根因
entity list 显示实体的平台/区域/设备信息 state list 多了注册信息
template(内联) 支持 stdin Jinja2 模板 不用临时写文件了

integration list 是这次升级的核心价值。以前想知道哪个集成挂了,得去 Web 界面一个个翻。现在:

ha-cli integration list
# name: xiaomi_miot
# state: not_loaded          ← 这就是根因
# ...
# name: sonoff
# state: not_loaded          ← 还有一个

看到 not_loaded,去 Web 界面重启对应集成就行。47 个灯的故障,5 秒定位。

4 个踩坑

坑 1:环境变量不生效

# 你以为这样就行
export HASS_SERVER="http://YOUR_HA_IP:8123"
export HASS_TOKEN="YOUR_TOKEN"
hass-cli state list   # 超时,或者报错

原因不明,可能是 CLI 解析环境变量的某些 edge case。

解法:别依赖环境变量,始终显式传参:

hass-cli --server "http://YOUR_HA_IP:8123" --token "$HASS_TOKEN" state list

或者用 alias 包一层,最省心。

坑 2:raw get URL 拼接 bug

hass-cli raw get "states"          # 报错
hass-cli raw get "/api/states"     # 正常

v1.0.0 在拼接 URL 时,host 和 path 之间少了 /。路径必须带前导 /,写完整 API 路径。这不是什么大问题,但文档没提,踩到了就卡一下。

坑 3:Python 版本不兼容

  • Python 3.11 → 装的是 v0.9.6(旧版)
  • Python 3.14 → 装 v1.0.0 后跑不起来,asyncio event loop 报错
  • Python 3.13 → 刚好

v1.0.0 要求 python_requires >= 3.13,但 3.14 的 asyncio 有兼容问题。用 uv python install 3.13 精确装就行,别赌最新的。

坑 4:info 命令 404

hass-cli info   # 404

新版 HA 弃用了 /api/discovery_info 端点,两版 CLI 都受影响。info 命令等于废了。

替代:用 config release 查版本信息。

命令速查

装好之后,常用命令都在这里:

# 状态查询
ha-cli state list                          # 所有实体
ha-cli state list "switch.*"              # 按前缀过滤
ha-cli state get sensor.xxx               # 单个实体详情
ha-cli --output yaml state get sensor.xxx # YAML 格式

# 结构探索(v1.0.0 新增)
ha-cli entity list                         # 实体注册信息
ha-cli integration list                    # 集成加载状态
ha-cli device list                         # 设备清单
ha-cli area list                           # 区域列表
ha-cli service list                        # 可用服务

# 模板渲染
ha-cli template <<< '{{ states.light | selectattr("state","eq","on") | list | length }}'

# 实时监控
ha-cli event watch                         # 实时事件流

# 原始 API
ha-cli --output json raw get "/api/states"

实战:5 秒定位设备离线

回到开头的场景——47 个灯全部 unavailable。

# 第一步:查集成状态
ha-cli integration list | grep -A2 "xiaomi_miot"
# name: xiaomi_miot
# state: not_loaded    ← 找到了

# 第二步:去 Web 界面重启 xiaomi_miot 集成

# 第三步:验证
ha-cli integration list | grep -A2 "xiaomi_miot"
# name: xiaomi_miot
# state: loaded        ← 恢复了

# 灯回来了(36/44 = 82%,其余是其他问题)

没有 integration list,这个排查过程至少要 15-20 分钟。有了它,从发现问题到定位根因不到 1 分钟。

总结

hass-cli v1.0.0 值得升级,但别指望开箱即用。记住三件事:

  1. 用 Python 3.13,别赌 3.14
  2. 别信环境变量,显式传 --server--token
  3. raw get 路径带前导 /

integration list 是这次升级最大的收获,尤其是排查设备离线问题——一条命令顶 20 分钟的 Web 界面翻找。