作者:jsonzhou 2018/02/10
小米(xiaomi)、绿米(aqara)、米家智能家庭(mijia)开发工具库。
小米IoT开发者平台不支持个人开发者申请,有一些极客的玩法没有API实现不了。通过mi-aqara-sdk
可以在Node.js平台实现米家智能家庭的互联互通。
mi-aqara-sdk
只在局域网中通讯,使用的协议或机制主要有:udp协议,组播,AES加解密。
npm install --save-dev mi-aqara-sdk
const MiAqara = require('mi-aqara-sdk');
MiAqara.create(gateways, opts); // 创建
MiAqara.start(); // 启动
- gateways 网关列表,支持数组(多个)或对象(单个)
- sid 网关设备ID (获取方式见文末)
- password 网关密码 (获取方式见文末)
- iv [可选]加密初始向量,有默认值
- opts 服务选项
- multicastAddress 组播IP,默认:224.0.0.50
- multicastPort 组播端口,默认:4321
- serverPort 服务监听端口,默认:9898
- bindAddress SDK所在设备具有多网络时需要设置
- onReady 网关及子设备已就绪, 多个网关可能会调用多次
- onMessage 所有消息回调
MiAqara.create([{
sid: '7811dcb28bde',
password: '**A68343AD********'
}], {
onReady (msg) { // 网关及子设备已找到, 多个网关可能会调用多次
// console.log('onReady', msg);
},
onMessage (msg) { // 所有消息类型
// console.log('onMessage', msg);
}
});
{
"cmd": "read_ack",
"model": "switch",
"sid": "158d0001bf542b",
"short_id": 2124,
"data": "{\"voltage\":3012}"
}
- iam 查找网关时,网关的响应包
- get_id_list_ack 网关查找子设备列表时消息响应
- report 网关及子设备状态变化时主动上报
- read_ack 读设备时消息响应
- write_ack 写设备时消息响应
- heartbeat 心跳包,网关每10秒钟发送一次, 主要更新网关token。子设备心跳,插电设备10分钟发送一次,其它1小时发送一次
- server_ack 通用回复, 如发送报文JSON解析出错,会回复此事件
MiAqara.start();
MiAqara.getGatewayBySid('7811dcb28bde')
MiAqara.getGatewayList();
- opts.sid 网关设备ID
- opts.power 开关
- opts.hue 色相
- opts.saturation 饱和度
- opts.brightness 亮度
MiAqara.controlLight({sid:'7811dcb28bde',power:false});
MiAqara.controlLight({sid:'7811dcb28bde',power:true});
MiAqara.getDeviceBySid('158d0001b8849f');
MiAqara.getDevicesByGatewaySid('7811dcb28bde');
MiAqara.getDevicesByGatewaySidAndModel('7811dcb28bde', 'switch');
以下key为model(型号)
const DEVICE_MAP = {
'gateway': {name:'Gateway', name_cn:'网关'},
'magnet': {name:'ContactSensor', name_cn:'门窗磁传感器'},
'motion': {name:'MotionSensor', name_cn:'人体感应'},
'switch': {name:'Button', name_cn:'按钮'},
'sensor_ht': {name:'TemperatureAndHumiditySensor', name_cn:'温度湿度传感器'},
'ctrl_neutral1': {name:'SingleSwitch', name_cn:'单按钮墙壁开关'},
'ctrl_neutral2': {name:'DuplexSwitch', name_cn:'双按钮墙壁开关'},
'ctrl_ln1': {name:'SingleSwitchLN', name_cn:'单按钮墙壁开关零火版'},
'ctrl_ln2': {name:'DuplexSwitchLN', name_cn:'双按钮墙壁开关零火版'},
'86sw1': {name:'SingleButton86', name_cn:'86型无线单按钮开关'},
'86sw2': {name:'DuplexButton86', name_cn:'86型无线双按钮开关'},
'plug': {name:'PlugBase', name_cn:'插座'},
'86plug': {name:'PlugBase86', name_cn:'86型墙壁插座'},
'cube': {name:'MagicSquare', name_cn:'魔方'},
'smoke': {name:'SmokeDetector', name_cn:'烟雾警报器'},
'natgas': {name:'NatgasDetector', name_cn:'天然气警报器'},
'curtain': {name:'ElectricCurtain', name_cn:'电动窗帘'},
'sensor_magnet.aq2': {name:'ContactSensor2', name_cn:'门磁感应 第二代'},
'sensor_motion.aq2': {name:'MotionSensor2', name_cn:'人体感应 第二代'},
'sensor_switch.aq2': {name:'Button2', name_cn:'按钮 第二代'},
'weather.v1': {name:'TemperatureAndHumiditySensor2', name_cn:'温度湿度传感器 第二代'},
'sensor_wleak.aq1': {name:'WaterDetector', name_cn:'水浸传感器'}
};
MiAqara.getDevicesByModel('switch')
MiAqara.getDeviceList()
- change({sid,data}) 改变指定设备(子设备ID:sid)的状态
- change({gatewaySid, model, data}) 改变指定网关下挂载的指定型号的子设备状态
- change({model, data}) 改变所有指定型号的子设备状态
{
"status": "close" //close:关闭; open:打开
}
{
"status": "motion" //motion:有人移动
}
// 或
{
"no_motion" "120" //120秒没人移动
}
{
"status": "click" //click:单击; double_click:双击
}
{
"temperature": "1741",
"humidity": "7593"
}
{
"channel_0": "on" //off是关闭
}
{
"channel_0": "on",
"channel_1": "off"
}
{
"channel_0": "on" //off是关闭
}
{
"channel_0": "on",
"channel_1": "off"
}
{
"channel_0": "click" //click:单击; double_click:双击
}
{
"channel_0": "click" //click:单击; double_click:双击
"channel_1": "click" //click:单击; double_click:双击
}
{
"status": "on" //off是关闭
}
{
"status": "on" //off是关闭
}
{
"status": ""
}
status取值:
- move
- flip180
- tap_twice
- shake_air
- flip90
{
"alarm": "0" // 0,1,2
}
{
"alarm": "0" // 0,1,2
}
{
"curtain_level": ""
}
{
"status": "close" //close:关闭; open:打开
}
{
"status": "motion" //motion:有人移动
}
// 或
{
"no_motion" "120" //120秒没人移动
}
{
"status": "click" //click:单击; double_click:双击
}
{
"temperature": "1741",
"humidity": "7593"
}
{
"status": "leak" //leak:水浸; no_leak:没有水浸
}
mac=后面的一串即为网关的SID,去掉“:”,转换成小写使用
趁年底周末折腾了一下,祝大家2018春节快乐!