将 Home Assistant 从 HAOS 迁移到 Ubuntu Server

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
添加新评论