开源智能家居系统 Home Assistant 入门

如果可以在你家的宠物猫上贴/绑一个小的低功耗蓝牙发射器,然后在一个小的家庭智能网关上搜集到这个蓝牙的位置,你是不是可以全天候监控你家萌宠,在你不在家的时候撒欢的情况了呢?本文尝试在一台 x86 虚拟机上安装这个开源的智能家居软件,待以后我们更新发布一个新的安装到树莓派或者香橙派的版本,那就是真正的智能家居系统了。

在我们的 Proxmox VE 6 集群里,找了一台空的 Ubuntu 1904 的虚拟机 1G 内存 1 vCPU。虚拟机主机名设为 lamp-u02。你问为什么要用虚拟机啊,就是为了隔离啊, 测试的东东不想和其他系统混杂,所以,我们的三台物理机的集群里,安装了很多七七八八的各种虚拟机。

开始按照网上参考文章安装,安装流程非常顺利。

$ sudo apt-get install python3-pip python3-venv
$ sudo apt-get install build-essential libssl-dev libffi-dev python-dev
$ sudo echo > /etc/pip.conf <<EOF
[global]
trusted-host=mirrors.aliyun.com
index-url=https://mirrors.aliyun.com/pypi/simple/
EOF
$ sudo useradd -rm homeassistant
$ cd /srv
$ sudo mkdir homeassistant
$ sudo chown homeassistant:homeassistant homeassistant
$ sudo su -s /bin/bash homeassistant
$ cd /srv/homeassistant
$ python3 -m venv .
$ source bin/activate
$ pip3 install homeassistant
$ hass &

等后台下载一些依赖,并启动到 “Starting Home Assistant” 可以浏览器登录 http://lamp-u02:8123/ 进入服务,来玩耍一把了。

设置好账号后,就进入一个地址定位界面,貌似自动检测不工作。 我们切换到火狐浏览器进入翻墙的情形,来测试一下定位地址的自动检测功能。显然由于不可知的原因,这个自动检测地址不工作,我们只好手工拖动地图到我们的实际位置,然后选择时区, +8 的时区选择里,居然没有中国的任何城市! :-(【后面我们会手工修改】,我们暂时选择新加坡,保存后,点击完成。这个服务就算设置好了。

接下来,我们点击集成,点击右下角的 + 号,就可以添加不同的设备或者服务了。里面有大金空调的直接输入 IP 地址就可以监控,还包括 海信,华为等设备,直接可以连接 MQTT , 还可以连接 Twillo(短信服务提供商) 等。

我们接下来去手机上安装一个 Home Assitant 的应用。 iOS 上在 App Store 里搜索 Home Assistant 第一个有房子形状的就是了。

安装完 App 后,确保手机 Wi-Fi 和 Home Assisstant 服务器在同一个网络内,App 就可以自动发现,如果没有发现的话,可以尝试手工输入 URL: http://192.168.x.x:8123/ 让 App 去发现,成功之后,点击三个允许授权,然后会出现白屏是因为中间在传输数据,大概需要 3-5分钟,手机上和 PC 浏览器上都可以出现手机的详细信息了。

下面来玩一把高级的,上面提到过,没有 上海这个时区。 其实,时区也是可以手工填写的,但是是不是 GMT+8,我们没有确认,中间没有天气预报这个模块了。 我们要初始化怎么办?实际上很简单粗暴,直接删除 .storage 目录就可以:

 $ rm -rf  /home/homeassistant/.homeassistant/.storage 

重启后,就会在浏览器上要求重新创建用户名和密码。我们要修改的时区的名称就在 .storage 目录下的 core.config 里。 把 Asia/Singapore 修改为 Asia/Shanghai 后,我们用 $ kill -HUP $(pgrep hass) 就可以重启原来启动的 hass 进程。虚拟机的 SSH console 上就可以看到重启的信息。 浏览器界面进入“配置=>通用”,就可以看到时区已经显示为 Asia/Shanghai 了。

最后, 我们把 hass 搞成一个自启动的服务, 这个在 Ubuntu 下很简单, 编辑一个启动脚本。 (请注意这个脚本和其他网络上介绍的有不一样的)

$ sudo echo > /lib/systemd/system/homeassistant@.service <<EOF
[Unit]
Description=Home Assistant
After=network-online.target

[Service]
Type=simple
User=%i
ExecStart=/srv/homeassistant/bin/hass -c "/home/%i/.homeassistant"

[Install]
WantedBy=multi-user.target
EOF
$ systemctl daemon-reload
$ systemctl --now enable homeassistant@homeassistant
$ systemctl  status homeassistant@homeassistant  // 查看服务启动情况

对以上的这个启动脚本做个解释,其中的 User=%i, 这个 %i 其实就是 服务名里面 @ 后面部分,也就是 homeassistant 。也就是说,要启动多个服务的话,只要在一个新的 HOME 下, 例如 /home/newuser 下配置好 .homeassistant 目录里,无需添加其他脚本,我们可以启动一个新的服务: systemctl start homeassistant@newuser 即可。(当然里面的端口号要修改)怎么修改启动的端口(例如 8122 )呢? 修改 configuration.yaml,把其中的 http: 部分修改成如下即可。

  base_url: lamp-u02:8122
    server_port: 8122

好了, 一个完整的配置安装教程基本完成,如果手头有其他苹果的,亚马逊的, Google 的音箱之类的,都可以爽爽的玩起来了。

什么?你不想用 8123 端口访问?前端加一个 Nginx 反向代理就可以,小儿科了。 就不介绍了。 请记住, 不能直接用普通用户启动端口号低于 1024 的 TCP 服务,例如 80/443 都必须以 root 启动。

但是问题是家庭里面,谁也不想开一台虚拟机跑这个东东吧?接下来,我们后面会尝试用其他方法来安装这个软件到小巧玲珑的树莓派,或者香橙派,或者香蕉派上面,然后在手机端就可以配置整个家庭的智能家居,在小巧的设备上配置上 DDNS,就可以远程在手机上控制家里的设备了。 譬如,你能想到的,下班前,先把家里的电饭煲开启,天冷了, 家里的空调/地热可以预先开启。等等等等。

所有这些,你都可以通过这个开源的软件来控制,好向往啊!

作者: 甬洁网络

--移动互联网&物联网技术提供商