miio( 调试)
更新时间:2018-09-14 13:52:13
TinyEngine 为接入小米设备,在TinyEngine的 Native 层,实现了小米设备 miio 通信协议,并向上提供了 JS 调用接口,这些接口都封装在 miio 这个对象中。本地 miio 库实现数据传输通道(包括会话建立、加密发送数据、解密接收数据等)和事件转发,具体的设备模型(属性、接口、事件)在JS应用层可见。
本扩展对象仅仅为开发者提供如何对接小米miio设备的方法。
miio 对象接口说明
创建设备
miio.createDevice(host, token)
- host - 设备的ip地址
- token - 设备对应的token
- return - 设备标识
注册设备事件监听器
miio.deviceOnEvent(device, cb)
- device - miio.createDevice创建的设备
- cb - function (event) {} 类型的回调函数
- return - 无
控制设备
miio.deviceControl(device, method, args, sid)
- device - miio.createDevice创建的设备
- method - 设备控制接口,如:set_power
- args - 设备控制接口参数,如:["on"],["off"]等
- sid - 子设备标识,控制device下的子设备时才会用到,其他情况不用填写
- return - 设备返回子符串
注:该接口为同步接口,最长等待时间为2秒
IP自发现
- miio.discover(timeout, cb)
- timeout - 单位为秒
- cb - function(host, deviceId) {} 类型的回调函数
- miio.discover(timeout, cb)
示例
如何获取小米设备的 token,如何获取小米设备不同品类的属性和设备模型,请参见 设备联动示例
console.log("=================================");
console.log(" demo-miio-scene ");
console.log("=================================");
// miio 为 Natvie Modules,按照小米设备接入协议实现的扩展对象
var lightDevice;
// 控制开灯
function lightOn() {
console.log("lightOn");
if (lightDevice) {
miio.deviceControl(lightDevice, "set_power", '["on"]');
}
}
// 控制开关
function lightOff() {
console.log("lightOff");
if (lightDevice) {
miio.deviceControl(lightDevice, "set_power", '["off"]');
}
}
function setupLight(host) {
// 创建小米灯设备,如何获取小米设备的token,
//其具体方法和步骤请见:设备联动示例
lightDevice = miio.createDevice(
host,
"Please input your device's token !"
);
// 初次启动时,第一次关闭小米灯
lightOff();
}
function setupGateway(host) {
// 创建小米 Zigbee 网关设备:如何获取小米设备的token,
//其具体方法和步骤请见:设备联动示例
var gatewayDevice = miio.createDevice(
host,
"0a7b7e5af0fc0b1b4877b0907834f9a7"
);
var motionSensorId = null;
var timeout = null;
// 注册监听事件,回调函数
miio.deviceOnEvent(gatewayDevice, function(event) {
console.log("gateway receive event");
var obj = JSON.parse(event);
var open = false;
if (obj.data) {
open = JSON.parse(obj.data).status === "motion";
}
//如果人体感应器检测到人,则开灯,如果一分钟没有感应到人存在,则关灯
if (obj.cmd === "report" && obj.sid === motionSensorId && open) {
lightOn();
if (timeout) {
clearTimeout(timeout);
timeout = null;
}
//每分钟接收一次
timeout = setTimeout(function() {
lightOff();
}, 60 * 1000);
}
});
// 获取小米网关的设备列表
var device_list = miio.deviceControl(
gatewayDevice,
"get_device_prop",
'["lumi.0","device_list"]'
);
console.log("device list: " + device_list);
// 从小米网关下挂的设备列表中,找到人体感应设备,网关下的其他设备可以按照类似的方法
var deviceList = JSON.parse(device_list);
for (var i = 0; i < deviceList.result.length; i++) {
if (deviceList.result[i + 1] === 2) {
motionSensorId = deviceList.result[i].substring(5);
console.log("motion sensor id: " + motionSensorId);
break;
}
}
}
miio.discover(20, function(host, deviceId) {
console.log('discovered device, host: ' + host + ', deviceId: ' + deviceId);
if (deviceId === 61632282) {
setupLight(host);
} else if (deviceId === 78463041) {
setupGateway(host);
}
});