Skip to content

Home Assistant

Home Assistant 是一款基于 Python 的智能家居开源系统,支持多品牌的智能家居设备,用于实现设备的语音控制、自动化等。

动机:苹果的家居好是好,但是又贵又少;小米的东西便宜,但是不能直接加到苹果家庭内

解决:将 Home Assistant 安装到树莓派上,作为中枢控制

支持列表:https://www.jianguoyun.com/p/DbzdYzoQp5HMBhjZ4IkB

Home Assistant 安装

各种安装方式的区别可以参考 Advanced installation methods

Docker 的安装方式

参考 Install Home Assistant Container ,采用 docker 的方式在树莓派上安装 Home Assistant

终端运行以安装 docker

bash
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings

获取 docker 源

bash
# https://cloud.tencent.com/document/product/213/46000#.E5.AE.89.E8.A3.85-docker
sudo curl -fsSL https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo   "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/ \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" |   sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
bash
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

更新 apt 包索引

bash
sudo apt-get update

安装 Docker CE 和 containerd:

bash
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

验证 Docker 是否安装成功

bash
systemctl status docker   # 执行以下命令,运行 Docker
docker info               # 检查安装结果
systemctl start docker    # 运行 Docker 守护进程
systemctl stop docker     # 停止 Docker 守护进程
systemctl restart docker  # 重启 Docker 守护进程

创建 compose.yml 文件,然后运行 docker-compose up -d 启动 Home Assistant

yml
services:
  homeassistant:
    container_name: homeassistant
    image: "ghcr.io/home-assistant/home-assistant:stable"
    volumes:
      - /PATH_TO_YOUR_CONFIG:/config
      - /etc/localtime:/etc/localtime:ro
      - /run/dbus:/run/dbus:ro
    restart: unless-stopped
    privileged: true
    network_mode: host
yml
services:
  homeassistant:
    container_name: homeassistant
    image: "ghcr.io/home-assistant/home-assistant:stable"
    volumes:
      - /home/ubuntu/homeassistant/config:/config  # 将宿主机上的配置目录挂载到容器内的 /config 目录。
      - /home/ubuntu/homeassistant/media:/media  # 将宿主机上的配置目录挂载到容器内的 /config 目录。
      - /etc/localtime:/etc/localtime:ro  # 将宿主机的时间区域文件挂载到容器内,只读模式。
      - /run/dbus:/run/dbus:ro  # 将 DBus socket 挂载到容器内,以便Home Assistant 可以与系统服务交互,只读模式。
    restart: unless-stopped  # 重启策略
    privileged: true  # 给容器特权模式,以便它可以访问一些普通容器无法访问的系统资源。
    network_mode: host  # 使用宿主机的网络栈,使得容器可以直接使用宿主机的 IP 地址进行网络通信。

启动 Home Assistant

bash
docker compose up -d
docker restart homeassistant # 重启 Home Assistant

如果修改了上述的 compose.yml 文件,需要重新启动 Home Assistant

bash
docker compose down
docker compose up -d --no-create

其中 PATH_TO_YOUR_CONFIG 为配置文件的路径,可以是 /home/ubuntu/homeassistant/config,那么需要修改 <...>/config/configuration.yaml 文件的时候,可以直接在宿主机上修改 /home/ubuntu/homeassistant/config/configuration.yaml 文件

进入容器

bash
docker exec -it homeassistant bash

Home Assistant

输入 http://<ip>:8123 进入 Home Assistant 界面进行配置,配置密码和家庭地址后,即可进入 Home Assistant 界面

<ip> 为树莓派的 IP 地址

HACS

hacs/integration

参考 Download 安装

进入容器

bash
docker exec -it homeassistant bash

执行脚本后重启 Home Assistant 容器

bash
wget -O - https://get.hacs.xyz | bash -

重启 Home Assistant 容器

bash
docker restart homeassistant

点击用左下角用户名,在「用户设置」中启用「高级模式」,然后在「配置」菜单中选择「系统」,右上角重启

重启

安装 HACS install-hacs

需要在 GitHub 上授权登录 hacs-github-link

米家集成

米家继承基于 Xiaomi Miot Auto,文档参考 Xiaomi Miot For HomeAssistant

在左侧 HACS 中搜索「 Xiaomi Miot Auto 」,安装后,重启 Home Assistant

打开 添加集成 修改 IP ,自动打开设置

卡片

除了上面这些默认卡片,还可以手动添加一些卡片,比如用 iframe 添加一个天气组件。

打开网站 Windy Embed,选择地区调整到合适比例,复制代码。

添加“网页卡片”,在 URL 中只需要粘贴代码中的 src 部分,可以调整长宽比例。

https://map.qweather.com/index.html?lat=3.21&lon=119.05&level=2&layer=radar&motion=on

