J4125 All In One主机搭建pve，安装iKuai、OpenWRT、Adguard LXC、Debian12 LXC、Home Assistant OS。 本期开始是软路由安装与配置系列，一共计划三期，主要记录工控机安装虚拟化系统并搭建软路由、服务器、NAS、Docker等系统及其配置和使用过程。本文不作为教程，仅仅是up主初试All in One主机搭建的记录，仅供参考。 参考： 【软路由】J4125安装PVE7.3+iKuai+OpenWrt+NAS+Win10+Debian+CentOS_pve添加第二块硬盘_xuehu96的博客-CSDN博客 司波图文字：通用PVE AIO安装教程: 通用PVE集成软路由，KODI，基于LXC的Docker服务教程 (gitee.com) AIO从入门到如土 篇一：一文为你揭开一台all in one家庭服务器的神秘面纱_服务器_什么值得买 (smzdm.com) 一、宿主机 选用倍控J4125 4*2.5G网口小主机，安装16GB内存、2T SATA固态硬盘和螃蟹8156b 2.5GUSB网卡（做管理口用，虽然这机器USB只能跑2.0速度）。 网口接线 参考：家用软路由、NAS、All in one网络拓扑方案 - 知乎 (zhihu.com) 网口定义： 宿主机外部名称 宿主机设备名 宿主机pcie地址 软路由内设备名 ETH0 enp1s0 01:00.0 eth1 ETH1 enp2s0 02:00.0 eth2 ETH2 eno1 03:00.0 eth1 ETH3 enp4s0 04:00.0 硬盘分配 500G mSATA做宿主机系统盘和虚拟机储存空间，2T SATA固态直接挂载给LXC容器做下载空间。 flowchart LR subgraph sdb ["/dev/sdb 2TB"] O["挂载 - Debian12 LXC /mnt/ext - qbittorrent LXC /mnt/ext"] end subgraph sda ["/dev/sda 500GB"] subgraph 11[local 100G] A["100G PVE/ESXi"] end subgraph 22[local-lvm 375G] direction TB B[10G iKuai] C[2.5G OpenWRT] F[32G HAOS] G(10G qbittorrent LXC) H(10G Nginx LXC) I(20G AdGuard LXC) D("100G Debian12 LXC") end end 内存分配 LXC不会占用全部内存，KVM虚拟机会分配全部内存。 graph LR subgraph DRAM ["16GiB内存"] A[iKuai 2G] B[OpenWRT 4G] D[HAOS 4G] CDebian LXC 10G Eqbittorrent LXC 4G FNginx LXC 2G GAdGuard LXC 1G end esxi or pve？ esxi不能显示CPU温度？ 容易核显直通 esxi需封装i226、8156b驱动 esxi直通核显需要预留内存 esxi性能损失更小？但无法利用p-state，功耗更大？ 网卡驱动：关于RTL8156 USB 2.5G网卡的安装说明 - 哔哩哔哩 (bilibili.com) PVE7.3 与 ESXi7.0U3c 性能对比：https://kb.blockbridge.com/technote/proxmox-vs-vmware-nvmetcp/ PVE 8.0.3、ESXi 8.0U1、Unraid 6.12.4、Hyper-V和黑群晖 7.1.1虚拟性能的比较：https://youtu.be/hdDNNgnMPII?si=UzrYLOJv4TTvSxFt 结论：PVE在Geekbench跑分中落后ESXi 2到3个百分点，其余指标均低于ESXi百分之1以内。 二、PVE 8.0 2.1 开启IOMMU组 vim /etc/default/grub 在 GRUB_CMDLINE_LINUX_DEFAULT 中，添加intel_iommu=on 和 iommu=pt 2.2 虚拟机架构 graph TD AIO[(AIO)] --> PVE(PVE) ==> A([100 debian12 LXC]) PVE --> B[101 OpenWRT] PVE --> C[102 iKuai] PVE --> D[103 HAOS] PVE ==> E([104 qbittorrent]) PVE ==> F([105 Nginx]) PVE ==> G([106 AdGuard]) 2.3 PVE宿主机配置 pve8.0 Debian12 换清华源 vim /etc/apt/sources.list # 8.0清华源 deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware # security updates deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware vim /etc/apt/sources.list.d/pve-enterprise.list # 8.0官方企业付费订购源 deb https://mirrors.tuna.tsinghua.edu.cn/proxmox/debian/pve bookworm pve-no-subscription 修复： #修复更新时源报401错 echo "deb http://download.proxmox.com/debian/ceph-quincy bookworm no-subscription" > /etc/apt/sources.list.d/ceph.list #下载官方授权加密秘钥证书 wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg pve-tools GitHub项目：ivanhao/pvetools: proxmox ve tools script apt update && apt -y install git && git clone https://github.com/ivanhao/pvetools.git cd pvetools ./pvetools.sh 用于显示CPU温度、调整CPU频率、快速PCI-E直通等。 2.4 PVE LXC容器 1）网络 100 Debian12 LXC 网卡eno1直通，且使用静态ip： nano /etc/pve/lxc/100.conf lxc.net.1.type: phys lxc.net.1.link: eno1 lxc.net.1.name: eth1 lxc.net.1.ipv4.address: 192.168.31.101/24 lxc.net.1.ipv4.gateway: 192.168.31.1 lxc.net.1.flags: up 容器内静态IP vim /etc/network/interfaces auto eth0 iface eth0 inet static address 192.168.2.10/24 gateway 192.168.2.1 # dns-* options are implemented by the resolvconf package, if installed dns-nameservers xxx dns-search your.search.domain.here iface eth0 inet6 dhcp firewall=1,gw=192.168.2.1, ,ip=192.168.2.10/24,ip6=dhcp 在PVE管理界面，容器的DNS设置中改为你想要的设置。 容器内网卡使用DHCP：为 LXC 配置网络 (lzz5235.github.io) vim /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp iface eth0 inet6 auto 软路由处设置Debian12 LXC静态DHCP并网关指向旁路由，查看网关是否切换成功： # ip route show default via 192.168.2.2 dev eth0 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 192.168.2.0/24 dev eth0 proto kernel scope link src 192.168.2.100 2）核显“直通” 核显“直通”做硬解（LXC容器与pve共同使用核显） #lxc.apparmor.allow_nesting = 1 lxc.cgroup2.devices.allow: c 226:0 rwm lxc.cgroup2.devices.allow: c 226:128 rwm lxc.cgroup2.devices.allow: c 29:0 rwm lxc.mount.entry: /dev/dri dev/dri none bind,optional,create=dir lxc.mount.entry: /dev/fb0 dev/fb0 none bind,optional,create=file lxc.apparmor.profile: unconfined pve 查看核显： # ls -l /dev/dri total 0 drwxr-xr-x 2 root root 80 Nov 23 21:39 by-path crw-rw---- 1 root video 226, 0 Nov 23 21:39 card0 crw-rw---- 1 root render 226, 128 Nov 23 21:39 renderD128 3）挂载硬盘 请采用by-id或by-uuid方式挂载分区 # by-id pct set 100 -mp0 /dev/disk/by-id/ata-GSL-2TB_0013204001102-part1,mp=/mnt/ext # by-uuid pct set 104 -mp0 /dev/disk/by-uuid/f42bcf36-3fee-400f-a8cb-bfaf2697872,mp=/mnt/ext 直接直通： brw-rw---- 1 root disk 8, 16 Nov 27 20:18 /dev/sdb brw-rw---- 1 root disk 8, 17 Nov 27 20:18 /dev/sdb1 #lxc.cgroup.devices.allow: b 8:16 rwm lxc.cgroup.devices.allow: b 8:17 rwm lxc.autodev: 1 lxc.hook.autodev: /var/lib/lxc/ID/mount-hook.sh lxc.mount.entry: /dev/sda1 /dev/sda1 bind,create=dir,optional 0 0 vim /var/lib/lxc/ID/mount-hook.sh #!/bin/sh mknod -m 777 ${LXC_ROOTFS_MOUNT}/dev/sda b 8 0 mknod -m 777 ${LXC_ROOTFS_MOUNT}/dev/sda1 b 8 1 2.5 PVE KVM虚拟机 虚拟机 CPU选Host 最小性能损耗；选项开启 QEMU GuestAgent ，虚拟机内安装qemu-guest-agent. RDM直通： qm set 101 --scsi1 /dev/disk/by-id/ata-GSL-2TB_0013204001102 核显直通： GRUB增加： intel_iommu=on initcall_blacklist=sysfb_init 更新grub update-grub 编辑黑名单：/etc/modprobe.d/pve-blacklist.conf blacklist i915 blacklist snd_hda_intel options vfio_iommu_type1 allow_unsafe_interrupts=1 更新initramfs update-initramfs -u -k all 重启pve update-pciids 101.conf args: -set device.hostpci1.x-igd-gms=1 hostpci1: 0000:00:02.0,legacy-igd=1,romfile=vbios.bin vbios 判断是否需要romfile cd /sys/bus/pci/devices/0000:00:02.0/ echo 1 > rom cat rom 三、ESXi 8.0U2 ESXi8.0U2 vCenter 封装i226-V、8156b驱动 UHD600核显直通支持 J4125 vCenter vcenter 封装驱动https://blog.csdn.net/myxsL/article/details/130989373 镜像来源：23年10月4日更新-ESXI 8.0 U2 ESXI 7.0 8.0系列，封包I225V/螃蟹USB驱动镜像-软路由,x86系统,openwrt(x86),Router OS 等-恩山无线论坛 (right.com.cn) 核显直通 开机释放核显权限： esxcli system settings kernel set -s vga -v FALSE 修改虚拟机配置文件 vi /vmfs/volumes/datastore1/debian12_esxi_xfce/debian12_esxi_xfce.vmx 添加： pciPassthru.use64bitMMIO="TRUE" pciPassthru.64bitMMIOSizeGB=64 （然而对于我的镜像和核显，这并没用，可能驱动不支持，或为reset bug，所以放弃ESXi转而投入PVE怀抱） 四、主路由 iKuai 设置WAN口与LAN口，设置WAN口PPPoE拨号账号密码，设置LAN口ip。 设置开启IPv6与DHCPv6 设置DHCP，DNS使用公共DNS，普通用户使用网关指向iKuai（192.168.2.1）；固定需要走代理的设备设置固定DHCP，并将网关指向代理服务器，本例中即旁路由OpenWRT192.168.2.2。 设置DNS服务器，可以与DHCP中设置相同，开启DNS加速。 五、旁路由 OpenWRT iStoreOS PVE官方安装教程：X86 PVE 安装 | 易有云产品中心 (linkease.com) pve下载工具 wget https://fw0.koolcenter.com/binary/other-tools/img2kvm pve下载镜像： wget https://fw0.koolcenter.com/iStoreOS/x86_64/istoreos-22.03.5-2023112413-x86-64-squashfs-combined.img.gz 虚拟机内安装Qemu-Guest-Agent opkg update opkg install qemu-ga iStore扩展插件包： https://github.com/AUK9527/Are-u-ok/tree/main/x86 六、Home Assistant OS 一键创建HAOS虚拟机脚本：Proxmox/vm/haos-vm.sh at main · tteck/Proxmox (github.com) 默认配置 2核4G 32GB硬盘 bash -c "$(wget -qLO - https://github.com/tteck/Proxmox/raw/main/vm/haos-vm.sh)" 安装插件与集成 安装ssh插件 使用第三方应用（如MobaXterm）生成ssh密钥对（为了debian12以上考虑，最好生成非RSA的），并填写SSH addon配置 username: hassio password: "" authorized_keys: - >- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO93BvbKjc//tyJ0HXTisr80F50cODQfJQcJscyTRz9V ed25519-key-20231126 sftp: false compatibility_mode: false allow_agent_forwarding: false allow_remote_port_forwarding: false allow_tcp_forwarding: false 安装HACS wget -O - https://get.hacs.xyz | bash - 通过HACS下载第三方集成需要网络代理，最好先配置好旁路由。 遇到PVE中显示内存占用高，但HomeAssistant中却显示内存占用很低，重启虚拟机即可。（与PVE的内存分配机制有关：HAOS/Proxmox ram jump usage after backup · Issue #847 · sabeechen/hassio-google-drive-backup (github.com)） Nginx反代信任 configuration.yaml文件中添加以下配置，参考：HTTP - Home Assistant (home-assistant.io) http: use_x_forwarded_for: true trusted_proxies: - 192.168.100.27 #反代服务器 - 172.30.33.0/24 #本机反代ip段 七、TrueNAS（未安装） RDM直通： qm set 104 --scsi1 /dev/disk/by-id/ata-GSL-2TB_0013204001102 qm set 105 --scsi1 /dev/disk/by-id/ata-GSL-2TB_0013204001102 TrueNAS Core基于FreeBSD，TrueNAS Scale基于Debian Linux。用TrueNAS为的是ZFS，但本机只有一块SATA硬盘，就直接挂在给Debian Server，不再考虑使用专用NAS系统。 八、Debian12 LXC 对于KVM虚拟机，需要关闭自动休眠。 关闭自动休眠 ： systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target 检查是否成功关闭 ： systemctl status sleep.target 返回信息出现sleep.target inactive(dead)即关闭成功 ssh密钥登陆 配置关闭密码访问，并生成ssh密钥对，以后客户端使用私钥登录。 编辑sshd_config vim /etc/ssh/sshd_config PermitRootLogin yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication no # 活跃时间 ClientAliveInterval 900 ClientAliveCountMax 3 重启sshd systemctl restart sshd debian 12 openssh 9以上默认不提供RSA支持，请申请更安全的非RSA密钥。 另一方面关于 SHA-1 哈希算法，此前该算法被发现构造前缀碰撞攻击成本已降至低于 5 万美元（实际为 4.5 万美元），因此开发团队决定禁用 ssh-rsa 公钥签名算法。 有一些更好的算法可以替代，包括 RFC8332 RSA SHA-2 签名算法 rsa-sha2-256/512、ssh-ed25519 签名算法与 RFC5656 ECDSA 算法。目前这些算法在 OpenSSH 中都已经支持。 完整的更新说明查看：http://www.openssh.com/txt/release-8.2 使用ed25519算法生成密钥 ssh-keygen -t ed25519 公钥添加至授权名单 cd ~/.ssh #若使用普通用户登录，也需要相应拷贝 cat id_ed25519.pub > authorized_keys 将私钥id_ed25519拷贝至客户端用于ssh登录. 本地化 locale重设 dpkg-reconfigure locales 空格选中 en_US.UTF-8 UTF-8 zh_CN.UTF-8 UTF-8，defalut选择 en_US.UTF-8 UTF-8 时区重设 dpkg-reconfigure tzdata 选择Asia/Shanghai apt换源：与上文PVE换源相同 创建并使用普通账户 # 家目录/mnt/ext/gakki 创建账户 useradd -m -b /mnt/ext gakki # 若已有目录可选择不创建家目录 使用-M useradd -M -b /mnt/ext gakki # 创建密码 passwd gakki # 修改默认sh为zsh chsh -s /bin/zsh gakki Docker 安装docker与docker-compose apt update && apt install curl #curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh apt install docker-compose 换国内镜像源 vim /etc/docker/daemon.json { "registry-mirrors": [ "https://dockerproxy.com", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com", "https://ccr.ccs.tencentyun.com" ] } 安装Jellyfin、Nextcloud、qbittorrent等容器将在下下期展开。 Syncthing 使用普通用户启用，避免权限问题 apt install syncthing 临时启动服务 systemctl enable syncthing@gakki --now vim ~/.config/syncthing/config.xml 找到127.0.0.1:8384，改为0.0.0.0:8384 重新启用服务 systemctl restart syncthing@gakki 九、各应用LXC qbittorrent 使用新建LXC搭建qbittorrent而非在Debian LXC中使用Docker安装qbittorrent，为的是获取完整的带宽与独立的IPv4与IPv6地址，从而更方便地设置不经过旁路由直连外网。 依旧使用Proxmox VE Helper脚本一键搭建： bash -c "$(wget -qLO - https://github.com/tteck/Proxmox/raw/main/ct/qbittorrent.sh)" 默认配置2核2G，8GB存储。本例中qbittorrent LXC与旁路由共享eno1网口，因此现在pve中设置桥接自eno1的新Linux Bridge vmbr1 安装完成后挂载SATA硬盘作为下载存储，pve宿主机操作： pct set 104 -mp0 /dev/disk/by-uuid/f42bcf36-3fee-400f-a8cb-bfaf2697872,mp=/mnt/ext 默认WebUI登录账户密码admin changeme 为了pt下载可以在设置中更换掉默认监听端口，并且在主路由iKuai的ACL增加监听端口的传入规则（见下期）。 AdGuard LXC PVE Helper一键脚本，默认单核512MiB内存，2G硬盘。为了后期系统更新着想，请使用Manual模式手动改大内存、硬盘容量。 bash -c "$(wget -qLO - https://github.com/tteck/Proxmox/raw/main/ct/adguard.sh)" 安装完可以把WebUI端口调为80，方便HA使用。
本篇是智能家居折腾系列的第三期，完稿于第5期之后，内容有穿插请跳转查看。 本篇主要介绍ESP8266单片机和ESPHome的开发使用，以及将开发版接入Home Assistant的方法。项目均为测试上手之用，完成度不高，仅做尝试。 这一期围绕使用支持Wi-Fi的单片机制作可使用Home Assistant控制的能远程开关灯的物联网设备，主要介绍使用ESP8266 Node MCU结合舵机制作的简易关灯装置、使用ESP01-S配合继电器模块设计的简易单火线墙壁开关、ESP32-CAM作为IP摄像头。 本文完成时间距内容创造时间较长，详细过程和实物图片就不全展示了，可以找相关教程和文档。 一、ESPHome开发智能开关 ESPHome is a system to control your ESP8266/ESP32 by simple yet powerful configuration files and control them remotely through Home Automation systems. ESP8266和Node MCU开发板这里就不详细介绍了，可以查阅相关页面： ESP8266-NodeMCU介绍. 太极创客：http://www.taichi-maker.com/homepage/reference-index/arduino-hardware-refrence/nodemcu/ 1. Mac(类Unix)上 ESPHome安装 根据官方文档引导，使用 pip 安装 ESPHome（此步骤可以不加user）： pip3 install --user esphome 注意ESPHome --user 安装位置：/Users/gakki/Library/Python/3.9/bin，使用时需要添加环境变量： export PATH="$PATH:/Users/gakki/Library/Python/3.9/bin" 看自己安装的方式，我的需要加 sudo 启动： sudo esphome esphome_config/ dashboard 访问Web localhost:6052： 对于nodeMCU，板载CH340的USB转TTL芯片，在mac上可以免驱直连；对于ESP01等小板，需要搭配烧录器连接至电脑。 连接后，在编辑页面输入配置文件，检查成功后可直接编译烧录至单片机。 ESPHome的优点就是无需编写代码，使用高度集成的配置文件式编程。更多细节请参阅相关文档。 2. ESP8266控制舵机 ESP8266有部分引脚可以输出PWM信号，进而可以操控舵机， 我使用的是SG90舵机，旋转角度仅为90度，供电和GND接开发版，数据线接D4引脚。 硬件输出PWM控制舵机 案例：接入ESPHome用ESP8266控制舵机喂狗：https://bbs.hassbian.com/thread-8741-1-1.html ESPHOME 舵机项目1 官方文档中所给出的ESPHome中关于舵机的配置，使用 esp8266_pwm 输出PWM至指定引脚，并创建舵机实体。 # Example configuration entry servo: - id: my_servo output: pwm_output # Example output platform # On ESP32, use ledc output output: - platform: esp8266_pwm id: pwm_output pin: D1 frequency: 50 Hz 用舵机控制墙壁开关 我尝试将舵机贴近墙壁开关粘贴放置，使得舵机旋转半周后刚好能将开关关闭（由于已拆除，已无现场图片），单片机开发板则从插座取电。 我烧录的yaml： esphome: name: node_mcu platform: ESP8266 board: nodemcuv2 wifi: ssid: "blue_sky" password: "720805zzy" power_save_mode: light # Enable fallback hotspot (captive portal) in case wifi connection fails #ap: #ssid: "Servos Fallback Hotspot" #password: "VYTOwxqxxlOT" #captive_portal: # Enable logging logger: # Enable Home Assistant API api: services: - service: control_servo variables: level: float then: - servo.write: id: my_servo level: !lambda 'return level / 100.0;' ota: password: "123" servo: - id: my_servo output: pwm_output # Example output platform # On ESP32, use ledc output output: - platform: esp8266_pwm id: pwm_output pin: D4 frequency: 50 Hz light: - platform: monochromatic name: "LED On Board" output: pwm_output D4管脚刚好对应开发板上的LED灯，实际的效果依然没有视频，不过可以参考B站上同类型的展示： 3. ESP01S控制继电器 ESP01S是简化的ESP8266，仅引出两个GPIO，GPIO0 和 GPIO2。 淘宝上搜索ESP01+继电器，有搭配ESP01的继电器模块，继电器模块通过5V供电，内部IDO转为3.3V给ESP01供电，因此整个模块需要5V供电，可以从墙壁插座使用变压器供电，若86盒中预留零线的，可以购买220V转5V的模块供电。 我的想法是：ESP01通过ESPHome接入HA，作为一个远程开关；继电器控制电灯火线的开闭；还要兼顾原来物理开关的功能，而且物理开关和HA中的状态可以实时更新同步。 可以参考下面的实例。 CSDN实例2 通过ESPHome接入HA，实现与之前相近的功能，即使用Wi-Fi和实体开关控制继电器。 大体的原理是：一个gpio虚拟成二进制传感器，一个gpio来控制继电器。当这个二进制传感器触发的时候，开关的开与闭合也发生变化。 GPIO0控制继电器的吸和，GPIO2与GND之间焊上原来的物理开关（使用杜邦线相连），并在GPIO和VCC间焊上10K的上拉电阻。（取决于继电器模块的工作模式，此方案是低电平触发，若为高电平触发，则开关要与VCC相连，对应焊接下拉电阻） 具体接线图已无处寻，可以参考CSDN实例2 中的接线方式。 ESPHome 配置 与CSDN例子中不同的是，他的是自动回弹式开关，使用的二进制传感器工作模式为 on_press，即每次按下时开/关灯。 我使用的是传统的墙壁开关，每次扳动时开/关灯，因此使用的模式是 on_state. 烧录文件： esphome: name: esp01s-1 platform: ESP8266 board: esp01_1m wifi: networks: ssid: "blue_sky" #改成你的wifi名称 password: "720805zzy" #改成你的wifi密码 power_save_mode: light #manual_ip: #static_ip: 192.168.50.189 #gateway: 192.168.50.1 #subnet: 255.255.255.0 # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Esp01S-1 Fallback Hotspot" #当esp01s连不上网的时候，它会自动发出热点。 password: "12345678" captive_portal: # Enable logging logger: # Enable Home Assistant API api: # password: "1" ota: password: "123" web_server: port: 80 switch: - platform: gpio pin: GPIO0 name: "书房灯1" id: relay2 inverted: True binary_sensor: - platform: gpio pin: GPIO2 name: "press_switch_lib1" device_class: opening filters: - delayed_on_off: 100ms #这里一定要加这个这个起到滤波的作用。 on_state: #当这个二进制传感器状态改变的时候，触发gpio0 then: - switch.toggle: relay2 ESPHome Wi-Fi 使用省电模式： wifi: # ... power_save_mode: light 深度睡眠请参考：https://www.esphome.io/components/deep_sleep 具体效果请参考我发在B站上的视频（此账号目前已寄）：https://www.bilibili.com/video/BV1Ri4y117Kk 4. HA端集成 在Home Assistant中添加ESPHome集成，自动发现设备，将实体添加至HA。 舵机对应的单色光灯和继电器开关对应的开关实体可以桥接至HomeKit。 二、Arduino开发智能开关 可以使用Arduino为ESP8266编程，使用高度封装的C或C++，详细的编程这里不介绍，可以参考： 太极创客-ESP8266-NodeMCU通过C/C++开发使用物联网 由于ESPHome与HA关系密切，使用更为简单，所以我最后的成品没有使用Arduino编程，以下引用自网络，仅供参考。 软件模拟PWM 案例：ESP8266/ESP01 软件输出PWM二极管调光（Arduino）：https://www.cnblogs.com/cuianbing/p/14409053.html B站的实例3 将普通开关接到GPIO2与Vcc之间。 定义了几个系统变量： 继电器状态标识YYXBC_HIGH和YYXBC_LOW （以后可用LED_ON和LED_OFF代替） 外部IO位置，物理开关与继电器 物理开关工作模式 /*1，继电器高电平触发时，YYXBC_HIGH = 1，YYXBC_LOW = 0 继电器低电平触发时，YYXBC_HIGH = 0，YYXBC_LOW = 1 */ const int YYXBC_HIGH = 0 ; //继电器是低电平触发 const int YYXBC_LOW = 1 ; //2，用esp-01时，物理开关接在vcc 和gpio2上，继电器接在gpio0上 //NodeMCU 继电器接D3 GPIO0,物理开关接D4 GPIO2 #define LED_BUILTIN_LIGHT 0 #define LED_BUILTIN_K2 2 /*3，物理开关点动模式1，自锁模式0*/ const int YYXBC_BUTTON_TYPE = 1; 开关响应： //点动模式按钮，监听按钮状态，执行相应处理 void btnHandler1() { static bool oButtonState = false; int state1 = digitalRead(LED_BUILTIN_K2); //按钮状态 int state2 = digitalRead(LED_BUILTIN_LIGHT); //灯的状态 if(state1 == HIGH ) { if(oButtonState ){ if(state2 == YYXBC_HIGH ) { button1_callback(BLINKER_CMD_OFF); Serial.println("按钮对灯已执行关闭"); }else{ button1_callback(BLINKER_CMD_ON); Serial.println("按钮对灯已执行打开"); } oButtonState = false; } }else{ oButtonState = true; } } //自锁模式按钮，监听按钮状态，执行相应处理 void btnHandler2() { static bool is_btn = false;//按钮的标志位，用来逻辑处理对比，判断按钮有没有改变状态 bool is = digitalRead(LED_BUILTIN_K2); //按钮状态 if ( is != is_btn) { bool is_led = digitalRead(LED_BUILTIN_LIGHT); digitalWrite(LED_BUILTIN_LIGHT, !is_led); if (is_led == YYXBC_HIGH) { button1_callback(BLINKER_CMD_OFF); Serial.println("按钮对灯已执行关闭"); } else { button1_callback(BLINKER_CMD_ON); Serial.println("按钮对灯已执行打开"); } is_btn = digitalRead(LED_BUILTIN_K2); //更新按钮状态 } 三、ESP32-CAM使用 安信可的ESP32-CAM对应的ESPHome默认配置如下所示4 Configuration for Ai-Thinker Camera # Example configuration entry esp32_camera: external_clock: pin: GPIO0 frequency: 20MHz i2c_pins: sda: GPIO26 scl: GPIO27 data_pins: [GPIO5, GPIO18, GPIO19, GPIO21, GPIO36, GPIO39, GPIO34, GPIO35] vsync_pin: GPIO25 href_pin: GPIO23 pixel_clock_pin: GPIO22 power_down_pin: GPIO32 # Image settings name: My Camera # ... 我烧录的配置文件为： esphome: name: esp32-cam esp32: board: esp32dev framework: type: arduino # Enable logging logger: # Enable Home Assistant API api: reboot_timeout: 0s ota: password: "1" wifi: ssid: "blue_sky" password: "720805zzy" # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Esp32-Cam Fallback Hotspot" password: "12345678" captive_portal: # Example configuration entry esp32_camera: external_clock: pin: GPIO0 frequency: 20MHz i2c_pins: sda: GPIO26 scl: GPIO27 data_pins: [GPIO5, GPIO18, GPIO19, GPIO21, GPIO36, GPIO39, GPIO34, GPIO35] vsync_pin: GPIO25 href_pin: GPIO23 pixel_clock_pin: GPIO22 power_down_pin: GPIO32 # Image settings name: My Camera # ... # Flashlight output: - platform: gpio pin: GPIO4 id: gpio_4 light: - platform: binary output: gpio_4 name: torch_light # Binary Sensor binary_sensor: - platform: gpio pin: GPIO13 name: "次卧" device_class: motion 在Home Assistant上直接添加ESPHome设备即可。 通过ESPHome添加的摄像头有如下问题： 无声音，HA上可查看串流 桥接至HomeKit无法查看串流，只可查看10s更新一次的缩略图 运动传感器可用，但貌似只有在光线变化剧烈时才会动作 参考资料 Servo Component. ESPHome. https://esphome.io/components/servo ↩ 树莓派智能家居homeassistant之用esphome制作零火智能开关篇. https://blog.csdn.net/zuobianfy/article/details/118432775 ↩ ↩ ESP-01+继电器，自己动手制作智能开关，添加物理开关控制. https://www.bilibili.com/video/av501928405/ ↩ ESP32-CAM. ESPHome. https://esphome.io/components/esp32_camera.html ↩
这是智能家居折腾记录的第二期，本篇介绍米家产品通过本地或云端连接至Home Assistant，并通过Home Bridge桥接至HomeKit，可以通过HomeKit管理和创建自动化。 同时介绍将苹果 HomePod Mini 与Home Assistant 联动，实现媒体 AirPlay 和tts (text to speech) 的功能。 本篇完成于第五期之后，图片和资源可能会用到4、5期的内容。请跳转翻看 米家直连Wi-Fi产品接入HA 我使用的为 Xiaomi Miot Auto 集成用于连接米家产品，安装于HACS，可以在HACS集成中搜索 Xiaomi Miot Auto 安装。1 在 配置-->设备与服务-->集成-->添加集成 添加此集成，配置中输入米家账号密码，连接模式选择 Auto 会自动侦测并使用本地或云端方式接入Home Assistant。添加新设备后，可以在此页面勾选 更新设备列表 刷新。 使用无线网络接入米家的设备，如插座 chuangmi.plug.v3、小米台灯1s yeelink.light.lamp4 可以自动通过此集成接入Home Assistant。 可以将设备添加到Home Assistant 面板 蓝牙Mesh产品板载BLE直连至HA 对于小米温湿度传感器等使用蓝牙Mesh工作的设备，无法直连小米服务器，只能通过手机或支持蓝牙Mesh的网关（多模网关、小爱音箱Pro等）连接WLAN网络，在没有上述设备的中转服务下，通过Home Assistant服务器的板载BLE也可以将蓝牙Mesh设备连接至Home Assistant。 此方法已经过时，不详细介绍，请参考以下页面： HA官方文档-mitemp-bt：https://www.home-assistant.io/integrations/mitemp_bt/ 智能家居homeassistant添加小米蓝牙温湿度计2代的教程：https://zhuanlan.zhihu.com/p/510881613 写文时我已经找不到我当时使用BLE添加米家设备的文章来源了。实测我使用的旧笔记本改造的服务器，它的板载BLE信号覆盖基本能满足全房需求，但是数据取回时间不太稳定，有时间隔1秒取回，有时隔了半天也不更新数据，总之没有蓝牙网关用着可靠，故此方法不推荐长期使用。 蓝牙、Zigbee产品通过多模网关接入HA 我使用小米的多模网关来连接米家生态的蓝牙Mesh产品，如单火墙壁开关、温湿度传感器；Zigbee产品，如无线按钮，这样物联网终端能直连米家云端，并通过集成接入Home Assistant。 使用小米Gateway集成的连接方式需要破解小米网关，且对新版本支持较差，现在已不推荐使用。 使用 Xiaomi Miot Auto 集成能够自动发现通过网关连接的设备： 空调伴侣 接入HA 【2022/7/12 更新】 小米空调伴侣2，能够红外遥控空调，具有功率检测的功能。由于米家放弃ZigBee，1代兼有ZigBee网关功能的空调伴侣停产。 空调伴侣在米家APP配置完成后，也可以使用 Xiaomi Miot Auto 集成连接至HA，但是截止到2022.7.12 ，此集成对空调的支持仍有些小问题。 显示室温 空调伴侣没有温度传感器，因此接入HA后不会显示 current_temperature ，将空调实体（climate）接入HomeKit后会显示室温为 21 摄氏度。 参考GitHub问题： 无法获取空调伴侣设定的当前空调的工作温度 · Issue #686 · al-one/hass-xiaomi-miot · GitHub 可以再添加 Xiaomi Miot Auto 集成，选择自定义集成，选择好要设置的空调实体，在bind_sensor绑定温度实体，重启后HA和HomeKit中均会显示室温与设定温度。 控制风速 在米家APP中配置好空调后，米家APP中可以正常调整设备风速（高中低档），而HA和HomeKit中调整风速后均无反应。 参考GitHub问题：小米空調fan_mode問題 · Issue #682 · al-one/hass-xiaomi-miot · GitHub 在配置文件中配置translations以修复风速问题： # configuration.yaml xiaomi_miot: translations: fan_control.fan_level: low: low medium: medium middle: middle high: high auto: auto 或者等待集成后续版本的更新推送。 HomeKit桥接 配置Home Bridge可以将接入Home Assistant的设备桥接至Home Kit，这样能使用HA、Home Kit两套系统控制智能家居，也能配合HomePod使用Siri管理包括米家设备在内的智能家居。 在集成中搜索HomeKit，出现两个集成，上面的是HomeKit桥接，将HA中设备虚拟成HomeKit桥接，供HomeKit终端连接控制；下面的是将HomeKit设备连接至HA。2 对于只支持HomeKit的智能家居设备，若想通过HA系统控制，可以使用HomeKit控制器先连接至HA，再桥接回HomeKit。 桥接设置 在HomeKit配置中，可以选择集成模式和包含或排除的实体类型。bridge模式用于将HA中的实体桥接至HomeKit，配件模式用于将摄像头、门锁、遥控器、电视等等配件连接至HomeKit。 包含的实体中选择要桥接的实体，需要注意的是，在“包含的域”中选择了某种类型，在“包含的实体”中未选择相应类型的实体，默认会把该类型下的所有实体纳入桥接。 配件 根据HA官方文档2，media_player, remote, lock, and camera domains 需要通过配件模式连接至HomeKit。 When exposing a Camera, Activity based remote (a remote that supports activities), Lock, or Television media player (a media_player with device class tv) to HomeKit, mode must be set to accessory, and the relevant include filter should be setup to only include a single entity. 将配件模式下包含相应的实体，会自动创建该设备的HomeKit Accessory和包含此配件的Bridge，若已有Bridge，可以删除自动创建的Bridge，再在Bridge中手动添加此配件。 配置完成后再通知栏回出现配对的二维码，使用家庭App扫描添加即可。 HomePod 自iOS 16起，iPad不再支持设置为HomeKit的家庭中枢，为此我购入了HomePod Mini，作为家庭中枢，能够执行自动化操作和远程访问控制。 HomePod可以作为媒体播放器自动检测并接入HA，显示为Apple TV，能够使用Airplay播放音频，且在2022年6月更新后能够原生支持HomePod上的tts播放。 媒体 媒体播放器可以播放HA中的音视频文件，媒体文件默认在 /media ，位置与configuration配置文件路径一致。我使用的HA是Home Assistant Supervised，docker容器中的 /media 默认映射到主机的 /usr/share/hassio/media 路径，因此可以向宿主机的此路径下存放媒体文件以供播放。 但由于我的HA服务器的根目录单独分区，与home目录不再同一分区，且根目录仅存放软件之用，空间不大，因此打算将此目录换成home目录分区下的路径。遗憾的是向 /usr/share/hassio/media 路径下添加指向home目录中的软链接并不会被HA读取。 根据下面提供的方法： https://community.home-assistant.io/t/media-folder-location/231755/17 I was also having the same issue with the supervised container installation. I found a solution with a simpler approach. The supervised container for homeassistant mounts /usr/share/hassio/media to /media within the container. See the output of docker inspect -f '{{ .Mounts }}' homeassistant command. So, in /etc/fstab, I added my “bind” mount point over /usr/share/hassio/media. My example line if /etc/fstab is here: /home/media /usr/share/hassio/media none defaults,bind 0 0 When the docker container is started, it now sees the contents of /home/media where /usr/share/hassio/media is located, and that is what is /media within the homeassistant container. 可以将宿主机中的 /usr/share/hassio/media 目录与用户家目录挂载点相绑定，编辑 fstab: sudo vim /etc/fstab # HA media bind /home/gakki /usr/share/hassio/media none defaults,bind 0 0 重启服务器后，HA容器自动开启并挂载此路径，这样打开媒体路径就访问的是用户的家目录了： TTS Text-to-Speech (TTS) 可以将文本转换成声音在媒体播放器中播放出来，HA也可以使用自动化实现自动播报。3 HA默认有谷歌翻译的tts，但可能由于我的服务器在国内，谷歌的tts基本上无法使用。因此可以考虑使用微软的tts服务。 在HACS中搜索集成 Microsoft Edge TTS 安装，在 configuration.yaml 中添加默认配置： # configuration.yaml tts: - platform: edge_tts language: zh-CN # Default language or voice (Optional) edge tts支持多种嗓音，可以在HACS集成介绍页面点击 list of voices 查看。 重启HA后即可使用。 作为Windows的音响 可以使用TuneBlade，将HomePod通过AirPlay作为Windows的音频输出。由于HomePod使用Wi-Fi接入2.4G网络，在实时模式下会经常出现干扰丢包问题，使用AirPlay做播放器的延迟还是一个大问题。 参考资料 al-one/hass-xiaomi-miot. GitHub. https://github.com/al-one/hass-xiaomi-miot ↩ HomeKit. Home Assistant. https://www.home-assistant.io/integrations/homekit ↩ ↩ tts. Home Assistant. https://www.home-assistant.io/integrations/tts/ ↩
小蚁摄像头 偶然找到一个闲置的小蚁云台摄像机，型号为Yi 1080p Dome，版本为15CN，虽然年代久远但是还可以正常使用，于是萌生了将其接入Home Assistant的想法。 小蚁摄像头需要接入“小蚁摄像头”APP，此摄像头的国行和美版各有限制，国行（CN）的机器只能使用中文商店的小蚁摄像头APP，US的机器需要使用 Yi Home APP。在APP中有实时串流、操控移动、全景照相、移动检测报警等功能，当然，还有云存储之类的功能，当然那是收费的（笑） 接入智能家居的办法是给摄像头刷入破解固件，使之除了能连接Yi Cloud还能支持本地rtsp串流、支持ONVIF 、MQTT 和 ssh 等功能。摄像头视频流通过rtsp流接入Home Assistant和HomeKit，运动检测等通过MQTT接入 刷入固件 破解固件使用的是 Yi-Hack-V5，Github仓库为：alienatedsec/yi-hack-v5，由于摄像头年代久远，即便是V5固件仅有两年前的更新且仅有BETA版。 比较成熟的是yi-hack-v3和v4固件，都比较古老，但是v3不支持rtsp流（即便加上插件也不能正常使用），v4的rtsp流服务需要收费。。因此选择了提供免费rtsp流服务的v5这一测试版固件。 此固件仍为测试版固件，功能并未全部得到验证，此项目已经停更多日，且仍有较多未解决issue，请谨慎使用。 固件版本选择 按照github页面提供的表格，不同的机型下载Release中对应的不同的分区文件。 Camera rootfs partition home partition Remarks Yi Home 17CN / 27US / 47US rootfs_y18 home_y18 Firmware files required for the Yi Home 17CN / 27US / 47US camera. Yi 1080p Home rootfs_y20 home_y20 Firmware files required for the Yi 1080p Home camera. Yi Dome rootfs_v201 home_v201 Firmware files required for the Yi Dome camera. Yi 1080p Dome rootfs_h20 home_h20 Firmware files required for the Yi 1080p Dome camera. Yi 1080p Cloud Dome rootfs_y19 home_y19 Firmware files required for the Yi 1080p Cloud Dome camera. Yi Outdoor rootfs_h30 home_h30 Firmware files required for the Yi Outdoor camera. Github页面列出了可使用机型。 刷入流程 按照Github页面提供的步骤操作。 准备一张16GB左右大小的micro SD卡，格式化成FAT32格式。 将Release中下载的文件解压后，直接拷贝至SD卡根目录。 拔掉摄像头电源，插上SD卡，重新开机。 待黄灯闪烁30秒后，固件刷入完成，之后黄灯常亮大约2分钟。 之后蓝灯亮起，遵循常规步骤设置Wi-Fi和连接至APP 去路由器管理页面找到摄像头IP地址，打开摄像头的Web管理页面： http://[IP]:8080 功能设置 在Web管理页面可以设置摄像头的时区、ssh功能、运动检测录像功能、FTP自动上传等等功能的开启。 对于1080p dome机型，高负载下最好开启在SD卡创建SWAP文件。 开启FTP上传 默认开启当监测到运动时，自动录制1min的视频，由于存储卡只有32GB，可以将录制的视频及时转存到异地硬盘中。 设置通过FTP方式自动上传视频到服务器，并上传后删除SD卡内的文件。 如果本地文件未能及时删除，也可以在Web管理页面，通过可视化的 cron 手动设置定时删除文件。 RTSP流接入HA 在Web管理页面设置开启RTSP串流，设置画质 记录RTSP高画质的URL为 rtsp://[IP]/ch0_0.h264 在Home Assistant的设置文件 cofiguration.yaml 中添加通用摄像头： camera: - platform: generic name: YiCam stream_source: rtsp://[IP]/ch0_0.h264 验证配置文件后重启Home Assistant，可以看见摄像头实体。 MQTT 功能的接入 此固件支持使用MQTT方式将运动传感器、人类传感器、声音传感器和运动检测捕获的图片上传至MQTT broker。 HA端设置broker 确保Home Assistant装有Supervisor，我的是Home Assistant Supervised，使用docker安装。https://zhuanlan.zhihu.com/p/482610042 在Supervisor设置页面打开加载项商店，下载安装 Mosquitto broker 启动之后进入配置页面，可以添加新用户（如果不添加也可使用homeassistant默认账户），在login中添加： - username: cam password: camvhyimy@7805 开放端口无冲突保持默认即可。 摄像头端设置 在摄像头Web管理界面设置开启MQTT，填写MQTT broker server即Home Assistant服务器的IP、端口、账户密码。 点击此处进入新页面： 在此页面打开HA发现，这样可以减去在Home Assistant上的配置文件设置，在HA中可以自动发现并添加实体。 设置完成后返回Home Assistant，添加集成 MQTT ，服务器填写本地 127.0.0.1 ，用户密码保持一致，添加MQTT集成。 重启HA后，会自动发现并添加实体： 三个二进制传感器为运动传感器、人类检测传感器和声音传感器，而且还有运动侦测时捕获的图片。 目前人类传感器和声音传感器无法正常工作，猜测是要在云端app中开启相应功能报警（可能吧，也可能是固件bug，不过目前我用不到就是） 配合运动传感器和捕获图片可以创建自动化，配合其他智能家居的联动。 桥接至Home Kit 将摄像头RTSP流、二进制传感器桥接至HomeKit，与https://zhuanlan.zhihu.com/p/535998824 配置过程相同： 根据*官方文档*1，摄像头、遥控器、电视、媒体播放器、锁等实体（media_player, remote, lock, camera ）不能直接桥接至HomeKit，需要设置成accessory添加至HomeKit。 在UI界面中，可以通过HomeKit集成添加摄像头配件： 创建新的HomeKit集成，勾选上Camera，点击“提交”。HomeKit集成会自动将未加入HomeKit的摄像头添加成Accessory 之后会自动创建含有此摄像头的桥接（HASS Bridge），如若之前已建立过桥接，且包含此摄像头（camera.XXX实体），则可放心地删除自动新建的Bridge。 二进制传感器也需要通过桥接至HomeKit。 在HomeKit家庭中可见看到摄像头： configuration 备份 # Configure a default setup of Home Assistant (frontend, api, etc) default_config: # Text to speech tts: - platform: google_translate - platform: edge_tts language: zh-CN group: !include groups.yaml automation: !include automations.yaml script: !include scripts.yaml scene: !include scenes.yaml camera: - platform: generic name: HW_cam_rtsp stream_source: rtsp://moonhikari:vhyimy%407805@192.168.50.111:8080/h264_pcm.sdp username: moonhikari password: vhyimy@7805 framerate: 30 - platform: generic name: YiCam stream_source: rtsp://192.168.50.158/ch0_0.h264 android_ip_webcam: - host: 192.168.50.111 port: 8080 name: Hw_cam username: moonhikari password: vhyimy@7805 sensors: - audio_connections - battery_level - battery_temp - battery_voltage - light - motion - pressure - proximity - sound - video_connections switches: - exposure_lock - ffc - focus - gps_active - motion_detect - night_vision - overlay - torch - whitebalance_lock - video_recording motion_sensor: true 参考资料 HomeKit.Accessory Mode - Home Assistant: https://www.home-assistant.io/integrations/homekit/#accessory-mode ↩
本篇文档采用两种摄像头接入HomeAssistant，并接入HomeKit。 一种是使用安信可的ESP32-CAM，通过ESPHome编辑配置文件并刷入固件，然后接入HomeKit，但这种方式没有较好的分辨率，不能串流至HomeKit，且不具备较多的功能。如果是通过Arduino编程，烧录官方示例的Camera WebServer等项目，是可以RTSP串流的，也可以开发其他的功能。 另一种是采用旧手机作为IP摄像头，iOS端可以使用App Store下载的IP摄像头（国人编写的基础版即可），Android端可以使用Google Play 商店的IP摄像头App，不仅能从Web访问进行控制和配置修改，还可以将控制按钮传入Home Assistant和HomeKit。 1 ESP32-CAM 接入ESPHome 我使用安信可的ESP32-CAM的开发板作为IP摄像头，通过ESPHome编程烧录固件，最终接入HA与HomeKit。 买安信可的ESP32尽量到安信可的官方旗舰店购买，避免买到冒牌货。 ESP32-CAM可以采用Arduino编程，也可以采用较简单的ESPHome，通过编写配置文件烧录固件。不过通过ESPHome接入HA能实现功能较为简单，不如自己编程有可玩性。 这里只展示通过ESPHome接入HA的方案。 ESPHome配置 安信可ESP32-CAM摄像头的配置，包括在GPIO_4的LED灯和在GPIO_13的运动传感器。 安信可的摄像头配置参照ESPHome文档的配置1，如不同的摄像头类型请对照官网自行修改。 esphome: name: esp32-cam esp32: board: esp32dev framework: type: arduino # Enable logging logger: # Enable Home Assistant API api: reboot_timeout: 0s ota: password: "1" wifi: ssid: "ssid" password: "password" # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Esp32-Cam Fallback Hotspot" password: "12345678" captive_portal: # Example configuration entry esp32_camera: external_clock: pin: GPIO0 frequency: 20MHz i2c_pins: sda: GPIO26 scl: GPIO27 data_pins: [GPIO5, GPIO18, GPIO19, GPIO21, GPIO36, GPIO39, GPIO34, GPIO35] vsync_pin: GPIO25 href_pin: GPIO23 pixel_clock_pin: GPIO22 power_down_pin: GPIO32 # Image settings name: My Camera # ... # Flashlight output: - platform: gpio pin: GPIO4 id: gpio_4 light: - platform: binary output: gpio_4 name: esp32cam-light # Binary Sensor binary_sensor: - platform: gpio pin: GPIO13 name: "westcam2_pir" device_class: motion HA端 在Home Assistant上直接添加ESPHome设备即可。 通过ESPHome添加的摄像头有如下问题： 无声音，HA上可查看串流 桥接至HomeKit无法查看串流，只可查看10s更新一次的缩略图 运动传感器可用，但貌似只有在光线变化剧烈时才会动作 2 手机做IP摄像头添加至HASS 如果无法忍受ESP32-CAM较低的帧率和分辨率，手头又没有较好的摄像头或者监控设备的话，使用旧手机作为IP摄像头是一个不错的尝试。 目前我拿了一台 HUAWEI Mate 10 Pro 作为IP摄像头，裸机散热基本可用，功能全开待机功耗在3.5W左右。注意在电池未满的情况，尽量选择5V2A以上的充电器和传输线，否则可能会导致充电监控，电量不升反降。 2-1 传输方式 采取rtsp协议，或onvif。 手机端使用IP摄像头APP，作为rtsp的推流端。 配置HASS，添加摄像头实体，并桥接给HomeKit。 2-2 手机端配置 IP摄像头-iOS端 配置rtsp推流端即可。 我使用过一款国产的IP摄像头，可以显示时间和电量覆盖，提供RTSP流服务器，免费版功能不是很多，但基本够用。 安卓端-Google Play商店应用：Android IP Webcam IP Webcam的免费版提供足够多的功能，包括显示时间与电量的覆盖（overlay）、运动和声音检测、检测到移动自动录像30s、远程管理对焦和切换摄像头等诸多功能。 Home Assistant有IP Camera对应的集成，可以通过修改配置文件configuration.yaml添加摄像头实体，而且可以将诸多控制开关和传感器接入Home Assistant。 1）基本配置 配置主、副摄像头 配置开启时间、电量和充电状态的Overlay 配置传感器动作的阈值 2）推流与录像配置 推流服务器要设置开机自启、防止休眠。 RTSP推流可以选择$\mu$律编码还是PCM编码 设置检测到运动后，开始录像，要选择录像的保存位置，必要时，还要设置定时清理和实时异地备份： 我是使用Syncthing同步至Home Assistant所在的服务器，在设置过期删除。 3）Web端配置 默认在摄像机 http://IP:8080或https://IP:8080即可打开Web端配置页面。 在网页端可以配置大部分功能，包括启用运动检测、切换摄像头、自动对焦、是否显示时间电量、对焦模式、场景模式、夜视增益等等。 还能设置运动传感器监测范围，和查看传感器图像。 此外，网页端也可以访问录制的视频。 2-3 HA端配置 可以参考camera类别下的多种集成可以选择： Generic Camera2：只需添加串流源，可以每10s自动generate缩略图。 FFmpeg Camera3: 可以控制画质 Camera Proxy4：摄像头代理 Android IP Webcam5：可以直接配置源于Android APP：IP Webcam的摄像头 通过ONVIF协议的摄像头6：暂时未用 不支持使用UI添加实体，可以去配置configuration.yaml，按照不同实体，在配置文件中添加以下内容： 2.3.1 使用 FFmpeg Camera 和代理的配置 使用了`FFmpeg Camera集成和Camera Proxy集成。 使用FFmpeg可以重新编码视频流的分辨率，使用Camera Proxy可以创造出一个新的摄像机，专门用于10s生成一张缩略图片。具体的配置参照各自的文档34。 camera: - platform: ffmpeg input: -rtsp_tramsport tcp -i rtsp://admin:password@192.168.50.99:8554/live name: iphone14_cam extra_arguments: -pred 1 -q:v 2 -s 1280x720 - platform: proxy entity_id: camera.iphone14_cam max_stream_width: 1280 max_image_width: 720 image_refresh_rate: 10.0 事实上IP摄像头原编码够用的情况下，可以使用FFmpeg二压，这样更占用系统资源。 2.3.2 只使用 Generic Camera2 的配置： Generic Camera实体可以直接捕获RTSP流。安全认证方面，可以直接在流地址前写上user@pswd（注意含特殊字符需要URL转义），特殊认证方式可以参照官方文档修改。 不加stream_image参数，默认每10s自动生成一张缩略图。 camera: - platform: generic name: iphone14_cam_1 stream_source: rtsp://admin:password@192.168.50.99:8554/live username: admin password: 1105 framerate: 30 2.3.3 使用 Android IP Webcam 的配置 源自官方示例5： # Example configuration.yaml entry android_ip_webcam: - host: 192.168.50.111 port: 8080 name: Hw_cam username: username password: password sensors: - audio_connections - battery_level - battery_temp - battery_voltage - light - motion - pressure - proximity - sound - video_connections switches: - exposure_lock - ffc - focus - gps_active - motion_detect - night_vision - overlay - torch - whitebalance_lock - video_recording motion_sensor: true 添加了官方文档中全部的传感器与控制开关，基本上包括了Web端控制IP摄像头的大部分功能。 另外添加了一个二进制传感器：运动传感器。在Web管理页面可以设置阈值，待数值的运动传感器捕获的数值大于阈值时触发二进制运动传感器。此二进制传感器可以接入HomeKit，并参与自动化配置。 HW手机摄像头接入HA后能展现如下多的实体： 在iOS的手机摄像头中，HA端我先后尝试使用了FFmpeg Camera配置和Generic Camera配置，只接入RTSP流，可以实时串流至HomeKit。 在Android IP Webcam摄像头中，在HA端我同时使用了原生Android IP Webcam集成和Generic Camera集成。这样我可以传入RTSP流，同时可以传入摄像头的控制按钮与传感器。 3 摄像头接入HomeKit 根据官方文档7，摄像头、遥控器、电视、媒体播放器、锁等实体（media_player, remote, lock, camera ）不能直接桥接至HomeKit，需要设置成accessory添加至HomeKit。 在UI界面中，可以通过HomeKit集成添加摄像头配件： 创建新的HomeKit集成，勾选上Camera，点击“提交”。HomeKit集成会自动将未加入HomeKit的摄像头添加成Accessory 之后会自动创建含有此摄像头的桥接（HASS Bridge），如若之前已建立过桥接，且包含此摄像头（camera.XXX实体），则可放心地删除自动新建的Bridge。 推荐为不同的实体类型创建不同的Bridge。 串流设置 需要注意的是，直接通过ESPHome方式添加至Home Assistant的摄像头，无法提供类似RTSP的串流，因此仅能在Home Assistant中查看视频流，而无法在HomeKit中看到实时串流，只能看到10s更新一次的图片。 想要在HomeKit中查得到实时串流的画面和声音，需要摄像头端支持RTSP，ONVIF等串流模式，且能提供不止一条视频流。 我将手机IP摄像头接入HomeKit的方案，是利用Android IP Webcam实体，将控制switch和传感器sensor以及二进制传感器binary_sensor接入HomeKit。 再使用generic_camera实体将RTSP流桥接至HomeKit。总体的configuration.yaml如文末所示。 成功接入HomeKit后，在家庭中可以看见摄像头，并可实时串流： HomeKit配件还可以通过编辑配置文件手动配置，可以给摄像头添加对应的linked_doorbell_sensor、linked_motion_sensor8 4 HA 配置文件备份 时间 2022.2.20 # Configure a default setup of Home Assistant (frontend, api, etc) default_config: # Text to speech tts: - platform: google_translate group: !include groups.yaml automation: !include automations.yaml script: !include scripts.yaml scene: !include scenes.yaml camera:0 - platform: generic name: HW_cam_rtsp stream_source: rtsp://username:passwd@192.168.50.111:8080/h264_pcm.sdp username: username password: password framerate: 30 android_ip_webcam: - host: 192.168.50.111 port: 8080 name: Hw_cam username: username password: password sensors: - audio_connections - battery_level - battery_temp - battery_voltage - light - motion - pressure - proximity - sound - video_connections switches: - exposure_lock - ffc - focus - gps_active - motion_detect - night_vision - overlay - torch - whitebalance_lock - video_recording motion_sensor: true 参考资料 ESP32CAM-ESPHome: https://esphome.io/components/esp32_camera.html#configuration-for-ai-thinker-camera ↩ Generic Camera - Home Assistant: https://www.home-assistant.io/integrations/generic/ ↩ ↩ FFmpeg Camera- Home Assistant: https://www.home-assistant.io/integrations/camera.ffmpeg/ ↩ ↩ Camera Proxy- Home Assistant: https://www.home-assistant.io/integrations/proxy/ ↩ ↩ Android IP Webcam- Home Assistant: https://www.home-assistant.io/integrations/android_ip_webcam/ ↩ ↩ ONVIF- Home Assistant: https://www.home-assistant.io/integrations/onvif/ ↩ HomeKit.Accessory Mode - Home Assistant: https://www.home-assistant.io/integrations/homekit/#accessory-mode ↩ HomeKit.Configuration Variables - Home Assistant:https://www.home-assistant.io/integrations/homekit/#linked_doorbell_sensor ↩
我要是发到博客或者专栏就当个学习笔记吧，如果有时间再整理成教程的格式。 Mac(类Unix)上 ESPHome安装 ESPHome --user 安装位置：/Users/gakki/Library/Python/3.9/bin 使用时需要添加环境变量： export PATH="$PATH:/Users/gakki/Library/Python/3.9/bin" 硬件输出PWM控制舵机 案例：接入ESPHome用ESP8266控制舵机喂狗：https://bbs.hassbian.com/thread-8741-1-1.html esphome: name: servos platform: ESP8266 board: nodemcuv2 wifi: ssid: "blue_sky" password: "720805zzy" # Enable fallback hotspot (captive portal) in case wifi connection fails #ap: #ssid: "Servos Fallback Hotspot" #password: "VYTOwxqxxlOT" #captive_portal: # Enable logging logger: # Enable Home Assistant API api: password: "123" services: - service: control_servo variables: level: float then: - servo.write: id: my_servo level: !lambda 'return level / 100.0;' ota: password: "123" binary_sensor: - platform: gpio pin: D4 name: "手动喂狗" on_state: then: - servo.write: id: my_servo level: 100.0% - delay: 2s - servo.write: id: my_servo level: 0% servo: - id: my_servo output: pwm_output # Example output platform # On ESP32, use ledc output output: - platform: esp8266_pwm id: pwm_output pin: D5 frequency: 50 Hz 软件模拟PWM 案例：ESP8266/ESP01 软件输出PWM二极管调光（Arduino）：https://www.cnblogs.com/cuianbing/p/14409053.html LED 测试项目： esphome: name: node_mcu platform: ESP8266 board: nodemcuv2 wifi: ssid: "blue_sky" password: "720805zzy" # Enable fallback hotspot (captive portal) in case wifi connection fails # Enable logging logger: # Enable Home Assistant API api: password: "123" ota: password: "123" output: - platform: esp8266_pwm pin: GPIO2 frequency: 200Hz id: led_onboard inverted: True light: - platform: monochromatic name: "LED On Board" output: led_onboard ESPHOME 舵机 # Example configuration entry servo: - id: my_servo output: pwm_output # Example output platform # On ESP32, use ledc output output: - platform: esp8266_pwm id: pwm_output pin: D1 frequency: 50 Hz 用舵机控制墙壁开关 最终烧录的yaml： esphome: name: node_mcu platform: ESP8266 board: nodemcuv2 wifi: ssid: "blue_sky" password: "720805zzy" power_save_mode: light # Enable fallback hotspot (captive portal) in case wifi connection fails #ap: #ssid: "Servos Fallback Hotspot" #password: "VYTOwxqxxlOT" #captive_portal: # Enable logging logger: # Enable Home Assistant API api: services: - service: control_servo variables: level: float then: - servo.write: id: my_servo level: !lambda 'return level / 100.0;' ota: password: "123" servo: - id: my_servo output: pwm_output # Example output platform # On ESP32, use ledc output output: - platform: esp8266_pwm id: pwm_output pin: D4 frequency: 50 Hz light: - platform: monochromatic name: "LED On Board" output: pwm_output 继电器加普通开关 通过ESP01S控制继电器，并通过普通开关的输入控制通断。 要写判断语句，分为有标识模式和无标识双控模式。 B站的实例1 将普通开关接到GPIO2与Vcc之间。 定义了几个系统变量： 继电器状态标识YYXBC_HIGH和YYXBC_LOW （以后用LED_ON和LED_OFF代替） 外部IO位置，物理开关与继电器 物理开关工作模式 /*1，继电器高电平触发时，YYXBC_HIGH = 1，YYXBC_LOW = 0 继电器低电平触发时，YYXBC_HIGH = 0，YYXBC_LOW = 1 */ const int YYXBC_HIGH = 0 ; //继电器是低电平触发 const int YYXBC_LOW = 1 ; //2，用esp-01时，物理开关接在vcc 和gpio2上，继电器接在gpio0上 //NodeMCU 继电器接D3 GPIO0,物理开关接D4 GPIO2 #define LED_BUILTIN_LIGHT 0 #define LED_BUILTIN_K2 2 /*3，物理开关点动模式1，自锁模式0*/ const int YYXBC_BUTTON_TYPE = 1; 心跳回调： 没用，只是用于更新点灯科技上的按钮状态。 void heartbeat() { BLINKER_LOG("heartbeat,state: ", digitalRead(LED_BUILTIN)); //较正app的按钮状态 if(YYXBC_HIGH == digitalRead(LED_BUILTIN_LIGHT) ){ Button1.print("on"); }else{ Button1.print("off"); } } 开关响应： //点动模式按钮，监听按钮状态，执行相应处理 void btnHandler1() { static bool oButtonState = false; int state1 = digitalRead(LED_BUILTIN_K2); //按钮状态 int state2 = digitalRead(LED_BUILTIN_LIGHT); //灯的状态 if(state1 == HIGH ) { if(oButtonState ){ if(state2 == YYXBC_HIGH ) { button1_callback(BLINKER_CMD_OFF); Serial.println("按钮对灯已执行关闭"); }else{ button1_callback(BLINKER_CMD_ON); Serial.println("按钮对灯已执行打开"); } oButtonState = false; } }else{ oButtonState = true; } } //自锁模式按钮，监听按钮状态，执行相应处理 void btnHandler2() { static bool is_btn = false;//按钮的标志位，用来逻辑处理对比，判断按钮有没有改变状态 bool is = digitalRead(LED_BUILTIN_K2); //按钮状态 if ( is != is_btn) { bool is_led = digitalRead(LED_BUILTIN_LIGHT); digitalWrite(LED_BUILTIN_LIGHT, !is_led); if (is_led == YYXBC_HIGH) { button1_callback(BLINKER_CMD_OFF); Serial.println("按钮对灯已执行关闭"); } else { button1_callback(BLINKER_CMD_ON); Serial.println("按钮对灯已执行打开"); } is_btn = digitalRead(LED_BUILTIN_K2); //更新按钮状态 } CSDN实例2 通过ESPHome接入HA，实现与之前相近的功能，即使用Wi-Fi和实体开关控制继电器。 大体的原理是：一个gpio虚拟成二进制传感器，一个gpio来控制继电器。当这个二进制传感器触发的时候，开关的开与闭合也发生变化。 YAML文件： esphome: name: node_mcu platform: ESP8266 board: nodemcuv2 wifi: networks: ssid: "blue_sky" #改成你的wifi名称 password: "720805zzy" #改成你的wifi密码 #manual_ip: #static_ip: 192.168.50.188 #gateway: 192.168.50.1 #subnet: 255.255.255.0 # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "WS05 Fallback Hotspot" #当esp01s连不上网的时候，它会自动发出热点。 password: "12345678" captive_portal: # Enable logging logger: # Enable Home Assistant API api: # password: "1" ota: password: "123" web_server: port: 80 switch: - platform: gpio pin: GPIO0 name: "wireless05_switch" id: relay2 binary_sensor: - platform: gpio pin: GPIO2 name: "press_switch05" device_class: opening filters: - delayed_on_off: 100ms #这里一定要加这个这个起到滤波的作用。 on_press: #当这个二进制传感器触发的时候，触发gpio0 then: - switch.toggle: relay2 我烧录的YAML esphome: name: node_mcu platform: ESP8266 board: nodemcuv2 wifi: networks: ssid: "blue_sky" #改成你的wifi名称 password: "720805zzy" #改成你的wifi密码 power_save_mode: light #manual_ip: #static_ip: 192.168.50.188 #gateway: 192.168.50.1 #subnet: 255.255.255.0 # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Library_Light_Hotspot" #当esp01s连不上网的时候，它会自动发出热点。 password: "12345678" captive_portal: # Enable logging logger: # Enable Home Assistant API api: # password: "1" ota: password: "123" web_server: port: 80 switch: - platform: gpio pin: GPIO0 name: "书房灯" id: relay2 inverted: True binary_sensor: - platform: gpio pin: GPIO2 name: "press_switch_lib" device_class: opening filters: - delayed_on_off: 100ms #这里一定要加这个这个起到滤波的作用。 on_state: #当这个二进制传感器状态改变的时候，触发gpio0 then: - switch.toggle: relay2 附录 ESPHome Wi-Fi 使用省电模式： wifi: # ... power_save_mode: none 参考资料 ESP-01+继电器，自己动手制作智能开关，添加物理开关控制.https://www.bilibili.com/video/av501928405/ ↩ 树莓派智能家居homeassistant之用esphome制作零火智能开关篇. https://blog.csdn.net/zuobianfy/article/details/118432775 ↩
【智能家居1】Home Assistant Supervised Docker 搭建
这是【智能家居】系列折腾实录的第一篇，整个系列大概会分成4～5期，不会太深入，只是记录下我做智能家居折腾的过程，留个档方便日后查看。如果时间不充裕就不出视频了，感兴趣的观众可以先去看看现有的教程，或是较为详细的官方文档。 2023.1.31 更新： ！！！文章实效性警告！！！ 由于Home Assistant Supervised 安装脚本自1.4.0版本（Dec 11, 2022）起，阻止非原生Debian 11系统（Debian Linux Debian 11 aka Bullseye (no derivatives)）安装HA Supervised，因此本文章对于1.4.0或更新的版本不可用。 用户仍可在非HA支持的发行版上安装较早的（1.3.1及以前）HA Supervised，并升级至最新版本，仍可使用基本的备份、插件功能。 HA Supervised 安装脚本 Release：https://github.com/home-assistant/supervised-installer/releases HA Supervised 安装系统要求：https://github.com/home-assistant/architecture/blob/master/adr/0014-home-assistant-supervised.md 环境介绍 系统环境为桌面端Linux：Deepin 20.4 x86_64，基于 Debian。 neofetch OS: Deepin 20.4 x86_64 Host: 2320JVC ThinkPad X230 Kernel: 5.10.83-amd64-desktop Uptime: 59 mins Packages: 1990 (dpkg) Shell: zsh 5.7.1 Terminal: /dev/pts/0 CPU: Intel i5-3230M (4) @ 3.200GHz GPU: Intel 3rd Gen Core processor Graphics Controller Memory: 1625MiB / 3615MiB 由于是x86的的Linux，所以本文档采用了HomeAssistant Supervised，不同的安装方法所支持的功能不同，具体可见官方文档1： 采用 Docker 安装 Home Assistant 与 Supervisor，为的是能备份和装插件，而且通过Docker安装方便管理。 Docker镜像安装 去GitHub 下载supervisor和其依赖os-agent的.deb安装包。 HomeAssistant-supervisied： https://github.com/home-assistant/supervised-installer/releases/ OS-Agent：（linux_x86_64版本） https://github.com/home-assistant/os-agent/releases/ ⚠️注意！！ 安装前请仔细阅读HA Supervised的系统要求： https://github.com/home-assistant/architecture/blob/master/adr/0014-home-assistant-supervised.md 受支持的HA Supervised系统有诸多要求，如： 必须安装在原生Debian Linux Debian 11 aka Bullseye (no derivatives) 上 除hass外无其他软件包等 在非受支持的系统中安装Home Assistant Supervised，会有启动警告，但仍可使用插件安装、系统备份等原有功能。 supervised-installer 自1.4.0 版本起阻止了不受支持系统的安装。用户若在非HA支持的发行版（即非原生Debian 11，如Deepin、Ubuntu或Raspberry Pi OS 等）上安装Home Assistant Supervised时，请选择supervised-installer的1.3.1或更早的版本，系统升级不受限制。 ⚠️Alerts！！ 然后使用dpkg安装： sudo dpkg -i os-agent_1.2.2_linux_x86_64.deb sudo dpkg -i homeassistant-supervised.deb 安装后会自动执行脚本拉取docker镜像并启动容器。 HomeAssistant Supervised 安装完成后，可以查看运行的docker容器： sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 251f6781fc2a ghcr.io/home-assistant/qemux86-64-homeassistant:2021.12.10 "/init" 46 minutes ago Up 13 minutes homeassistant 5b4c3c02c584 ghcr.io/home-assistant/amd64-hassio-multicast:2021.04.0 "/init" 47 minutes ago Up 47 minutes hassio_multicast c31e5db3fc23 ghcr.io/home-assistant/amd64-hassio-audio:2021.07.0 "/init" 47 minutes ago Up 47 minutes hassio_audio 714d9b3c18d9 ghcr.io/home-assistant/amd64-hassio-dns:2021.06.0 "/init" 47 minutes ago Up 47 minutes hassio_dns 91d9e8bf52cc ghcr.io/home-assistant/amd64-hassio-cli:2021.09.0 "/init /bin/bash -c …" 47 minutes ago Up 47 minutes hassio_cli 47a11a170c17 ghcr.io/home-assistant/amd64-hassio-observer:2021.10.0 "/init" About an hour ago Up 48 minutes 0.0.0.0:4357->80/tcp, :::4357->80/tcp hassio_observer 8a6a1b496de3 homeassistant/amd64-hassio-supervisor "/init" About an hour ago Up 48 minutes hassio_supervisor 每个组件都运行在不同的容器中，如果通过Supervisor安装插件，也会相应拉取对应镜像并在容器运行。 镜像源为：ghcr.io/home-assistant/qemux86-64-homeassistant:2021.12.10的 HomeAssistant本体镜像会随后拉取并运行。 如果HomeAssistant容器并未开启，请检查是否之前有自建的HomeAssistant容器和镜像，尝试删除后重启docker服务。 自动安装脚本会自动链接supervisor，并创建HomeAssistant容器，自建的容器如若没有配置过链接不会出现Supervisor配置面板。 查看容器配置 进入HomeAssistant容器配置目录，比如我的在$HOME/docker/containers/<容器ID>，默认可能在/var下。 找到 config.v2.json复制备份打开后，格式化JSON，找到其中MountPoints的部分： "MountPoints": { "/config": { "Source": "/usr/share/hassio/homeassistant", "Destination": "/config", "RW": true, "Name": "", "Driver": "", "Type": "bind", "Relabel": "rw", "Propagation": "rprivate", "Spec": { "Type": "bind", "Source": "/usr/share/hassio/homeassistant", "Target": "/config" }, "SkipMountpointCreation": false }, 可见容器里/config被挂载到宿主机的/usr/share/hassio/homeassistant。 为配置方便，可以把config文件夹软连接至家目录： sudo ln -s /usr/share/hassio/homeassistant $HOME/homeassistant_config 这样可以更方便地更改HomeAssistant的配置文件。如果服务器不可达，可以尝试安装Samba服务器插件。不过我本身主机配置过samba，就不通过SMB插件管理配置文件了。 整个HASS系统在/usr/share/hassio，通过Supervisor备份配置时，便会打包/usr/share/hassio。需要系统迁移时，可以将/usr/share/hassio拷贝至目的主机，然后使用HomeAssistant Supervised的安装脚本安装。 安装HACS Home Assistant Community Store 为社区建设的HomeAssistant商店，可以安装第三方集成、主题、表盘以及自动化等。 其GitHub页面为：https://github.com/hacs 宿主机使用命令安装 安装有Home Assistant Supervised的宿主机可以直接在宿主机通过命令安装： sudo su wget -O - https://get.hacs.xyz | bash - 拷贝文件安装 命令脚本安装需要能访问GitHub，若无法通过命令安装，可以尝试通过直接拷贝文件安装。 在GitHub下载HACS Realease文件： https://github.com/hacs/integration/releases/download/1.21.0/hacs.zip 解压后复制到/config文件夹下。 sudo mkdir ~/homeassistant_config/custom_components/ sudo cp -rf ~/share/hacs ~/homeassistant_config/custom_components/ 安装完成之后，在HomeAssistant 配置面板检查完整性，然后重启HomeAssistant服务。 重启后在添加集成可以搜索到HACS。 HA附加配置 利用HACS 安装第三方集成 在HACS的第三方集成中，搜索集成安装即可。若网络不可达，可以去第三方集成的GitHub页面，git clone然后拷贝至config/custom_components中。 我目前安装的第三方集成有： Miot Auto：将米家的设备接入HA，且可以接入蓝牙网关下的设备，能自动判断设备是本地还是远程连接（除了支持Wi-Fi的，都是远程） BLE Monitor：在不使用Miot集成的情况下，直接将蓝牙Mesh设备通过BLE直连至服务器。（但是板载蓝牙的距离和数据取回时间都很糟糕） 安装 add-on 在 配置 > 加载项 中添加新的加载项 官方提示2：add-on支持的系统 Add-ons are only available if you've used the Home Assistant Operating System or Home Assistant Supervised installation method. If you installed Home Assistant using any other method then you cannot use add-ons. Often you can achieve the same manually, refer to the documentation by the vendor of the application you'd like to install. 安装官方插件 官方插件库GitHub：https://github.com/home-assistant/addons 如果未如同上文中将HomeAssistant Docker容器的配置文件链接到家目录，可以安装官方插件库的 Samba Share 插件： 添加官方社区插件仓库： 访问 配置 > 加载项 > 加载项商店，在右上角的拓展菜单中选择仓库(Repo) ，并粘贴社区源的URL： https://github.com/hassio-addons/repository 添加完成后，检查更新，在插件商店选取插件安装即可。 为了不便于修改配置文件，我安装了VSCode网页端的插件。 目前我的HomeAssistant主页Lovelace长这样，后续可能会再美化吧。 配置HTTPS 配置证书：使用路由器插件 Let's Encryped 插件，使用DNSPod API申请的免费证书。 Nginx 反代 采用系统中安装的Nginx，当然也可以使用HA的插件 server { listen 11237; listen 11238 ssl http2; server_name ha.xxxxxx.cn; ssl_certificate /root/cert/cert.pem; ssl_certificate_key /root/cert/key.pem; ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; add_header Strict-Transport-Security "max-age=31536000"; error_page 497 https://$host$request_uri; location / { proxy_pass http://127.0.0.1:8123; proxy_redirect http://$host/ http://$http_host/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; } } HA还需要配置 configuration.yaml ，否则会返回400 Bad Request https://www.home-assistant.io/integrations/http/#reverse-proxies Reverse proxies When using a reverse proxy, you will need to enable the use_x_forwarded_for and trusted_proxies options. Requests from reverse proxies will be blocked if these options are not set. http: use_x_forwarded_for: true trusted_proxies: - 10.0.0.200 # Add the IP address of the proxy server - 172.30.33.0/24 # You may also provide the subnet mask 下一期介绍米家设备接入HA。 停止HA Supervised sudo systemctl stop hassio-supervisor.service sudo systemctl stop hassio-apparmor.service sudo systemctl stop haos-agent.service sudo systemctl disable hassio-supervisor.service sudo systemctl disable hassio-apparmor.service sudo systemctl disable haos-agent.service sudo docker stop homeassistant hassio_multicast hassio_observer hassio_audio hassio_dns hassio_cli hassio_supervisor sudo docker stop addon_core_configurator addon_core_mosquitto addon_a0d7b954_vscode 参考资料 https://www.home-assistant.io/installation/ ↩ https://www.home-assistant.io/addons ↩