根据这个就可以使用iphone控制灯与开关.
折腾了3个晚上,终于将homebridge安装好,安装之前需要安装一堆的库,比如node.js运行环境等,因为网上资料大部分都是在树莓派上面运行,我是直接在ubuntu上面进行的测试,因为安装会有所区别,但是安装好之后就一样了,安装方法在此我就不写了,后面补上,这里我主要写homebridge-aqara与网关的通信协议,可以使用一个linux程序,windows程序或者单片机作为网关,网关必须能连接到局域网,我测试使用的是一个VC++编写的windows程序.
上一个homebridge正常工作的截图
在使用homebridge-aqara插件之前我尝试过几个别的,都没能成功,主要是我对js一点都不懂,但是homebridge-aqara这个插件比较简单,通过代码就可以看出json结构,加上测试,就把几个常用的设备的协议给弄出来了,方便大家自己玩,可以不用依赖什么小米路由器之类的网关了,听说小米也是使用这个插件的.
1.修改配置文件(路径 /home/用户名/.homebridge/)
{
"bridge": {
"name": "Homebridge",
"username": "00:0C:29:E1:25:B2",
"port": 51826,
"pin": "123-45-678"
},
"platforms": [
{
"platform": "AqaraPlatform",
"sid":["6409802da3ca"],
"password":["1234567812345678"]
}]
}
"pin": "123-45-678" 类似一个配对码,可以按照这个格式任意修改,仅限数字,端口就不要修改了
"sid":["6409802da3ca"],
"password":["1234567812345678"]sid与密码可以按照这个格式修改,但是密码长度必须是16位,否则可能会报密码长度错误,这2个后面网关程序中会使用到.
2.homebridge是个桥梁,上边与iphone的homekit通信,下边通过aqara插件与第三方的网关通信.
1.homebridge首先会发送广播数据
{"cmd": "whois"}
2.设备收到后响应
{
"cmd": "iam",
"ip": "10.254.1.100",
"port": "4321"
}
3.homebridge 发送请求设备列表
{"cmd":"get_id_list"}
4.设备响应传感器列表
{
"cmd": "get_id_list_ack",
"sid": "6409802da3ca",
"token": "1234567812345678",
"data": "[11,12,15,16]"
}
5.homebridge会对每个设备进行读取
{"cmd":"read", "sid":"11"}
6.设备响应数据
//温湿度
{
"cmd": "return_read",
"model": "sensor_ht",
"sid": "11",
"data": "{\"temperature\": 2500,\"humidity\": 6501}"
}
//插座
{
"cmd": "return_read",
"model": "plug",
"sid": "12",
"data": "{\"status\": \"on\"}"
}
//照明开关
{
"cmd": "return_read",
"model": "ctrl_neutral1",
"sid": "15",
"data": "{\"channel_0\": \"on\"}"
}
//网关心跳包
{
"cmd": "heartbeat",
"model": "gateway",
"sid": "6409802da3ca",
"token": "1234567812345678"
}
//控制插座下发的数据
{
"cmd": "write",
"model": "plug",
"sid": "12",
"data": "{\"status\":\"off\", \"key\": \"bbf5624a816f7f2702512d6c1cd55e53\"}"
}
//控制灯后状态需要立即更新,否则会退出
{
"cmd": "write",
"model": "ctrl_neutral1",
"sid": "15",
"data": "{\"channel_0\":\"off\", \"key\": \"bbf5624a816f7f2702512d6c1cd55e53\"}"
}
在homebridge-aqara源代码 AqaraPlatform.js最上面可以看到端口与组播信息.
const dgram = require('dgram');
const inherits = require('util').inherits;
const crypto = require('crypto');
const iv = Buffer.from([0x17, 0x99, 0x6d, 0x09, 0x3d, 0x28, 0xdd, 0xb3, 0xba, 0x69, 0x5a, 0x2e, 0x6f, 0x58, 0x56, 0x2e]);
const serverSocket = dgram.createSocket('udp4');
const multicastAddress = '224.0.0.50';
const multicastPort = 4321;
const serverPort = 9898;
var AqaraAccessoryFactory;
multicastAddress:组播地址
multicastPort:组播端口没什么用
serverPort = 9898 这个端口比较重要,用于与homebridge-aqara通信的端口,网关可以使用任意端口与这个端口建立UDP连接即可通信.
4.协议说明
这里的协议仅限于网关与homebridge-aqara通信的协议,网关与传感器的通信协议大家可以任意自定义,比如我的网关使用433与底层传感器通信,协议采用modbus-RTU协议.
下面是我自己做的一些控制用的硬件
USB串口转433模块(采用STM32+A7139无线通信模块)
RGB灯带驱动,同样STM32+A7139 ,采用1000V12A MOSFET,可惜homebridge-aqara不支持调色调亮度功能,好在homebridge_yeelight支持,后面需要再研究研究.
12V/24V低压控制板,同样保留3个通道,PWM驱动
淘宝上买的5元外壳,内部同样STM32+A7139/WIFI ,1路10A继电器控制
之所以都自己做是因为家里刚装修,预留了很多灯位,想自己做个简单智能家居,并且自己做的协议自己定,不用依赖厂家,刚好IOS的homekit被黑客破解发到网上变为开源接口了,所以手机APP都不用做了,直接用,还挺方便的.
iso上面homekit效果
后面将这个部署到嵌入式linux中,购买了一个57元的全志的核心板,比树莓派便宜不少
只有3x3cm比较小巧.
5.homebridge-aqara的小bug
在使用过程中,特别是控制灯的时候,如果状态没有及时更新,homebridge-aqara会崩溃,在源码AqaraPlatform.js中搜索 Value not changed, do nothing
// Dont' send duplicate command out.
if (this.lastValue == on) {
platform.log.debug("Value not changed, do nothing");
return;
}
var platform = this.platform;
var password = platform.passwords[this.deviceSid];
var platform = this.platform;
if (this.lastValue == on) {
platform.log.debug("Value not changed, do nothing");
return;
}
var password = platform.passwords[this.deviceSid];
6.测试网关程序
串口就是433模块,用于与底层传感器通信,端口就是连接homebridge-aqara,使用json通信
可以看到通信协议,homebridge-aqara发送给网关控制灯,以及读取设备信息.
7.相关连接,大家可以看看
http://bbs.feng.com/forum.php?mod=viewthread&tid=10857822&extra=page=1&filter=typeid&typeid=912&typeid=912
http://www.tuicool.com/articles/uM3q2yR
http://forum.yeelight.com/t/homebridge-plugin/83/13