本文提供了一个插座本地倒计时功能的开发案例,开发者可以参考本文,实现任意设备的本地倒计时功能。

背景信息

“本地倒计时”是指,由App页面向设备端下发“开始倒计时”的任务后,设备端开始根据本地时钟,执行倒计时任务。

要实现本地倒计时的效果,设备端和APP端需要按照本文推荐的方式进行实现。

  • 设备端:按照平台标准数据格式,实现倒计时任务的增删改。
  • APP端:在公版App中,或平台给自定义App提供的设备界面中,如“灯”“开关”,可以直接使用倒计时功能。

倒计时

与单路倒计时不同的是,多路倒计时可以同时对多个设备上的布尔值设定本地倒计时任务,如多路插座。


多路倒计时

操作步骤

  1. 在控制台人机交互 > 自动化和定时处,勾选本地定时功能,并在功能参数中设置本地定时的最大条数(与设备端的存储、性能有关)。

    本地倒计时

    平台会在功能定义中自动插入一个本地倒计时的标准功能(CountDownList),并支持多个定时任务。

    数据结构说明如下。

    • 功能名称:倒计时列表
    • 标识符:CountDownList
    • 类型:JSON
    CountDownList: {
    Target: "PowerSwitch"(string,当次设置操作指定的布尔值的identifier),
    Contents: "PowerSwitch-1-1-123-1535644800000,LightSwitch-0-1-456-1535644800000"(string, 该设备的所有倒计时任务字符串,具体格式说明见下方)
    XXX1:0(bool,该产品已有的布尔类型标准属性),
    XXX2:0(bool,该产品已有的布尔类型标准属性)
    }

    CountDownList是可选的标准属性,其中TargetContentsCountDownList的必选属性二者都是string类型(最大长度为2048字节)。

    XXX1XXX2为当前产品已有的标准布尔属性,可以由开发者随意增删,默认值为0。

    说明 功能定义里如果含有CountDownList,则CountDownList里除了TargetContents外,还需要含有其他的布尔属性,否则运行会报错。
    参数名称 类型 属性名 是否必选 长度 解释
    Target string 操作对象 2048 当次操作的布尔值类型的标准属性,用于表时倒计时的地点位置。
    Contents string 倒计时命令 2048 当同时设置多个布尔值属性的倒计时任务,且当前没有数组类型的数据,需采用该参数来存放设备的所有倒计时任务。
  2. 功能设计。
    • 设计倒计时功能。
      • 如果当前产品的功能定义里有CountDownList属性,那么此时走新的倒计时列表逻辑,在当前组件展示倒计时列表相关界面。
      • 如果当前产品的功能定义里没有CountDownList属性,但是有CountDown属性,那么则走以前的倒计时插件逻辑。
    • 撤销某个倒计时任务。
      • App删除Contents字段里对应identifier的任务,同时设置Target为这个identifier,上报云端,下发给设备端。
      • 设备端收到新的CountDownList属性,发现Target指定了一个identifier,但是Contents里却没有这个identifier,那么删除正在执行的identifier对应的倒计时任务,不影响其余的倒计时任务。

    场景举例如下。

    说明 整个插件和设备端上报云端的过程中,CountDownList里的XXX1XXX2等布尔属性可以设置为任意符合布尔属性的值。
    1. 单击倒计时按钮。
    2. 检查TSL,发现CountDownList里还有额外的XXX1XXX2属性。
    3. 倒计时列表弹层展示XXX1XXX2的中文名称列表。
    4. 选择其中一个属性,例如PowerSwitch,展示设置时间和动作界面,设定好时间(1000s)和动作(打开)。
    5. 设置Target: "PowerSwitch"Contents: "PowerSwitch-1-1-1000-1535644800000",下发给云端。
    6. 设备端收到CountDown后,解析Contents和Target内容,设置实际的定时任务。
    7. 设置了第二个属性XXX2。Contents为:PowerSwitch-1-1-1000-1535644800000,XXX2-0-1-2000-1535644800000,Target为:XXX2。
    1000s到了之后,第一个PowerSwitch倒计时任务结束,设备端删除Contents里PowerSwitch这一条任务,同时设置Target为PowerSwitch,将整个CnountDownList属性上报到云端,插件侧查询CountDown属性,发现Contents里没有Target指定的布尔属性,代表PowerSwitch倒计时任务已执行,进而提示PowerSwitch倒计时任务执行完毕。