跳至主要內容

属性上报规则

约 2701 字大约 9 分钟

属性上报规则

当云平台接收设备端的属性上报消息,并更新设备属性后,会触发设备的属性上报规则。

属性上报规则目前支持以下操作:

  • 向当前设备下发属性
  • 向当前设备更新云端属性
  • 向当前设备下发命令
  • 向当前设备下发自定义数据
  • 推送到外部 MQTT
  • 推送到外部 URL
  • 向当前网关上报子设备属性
  • 自定义云函数

当属性上报规则直接创建在设备下时,还支持以下操作:

  • 向指定设备下发属性
  • 向指定设备更新云端属性
  • 向指定设备下发命令
  • 向指定设备下发自定义数据

如下图:

向指定设备下发属性

该操作用于向指定的其它设备下发属性,实现设备联动功能。

选项

  • 选择下发到设备:在这里选择接收平台下发属性的设备。云函数中不需要指定接收的设备。
  • 云函数:动态生成下发属性 JSON 消息。
  • 延迟设置:可设置下发属性的延迟时间(秒数)。

云函数参数

  • report_attributes:设备上报的属性集合,作为参数传入函数。

云函数返回值

  • object:构造下发属性 JSON 消息。空的 JSON 对象表示不下发属性。
  • null:表示不下发属性到设备。

示例:根据温度自动开启风机

例如,当前传感器温度超过30度后,我们希望自动开启风机设备。

我们在操作配置界面中选择要下发的风机设备,假设开关属性为 fan_relay,编写云函数如下:

module.exports = function (report_attributes) {

    var push_attributes = {};
    var temperature = report_attributes.temperature;
    if (temperature !== undefined) {
        // 判断设备是否上报了温度值
        push_attributes.fan_relay = temperature > 30 ? true : false;
    }
    
    return push_attributes;
}

也可以换一种写法,使得在25度到30度之间避免频繁开关,云函数如下:

module.exports = function (report_attributes) {

    var push_attributes = {};
    var temperature = report_attributes.temperature;
    if (temperature !== undefined) {
        if (temperature > 30) {
            // 大于30度时开启风机
            push_attributes.fan_relay = true;
        } else if (temperature < 25) {
            // 小于25度时关闭风机
            push_attributes.fan_relay = false;
        } 
    }

    return push_attributes;
}

示例:为每个设备执行不同的判断

这是一个在智慧农业场景中的例子,我们用到内置函数 Cloud.getCurrentAttributes(),它可以读取设备当前的所有属性值,用于进行各种条件判断。

module.exports = function (report_attributes) {

    // 要下发的属性集合,先空着,如果后边不设置字段,则不会实际下发。
    const push_attributes = {};

    // 获取设备当前的所有属性
    const attrs = Cloud.getCurrentAttributes();

    // 读取上报属性里的光照强度
    const lightIntensity = report_attributes.lightIntensity;

    // 判断是否有上报光照强度,以及设备是否设置为自动模式
    if (lightIntensity !== undefined && attrs.controlMode == "auto") {
        if (lightIntensity < attrs.idealLightIntensity) {
            // 如果当前光照强度低于理想值,打开补光灯
            push_attributes.lightSupplement = true;
        } else {
            // 如果光照强度达到或超过理想值,关闭补光灯
            push_attributes.lightSupplement = false;
        }
    }

    return push_attributes;
}

以上函数中,读取了设备当前属性集合,利用了其中的 controlMode 来判断设备是否处于自动模式,以及 idealLightIntensity 来判断光照亮度是否低于理想值,从而决定是否开启或关闭补光灯。这两个属性都可以通过控制台或用户 App 为设备单独设置,从而实现一个规则对不同设备产生不同的结果。

向当前设备下发属性

该操作用于向当前设备下发属性,实现设备联动功能。

选项

  • 云函数:动态生成下发属性 JSON 消息。
  • 延迟设置:可设置下发属性的延迟时间(秒数)。

云函数参数

  • report_attributes:是设备上报的属性集合,作为参数传入函数。

云函数返回值

  • object:构造下发属性 JSON 消息。空的 JSON 对象表示不下发属性。
  • null:表示不下发属性到设备。

示例

例如,我们需要当设备上报开关量 di1 属性变为 ON 后,自动断开继电器 do1,可以编写如下的云函数:

 module.exports = function (report_attributes) {
    /**
     * report_attributes:   上报的属性对象,作为函数参数传入
     * push_attributes:     构造下发的属性对象,作为函数返回值,下发到硬件
     */
    var push_attributes = {

    };

    // 这里的 === 表示上报属性中必须存在 di1 且为 true
    if (report_attributes.di1 === true) {
        push_attributes.do1 = false;
    }
    return push_attributes;
} 

更多示例可参考 向指定设备下发属性,它们在云函数生成下发属性的部分是完全相同的。

向指定设备下发命令

该操作用于向其它设备下发命令,实现设备联动功能。

选项

  • 选择下发到设备:在这里选择接收平台下发命令的设备。云函数中不需要指定接收的设备。
  • 云函数:动态生成下发命令 JSON 消息。
  • 延迟设置:可设置下发属性的延迟时间(秒数)。

云函数参数

  • report_attributes:是设备上报的属性集合,作为参数传入函数。

