|
本帖最后由 ABC 于 2017-11-25 16:26 编辑
(来自非常有名的小米一系列插件作者yinhangcode)
HomeBridge是桥 By Mr.Yin
1.引言
最近笔者业余时间开发了几个HomeBridge的插件,也接触了很多智能家居的玩家,玩HomeAssistant也有,玩HomeBridge的也有。而对于HomeKit的用户体验,很多玩家普遍反映设备加多了之后响应会慢,外网控制慢,某个设备断电(不用了收起来)会导致整个HomeKit的插件都卡在“正在更新”等问题。交流得知很多玩家的部署架构后,笔者觉得并不是很合理,于是有了今天这篇文章,发表一下我个人的观点,也仅仅代表我目前对HomeBridge的理解所持有的观点,若有异议和建议,可以到群(QQ群:107927710)里大家一起交流。
2.苹果官方HomeKit认证的设备
既然提到HomeKit,自然先看一下正版苹果官方经过HomeKit认证的设备是怎么工作的。当然,首先要给设备做上电等操作,一切准备就绪后,打开苹果“家庭”app,点击“添加配件”,扫描或者手动搜索设备的Pin码,之后添加设备成功。这个过程和添加HomeBridge的过程一样,那么我们添加了N个设备之后,架构便是如图这样的。
当用户打开家庭app时,HomeKit会分别读取各个设备的状态。当然,读取状态是需要通过网络的,经过网络就会有延迟,可能快至1ms,也可能慢至几秒,甚至说可能某个设备断了电他将永远不会响应了。比如说,风扇设备需要10ms响应,而空净需要10s响应,或者说空净断了电。但是都没关系,响应的设备会在响应后将状态由“正在更新”变为当前的状态,并且用户已经可以控制他了,而没响应的设备他会继续保持“正在更新”的状态,直到响应,或是说超过一个超时时间,变为未响应状态。
也就是说,当你打开家庭app的时候,可能不到1秒钟风扇的状态就读到了,你就可以控制他了,而空净可能需要5秒钟才会读到状态才能控制,但是不管空净多久读到状态,甚至是未响应,这都不会影响用户对风扇的操作。
3.HomeBridge不是平台
说完上一章可能有些朋友会明白我的观点,但也许还不是很明白。那么我继续说,现在很多玩家普遍的架构是这样的:
这样的架构来看,HomeKit会认为虚线内的是一个HomeKit设备。家庭app打开后会像这个虚线设备要这个设备的当前状态。到了HomeBridge这里,HomeBridge会像小米风扇,小米空净等去要当前状态。
那么,如果说小米风扇1秒内就会给HomeBridge状态,此时HomeBridge也不能返回状态给HomeKit,因为空净的状态他还不知道,所以HomeBridge要等空净的状态返回,才能给HomeKit响应虚线设备的状态。也就是说,如果空净获取状态可能需要5s,那么虽然风扇1s就返回了当前状态,但是在HomeKit看来他并不知道,所以在HomeBridge整体没有返回状态的时候,风扇插件还是“正在更新”的状态,你依然无法去控制他。这也就导致了如果一个设备响应慢,会卡住整个HomeBridge。甚至说,如果某个HomeBridge插件代码逻辑有问题,那么将会影响整个HomeBridge的使用。简单的测试方法就是在某个插件的’get’事件的代码中,你不去调用callback,那么整个HomeBridge下插件都会显示“正在更新”。
4.HomeBridge是桥
既然我们普遍用的架构有这个缺陷,那么可不可以想办法去优化他呢。这个答案苹果官方就告诉我们了。是的,我们将架构设计成官方HomeKit认证设备那样,自然会解决这个问题。那么架构如下:
这样一来,小米风扇1秒内响应给HomeBridge,HomeBridge就会1秒内响应给HomeKit了,用户也就能在1秒内就控制小米风扇了。空净不管几秒给HomeBridge响应,都不会影响小米风扇。
5.HomeBridge与HomeAssistant的关系
我觉得这两个并没有什么关联。换句话说,难道支持苹果官方授权的HomeKit设备就不能加入到HomeAssistant里了么?显然不是。所以HomeBridge与HomeAssistant的关系应该为如下如所示:
好了,现在我来介绍如何多开首先我们来安装homebridge,在这里提供树莓派的安装方法,草,第一个命令是这样
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo apt-get -y install libavahi-compat-libdnssd-dev
sudo npm install -g --unsafe-perm homebridge hap-nodejs node-gyp
cd /usr/lib/node_modules/homebridge/
sudo npm install --unsafe-perm bignum
cd /usr/lib/node_modules/hap-nodejs/node_modules/mdns
sudo node-gyp BUILDTYPE=Release rebuild
cd /
到这里homebride已经按装好了,我以homebridge-homeassistant和homebridge-mi-airpurifier这两个插件来介绍,
为何用这两个插件,因为homebridge-homeassistant是hass的插件,homebridge-mi-airpurifier要引用miio库
首先来安装插件
sudo npm install -g miio homebridge-mi-airpurifier
sudo npm install -g homebridge-homeassistant
插件安装好了,我们来创建文件夹
mkdir /home/pi/YHHB/
mkdir /home/pi/YHHB/Homeassistant/
mkdir /home/pi/YHHB/Homeassistant/config/
mkdir /home/pi/YHHB/Homeassistant/plugin/
mkdir /home/pi/YHHB/Airpurifier/
mkdir /home/pi/YHHB/Airpurifier/config/
mkdir /home/pi/YHHB/Airpurifier/plugin/
config就是用来放置config.json文件的地方,plugin就是用来放置插件的地方
但是我们安装插件的时候并不是在这里,那我们接下来就是把插件移到这里来
(其他不是按照这个教程来安装的自己看看插件的位置在哪里)
mv /usr/lib/node_modules/homebridge-homeassistant/ /home/pi/YHHB/Homeassistant/plugin/
mv /usr/lib/node_modules/homebridge-mi-airpurifier/ /home/pi/YHHB/Airpurifier/plugin
[/code]
刚才说了,因为homebridge-mi-airpurifier引用了miio ,但是miio又是安装在/usr/lib/node_modules/,所以我们必须把homebridge-mi-airpurifier引用miio的语句改一下路径
cd /home/pi/YHHB/Airpurifier/plugin/homebridge-mi-airpurifier/Devices/
ls
我们能看到有四个文件,只用改其中的三个Airpurifier.js Airpurifier2.js Airpurifierpro.js
用sudo nano逐一编辑 把开头的const miio = require('miio'); 改成 const miio = require('/usr/lib/node_modules/miio');
例如
sudo nano Airpurifier.js
改好后我们开始来编辑config.json文件,也就是homebridge加载配置的文件
sudo nano /home/pi/YHHB/Homeassistant/config/config.json
把下面的内容改一下,homeassistant的ip和密码,没有密码的可以不用理会
{
"bridge": {
"name": "Homeassistant",
"username": "B6:27:EB:42:FA:4E",
"port": 53281,
"pin": "123-11-678"
},
"platforms": [
{
"platform": "HomeAssistant",
"name": "HomeAssistant",
"host": "http://192.168.1.200:8123",
"password": "raspberry",
"supported_types": [
"binary_sensor",
"climate",
"cover",
"fan",
"input_boolean",
"light",
"lock",
"media_player",
"scene",
"sensor",
"remote",
"group",
"script",
"automation",
"device_tracker",
"switch"
],
"default_visibility": "visible",
"logging": false,
"verify_ssl": false
}
]
}
#############################
编辑完Ctrl+x 再 加Y,应该都知道
再Homeassistant的config.json文件里我们只要编辑homeassistant的配置
然后我们再来编辑Airpurifier的配置文件
sudo nano /home/pi/YHHB/Airpurifier/config/config.json
把下面的内容复制,还是改ip,改token
{
"bridge": {
"name": "Airpurifier",
"username": "B5:27:EB:43:FA:4E",
"port": 53188,
"pin": "123-11-678"
},
"platforms": [
{
"platform": "MiAirPurifierPlatform",
"deviceCfgs": [{
"type": "AirPurifier2",
"ip": "192.168.1.167",
"token": "92929d99875a113071f7bd1a21484xxx",
"airPurifierDisable": false,
"airPurifierName": "空气净化器",
"silentModeSwitchDisable": true,
"silentModeSwitchName": "净化器静音",
"temperatureDisable": false,
"temperatureName": "卧室温度",
"humidityDisable": false,
"humidityName": "卧室湿度",
"buzzerSwitchDisable": true,
"buzzerSwitchName": "AirPurifier Buzzer Switch",
"ledBulbDisable": true,
"ledBulbName": "AirPurifier LED Switch",
"airQualityDisable": false,
"airQualityName": "空气质量"
}
]
}
]
}
然后再来给YHHB文件夹权限
sudo chmod -R 0777 /home/pi/YHHB
现在可以来手动启动一下了
homeassistant的启动方式
homebridge -U /home/pi/YHHB/Homeassistant/config/ -P /home/pi/YHHB/Homeassistant/plugin/
空气净化器的启动方式
homebridge -U /home/pi/YHHB/Airpurifier/config/ -P /home/pi/YHHB/Airpurifier/plugin/
自动启动:
启动没有问题了,接下来让homebridge自动启动,把下面的附件YHHB脚本扔到/etc/init.d/下
再来编辑这个文件
sudo nano /etc/init.d/YHHB
因为现在只做了两个插件,所以我们把里面的21-27行减掉只剩下Homeassistant和Airpurifier
剪掉前
hbPaths=(
'/home/pi/YHHB/Homeassistant/'
'/home/pi/YHHB/YeeLight/'
'/home/pi/YHHB/Zhimifan/'
'/home/pi/YHHB/Airpurifier/'
'/home/pi/YHHB/ffmpeg/'
);
剪掉后
hbPaths=(
'/home/pi/YHHB/Homeassistant/'
'/home/pi/YHHB/Airpurifier/'
);
同理,增加插件也要在这里添加上去
同样,修改完必须给权限
sudo chmod 0777 /etc/init.d/YHHB
安装chkconfig, 并把该服务添加到配置当中
sudo apt-get install chkconfig
sudo chkconfig --add YHHB
重新加载服务,重启树莓派,开机启动启动,你可以在家庭里添加了
sudo systemctl daemon-reload
sudo reboot
手动启动停止
sudo service YHHB start
sudo service YHHB stop
最后,每个插件的缓存文件在相应的config文件夹里,所有有引用库的都必须把插件的引用路径改了
搞完之后你可以把整个YHHB文件夹和YHHB脚本复制出来,以后重装系统可以把文件扔回去,给予权限就可以,
这样在家庭也不用重新添加
注意: 每一个config.json的homebridge的name,username,port都要改,name其实可以不用,但是为了容易区分
教程完毕
|
评分
-
查看全部评分
|