采集型水表每日累计值计算及限量告警


采集型水表每日累计值计算及限量告警

水表通常上报的是当前读数,也就是累计用水量,单位是 。但是在实际使用中,我们希望记录水表每日的累计用量,在工业场景中对每日用量进行限量告警,通知企业主或客户关注用水情况。

通过 ThingsCloud 规则引擎云函数,可以非常快速的实现这个计算需求,我们创建一个属性上报预处理规则,在云函数中使用如下示例代码,请通过代码中的注释进行学习。

module.exports = function (report_attributes) {
    /**
     * report_attributes:   上报的属性对象,同时作为函数返回值。函数中可更新属性对象。
     */
    if (report_attributes.water !== undefined) {

        // 调用 ThingsCloud 内置函数,读取设备当前属性,也就是上次上报后的数据
        const attrs = Cloud.getCurrentAttributes();

        // 计算本次上报和上次的差值
        report_attributes.water_add = report_attributes.water - attrs.water;
        if (report_attributes.water_add < 0) {
            // 如果水表设备端清零读数,会出现负值,这里判断并做修正
            report_attributes.water_add = 0;
        }

        // 记录本次上报的年月日
        report_attributes.report_date = Cloud.Utils.dateFormat("YYYYMMDD");

        // 读取当前的累计增加值,默认为 0
        let water_add_total = attrs.water_add_total || 0;
        if (report_attributes.report_date !== attrs.report_date) {
            // 如果是新的一天首次上报
            // 保存每日的用水量,在历史数据中可以查看每日的用水量
            report_attributes.day_water = water_add_total;
            // 清零累计增加值,开始新一天的累加计算
            water_add_total = 0;
        }
        // 更新累计增加值
        report_attributes.water_add_total = water_add_total + report_attributes.water_add;

        // 默认告警状态为flase
        report_attributes.water_alarm = false;
        if (report_attributes.water_add_total > 100) {
            // 如果达到 100,告警为 true
            report_attributes.water_alarm = true;
        }

        // 更新水表上报次数
        report_attributes.water_count = (attrs.water_count || 0) + 1;
    }

    return report_attributes;
}

详细了解 ThingsCloud 消息规则,请浏览 消息规则