我家里的小米智能电器有米家、yeelight、aqara等品牌,米家有小米电视、米家空调等,yeelight有各个房间的吸顶灯,aqara有智能开关。由于米家开发者文档显示目前当前仅面向企业开放,暂未面向个人开发者开放。而aqara智能开关可玩性一般(文档可访问这里),而yeelight智能灯可以调节灯光开关、光暗、与传感器联动,可玩性更高,于是我就把魔爪伸向了yeelight智能灯了。
先来看一下效果:视频地址
由于百度谷歌都没有JS实现相关的教程,于是我只能从头开始摸索了。yeelight的开发文档比较简陋,而且是全英文的,社区更是提问题的多,解答问题的少,真是不太友好。
对可行性存在怀疑的我决定先尝试运行一下网站提供的mac版demo代码,看看是不是能跑通的。为此我还安装了xcode。结果直接运行会报如下错误:
error: No account for team "S4JD8QVPVY". Add a new account in the Accounts ...
解决办法是,这儿需要换上自己的开发者账号所在的team。
运行成功后发现找不到灯设备,fine,那我暂时也没办法了。
本着快速实现的想法,我逆转了一下思路,到github上看看有没有相关的轮子。筛选一下语言、高赞、文档详细的项目后,最后选择了几个项目尝试跑一下,但都没有找到灯设备。百思不得其解地吃了一个下午茶,以及抢了一轮小米有品的口罩结果被耍猴之后,不得不感叹整个下午都被小米耍了。
此刻作为一个逆转裁判粉丝,我也逆转一下思路,既然这么多demo都找不到设备,但他们既然存在,存在就是合理,那是不是其实demo是能跑通的,只是我缺了哪些步骤呢?把yeelight的论坛以及官网翻了个片后,我注意到官网的“局域网控制”入口,那是否我要给这些灯打开局域网控制才能够被发现呢?于是我被逼按照提示下载了他们的app来打开控制。再运行一遍mac版的demo,果然找到灯泡设备了!github上的项目也能顺利运行了。
没想到要运行成功一个demo,还需要经历探索、推理、逆转思路的过程,yeelight灯的开发入门真是趣味满满!建议官方出一个文档,让人按着步骤去做吧。这方面aqara的文档就做得好多了。
对比试用几个github库后,我最终选择了jamesblanksby的库来开发,虽然现在已经不再维护了。
实现如下:
先安装库:
npm i --save node-yeelight
再编写代码:
var Yeelight = require('node-yeelight');
var y = new Yeelight;
y.on('ready', function() {
console.log('ready');
y.discover();
});
y.on('deviceadded', function(device) {
console.log('device added');
y.connect(device);
});
var deviceList = [];
y.on('deviceconnected', function(device) {
console.log('device connected');
deviceList.push(device);
var state = true;
setTimeout(function(){
setInterval(function() {
// 设置灯泡开关及过度时间
// y.setPower(device, state, 2500);
state = state ? false : true;
// 设置灯泡亮度
y.setBrightness(
device, // device object
state?100:1, // brightness percentage (1-100)
800 // transition speed in ms
);
}, 1000);
},(deviceList.length-1)*1000);
});
y.listen();
以上代码实现的是两个灯轮流变光变暗,即开始的视频效果。
接着我搭配可编程的门窗传感器,总算实现了门开灯开的效果了。这个下午也没白呆了。可惜的是这个是局域网控制,就是要时刻开着服务器来控制,有点不太方便了,如果能提供云控制的办法就好了。
至此总算把功能实现了。在遇到新的技术难题时,我们要尝试从多个角度去分析应对,一条路走不通就换个思路走,在解决的过程中逐渐理解问题所在。另外还要懂得用轮子,弯路会少走很多,效率也会提高很多。