跳至主要內容

属性上报预处理规则

约 1742 字大约 6 分钟

属性上报预处理规则

属性上报预处理规则 的触发时间,是在云平台接收到硬件上报的属性,且在正式更新设备属性之前。适合用于对设备上报属性做必要的格式处理、二次计算、转化、合并等,总之可以进行任意的加工。

目前支持的操作如下:

预处理函数

提供了可编程的云函数,支持 Javascript 编程语言,如下:

module.exports = function (report_attributes) {
    /**
     * report_attributes:   上报的属性对象,同时作为函数返回值。函数中可操作属性对象。
     */
    
    return report_attributes;
}

提示

当您在消息规则中编辑云函数时,可以多多使用在线调试功能,帮助您验证代码的准确性,并提升开发速度。详细介绍请浏览:每日调用上亿次的消息规则云函数,如何在线测试?open in new window

示例:对设备上报的属性值做一些计算处理

这是一个最简单的例子,对设备上报的 temperature 温度属性值乘一个固定的系数 0.1,我们编写预处理函数如下:

 module.exports = function (report_attributes) {
    /**
     * report_attributes:   上报的属性对象,同时作为函数返回值。函数中可操作属性对象。
     */
    
    if (report_attributes.temperature !== undefined) {
        report_attributes.temperature = report_attributes.temperature * 0.1;
    }
    
    return report_attributes;
} 

当设备上报属性为:

{
    "temperature": 261
}

经过以上规则预处理后,设备上报的消息实际上变成了:

{
    "temperature": 26.1
}

示例:根据电池电压计算电池剩余容量

设备定时上报电池的原始电压值,根据电池手册中容量的计算方法,我们可以写出以下的预处理函数:

 module.exports = function (report_attributes) {
    /**
     * report_attributes:   上报的属性对象,同时作为函数返回值。函数中可操作属性对象。
     */
    
    if (report_attributes.volt !== undefined) {
        report_attributes.battery = (report_attributes.volt - 3.6) / 0.4 * 100;
    }
    
    return report_attributes;
} 

以上函数中,判断设备上报的 volt 属性如果存在,则通过计算,生成一个新的属性 battery 表示电池电量百分比。

示例:记录属性上报次数

假设我们要记录设备上报湿度 humidity 的次数,可以写一个这样的预处理函数:

module.exports = function (report_attributes) {

    if (report_attributes.humidity !== undefined) {
        // 读取设备当前的属性
        var curr_attrs = Cloud.getCurrentAttributes();

        if (curr_attrs.count === undefined) {
            // 计数count不存在,说明是首次上报
            report_attributes.count = 1;
        } else {
            // 计数+1
            report_attributes.count = curr_attrs.count + 1;
        }
        
    }

    return report_attributes;

}

在此基础上,还可以改为只统计当日的上报次数,或者计算当日的湿度平均值,思考一下如何实现呢?

示例:记录设备属性上报的最后更新时间

假设我们希望在控制台或者用户 App 中,直观的显示设备最后一次上报属性的日期时间,可以通过以下的属性上报预处理函数,生成一个新的属性 last_update_time 保存日期时间,您可以将这个属性放在 ThingsX App 的设备界面上。

这里会用到另一个内置函数 Cloud.Utils.dateFormat

module.exports = function (report_attributes) {

    report_attributes.last_update_time = Cloud.Utils.dateFormat("YYYY-MM-DD HH:mm:ss");

    return report_attributes;

}

如果我们的需求更进一步,希望记录湿度上报的最后更新时间,修改一下如下:

module.exports = function (report_attributes) {

    if (report_attributes.humidity !== undefined) {
        report_attributes.last_update_time = Cloud.Utils.dateFormat("YYYY-MM-DD HH:mm:ss");
    }

    return report_attributes;

}

ThingsCloud 还支持完善的时区设置,假设这里使用 美国东部时区 来生成日期时间,修改如下:

module.exports = function (report_attributes) {

    // 在函数开头设置时区
    Cloud.Utils.setTimezone("America/New_York");

    report_attributes.last_update_time = Cloud.Utils.dateFormat("YYYY-MM-DD HH:mm:ss");

    return report_attributes;

}

提示

预处理函数中除了可以调用 Javascript 的标准函数外,ThingsCloud 还提供了一系列的 内置函数库,增强了云函数的能力。

更多示例

GPS 位置坐标系转换

用于将 GPS 原始 WGS84 坐标转化为国内的 GCJ02(火星坐标)或 BD09(百度坐标),转化后的坐标可以在国内地图平台上正确显示位置。

在 ThingsCloud 的可视化看板中也提供了地图组件,同样经过这个坐标体系转换后,就可以显示正确的位置。如果直接显示 GPS WGS84 原始坐标,大概有几百米距离的偏移。

该操作需要填写以下内容:

  • 输入坐标属性:填写设备上报原始 GPS 位置的属性标识符,该属性必须是 MapPoint 类型。
  • 转换方式:选择希望转换的目标坐标体系。
  • 输出坐标属性:填写用于保存转换结果的属性标识符,该属性必须是 MapPoint 类型。

如果设备所属设备类型已经创建了相应的属性功能定义,以上填写属性标识符时,会有联想提示。

GPS 位置电子围栏检查(圆形)

用于判断某个坐标位置是否处于圆形地理区域内部,实现电子围栏的功能。

该操作需要填写以下内容:

  • 位置属性:填写表示设备当前位置的属性标识符。该属性必须是 MapPoint 类型。
  • 电子围栏属性:填写用于保存转换结果的属性标识符。该属性必须是 MapCircle 类型。
  • 结果属性:填写用于保存计算结果的属性标识符,输出结果的数据类似是 Boolean,代表是否处于电子围栏内部。

如果设备所属设备类型已经创建了相应的属性功能定义,以上填写属性标识符时,会有联想提示。

GPS 位置电子围栏检查(多边形)

用于判断某个坐标位置是否处于多边形地理区域内部,实现电子围栏的功能。

该操作需要填写以下内容:

  • 位置属性:填写表示设备当前位置的属性标识符。该属性必须是 MapPoint 类型。
  • 电子围栏属性:填写用于保存转换结果的属性标识符。该属性必须是 MapPolygon 类型。
  • 结果属性:填写用于保存计算结果的属性标识符,输出结果的数据类似是 Boolean,代表是否处于电子围栏内部。

如果设备所属设备类型已经创建了相应的属性功能定义,以上填写属性标识符时,会有联想提示。