简介

HUAWEI HiLink智能家居主要是将传统家电增加HiLink通信模组(包含WiFi模组、蓝牙模组、Zigbee模组),将家电和HiLink联网,从而完成家电的远程控制、智能化场景、设备间的智能联动。
开发者需要,

您将建立什么

在这个Codelab中,你将创建出一个可以接入HiLink生态系统的空气净化器。这个空气净化器可以

您将会学到什么

硬件要求

软件要求

暂无

按下面的电路图,将HiLink模组开发板和全彩LED灯、按键,PM2.5传感器,风扇连接在一起,构建硬件调试环境。

下面是实际使用到的HiLink WiFi模组对应的GPIO信息:
LED红色:IO14,模式是PWM。
LED绿色:IO15,模式是PWM。
LED蓝色:IO12,模式是PWM。
总开关按键:IO19,模式是上拉输入。
风扇按键:IO22,模式是上拉输入
风扇控制:IO0,模式是PWM。
PM2.5传感器:IO18,IO23,模式是UART口。

本步骤是在开发者联盟的智能家居版块中,进行智能产品的创建。通过创建产品,开发者可以获得产品在HiLink生态中必要产品ID等基础数据。 创建产品过程中定义的产品信息,也将通过智能家居呈现给最终消费者。

  1. 使用企业认证通过的华为账号登录HiLink开发者平台网站 https://iot.openlab.huawei.com:8443/pages/login/login.html
  2. 点击左侧侧的"+"号,新建一个智能单品的开发项目。
  3. 本次Codelab是做一个硬件接入的设备,需要选择"硬件接入"
  4. 本次Codelab是准备开发一款"空气净化器",属于环境品类。
  5. 填写如下内容,注意通讯类型选择Wi-Fi
  6. 填写完基础信息后,点击下一步,进入"功能定义"阶段。

在如下界面选择本次开发的空气净化器对应的功能。开发者除了可以选择罗列出来的标准功能以外,还能够点击"自定义"按钮,定义标准功能以外的其他功能。除了标准功能和自定义功能,还有很多基础功能已经在HiLinkSDK中实现,比如OTA等,本次Codelab暂不对这部分基础功能进行描述。
本次Codelab主要实现5个标准功能:

  1. 开关,开关空气净化器功能。
  2. PM2.5,读取PM2.5数值,LED灯根据数值显示对应的RGB颜色(绿、黄、橙、红)。
  3. 风速调节,开关风扇,调节风速。
  4. 定时,定时开启和关闭的任务。
  5. 倒计时,对于当前状态进行延迟关闭或开启。

开发者确定完成功能选择后。进入下一步固件开发

进入固件开发步骤后,此次Codelab选择使用华为HiLink认证的AiLink模组"WF-R710-RTA1(N2)"基于JavaScript语言进行在线"模组二次开发"。

点击"在线编辑"打开在线编辑环境,开发功能定义中对应的硬件侧代码。

