1. 为什么要把 openclaw 和 Home assistant 拼在一起
如果你手上同时有小米摄像头、涂鸦拇指机器人、向日葵智能插座,大概率经历过这种场面:米家一个 App、智能生活一个 App、向日葵再来一个 App,想看设备状态得来回切,想联动更是没门。Home assistant 能把这些设备收进一个面板,而 openclaw 负责用自然语言去驱动它们,两者组合起来才算真正“统一控制”。
这篇内容聚焦 openclaw 与 Home assistant 的本地集成,覆盖小米、涂鸦、向日葵三类智能硬件的接入配置。我会给出可复制的 configuration.yaml 片段、设备实体映射表与验证步骤,目标是在 Home assistant 面板里统一查看和控制三类设备状态,再让 openclaw 通过 skill 去调用。
先说清楚适合谁:已经有一台常开的 Ubuntu 机器(我用的是 Ubuntu 22),愿意用 Docker 跑服务,手上有至少一类上述智能硬件,并且想让 AI 帮你查状态、开关设备。不适合完全没接触过命令行、也不想折腾本地服务的人。
整体链路是这样的:Ubuntu 上跑 Home assistant 容器,容器里装三类设备的集成插件,设备变成 HA 里的实体(entity),openclaw 装上 home-assistant skill 后,通过 HA 的 API 读写这些实体。下面按这个顺序一步步来,每一步都给可复制的命令和配置。
2. 前置准备:Home assistant 容器与 openclaw 环境
2.1 用 Docker 跑起 Home assistant
Home assistant 官方推荐容器方案,先装 Docker:
curl -fsSL https://get.docker.com | sudo sh然后启动 HA 容器。注意把MY_TIME_ZONE换成Asia/Shanghai,/PATH_TO_YOUR_CONFIG换成你宿主机上准备放配置的目录,比如/home/yourname/ha_config:
docker run -d \ --name homeassistant \ --privileged \ --restart=unless-stopped \ -e TZ=Asia/Shanghai \ -v /home/yourname/ha_config:/config \ -v /run/dbus:/run/dbus:ro \ --network=host \ ghcr.io/home-assistant/home-assistant:stable确认容器在跑:
sudo docker ps正常会看到类似输出,STATUS 是 Up:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2b3e13d4cdb8 ghcr.io/home-assistant/home-assistant:stable "/init" 2 days ago Up 2 days homeassistant2.2 找到访问地址并完成初始化
先确认 Ubuntu 的 IP。我的机器有两个:Docker 网桥172.17.0.1,无线网卡10.214.74.212。浏览器访问http://172.17.0.1:8123或http://10.214.74.212:8123,首次登录要注册管理员账号。
这里有个坑:后面小米认证会跳转到http://homeassistant.local:8123/...,这个域名在容器网络里往往解析不到,需要手动把homeassistant.local换成你实际能访问的 IP,比如172.17.0.1。我试过直接点跳转一直失败,改成 IP 就通了。
2.3 openclaw 侧的准备
openclaw 要调用 HA,需要先装 clawhub 这个 skill 管理能力,才会有clawhub命令,然后再装 home-assistant skill:
clawhub install home-assistant安装完成后在 openclaw 里就能看到这个 skill。但光有 skill 还不够,它需要知道 HA 的地址和访问令牌,这部分放到第 3 节配置里讲。如果你还没拿到 openclaw 的 API Key,可以先去 TaoToken API Keys 生成一个,后面调用模型和 skill 都会用到。
3. 可复制配置:三类设备接入与实体映射
3.1 涂鸦设备:直接在面板添加
涂鸦是最省事的,不用改配置文件。在 HA 主页右上角点+添加设备,选 Tuya 集成,然后输入涂鸦 App「智能生活」里的用户码(在「账号与安全」里能找到),接着扫码登录,设备就出来了。拇指机器人这种能直接看到并控制。
3.2 小米设备:容器内装 ha_xiaomi_home
小米要走官方集成ha_xiaomi_home。关键点:一定要进入 Docker 容器内部执行,我在宿主机上直接跑卡了很久。
sudo docker exec -it homeassistant bash进入容器后:
cd /config git clone https://github.com/XiaoMi/ha_xiaomi_home.git cd ha_xiaomi_home/ ./install.sh /config看到Xiaomi Home installation is completed. Please restart Home Assistant.就成功了。重启 HA:
sudo docker restart homeassistant重启后在添加设备里能看到Xiaomi Home,认证到最后跳转地址把homeassistant.local改成你的 IP 即可。
3.3 向日葵设备:同样容器内装插件
向日葵和小米类似,也要在容器里操作:
cd /config git clone https://github.com/cx3Y/sunlogin.git cd sunlogin/ cp custom_components/sunlogin ../custom_components/重启后按小米的方式添加即可。
3.4 configuration.yaml 与实体映射
如果你想让 openclaw 稳定调用,建议在/config/configuration.yaml里显式声明要暴露的实体,避免它去猜。下面是我实际用的片段,路径就是容器里的/config/configuration.yaml:
homeassistant: name: Home unit_system: metric time_zone: Asia/Shanghai # 显式列出要交给 openclaw 控制的实体 group: openclaw_devices: name: Openclaw 可控设备 entities: - switch.sunlogin_socket_1 - switch.tuya_thumb_robot - camera.xiaomi_camera_livingroom # 允许 openclaw 通过 API 调用脚本 script: openclaw_all_off: alias: "一键关闭全部设备" sequence: - service: switch.turn_off target: entity_id: - switch.sunlogin_socket_1 - switch.tuya_thumb_robot实体 ID 每个人不一样,去「开发者工具 → 状态」里搜关键字确认。对照表如下:
| 设备类型 | 集成方式 | 实体 ID 示例 | 可控能力 |
|---|---|---|---|
| 小米摄像头 | ha_xiaomi_home | camera.xiaomi_camera_livingroom | 查看画面、开关 |
| 涂鸦拇指机器人 | Tuya 集成 | switch.tuya_thumb_robot | 开关、状态 |
| 向日葵智能插座 | sunlogin 插件 | switch.sunlogin_socket_1 | 开关、功率 |
改完配置要检查语法再重启:
sudo docker exec -it homeassistant python -m homeassistant --script check_config -c /config sudo docker restart homeassistant3.5 给 openclaw 的 HA 连接配置
openclaw 的 home-assistant skill 需要 HA 的长期访问令牌。在 HA 里点左下角用户头像 → 「长期访问令牌」→ 创建,复制出来。然后在 openclaw 的 skill 配置里填:
{ "home_assistant": { "base_url": "http://172.17.0.1:8123", "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...", "model_id": "claude-3-5-sonnet", "exposed_entities": [ "switch.sunlogin_socket_1", "switch.tuya_thumb_robot", "camera.xiaomi_camera_livingroom" ] } }三件套要写全:Base URL 指向你的 HA 地址,Key 就是长期访问令牌,Model ID 是 openclaw 调用的模型。如果你用的是 Claude Code 那套,配置结构类似,把 base_url 和 token 对应填好即可。模型侧如果走 TaoToken,接入文档在 TaoToken 文档 里有完整说明。
4. 验证请求:从 HA 面板到 openclaw 调用
4.1 先用 curl 验证 HA API 通不通
在 Ubuntu 上直接打 HA 的 REST API,确认令牌有效:
curl -s -X GET \ -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..." \ -H "Content-Type: application/json" \ http://172.17.0.1:8123/api/states/switch.sunlogin_socket_1返回类似下面就说明通了:
{ "entity_id": "switch.sunlogin_socket_1", "state": "on", "attributes": { "friendly_name": "向日葵插座", "device_class": "outlet" }, "last_changed": "2025-01-01T10:00:00.000000+00:00" }4.2 在 openclaw 里查设备数量与状态
skill 装好后,直接在 openclaw 里问:
帮我列出 Home assistant 里所有可控设备及当前状态正常会返回三类设备的列表和 on/off 状态。再试一条控制指令:
把向日葵插座关掉,然后告诉我涂鸦拇指机器人现在是什么状态openclaw 会调用 HA 的 service API 执行switch.turn_off,再读一次状态返回。如果这一步能成功,说明整条链路打通了。
4.3 面板统一查看
回到 HA 面板,把三类设备加到同一个仪表盘卡片里,就能一屏看到小米摄像头画面、涂鸦机器人状态、向日葵插座开关。openclaw 的调用结果也会实时反映到面板上,两边状态是一致的。
5. 常见报错排查:401、local proxy failed 与实体找不到
5.1 401 Unauthorized
最常见。原因基本是令牌问题:令牌复制时带了空格、令牌被删除、或者 base_url 写错导致请求打到别的服务。排查顺序:先用 4.1 的 curl 单独验证令牌,curl 通了再查 openclaw 配置里的 token 字段有没有多余字符。
5.2 local proxy failed
这个报错通常出现在 openclaw 通过本地代理访问 HA 时。检查两点:一是base_url用的是不是容器能访问到的地址,172.17.0.1和10.214.74.212在不同网络环境下可达性不同;二是 HA 容器用了--network=host,端口 8123 应该直接可达。如果 openclaw 跑在另一个容器里,172.17.0.1可能指向它自己的网桥,要换成宿主机实际 IP。
5.3 reading choices 相关报错
调用模型返回结构解析失败时会出现reading 'choices'这类错误,多半是模型侧返回了非预期格式,或者 Model ID 填错导致请求被拒。确认 Model ID 和你的 API Key 匹配,必要时换一个模型再试。
5.4 OAuth 认证卡住
小米认证跳转homeassistant.local失败就是典型。手动把域名替换成 IP。如果替换后仍失败,检查 HA 的configuration.yaml里internal_url和external_url是否配置正确。
5.5 实体找不到 / 设备不出现
先确认插件装在了容器内而不是宿主机,/config/custom_components/下应该有xiaomi_home和sunlogin目录。再看实体 ID 是否和配置里写的一致,去「开发者工具 → 状态」搜关键字核对。改完 configuration.yaml 记得跑 check_config 再重启。
6. 把 openclaw 当成智能家居的统一入口
走到这里,小米、涂鸦、向日葵三类设备已经在同一个 HA 面板里,openclaw 也能通过 skill 读写它们的状态。我的习惯是把常用操作固化成 HA 脚本,再让 openclaw 调用脚本名,比每次拼 service 调用稳定得多。
如果你还想让 openclaw 长期跑自动化、定时巡检设备状态,可以了解下 TaoToken Coding Plan,适合这种持续调用的场景。想先手动验证模型对设备指令的理解,去 TaoToken 模型对话 试几条自然语言指令就行。配置过程中卡在令牌或实体映射,直接翻 TaoToken 接入文档 对照参数。