之前用Docker容器配置过一次Home Assistant,但是由于Add-ons无法使用,加上当时配置的可能也是有点问题,所以总感觉用起来不舒服,弃用了一段时间。但是最近实在忍受不了小米那个垃圾APP了,于是乎在这个悠闲的周末,又动起了折腾的念头,这次打算直接安装Home Assistant Operating System,而且这次有ChatGPT,着实能帮很多忙。尽管如此,配置HassOS还是花了大半天的时间,趁着热乎,记录一下配置的过程。

方案选择

HassOS有很多种方案可以选,我家里有台NUC装了Debian用作服务器,所以我最终的选择是在KVM上安装。不过我之前并没有用过KVM,所以还得先安装个KVM,这里是可以直接让ChatGPT帮忙的,不过保险起见,我还是以官方的教程为主,以这个谷歌搜到的教程为辅,来进行安装和配置的。

KVM安装及设置

这里不多赘述,只讲一下我遇到的一个问题,就是网桥br0的设置,因为我是在服务器上安装虚拟机,而且我希望为这台虚拟机配置一个和宿主机在同一个网段的IP地址,那么就必须要设置网桥。而网桥的作用是取代之前的物理网卡,比如我之前的物理网卡是eth0,IP地址是我手动设置的静态IP,同时网关也是手动指定的,那么在设置br0的时候就原样搬过来,否则网桥设置之后eth0就没有自己的IP地址了,服务器的IP也就变了,IPv6同理。下面是我的/etc/network/interfaces配置文件更改:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
-iface eth0 inet static
+iface eth0 inet manual
+#Configure bridge and give it a static ip
+auto br0
+iface br0 inet static
   address 192.168.1.10
   netmask 255.255.255.0
   gateway 192.168.1.2
-iface eth0 inet6 auto
+  bridge_ports eth0
+  bridge_stp off
+  bridge_fd 0
+  bridge_maxwait 0
+iface br0 inet6 auto

改完配置,重启之后还没有结束,因为KVM默认只有一个default的网络,可以通过virsh net-list --all命令查看所有网络,通过virsh net-edit --network default 命令查看具体配置,这个网络是通过NAT转发的,不能满足我的需求,所以需要增加一个网络,下面是具体的步骤:

  1. 新建一个名为br0.xml的文件,把下面内容粘贴进去并保存

    1
    2
    3
    4
    5
    
    <network>
      <name>br0</name>
      <forward mode='bridge'/>
      <bridge name='br0'/>
    </network>
    
  2. 依次运行virsh net-define br0.xml virsh net-start br0 virsh net-autostart br0

  3. 最后运行virsh net-info --network br0检查一下具体信息

到这里KVM的准备工作就完成了,下面正式安装HassOS。

安装HassOS

使用官方教程中的virt-install命令后面补充一个网络选项--network bridge=br0,完整的命令为virt-install --name hass --description "Home Assistant OS" --os-variant=generic --ram=2048 --vcpus=2 --disk <PATH TO QCOW2 FILE>,bus=sata --import --graphics none --boot uefi --network bridge=br0。这里遇到的一个问题是Did not find any UEFI binary path for arch ‘x86_64’,有大佬给出了解决方案,运行apt install ovmf安装ovmf即可。

然后就会直接进入hass虚拟机,退出的话是按Ctrl+],之后可以通过virsh console hass再次进入,等一会儿,应该可以看到一行 homeassistant login: 的提示,没看到可以按几下回车,这里直接输入root再回车就可以进入,官方教程居然没提这一点。进去是为了查看HassOS的IP地址,因为我试了很多方法似乎并不能在宿主机查看到这个IP,在hass虚拟机内部输入ip addr,会输出很多信息,但是只有一个IP是和宿主机同网段的,通过访问http://X.X.X.X:8123就可以进入WEB界面了。之后跟着官方教程走就没什么问题了。

我在这里遇到的另一个问题是防火墙,我是在Debian上开启了ufw的,虽然内网开不开都无所谓,但是我的习惯是开启。但是KVM会被防火墙阻止,我暂时没写明白合适的规则,所以此处我只能关闭防火墙,否则要折腾很久。

推荐的配置

  1. 配置 -> 系统 -> 网络中,修改IPv4为静态IP,网关、DNS看情况修改。比如我的网络是存在旁路由的,所以需要修改网关和DNS,否则是无法访问Google的,那么很多操作比如更新、下载也就受到极大限制。改了之后可以通过在命令行运行curl https://www.google.com查看网络是否OK。
  2. 安装File editorTerminal & SSH这两个插件,因为经常折腾的话要经常修改配置文件,安装了之后就可以直接在网页修改了。

反向代理的设置

我习惯于用域名访问家里的服务,而且现在很多服务的一些功能需要SSL,比如网页的通知推送,所以需要设置一个反向代理,域名解析到宿主机,宿主机反代到虚拟机,可以参考这个社区的教程,下面是我的nginx配置文件(隐藏了真实域名):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
upstream homeassistant {
  server 192.168.1.11:8123;
}

server {
  listen 80;
  listen [::]:80;

  server_name homeassistant.doamin.com;

  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;

  server_name homeassistant.doamin.com;

  ssl_certificate certs/homeassistant.doamin.com;
  ssl_certificate_key certs/homeassistant.doamin.com;

  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384';
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;

  proxy_buffering off;

  access_log  /var/log/nginx/homeassistant_access.log;
  error_log   /var/log/nginx/homeassistant_error.log;

  location / {
    proxy_pass http://homeassistant;

    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_redirect http:// https://;

    # Enable WebSocket support
    proxy_http_version 1.1;
    proxy_set_header Connection $connection_upgrade;
    proxy_set_header Upgrade $http_upgrade;
  }
}

总结

至此HassOS就安装完成了,其实安装没有特别复杂,按照官方教程一步一步来,有问题社区搜一下,都有解决方案。接下来就要配置家里的智能家居了,这里面可玩性就很高了,因为不仅可以设置厂商的硬件,比如小米电扇什么的,还可以设置自己的开发板,但我还没入门,后续折腾一波再来分享。