请选择 进入手机版 | 继续访问电脑版

『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 27762|回复: 60

homebridge的介绍和多开(已经完成)

  [复制链接]

18

主题

142

帖子

2572

积分

金牌会员

Rank: 6Rank: 6

积分
2572
金钱
2430
HASS币
0

论坛风云人物

发表于 2017-10-5 13:49:22 | 显示全部楼层 |阅读模式
本帖最后由 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其实可以不用,但是为了容易区分






教程完毕









$DHOXE]_~T]QKE5PQCY1M5X.png
S5F3XC@APCY[8{CRR]_$D6S.png
E`XP9T@]$P[~9PFKS5ZDT2T.png
G@PFK]$(LB1D8Y)M4JGY[YV.png

YHHB.zip

865 Bytes, 下载次数: 143

评分

参与人数 1金钱 +20 收起 理由
+ 20 辛苦A总了,写这么长的教程贴!.

查看全部评分

回复

使用道具 举报

0

主题

19

帖子

134

积分

论坛积极会员

积分
134
金钱
115
HASS币
0
发表于 2017-10-5 14:37:49 | 显示全部楼层
谢谢分享蛤
回复

使用道具 举报

62

主题

581

帖子

6039

积分

论坛元老

Rank: 8Rank: 8

积分
6039
金钱
5383
HASS币
240

教程狂人论坛风云人物

发表于 2017-10-5 15:39:23 来自手机 | 显示全部楼层
谢谢分享,获益良多
回复

使用道具 举报

220

主题

1284

帖子

7847

积分

超级版主

Rank: 8Rank: 8

积分
7847
金钱
6533
HASS币
86

教程狂人论坛风云人物突出贡献

发表于 2017-10-5 16:12:09 来自手机 | 显示全部楼层
擦,顿悟啊!茅塞顿开啊!
回复

使用道具 举报

32

主题

986

帖子

4233

积分

论坛元老

Rank: 8Rank: 8

积分
4233
金钱
3207
HASS币
110

教程狂人论坛风云人物

发表于 2017-10-6 00:35:41 | 显示全部楼层
图挂了啊呵呵
回复

使用道具 举报

0

主题

13

帖子

58

积分

注册会员

Rank: 2

积分
58
金钱
45
HASS币
0
发表于 2017-10-6 15:47:01 | 显示全部楼层
我也发现了同样的问题,只是没有这个专业水平去解决,还是等楼主把这篇文写完再借鉴借鉴。另外,图片挂了哦
回复

使用道具 举报

17

主题

418

帖子

2816

积分

金牌会员

Rank: 6Rank: 6

积分
2816
金钱
2398
HASS币
0

教程狂人

发表于 2017-10-6 17:22:14 | 显示全部楼层
图挂了啊
回复

使用道具 举报

0

主题

3

帖子

60

积分

注册会员

Rank: 2

积分
60
金钱
57
HASS币
0
发表于 2017-10-8 15:22:04 来自手机 | 显示全部楼层
多开,是不是意味多占几倍的树莓派资源?
回复

使用道具 举报

4

主题

250

帖子

1283

积分

金牌会员

Rank: 6Rank: 6

积分
1283
金钱
1033
HASS币
0
发表于 2017-10-9 07:55:25 来自手机 | 显示全部楼层
谢谢分享,获益良多
回复

使用道具 举报

38

主题

748

帖子

4687

积分

论坛元老

Freddy.

Rank: 8Rank: 8

积分
4687
金钱
3914
HASS币
0

最佳新人卓越贡献

发表于 2017-10-10 16:57:15 | 显示全部楼层
感谢分享,等待更新~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-19 03:13 , Processed in 0.076468 second(s), 42 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表