HAOS 固然好,但是不提供 pi-hole 组件。Ubuntu 也不错,但是 Home Assistant Core 没有组件支持。为了合并两台小主机,只能把 Home Assistant 迁移到 Ubuntu 下面,通过 docker 提供附加组件。
这次需要转移的服务如下:
- Home Assistant Core
- Mosquitto
- Zigbee2MQTT (SONOFF Zigbee 3.0 Stick)
- Zwave-JS UI (Zooz Z-wave Stick ZST10)
- ESPhome
AI 是个好东西,Grok 对这次迁移过程提供了很大帮助。不过,Grok 也有不太准确的地方。本文不仅是对迁移过程进行记录,也修正了 Grok 不准确的地方。
0. 备份 Home Assistant
进入 Home Assistant 管理页面,在 Settings -> System -> Backups 页面里面找到 Backup Settings 部分。点击 Configure Backup Settings。然后在 Location 部分找到 This system,点击后面的设置图标。在弹出的窗口中关掉 Encryption(加密)。
然后退回 Backup 页面,点击右下方的 Backup Now,按提示备份。注意备份要包括所有的 addons。
备份完成后,去 Manual backups 里面找到刚刚的备份文件,下载回来,解包。
比较关键的有以下几个。
- homeassistant.tar.gz
- core_mosquitto.tar.gz
- xxxxxxxx_zwavejs2mqtt.tar.gz
注意:以上文件名会根据版本不同而改变,但是都会包含对应组件的关键字。
1. 导入设置数据
将上面的备份文件传到 Ubuntu 机器上。
# Restore Home Assistant backup
mkdir -p /data/homeassistant
cd /data/homeassistant
cp /path/to/homeassistant.tar.gz .
tar -xzf homeassistant.tar.gz
rm homeassistant.tar.gz
# Restore Mosquitto backup
mkdir -p /data/mosquitto
cd /data/mosquitto
cp /path/to/core_mosquitto.tar.gz .
tar -xzf core_mosquitto.tar.gz
rm core_mosquitto.tar.gz
# Restore Zigbee2MQTT backup
mkdir -p /data/zigbee2mqtt
cd /data/zigbee2mqtt
cp -r /data/homeassistant/data/zigbee2mqtt/* .
# Restore Zwave-JS UI backup
mkdir -p /data/zwave-js-ui
cd /data/zwave-js-ui
cp /path/to/xxxxxxxx_zwavejs2mqtt.tar.gz .
tar -xzf xxxxxxxx_zwavejs2mqtt.tar.gz
rm xxxxxxxx_zwavejs2mqtt.tar.gz
# Restore ESPhome backup
mkdir -p /data/esphome/config
cd /data/esphome/config
cp -r /data/homeassistant/data/esphome/* .
2. 创建 Mosquitto 设置文件
将以下内容写入到 /data/mosquitto/config/mosquitto.conf
persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
listener 1883
allow_anonymous false
password_file /mosquitto/config/password.txt
然后运行下面的命令,建立 Mosquitto 用户账号。注意替换 <username>
sudo docker run -it --rm -v /data/mosquitto:/mosquitto eclipse-mosquitto mosquitto_passwd -c /mosquitto/config/password.txt <username>
3. 修正 Zigbee2MQTT 和 Zwave-JS UI 到 Mosquitto 的连接
将上一步创建的 Mosquitto 用户名/密码更新到 Zigbee2MQTT 和 Zwave-JS UI 设置当中。注意,要把 Mosquitto 主机地址也改成本机地址,不要用 localhost 或者 127.0.0.1。
/data/zigbee2mqtt/configuration.yaml
/data/zwave-js-ui/store/settings.json
4. 修正 Zigbee Stick 和 Z-wave Stick 在系统中的路径
首先,用 lsusb
命令获取两个 USB 棒的 Vender ID 和 Product ID。
然后,创建文件 /etc/udev/rules.d/99-usb.rules
,内容如下。注意替换正确的 ID
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="zwave"
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d4", SYMLINK+="zigbee"
重启系统。
5. 部署 Docker
先为 Zwave-JS UI 生成 SESSION_SECRET
openssl rand -base64 32
最终的 docker-compose.yaml
内容如下。注意替换 <secret>
version: '3'
services:
homeassistant:
image: homeassistant/home-assistant:latest
container_name: homeassistant
network_mode: host
volumes:
- /data/homeassistant/data:/config
environment:
- TZ=America/Toronto
ports:
- "8123:8123"
restart: unless-stopped
mosquitto:
image: eclipse-mosquitto:latest
container_name: mosquitto
volumes:
- /data/mosquitto:/mosquitto
- /data/mosquitto/data:/mosquitto/data
- /data/mosquitto/log:/mosquitto/log
ports:
- "1883:1883"
- "9001:9001"
restart: unless-stopped
zigbee2mqtt:
image: koenkk/zigbee2mqtt:latest
container_name: zigbee2mqtt
volumes:
- /data/zigbee2mqtt:/app/data
- /run/udev:/run/udev:ro
ports:
- "8099:8099"
environment:
- TZ=America/Toronto
devices:
- /dev/zigbee:/dev/ttyACM0
restart: unless-stopped
zwave-js-ui:
image: zwavejs/zwave-js-ui:latest
container_name: zwave-js-ui
tty: true
stop_signal: SIGINT
volumes:
- /data/zwave-js-ui/store:/usr/src/app/store
ports:
- "8091:8091"
- "3000:3000"
environment:
- SESSION_SECRET=<secret>
- TZ=America/Toronto
devices:
- /dev/zwave:/dev/ttyUSB0
restart: unless-stopped
esphome:
image: esphome/esphome:latest
container_name: esphome
privileged: true
network_mode: host
volumes:
- /data/esphome/config:/config
- /etc/localtime:/etc/localtime:ro
ports:
- "6052:6052"
environment:
- ESPHOME_DASHBOARD_USE_PING=true
restart: always
访问 http://<server-ip>:8123
确认 Home Assistant 是否正常工作。
6. 在 Home Assistant 设备集成中重新设置附加组件的服务连接
在 Home Assistant 中选择 Settings -> Device & services。
进入 MQTT 集成,点击 core-mosquitto 右面的三个点,选择 Reconfigure,填写本机 IP 地址,和上面重新设置的 Mosquitto 用户名密码。
进入 Z-Wave 集成,点击 Z-Wave JS 右面的三个点,选择 Reconfigure,在弹出选项里面选择 Re-configure the current controller,将地址中的主机名改成本机 IP。
7. 将 Zigbee2MQTT、Zwave-JS UI 和 ESPhome 添加到 Home Assistant 侧栏
从 HACS 里面安装 Ingress 扩展。
然后,在 /data/homeassistant/data/configuration.yaml
里面加上下面一段
ingress:
esphome:
require_admin: true
title: ESPHome
icon: mdi:chip
url: http://<server-ip>:6052
zigbee2mqtt:
require_admin: true
title: Zigbee2MQTT
icon: mdi:zigbee
url: http://<server-ip>:8099
zwave_js_ui:
require_admin: true
title: Zwave-JS UI
icon: mdi:z-wave
url: http://<server-ip>:8091