一、业务需求
ThingsBoard接受的默认格式为JSON,数据不能太复杂。
比如下面这种,能正常通过仪表板显示。
{"humidity": 30, "temperature": 21}
如果上传的数据是稍微复杂的结构,接受到的数据如下这样:
{
"Data": {
"C1_D1": [{
"Tagname": "C1.D1.Tag001",
"Value": 0,
"Quality": 0,
"Time": "2020-09-22T16:06:38.136+0800"
}, {
"Tagname": "C1.D1.Tag002",
"Value": 0,
"Quality": 0,
"Time": "2020-09-22T16:06:38.136+0800"
}]
}
}
Thingsboard接受后,会显示为如下样子,不便于直接的展示。
所以需要通过规则链来调整数据结构。
二、规则链
1、规则链作用
能够用于接收任何事件,可以是来自设备的,设备生命周期事件、REST API 事件、RPC 请求等的传入;
能够处理单个传入消息并生成一个或多个传出消息,发往不同的规则链路进行消息的路由处理,同时可以过滤,丰富,转换传入消息,执行操作或与外部系统通信。
- 在设备数据保存到数据库之前,支持对接收的遥测数据或属性数据进行拦截验证和修改;
- 将设备遥测数据或者设备属性从设备复制到相关资产,以便可以汇总遥测;
- 自定义告警规则/函数,进行设备告警触发、更新、清除;
- 根据设备生命周期事件触发操作。如设备上线、设备离线状态,创建告警事件;
- 加载所需的其他处理数据。在客户设备或租户属性中定义的设备的负载阈值;
- 发生复杂事件时发送电子邮件,并使用 “电子邮件模板” 中其他实体的属性;
- 根据定义的条件进行远程设备控制的 RPC 调用。
- 将设备实时数据、远程控制 RPC 指令,或者由规则引擎触发的告警或者事件,推送到与外部消息中间件或者第三方系统(如 Kafka,MQTT,RabbitMQ, Spark,AWS 服务等等)
2、规则结点类型
- 过滤结点: 用于消息过滤和路由
- 属性集节点: 用于更新消息的 metadata
- 变换结点: 用于变换消息中的信息项,如 Originator, Type, Payload, Metadata.
- 动作结点: 基于传入消息执行各种动作。
- 外部结点: 用于和外部系统交互。
三、实际应用
1、建立一个新的规则链
内有三个规则节点,输入,变换,保存时序数据。
核心功能在变换上,选择变换节点中script,输入变换的javascript脚本。
var data = msg.Data;
var datas = [];
for (var key in data) {
datas = data[key];
}
var newmsg = {}
for (var i in datas) {
var od = datas[i];
newmsg[od.Tagname] = od.Value;
}
return {
msg: newmsg,
metadata: metadata,
msgType: msgType
};
2、修改根规则链
增加设备判断,转发到新建的规则链
判断的方式大致如下:
return metadata.deviceName === 'PLC-300'
这样接受到的数据结果如下: