分类 ThingsBoard 下的文章

ThingsBoard是一款强大的开源平台,提供了丰富的功能来管理和监控物联网设备。其中,规则链(Rule Chains)是ThingsBoard中一个关键的特性,它允许用户定义和执行自定义的业务规则,实现设备数据的处理、转换和触发特定动作。本篇博客将带你在短短五分钟内学会使用ThingsBoard规则链,让你更灵活地管理你的物联网应用。

规则链概述

规则链,即低代码的逻辑处理模块,简而言之,描述了服务器在接收数据后的处理流程

有 3 个主要组成部分:

  • 消息: 任何传入事件。它可以是来自设备的传入数据、设备生命周期事件、REST API 事件、RPC 请求等。
  • 规则节点: 对传入消息执行的函数。有许多不同的节点类型可以对传入消息进行过滤、转换或执行某些操作。
  • 规则链: 节点通过关系相互连接,因此来自规则节点的出站消息被发送到下一个连接的规则节点。

创建规则链

在控制台的左侧导航栏中,找到并点击“规则链”选项。这将带你进入规则链管理页面,其中你可以查看和管理现有的规则链。

在设备配置管理页面,填写规则链的名称。保存后使用规则链。

截屏2023-12-29 14.32.34.png

规则链元素介绍

节点类型及其功能

在规则链中,有不同类型的节点,每个节点都有特定的功能。常见的节点类型包括:

  • 过滤器节点: 用于筛选数据,只允许满足特定条件的数据通过。
  • 属性集节点:用于更新传入消息的元数据
  • 转换器节点: 用于将数据从一种格式或单位转换为另一种格式或单位。
  • 动作节点: 用于触发特定的动作或通知。
  • 外部节点:用于与外部系统进行交互,提供将消息及数据路由到外部。

示例规则链

在 Thingsboard UI 中,转到规则链部分并打开根规则链。这个示例可以包括一系列节点,如上传遥测、存储日志和RPC调用等。

截屏2023-12-29 15.20.04.png

应用案例

数据过滤和清理

考虑一个场景,设备传感器每秒钟发送一批数据,但我们只对特定阈值以上的数据感兴趣。通过使用规则链的过滤器节点,可以轻松地过滤掉那些不满足条件的数据,只保留我们关心的数据。

在本案例中,我们将配置 ThingsBoard 规则引擎来存储 -40 到 80°C 范围内的所有温度。

截屏2023-12-29 14.46.21.png

我们将使用此脚本进行数据验证:

return msg.temperature < -40 || msg.temperature > 80

如果温度在有效范围内,脚本将返回True,否则将返回False。如果脚本返回True,传入消息将被路由到以True关系连接的下一个节点。

现在我们使用Post Telemetry关系将Message Type Switch节点与Script Filter节点连接:

截屏2023-12-29 14.30.04.png

接下来,我们需要使用True关系将Script Filter节点与Save Telemetry节点连接起来。因此所有有效的遥测数据都将被保存:

截屏2023-12-29 14.30.16.png

上传telemetry温度为200,我们将看到设备最新遥测部分中未添加遥测:

{
    "temperature": "200"
}

截屏2023-12-29 14.34.31.png

现在修改温度为24,再次发送请求

{
    "temperature": "24"
}

我们将看到遥测数据已成功保存。

截屏2023-12-29 14.35.09.png

实时数据转换

假设设备传感器提供的数据是以摄氏度为单位,但我们更喜欢使用华氏度。通过规则链中的转换器节点,可以将摄氏度转换为华氏度,确保我们得到的数据在我们熟悉的单位中。

下面的案例中,通过配置 ThingsBoard 规则引擎区分设备A和设备B,同时根据设备属性值分别将遥测数据中的温度进行不同处理。

我们使用到属性集节点中的originator attributes

截屏2023-12-29 15.04.00.png

在消息元数据中添加消息发起者属性(client\shared\server)和最新的遥测值,通过isTempCalculate属性区分设备A和设备B

截屏2023-12-29 15.01.27.png

我们会使用脚本来验证传入的温度是否在有效范围内,并返回Success或Failure。

截屏2023-12-29 15.04.53.png

我们将使用此脚本进行数据验证:

if (metadata.isTempCalculate && metadata.isTempCalculate === "true") {
    if (typeof msg.temperature !== 'undefined') {
        msg.temperature = precisionRound(msg.temperature / 10, 2);
    }
}else{

}

function precisionRound(number, precision) {
    var factor = Math.pow(10, precision);
    return Math.round(number * factor) / factor;
}

return {msg: msg, metadata: metadata, msgType: msgType};

上传一个温度值,确保规则链正确地执行了转换脚本并将数据保存。

{
"temperature": "200"
}

设备A:

截屏2023-12-29 15.06.03.png

设备B:

截屏2023-12-29 15.06.47.png

设备状态监控

在这个场景中,我们想要监控设备的状态,当设备状态发生变化时触发通知。通过规则链的动作节点,我们可以设置条件,例如设备断线或异常状态,以触发相应的通知或报警动作。

本节的案例,通过配置 ThingsBoard 规则引擎,当温度不在-40~80之间时发送设备告警,并向外部MQTT中发送原始数据信息

遥测数据上传成功后,通过script脚本判断温度是否在正常范围内,并添加新增告警和清除告警节点

截屏2023-12-29 15.34.51.png

我们将使用此脚本进行新增告警的逻辑处理:

var details = {};
details.temperature = msg.temperature;
if (metadata.prevAlarmDetails) {
    details = JSON.parse(metadata.prevAlarmDetails);
    //remove prevAlarmDetails from metadata
    delete metadata.prevAlarmDetails;
    //now metadata is the same as it comes IN this rule node
    details.count = details.count + 1;
}else {
    details.count = 1;
}

return details;

可以将规则链配置为使用转换节点链,以将正确的有效负载发送到MQTT代理。在成功发布消息的情况下,原始消息将通过Success链传递到下一个节点,否则将使用Failure链。

截屏2023-12-29 15.38.35.png

配置MQTT节点:

截屏2023-12-29 15.38.27.png

向Device发送一条带有温度 = 200 的遥测请求,查看设备的告警页面

截屏2023-12-29 15.38.35.png

同时MQTT接收到规则链发送的JSON

{
"tenantId": {
    "entityType": "TENANT",
    "id": "4d22a670-a52a-11ee-a5a6-494c5c858852"
},
"customerId": {
    "entityType": "CUSTOMER",
    "id": "13814000-1dd2-11b2-8080-808080808080"
},
"type": "General Alarm",
"originator": {
    "entityType": "DEVICE",
    "id": "33441de0-a5e5-11ee-a3e5-494c5c858852"
},
"severity": "CRITICAL",
"status": "ACTIVE_UNACK",
"startTs": 1703837072025,
"endTs": 1703837072025,
"ackTs": 0,
"clearTs": 0,
"details": {
    "temperature": 200,
    "count": 1
},
"propagate": false,
"propagateToOwner": false,
"propagateToTenant": false,
"propagateRelationTypes": [],
"id": {
    "entityType": "ALARM",
    "id": "e5ea5cd0-a620-11ee-948b-d78826584bf8"
},
"createdTime": 1703837072157,
"name": "General Alarm"
}

总结与建议

通过这篇博客,你将能够快速上手使用ThingsBoard规则链,包括规则链的元素介绍、实际应用示例、总结和建议等,后续将会进一步深入介绍和展示如何在ThingsBoard中灵活使用规则链,使读者能够在短时间内掌握这一强大功能。