HA 备份

为了实现这个需求,我们需要在脚本中增加一个清理旧备份的功能,确保任何时候只有最近七天的备份存在。以下是一个修改后的脚本示例,它会在每天执行一次备份,并限制备份数量不超过一周(7个)。

创建一个名为 backup_script.sh 的新脚本文件,并使用以下内容:

bash
#!/bin/bash

# 设置源目录和目标目录
SOURCE_DIR="/path/to/source_directory"
BACKUP_DIR="/path/to/backup_directory"

# -- 设置临时目录,并拷贝源目录内容至临时目录,解除 root 权限
tmp_source_dir=$BACKUP_DIR/$(basename $SOURCE_DIR)
date_format=$(date +%Y%m%d)
backup_file="${tmp_source_dir}_${date_format}.tar.gz"

# 如果不存在备份目录,则创建
[ ! -d "$tmp_source_dir" ] && mkdir -p "$tmp_source_dir"

# 复制源目录内容至临时目录
sudo cp -Rp "$SOURCE_DIR"/* "$tmp_source_dir"

sudo chown -R ubuntu:ubuntu $tmp_source_dir
sudo chmod 755 -R $tmp_source_dir

# 使用tar命令进行压缩
tar -C "$tmp_source_dir" -czf "$backup_file" .

# 检查是否备份成功
if [ $? -eq 0 ]; then
    echo "Backup completed successfully."

    # 清理超过一周的备份
    find "$BACKUP_DIR" -maxdepth 1 -name "homeassitant_*.tar.gz" -mtime +7 -exec rm {} \;
    
    echo "Old backups removed if any."
else
    echo "Backup failed."
fi

# 删除临时目录
rm -rf "$tmp_source_dir"
  1. 压缩备份:使用 tar 命令将源目录压缩成一个 .tar.gz 文件,文件名包含当前日期。
  2. 清理旧备份:使用 find 命令查找所有超过7天的备份文件,并删除它们。-mtime +7 参数表示查找修改时间超过7天的文件。

设置脚本具有执行权限:

bash
chmod +x backup_script.sh

使用 crontab 来安排定时任务。每天凌晨1点执行脚本:

bash
crontab -e

在打开的编辑器中添加如下行:

shell
0 1 * * * /path/to/your/script/backup_script.sh
  • 确认 SOURCE_DIRBACKUP_DIR 替换为你自己的路径。
  • 确保 BACKUP_DIR 目录有写权限,脚本能够创建和删除文件。
  • 测试脚本以确认一切正常工作。

现在,每当脚本运行时,它都会创建当天的备份,并自动清理掉一周之前的备份文件,确保备份目录不会无限膨胀。

SD 卡备份

Mac 上备份和恢复 Raspberry Pi SD 卡

  • Mac 上「备份」 Raspberry Pi SD 卡

使用 diskutil list 命令来找到SD卡

zsh
diskutil list

找到SD卡后,你会看到类似这样的输出:

zsh
/dev/disk6 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *64.1 GB    disk6
   1:             Windows_FAT_32 system-boot             536.9 MB   disk6s1
   2:                      Linux                         63.6 GB    disk6s2

设置 SD 卡的路径变量 和 备份文件路径

zsh
SD_CARD="/dev/disk6"
BACKUP_FILE="~/raspberry-pi-backup-$(date +%Y%m%d).img"

执行备份命令

zsh
sudo dd if=${SD_CARD} of=${BACKUP_FILE} status=progress
# sudo dd if=${SD_CARD} | gzip > ${BACKUP_FILE}.gz # 管道 压缩
  • Mac 上「恢复」 Raspberry Pi SD 卡

现在需要将 Raspberry Pi恢复到系统中,需要使用 diskutil list 命令来找到SD卡

zsh
diskutil list

设置 SD 卡的路径变量 和 备份文件路径

zsh
SD_CARD="/dev/disk6"
BACKUP_FILE="~/raspberry-pi-backup-$(date +%Y%m%d).img"

现在,向SD卡写入之前,需要先卸载它。这样做的原因是OSX会同时尝试向它写入,卸载SD卡可以防止这种情况发生。在Mac设备上运行以下命令来卸载存储卡

zsh
diskutil unmountDisk ${SD_CARD}

现在可以把镜像写回SD卡,这也是一个漫长的过程

zsh
sudo dd if=${BACKUP_FILE} of=${SD_CARD} status=progress

dd工具并不显示任何写入进度,所以请耐心等待回车命令提示重新出现

写入过程完成后,现在可以从Mac上弹出SD卡,这样就可以使用Raspberry Pi备份了。要弹出SD卡,可以利用以下命令。

Raspberry Pi的SD卡现在应该与进行原始备份时的状态相同。

sudo diskutil eject /dev/rdisk3

⏰ 最后更新于: