小米——永远相信美好的事情即将发生!Home Assistant智能家居

小米智能家居之使用JS API 开发控制Yeelight智能灯

2020-01-30  本文已影响0人  转移到知乎熊的一些事

我家里的小米智能电器有米家、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。

换上自己的开发者账号所在的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();

以上代码实现的是两个灯轮流变光变暗,即开始的视频效果。

接着我搭配可编程的门窗传感器,总算实现了门开灯开的效果了。这个下午也没白呆了。可惜的是这个是局域网控制,就是要时刻开着服务器来控制,有点不太方便了,如果能提供云控制的办法就好了。

至此总算把功能实现了。在遇到新的技术难题时,我们要尝试从多个角度去分析应对,一条路走不通就换个思路走,在解决的过程中逐渐理解问题所在。另外还要懂得用轮子,弯路会少走很多,效率也会提高很多。

上一篇下一篇

猜你喜欢

热点阅读