最近在整理thingsboard课程,基于最新thingsboard版本3.9.1/4.0,欢迎大家收藏、关注我,提问,在评论区留言,我争取把最新、最准、最好的课程,呈现在各位亦师亦友的csdn广大读者面前。
目录
1. 变换节点
1.1节点-change originator
本节点:修改传入消息的发起者。
传入消息都具有标识提交消息的发起者实体(originator字段),originator可以是设备、资产、客户、租户等。(消息格式参见Mark-20250204-1)
使用场景:
当传入消息应作为来自一个实体(比如机床设备)的消息时,在应用层需要知道这个消息属于哪个范畴,应该把遥测数据复制给更高级别的实体(比如资产或客户)。
(应该在Save Timeseries node之前添加该节点)
更高阶别的实体,在此有五种选择,如下:
选择客户,如下:
选择租户,如下:
选择Alarm originator,如下:
说明:当传入消息发起者是告警时才可以选择Alarm Originator这个选项。
选择Related entity,如下:
说明:
如果发现多个关联实体,则只使用第一个实体作为新的发起者,其他实体将被丢弃。
如果没有找到相关实体,则失败,否则成功。
选择 Entity by name pattern,如下:
说明:
如果发现多个关联实体,则只使用第一个实体作为新的发起者,其他实体将被丢弃。
如果没有找到相关实体(设备/资产/实体视图/用户/边缘),则失败,否则成功。
1.2节点-copy key-value pairs
本节点:清除告警。
注意:本节点的相反操作节点:create alarm
默认脚本:
var details = {};
if (metadata.prevAlarmDetails != null) {
details = JSON.parse(metadata.prevAlarmDetails);
//remove prevAlarmDetails from metadata
metadata.remove('prevAlarmDetails');
//now metadata is the same as it comes IN this rule node
}
return details;
1.3节点-deduplication
本节点:删除重复消息。删除重复时可指定某一时间段、指定删除重复策略。
说明:
FIRST - return first message that arrived during deduplication period.FIRST.
-获取执行期间的第一条到达消息。
LAST - return last message that arrived during deduplication period.LAST.
-获取在执行期间的最后一条到达消息。
ALL - return all messages as a single JSON array message. Where each element represents object with msg and metadata inner properties.
-返回所有消息并封装成一个JSON数组消息。其中每个元素表示具有和内部属性的对象。
1.4节点-delete key-value pairs
本节点:从消息或消息元数据中删除key-value键值对。
本节点输出:Success/Failure。
1.5节点-json path
本节点:对json结构提取相关字段。
本节点输出:Success/Failure。
应用场景:
(1)设备上传复杂json,需要提取关键字段,用JSON Path提取;
(2)消息体嵌套多层结构,可以用JSON Path直接定位到某个key;
(3)先把字段提取到metadata,以便再用Switch节点做分流;
(4)数据预处理、简化后续节点逻辑;
举例说明,
{
"msg_Id": "u67e89363yd5722"
"device_id": "meter001",
"meteraddress": 23
"reports": {
"activepower": 4900,
"temerature": 35,
"current": 22,
"voltage": 320,
"frequency": 58
}
}
或者
{
"meterName": "TEST2",
"meterAddress": 12,
"reports": {"activepower": 4811, "temerature": 32, "current": 18, "voltage": 319, "frequency": 60}
}
应用场景测试:
1:
{
"meterName": "TEST2",
"meterAddress": 12,
"reports": {
"activepower": 4811,
"temerature": 32,
"current": 18,
"voltage": 319,
"frequency": 60
}
}
2:
{
"deviceName": "Test Device A2",
"deviceType": "default",
"ts": "1746673231902"
}
3:
319
4:
{
"deviceName": "Test Device A2",
"deviceType": "default",
"ts": "1746673231902"
}
1.6节点-rename keys
本节点:重命名消息体或消息元数据的字段key名字
说明:
如果current key name 的某个key名字在消息体或消息元数据中不存在,它将被直接忽略。
1.7节点-script
本节点:脚本编程。
举例说明,脚本如下:
var tempC = msg.temperature;
var tempF = (tempC * 9/5) + 32;
msg.temperature = tempF;
return {msg: msg, metadata: metadata, msgType: msgType};
1.8节点-splite array msg
本节点:将数组消息拆分为多个消息。
将数组消息拆分为单独的元素,每个元素作为单独的消息发送。所有出站消息将具有与原始数组消息相同的类型和元数据。
流程说明:
把一个数组消息(比如设备一次上报了很多条数据打包在一起);
拆分成一条一条单独的小消息,一条一条地继续流转后续规则节点;
场景说明:
主要用于处理批量上报、批量控制等场景。
批量上传多条传感器数据,需要单独报警;
一次下发多个控制指令,逐条处理;
应用场景测试说明:
(1)消息中有数组的情况
body本身就是一个数组:
[
{"temperature": 25, "sensor": "A"},
{"temperature": 30, "sensor": "B"}
]
消息体中有包含数组:
{
"deviceId": "SN-001",
"timestamp": 1625097600000,
"readings": [
{"sensor": "temp1", "value": 25.6},
{"sensor": "temp2", "value": 26.1},
{"sensor": "temp3", "value": 24.9}
]
}
(2)对于有数组消息的拆分
1:
{
"roomName": "R001",
"status": "open",
"temps": [{
"sensor": "temperatureIn",
"value": 25.1
}, {
"sensor": "temperatureOut",
"value": 26.1
}, {
"sensor": "temperatureDoor",
"value": 23.1
}]
}
2:
{
"deviceName": "Test Device A2",
"deviceType": "default",
"ts": "1745757814249"
}
5:
(3)对于原始遥测上报消息格式就是数组形式,系统自动分割。
原始消息格式[{"key1": "value1"}, {"key2": "value2"}]
不显式调用 split array msg节点。
1:
{
"key1": "value1"
}
2:
{
"key2": "value2"
}
1:
{
"key1": "value1"
}
3:
{
"key2": "value2"
}
5:
原始遥测上报消息格式:
[{"key1": [{"key11": "value11"}, {"key111": "value111"}] }, {"key2": [{"key22": "value22"}, {"key222": "value222"}] }]
1:
{
"key1": [{
"key11": "value11"
}, {
"key111": "value111"
}]
}
2:
{
"key2": [{
"key22": "value22"
}, {
"key222": "value222"
}]
}
1.9节点-to email
本节点:把消息转为邮件并发送。
使用方法:
收件邮件地址,
cc抄送邮件地址,
bcc密送邮件地址,
subject邮件主题,
content邮件正文,
节点的传入消息,如下
假设在创建警报之后,我们获取的消息:
{
"msg": {
"temperature": 32
},
"metadata": {
"deviceType": "Thermostat",
"deviceName": "TH-001",
"ts": "1705379440000",
"GuardUser": "monitor@qeeking.cn",
"AdminUser": "david.jing@163.com",
"Subscribers": "mike.wang@aliyun.net,tom.zhao@qq.com,jeff.zhang@126.com"
}
}
配置 to email节点的方法如下:
Email Sender:
From*:${GuardUser}
Recipients:
To*:${AdminUser}
Cc*:${Subscribers}
Ccc:jingweidong@gmail.com
Message subject and content:
subject*:Device ${deviceType} temperature high
mail body type:plain text
body:Device ${deviceName} has high temperature ${temperature}
节点的传出消息如下:(紫色部分是to email节点构造出来的email消息数据)
{
"msg": {
"from": "monitor@qeeking.cn",
"to": "david.jing@163.com",
"cc": "mike.wang@aliyun.net,tom.zhao@qq.com,jeff.zhang@126.com",
"bcc": "jingweidong@gmail.com",
"subject": "Device Thermostat temperature high",
"body": "Device TH-001 has high temperature 32",
"images": null,
"html": false
},
"metadata": {
"deviceType": "Thermostat",
"deviceName": "TH-001",
"ts": "1705379440000",
"GuardUser": "monitor@qeeking.cn",
"AdminUser": "david.jing@163.com",
"Subscribers": "mike.wang@aliyun.net,tom.zhao@qq.com,jeff.zhang@126.com"
}
}