在线开发

  1. 模块引用与端口设置。
    本次Demo中PM2.5感应器是通过串口接入的,所以需要设置相关串口信息
  2. var hilink = require('hilink'); var uart = require('uart'); var pwm = require('pwm'); var gpio = require('gpio'); var tim = require('timer'); var port = uart.open({uartNum:1, baudRate:9600, dataBits:8, stopBits:1}); var sw=gpio.open({ pin:19, dir:gpio.DIR_IN, mode:gpio.PULLUP }); var speed=gpio.open({ pin:22, dir:gpio.DIR_IN, mode:gpio.PULLUP }); var r=pwm.open({pin:14,period:1000,duty:0}); var g=pwm.open({pin:15,period:1000,duty:0}); var b=pwm.open({pin:12,period:1000,duty:0}); var vsp=pwm.open({pin:0,period:1000,duty:0});
  3. LED灯调色,开关控制函数代码块
  4. var fan_speed = 0; //风扇转速 var count = 0, pmval=10; /** * LED灯光颜色设置,按照RGB方式设置。 */ function ledcolourSet(red, green, black) { r.set_duty(red); g.set_duty(green); b.set_duty(black); } /* * 总开关代码,打开:LED灯亮,风扇 */ function swithControl(value) { if (value == 1) { ledcolourSet(1, 1, 1); vsp.set_duty(fan_speed); } else { ledcolourSet(0, 0, 0); vsp.set_duty(0); } } sw.on(gpio.INT_RISING, function() { if (sw.read() == 1) { print("switch push down"); var status = services['switch'].data.on; if (status == 1) { swithControl(0); services['switch'].data.on = 0; } else { print("fan_speed: " + fan_speed); swithControl(1); services['switch'].data.on = 1; } print(services['switch'].data.on); hilink.upload('switch', ''); } });
  5. 风扇相关代码,包含状态上报
  6. speed.on(gpio.INT_RISING, function(){ if(speed.read() == 1) { print("speed push down"); services['fan'].data.gear += 1; if (services['fan'].data.gear > 5) services['fan'].data.gear = 0; services['fan'].ctrl(); hilink.upload('fan', ''); } });
  7. APP侧打开开关相关代码
  8. services['switch'] = { /* * this.data.on * bool 0:关;1:开; */ 'data': { 'on': 0 }, 'pm': 'GPR', 'ctrl': function () { print(this.data.on); swithControl(this.data.on); } };
  9. APP侧调整风速相关代码
  10. services['fan'] = { /* * this.data.gear * enum 0:自动;1:低风;2:中风;3:高风;4:强风;5:超强风; */ 'data': { 'gear': 0 }, 'pm': 'GPR', 'ctrl': function () { if(this.data.gear ==0) { fan_speed = 0.5; } else if(this.data.gear == 1) { fan_speed = 0.2; } else if(this.data.gear == 2) { fan_speed = 0.4; } else if(this.data.gear == 3) { fan_speed = 0.6; } else if(this.data.gear == 4) { fan_speed = 0.8; } else if(this.data.gear == 5) { fan_speed = 1; } else { fan_speed = 0.5; } print("fan_speed: "+fan_speed); vsp.set_duty(fan_speed); } };
  11. 设备配网成功后相关代码
  12. hilink.on(hilink.DEVSTAT, function(state) { if (state === 0) {/* TODO disconnect */ } else if (state === 1) { swithControl(0); services['switch'].data.on = 0; hilink.upload('switch', ''); } return 0; });
  13. 串口PM2.5传感器相关代码,包含状态上报
  14. var data2 = Buffer(24); port.on(uart.DATA, 48, function(data) { for (var i = 0; i < 24; i++) { if (data.readUInt8(i) == 0x42 && data.readUInt8(i + 1) == 0x4D) break; } data.copy(data2, 0, i, i + 24); var hval = data2.readUInt8(12); var lval = data2.readUInt8(13); pmval = (hval << 8) + lval; count += 1; if (count % 5 == 0) { count = 0; print('pm2.5:' + pmval); //5次显示上报一次 services['pm25'].data.current = pmval; if (pmval >= 0 && pmval <= 35) {//优 services['pm25'].data.level = 1; ledcolourSet(0, 1, 0); } else if (pmval > 35 && pmval <= 75) {//良 services['pm25'].data.level = 2; ledcolourSet(1, 1, 0); } else if (pmval > 75 && pmval <= 115) {//轻度 services['pm25'].data.level = 3; ledcolourSet(1, 0.843, 0); } else if (pmval > 115 && pmval <= 150) {//中度 services['pm25'].data.level = 4; ledcolourSet(1, 0.388, 0.278); } else if (pmval > 150 && pmval <= 250) {//重度 services['pm25'].data.level = 5; ledcolourSet(1, 0, 0); } else {//严重即以上 services['pm25'].data.level = 6; ledcolourSet(0.545, 0.202, 0.202); } hilink.upload('pm25', ''); } }); print('js execute done abcd');

在线代码部署调试

完成在线开发后,把开发板通过USB连接电脑,参考https://github.com/HWMapleJS/MapleJS/tree/master/tools安装对应的硬件和驱动。点击在线编辑器"connect"按钮,选择设备对应的串口号,Output菜单将展示"COMX is opened.",点击"deploy"按钮,把我们开发的js代码部署到模组。

开发完硬件侧代码后,返回开发者平台。点击下一步进入"交互开发"

每款产品在HiLink智能家居App上都有自己配套的UI控制界面。目前开放的UI界面开发方式有两种:

  1. 使用开发者联盟上的UI+在线开发工具来快速拖拽一个智能产品控制页面;
  2. 或者使用线下的HTML5方式开发控制页面,并将这个页面打包上传到平台

本次Codelab主要体验使用HiLink提供的UI+快速界面开发工具。
进入界面设计后,默认启用UI+工具,并根据当前产品的品类,以及产品选择的标准功能,自动生成一个默认布局的UI控制界面。
我们设定一个目标界面,如下图

将定时这个控件,调整为 一个长条形的,这样布局看上去比较合理。
首先,需要选中定时这个部件,然后在右侧菜单选中"显示长卡片"。

完成交互开发后,点击下一步,进入产品联网调测

在联网调测界面,默认进入的是模拟调测。可以在多终端预览我们的交互开发设计的界面。同时也可以选择真机调测,本次Codelab我们重点进行真机调测。

调测准备

点击"真机调测"扫码下载调测版华为智能家居APP,安装后打开APP,需要进入到"关于"中,进行相关配置。

需要将App连接的云修改到"厂家认证云"和切换环境目录到"测试环境(guide目录)"。

发现添加设备

打开智能家居App后,会自动发现一个新设备。这个设备的名称会根据开发者在创建产品时提供的产品名称。
然后根据智能家居App完成设备添加。建议,给新增的设备取合适的名称,避免和其他开发者重复(因为Codelab现场可能会有多个Demo共用同一个临时开发账号)。

点击进入产品控制页面后,会呈现该产品在UI+上设计的界面。开发者可以对该设备进行开关、风速设置、设置倒计时定时等功能。

测试设备基础功能

产品配置中主要有上述的3类,配网步骤图、产品图、场景联动。
本次Codelab主要体验设备联动配置,即IFTTT。(因时间关系,就不进行配网步骤图、产品图的处理了,使用默认空白的)

管理场景联动配置界面中,选择"开启状态"、"风速调节"这两个属性,既可以作为触发条件,也可以作为执行任务。然后点击保存,保存场景联动配置。

干得好,你已经成功完成了Codelab并学到了:

本Codelab中所用demo源码下载地址如下:

源码下载

已复制代码