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
# 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 源
# 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
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 包索引
sudo apt-get update
安装 Docker CE 和 containerd:
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
验证 Docker 是否安装成功
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
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
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
docker compose up -d
docker restart homeassistant # 重启 Home Assistant
如果修改了上述的 compose.yml
文件,需要重新启动 Home Assistant
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
文件
进入容器
docker exec -it homeassistant bash
Home Assistant
输入 http://<ip>:8123
进入 Home Assistant 界面进行配置,配置密码和家庭地址后,即可进入 Home Assistant 界面
<ip>
为树莓派的 IP 地址
HACS
参考 Download 安装
进入容器
docker exec -it homeassistant bash
执行脚本后重启 Home Assistant 容器
wget -O - https://get.hacs.xyz | bash -
重启 Home Assistant 容器
docker restart homeassistant
点击用左下角用户名,在「用户设置」中启用「高级模式」,然后在「配置」菜单中选择「系统」,右上角重启
安装 HACS
需要在 GitHub 上授权登录
米家集成
米家继承基于 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
的新脚本文件,并使用以下内容:
#!/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"
- 压缩备份:使用
tar
命令将源目录压缩成一个.tar.gz
文件,文件名包含当前日期。 - 清理旧备份:使用
find
命令查找所有超过7天的备份文件,并删除它们。-mtime +7
参数表示查找修改时间超过7天的文件。
设置脚本具有执行权限:
chmod +x backup_script.sh
使用 crontab
来安排定时任务。每天凌晨1点执行脚本:
crontab -e
在打开的编辑器中添加如下行:
0 1 * * * /path/to/your/script/backup_script.sh
- 确认
SOURCE_DIR
和BACKUP_DIR
替换为你自己的路径。 - 确保
BACKUP_DIR
目录有写权限,脚本能够创建和删除文件。 - 测试脚本以确认一切正常工作。
现在,每当脚本运行时,它都会创建当天的备份,并自动清理掉一周之前的备份文件,确保备份目录不会无限膨胀。
SD 卡备份
Mac 上备份和恢复 Raspberry Pi SD 卡
- Mac 上「备份」 Raspberry Pi SD 卡
使用 diskutil list
命令来找到SD卡
diskutil list
找到SD卡后,你会看到类似这样的输出:
/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 卡的路径变量 和 备份文件路径
SD_CARD="/dev/disk6"
BACKUP_FILE="~/raspberry-pi-backup-$(date +%Y%m%d).img"
执行备份命令
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卡
diskutil list
设置 SD 卡的路径变量 和 备份文件路径
SD_CARD="/dev/disk6"
BACKUP_FILE="~/raspberry-pi-backup-$(date +%Y%m%d).img"
现在,向SD卡写入之前,需要先卸载它。这样做的原因是OSX会同时尝试向它写入,卸载SD卡可以防止这种情况发生。在Mac设备上运行以下命令来卸载存储卡
diskutil unmountDisk ${SD_CARD}
现在可以把镜像写回SD卡,这也是一个漫长的过程
sudo dd if=${BACKUP_FILE} of=${SD_CARD} status=progress
dd工具并不显示任何写入进度,所以请耐心等待回车命令提示重新出现
写入过程完成后,现在可以从Mac上弹出SD卡,这样就可以使用Raspberry Pi备份了。要弹出SD卡,可以利用以下命令。
Raspberry Pi的SD卡现在应该与进行原始备份时的状态相同。
sudo diskutil eject /dev/rdisk3