跳至主要內容

属性下发类任务

约 1074 字大约 4 分钟

属性下发类任务

利用属性下发类任务,可以将设备单个属性或多个属性的下发操作,打包为一条快捷指令,实现随时复用。

目前支持以下几类任务动作:

静态属性下发

可以在编辑器中直接填写要下发的属性集合 JSON 代码,例如下图:

另外配合任务的定时运行机制,可以快速实现云平台对设备的各种控制指令的定时下发。例如您可以定时早晨 8:00 执行任务通知设备运行,晚上 19:00 执行任务通知设备关闭。

云函数属性下发

提供了自由度更高的云函数,来实时构造要下发给设备的属性集合。适合具有一定开发能力的用户使用,也可联系我们的技术支持提供指导。

示例:固定属性下发

这是一个最简单的例子,在云函数中构造一个固定的属性集合,效果和前边静态属性下发是相同的。云函数如下:

module.exports = function () {

    var push_attributes = {
        relay1: true,
        relay2: false
    };

    return push_attributes;
}

运行以上任务后,下发到设备的属性消息是这样的:

{
    "relay1": true,
    "relay2": false
}

示例:读取设备当前属性实现逻辑判断

通过调用内置函数库,在云函数中可以获取设备当前的属性值,这样我们便可以根据实际需求,对属性做各种各样的逻辑判断,从而动态生成要下发给设备的属性消息。

例如,我们编写以下的云函数,在任务运行时,根据设备最近一次上报的温度值,以及用户事先设置的温度下限值,来判断是否开启或关闭继电器,将生成的消息下发给设备。这个任务我们可以设置每 5 分钟定时执行一次。

module.exports = function () {

    // 读取设备当前的属性值
    const attributes = Cloud.getCurrentAttributes();
    var push_attributes = {};
    // 根据当前温度和阈值,决定继电器状态
    if (attributes.temperature > attributes.temperature_threshold) {
        // 如果温度大于阈值,继电器闭合
        push_attributes.relay1 = true;
    } else {
        // 否则,继电器断开
        push_attributes.relay1 = false;
    }

    return push_attributes;
}

示例:实现用户设置不同的定时操作

在这个例子中,我们希望每个用户可以在 App 上控制不同温室的棉被开启时间,我们在 App 界面上放置了时间控制组件,绑定了云端私有属性 time_set,App 界面编辑如下:

然后创建一个每隔 5 分钟运行的定时任务,编写以下云函数。

任务每次运行时,发现如果大于用户设置的时间,并且棉被没有开启,便下发消息控制电机的继电器属性 relay1 启动。

module.exports = function () {
    /**
     * push_attributes:     构造下发的属性对象,作为函数返回值,下发到硬件。
     */
    var push_attributes = {};
    
    const attrs = Cloud.getCurrentAttributes();
    // 获取用户设置的时间
    const time_set = attrs.time_set || "";
    // 获取当前继电器状态
    const relay1 = attrs.relay1 || false;
    
    
    if (time_set && !relay1) {
        // 如果用户设置了时间,并且继电器是断开状态
        
        // 获取当前时间的日期对象
        const now = new Date();
    
        // 将用户设置的时间分割成小时和分钟
        const [hours, minutes] = time_set.split(':').map(Number);
    
        // 创建一个新的日期对象,用于表示用户设置的时间
        const setTime = new Date(now.getFullYear(), now.getMonth(), now.getDate(), hours, minutes);
    
        // 比较当前时间和用户设置的时间
        if (now > setTime) {
            // 如果当前时间大于用户设置的时间,则在push_attributes中放置一个字段relay=true
            push_attributes.relay1 = true;
        }
    }

    return push_attributes;
}

在这个例子中,只需控制电机启动即可,当棉被到达限位后,会上报属性实现自动关闭电机。

那么,为什么不直接用任务的每日定时模式,指定一个固定时间呢?原因有两点:

  • 为了创建一个任务来管理所有温室设备,我们将任务创建到设备类型下,而每个温室设备的启动时间不同。
  • 需要让每个用户可以单独设置不同温室的启动时间。