写点什么

DIY 一款能随周围环境变化的智能灯泡,求婚必备!

用户头像
IoT云工坊
关注
发布于: 2021 年 02 月 01 日
DIY一款能随周围环境变化的智能灯泡,求婚必备!

参加了此次涂鸦实战训练营(基于 App SDK 玩转 IoT App 开发),主要目标是基于涂鸦的 SDK 开发一个基于 IoT 的控住智能灯的 App。SDK 支持 iOS 和 Android 开发,我参加此次的实战营主要目的是为了学习物联网的相关开发,自己了解一些 Android 的开发(并不善于 Android UI 的开发),所以我的 App 采用 Android SDK 开发,UI 的也是比较简陋,主要以验证功能为主。


此次实战营需要一些 Android 或 iOS 的开发基础,新建一个 Android 的工程,并添加涂鸦的 SDK 参考 Demo 即可,下面主要讨论涂鸦的 API 使用。


Demo 如下:


基于涂鸦 App SDK 开发一款 Android App 并控制智能灯


基于涂鸦 App SDK 快速地开发一款 iOS IoT App


以下内容为涂鸦开发者“@徐阳”创作,经其授权编辑发布:




功能主要分为以下几部分,账户管理,家庭管理,设备配网和设备控制。


账户管理


账户管理分为两个部分,用户注册和用户登录


用户登录


  

在界面上获取用户名和密码,然后赞登录按钮的回调函数中调用涂鸦的 api,并且利用 Toast 输出结果。


TuyaHomeSdk.getUserInstance().loginWithPhonePassword("86", uerName, password, new ILoginCallback() {    @Override    public void onSuccess(User user) {        Toast.makeText(MainActivity.this, "登录成功" , Toast.LENGTH_SHORT).show();        //Toast.makeText(MainActivity.this, "登录成功,用户名:" +TuyaHomeSdk.getUserInstance().getUser().getUsername(), Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this,MenuActivity.class); startActivity(intent);
}
@Override public void onError(String code, String error) { Toast.makeText(MainActivity.this, "code: " + code + "error:" + error, Toast.LENGTH_SHORT).show(); }});
复制代码


用户注册



用户注册其实分为两个部分,一个是获取验证码,一个是根据验证码注册账户


  • 获取验证码的过程,在获取按钮的回调函数中调用涂鸦 API


TuyaHomeSdk.getUserInstance().getValidateCode("86",uerName, new IValidateCallback(){    @Override    public void onSuccess() {        Toast.makeText(MainRegisterActivity.this, "获取验证码成功", Toast.LENGTH_SHORT).show();    }
@Override public void onError(String code, String error) { Toast.makeText(MainRegisterActivity.this, "code: " + code + "error:" + error, Toast.LENGTH_SHORT).show(); }});
复制代码


  • 获得验证码后调用涂鸦 api,进行账户的注册


TuyaHomeSdk.getUserInstance().registerAccountWithPhone("86",uerName,password,validatecode, new IRegisterCallback() {    @Override    public void onSuccess(User user) {        Toast.makeText(MainRegisterActivity.this, "注册成功", Toast.LENGTH_SHORT).show();    }    @Override    public void onError(String code, String error) {        Toast.makeText(MainRegisterActivity.this, "code: " + code + "error:" + error, Toast.LENGTH_SHORT).show();    }});
复制代码


家庭管理


家庭管理包含新建家庭,删除家庭等。其中还包括新建 room,将设备添加到 room 中,我的 App 中并没有实现 room 的功能,有兴趣可自己参考 api 实现。


  • 设备的配网,设备控制都需要家庭 id,所以新建家庭是必须的。


    


枚举家庭