云函数返回值

  • object 类型:构造一个下发到目标设备的命令 JSON 消息。空的 JSON 对象表示不下发命令。
  • null:表示不下发命令到设备。

提示

关于下发命令的消息结构说明,请浏览 设备接收云端下发命令

示例

例如,我们想根据传感器设备上报的温度,来自动执行继电器操作:

  • 当温度升到 35 度或以上,将继电器 #1、#2、#3、#4 开启一次,并在 60 秒后关闭。
  • 当温度降到 27 度或以下,将继电器 #5、#6、#7、#8 开启一次,并在 60 秒后关闭。

由于使用 ThingsEdge DTU 来连接 RS485 继电器,支持 下发开关量控制命令open in new window

规则操作中的云函数可以编写如下:

module.exports = function (report_attributes) {
    /**
     * report_attributes:   上报的属性对象,作为函数参数传入
     * command:             构造下发的命令对象,作为函数返回值,下发到硬件
     */
    var command = {}
    // 获得设备上一次的属性
    const attrs = Cloud.getCurrentAttributes();
    
    if (report_attributes.temperature >= 35 && attrs.temperature < 35) {
        // 如果当前温度大于等于 35 度,并且上一次小于 35 度
        command = {
            "method": "switch_relay",
            "params": {
                "attributes": ["relay1", "relay2", "relay3", "relay4"],
                "state": true,
                "delay_reverse": 60     // 60秒后反转
            },
            "id": 1000
        }
    } else if (report_attributes.temperature <= 27 && attrs.temperature > 27) {
        // 如果当前温度小于等于 27 度,并且上一次大于 27 度
        command = {
            "method": "switch_relay",
            "params": {
                "attributes": ["relay5", "relay6", "relay7", "relay8"], // 自己修改这里
                "state": true,
                "delay_reverse": 60     // 60秒后反转
            },
            "id": 1000
        }
    }

    return command;
}  

向当前设备下发命令

该操作用于向当前设备下发命令,实现设备联动功能。

选项

  • 云函数:动态生成下发命令 JSON 消息。
  • 延迟设置:可设置下发属性的延迟时间(秒数)。

云函数参数

  • report_attributes:是设备上报的属性集合,作为参数传入函数。

云函数返回值

  • object 类型:构造一个下发到目标设备的命令 JSON 消息。
  • null:表示不下发命令到设备。

提示

关于下发命令的消息结构说明,请浏览 设备接收云端下发命令

示例

可参考向 指定设备下发命令 的示例,除了目标设备不同,云函数的用法完全一致。

向指定设备下发自定义数据

该操作用于向其它设备下发自定义数据,通过目标设备支持的自定义数据流,可下发十六进制、文本、JSON 等格式。

选项

  • 选择下发到设备:在这里选择接收平台下发自定义数据的设备。云函数中不需要指定接收的设备。
  • 云函数:动态生成下发自定义数据。
  • 延迟设置:可设置下发属性的延迟时间(秒数)。

云函数参数

  • report_attributes:是设备上报的属性集合,作为参数传入函数。

云函数返回值

  • object 类型:构造一个下发到目标设备的自定义数据消息。
  • null:表示不下发数据到目标设备。

向当前设备下发自定义数据

该操作用于向当前设备下发自定义数据,通过目标设备支持的自定义数据流,可下发十六进制、文本、JSON 等格式。

选项

  • 云函数:动态生成下发自定义数据。
  • 延迟设置:可设置下发属性的延迟时间(秒数)。

云函数参数

  • report_attributes:是设备上报的属性集合,作为参数传入函数。

云函数返回值

  • object 类型:构造一个下发到目标设备的自定义数据消息。
  • null:表示不下发数据到目标设备。

推送到外部 MQTT

该操作将设备上报的属性直接转发到第三方 MQTT 服务器,需要填写 MQTT 主机名、端口、身份验证信息等。

推送到外部 URL

该操作将设备上报的属性,通过 HTTP 请求转发到您设置的第三方 URL。

请求格式

HTTP 请求头

Content-Type: application/json

HTTP 正文

采用 JSON 格式,数据示例如下:

{
    "device": {                 // 设备基础信息
        "id": "string",
        "name": "string",
        "device_key": "string"
    },
    "attributes": {             // 设备上报的属性集合
        ...
    },
    "ts": number                // 当前 Unixstamp 时间戳
}

向当前网关上报子设备属性

该操作将设备上报的属性转发到子设备,仅用于当前设备是网关类型的情况下。

选项

  • 云函数:动态生成向网关上报子设备属性的消息。

参数

  • report_attributes:是设备上报的属性集合,作为参数传入函数。

返回值

  • object 类型:构造一个向网关上报子设备的消息,消息格式请参考 上报子设备属性
  • null:表示不转发消息到子设备。

示例

module.exports = function (report_attributes) {
    /**
     * report_attributes:   上报的属性对象,作为函数参数传入
     */

    var data = {};
    if (report_attributes.devEUI) {
        data[report_attributes.devEUI] = report_attributes;
    }

    return data;
}   

以上云函数示例的详细介绍请浏览 星纵 LoRaWAN UG65 网关使用消息规则转发数据到子设备

自定义云函数

自定义云函数 操作可处理自定义逻辑,并支持一些内置函数,例如:

  • 更新设备云端私有属性
  • 给指定设备下发属性
  • 给指定设备下发命令