家里的智能设备是这么堆起来的:前年买了个米家的插座,去年添了两个涂鸦的灯,今年又来了个天猫精灵。结果就是——客厅的灯要用涂鸦 App,卧室的插座要用米家 App,想让它们联动,得靠天猫精灵喊一嗓子。

三个 App,三套账号,谁跟谁都不认识。

我忍了很久,上个月终于决定把这堆东西收到一个界面里。

Home Assistant 是干什么的

一句话:把不同品牌的智能设备统一到一个面板上,然后让它们互相联动。

它不是"又一个 App",是个本地服务。所有设备接入 HA 之后,你在 HA 里看到的是一堆实体(灯、插座、传感器),规则是统一的,自动化也是统一的。

设备品牌、协议、云端,全被它屏蔽在下面。你在上面只操作"客厅灯"这个实体,不管它到底是米家还是涂鸦。

部署:host 网络是硬要求

services:
  homeassistant:
    image: ghcr.io/home-assistant/home-assistant:stable
    container_name: homeassistant
    restart: unless-stopped
    network_mode: host
    privileged: true
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./config:/config
      - /etc/localtime:/etc/localtime:ro

三个关键点:

network_mode: host——这不是可选项。HA 要靠 mDNS 和 SSDP 在局域网里发现设备,走桥接网络加端口映射,很多设备根本发现不了。

privileged: true——如果后面要接蓝牙或 Zigbee 网关,需要访问宿主机的 USB 设备,这个得开。

TZ=Asia/Shanghai——容器默认 UTC,时区不对,自动化全在半夜触发。我第一次就踩了这个,设置的"晚上七点开灯",结果凌晨三点亮。

启动后访问 http://IP:8123,第一次进去是初始化向导,建账号、选时区、选单位。

目录结构

./config 是 HA 的全部家当——配置、数据库、日志、集成。这个目录必须持久化,删了就全没了。

我一开始没挂 volume,容器重建一次,所有设备配置清零,重新接了半小时。

HACS:社区插件仓库

HA 自带的功能够用,但接国内设备要靠第三方集成。装 HACS(Home Assistant Community Store)相当于给 HA 加了个应用商店。

安装方式:进容器执行脚本。

docker exec -it homeassistant bash
wget -O - https://get.hacs.xyz | bash -
exit

然后重启容器,在 HA 的「设备与服务」里搜索 HACS 添加,按提示走 GitHub 授权。

HACS 装完,在它的「集成」页面搜 Xiaomi Miot Auto,下载,重启。

接米家设备

重启后在「设备与服务」里添加集成,搜 Xiaomi Miot Auto,选「添加账号」。

它会让你登录米家账号。这里有个坑:登录走的是小米的云端,你的账号密码会经过一次 OAuth。介意的话就用局域网模式,但局域网模式只支持同一网段的设备,有些老设备不支持。

登录成功后,它会列出你账号下所有设备。勾选要接的,加进来。

我接了三类:

设备接入状态备注
米家智能插座正常,能开关、看功率直接可用
涂鸦的灯通过 Tuya 集成接入要另外装 Tuya 集成
天猫精灵不支持直连只能反向:HA 控制它

涂鸦的设备要单独装 Tuya 集成,在涂鸦开发者平台注册账号拿 Access ID 和 Secret,稍微麻烦,但能接。

天猫精灵这类语音助手是"反向"的——它不能作为设备接进 HA,但 HA 可以把自己虚拟成一个设备暴露给它,让它来喊。这个后面再说。

做一条自动化

设备接进来之后,HA 的价值才体现出来。

我做的第一条:晚上回家,玄关灯自动亮。

条件:

动作:开灯,亮度 40%。

配置在「自动化」里可视化编辑,也可以直接写 YAML:

alias: 回家开玄关灯
trigger:
  - platform: state
    entity_id: person.moxiao
    to: home
condition:
  - condition: time
    after: "18:00:00"
action:
  - service: light.turn_on
    target:
      entity_id: light.xuan_guan
    data:
      brightness_pct: 40
mode: single

第二条:插座功率超过阈值就提醒。米家插座能读功率,洗衣机的插座跑完程序功率会掉到 2W 以下,触发手机通知"衣服洗好了"。

这条特别实用,比洗衣机自带的提示靠谱。

四个坑

坑一:不走 host 网络,设备发现不了

我最开始用的是桥接网络,端口映射了 8123,网页能开,但添加米家设备时一直"未发现设备"。

原因是 HA 靠 mDNS 广播找设备,桥接网络里它收不到广播包。改成 host 模式立刻好了。

坑二:token 过期

米家云端登录的 token 有有效期,大概几个月。过期之后所有设备显示"不可用"。

处理:在集成页面点「重新认证」,重新登录一次。没法彻底避免,除非全走局域网模式。

坑三:数据库膨胀

HA 的 recorder 默认把每个实体的每次状态变化都写进 SQLite。一个带功率的插座,一天能写几千条。两个月后数据库能到几个 G,HA 越来越卡。

处理:在 configuration.yaml 里限制保留天数:

recorder:
  purge_keep_days: 10
  commit_interval: 30

再定期清理一次:

docker exec homeassistant hass --script db_migrate

不是必须,但数据库小一点跑得顺。

坑四:设备离线但显示在线

有些设备(尤其涂鸦的)掉线之后,HA 里的状态还停在最后一次,看着是"开着",实际早断了。

处理:在自动化里加 for 条件,或者配一个 ping 传感器定时检查。

值不值

对我来说,值。

缺点也清楚:

最后

装完这套,我最大的感受是:智能家居的问题不是设备不够智能,是每个品牌都想当那个唯一的入口。

HA 干的事很简单——把入口收回你自己手里。

设备还是那些设备,插座还是那个插座,但从此它们听你的,不听厂商的。

如果你家里也有三四个品牌的智能设备,又烦透了切 App,可以试试。先从接一个插座开始,别一上来全接,慢慢来。


如果你也在折腾这套东西,碰到卡住的地方,可以加我微信 lige0552 聊聊。白天要上班,消息回得慢,看到都会回。