TuyaHomeSdk.getHomeManagerInstance().queryHomeList(new ITuyaGetHomeListCallback() {    @Override    public void onSuccess(List<HomeBean> homeBeans) {        // do something        //text_view.sette        String stMsg = "ListHome Success,homesize="+homeBeans.size()+"\n";
for(int i=0;i<homeBeans.size();i++) { stMsg += "Home Id:" + homeBeans.get(i).getHomeId() + "\n"; }
text_view.setText(stMsg);
mHomeBeans = homeBeans;
} @Override public void onError(String errorCode, String error) { // do something text_view.setText("ListHome Failed\n"); }});
复制代码


新建家庭


List<String> rooms = new ArrayList();rooms.add("myhome1");TuyaHomeSdk.getHomeManagerInstance().createHome("myhome", 0, 0, "sh", rooms, new ITuyaHomeResultCallback() {    @Override    public void onSuccess(HomeBean bean) {        // do something        text_view.setText("NewHome Success\n");    }    @Override    public void onError(String errorCode, String errorMsg) {        // do something        text_view.setText("NewHome Failed"+"\n");    }});
复制代码


删除家庭


if(mHomeBeans == null){    text_view.setText("No Home\n");    return;}for(int i=0;i<mHomeBeans.size();i++) {    TuyaHomeSdk.newHomeInstance(mHomeBeans.get(i).getHomeId()).dismissHome(new IResultCallback() {        @Override        public void onSuccess() {            // do something            text_view.setText("DeleteHome Success\n");        }
@Override public void onError(String code, String error) { // do something text_view.setText("DeleteHome Failed" + error + "\n"); } });}
复制代码


设备配网



在配网按钮的回调中获取控件上的 ssid,passwd 的住,然后调用涂鸦配网 API。


设备配网 API 需要 homeid 所以必须完成家庭的管理,才可以进行设备的配网。


设备配网 API 调用成功后,利用获得控件上的 ssid,passwd,开始广播配网。


TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId, new ITuyaActivatorGetToken() {
@Override public void onSuccess(String token) {
ActivatorBuilder builder = new ActivatorBuilder() .setSsid(ssidName) .setContext(EZActivity.this) .setPassword(password) .setActivatorModel(ActivatorModelEnum.TY_EZ) .setToken(token) .setListener(new ITuyaSmartActivatorListener() {
@Override public void onError(String errorCode, String errorMsg) { Toast.makeText(EZActivity.this, "配网失败", Toast.LENGTH_SHORT).show(); }
@Override public void onActiveSuccess(DeviceBean devResp) { //多个设备同时配网,将多次回调
Toast.makeText(EZActivity.this, "配网成功", Toast.LENGTH_SHORT).show();
/*TuyaHomeSdk.newRoomInstance(roomId).addDevice(devResp.devId, new IResultCallback() { @Override public void onSuccess() { // do something Toast.makeText(EZActivity.this, "addDevice成功", Toast.LENGTH_SHORT).show(); } @Override public void onError(String code, String error) { // do something Toast.makeText(EZActivity.this, "addDevice失败", Toast.LENGTH_SHORT).show(); } });*/
finish();

}
@Override public void onStep(String step, Object data) {
Toast.makeText(EZActivity.this, "配网Step:" + step, Toast.LENGTH_SHORT).show();
finish(); } });
ITuyaActivator mTuyaActivator = TuyaHomeSdk.getActivatorInstance().newMultiActivator(builder); mTuyaActivator.start();
}
@Override public void onFailure(String s, String s1) {
}});
复制代码


设备控制


     


UI 做的比较简陋,实现开关灯,和 5 路灯的控制


控制灯需要调用 getHomeDetail 得到设备的 handle,在菜单页面的设备控制的回调函数中,先获得设备,然后启动当前的页面:


TuyaHomeSdk.newHomeInstance(mHomeBeans.get(0).getHomeId()).getHomeDetail(new ITuyaHomeResultCallback() {    @Override    public void onSuccess(HomeBean bean) {        // do something        List<DeviceBean> dev = bean.getDeviceList();        if(dev.size()>0)        {            Intent intent = new Intent(MenuActivity.this,DeviceActivity.class);            intent.putExtra("devid",dev.get(0).getDevId());  // 传递参数,根据需要填写            startActivity(intent);        }        else        {            text_view.setText("No Fevice\n");        }

}

@Override public void onError(String errorCode, String errorMsg) { // do something text_view.setText("Home Error\n"); }});
复制代码


开关灯


dps = "{\"1\": true}";//dps = "{\"102\": \"00ffff\"}";mDevice.publishDps(dps, new IResultCallback() {    @Override    public void onError(String code, String error) {        Toast.makeText(DeviceActivity.this, "开灯失败", Toast.LENGTH_SHORT).show();    }
@Override public void onSuccess() { Toast.makeText(DeviceActivity.this, "开灯成功", Toast.LENGTH_SHORT).show(); }});
复制代码


  • 关灯,设为 false


其他命令类似。


图片颜色和人脸识别


还实现了图片颜色和人脸检测的功能,主要是采用了别人的开源方案


https://github.com/bifan-wei/FaceDetector


获得图片数据,然后计算图片的平均值然后设置 rgb,检测到人脸后设置高亮。


想象一下,“月上柳梢头,人约黄昏后”。你和你的心上人牵手回家,万籁俱寂,你拿着求婚戒指的手已经全是汗。一开门,家里的灯泡检测到人脸,一盏盏开启,为你烘托出浪漫的氛围,最后,单膝下跪,抱得美人归。



这里有很多发挥的空间,添加各种检测算法,检测不同的场景来设置不同的灯颜色。


总结


1. 涂鸦的 API 使用很简单,通过账户,家庭,房间对设备的管理定义也很合理,参考涂鸦的 API doc 就实现了控制设备基本的功能。这次的活动时间较短,其实还是需要开发者具有一定的 Android 或者 iOS 的开发技术。由于我自己并非 Android 开发,只是以前简单的学习过一点点,而且平时时间也有限,所以这次做的 UI 和实现的功能也是比较简单,主要是以功能验证为主了。

2. 在开发过程中获取家庭的详细信息 getHomeDetail 这个 API 开始没有调用,导致一直获得不到设备 id,特此记录一下

3. 灯的功能点文档介绍不清晰,

//设置 dpId 为 101 的布尔型功能点示例 作用:开关打开 dps = {"101": true};

参考 Demo 的代码,开关的功能点为 1。其他功能类似。

还有灯的模式和 5 路灯关系没有弄的很明白。


用户头像

IoT云工坊

关注

公众号:涂鸦IoT开发平台(Tuya_IoT) 2020.10.31 加入

微信:tuya1077,回复“行业报告”,可获取2020年20多份最新物联网相关行业报告。

评论

发布
暂无评论
DIY一款能随周围环境变化的智能灯泡,求婚必备!