- 使用场景
- 前置条件
- Message flow
- 配置 Rule Chains
- 修改 Create & Clear Alarms with details:
- Alarm entity JSON (reference)
- 配置 Dashboard
- 创建 Dashboard
- 上报 telemetry 并验证
- 另请参阅
- 下一步
使用场景
本教程基于 create & clear alarms 教程及其使用场景。 我们将复用上述教程中的 rule chain,并在 Create Alarm 与 Clear Alarm 节点中配置 Alarm Details 功能。 假设你的设备使用 DHT22 传感器采集并上报温度数据到 ThingsBoard。 DHT22 适用于 -40 到 80°C 的温度范围,我们希望当温度超出该范围时生成 Alarm。
在本教程中,我们将配置 ThingsBoard Rule Engine 以实现:
- 统计每个设备出现临界温度更新的次数,并保存到 Alarm details。
- 将最新的临界温度值保存到 Alarm details。
前置条件
请确保已完成以下指南并阅读所列文章:
Message flow
本节说明本教程中各节点的作用:
- Node A: Create alarm node.
- 当上报温度不在预期范围内时(filter script 节点返回 True),创建或更新 alarm。
- Node B: Clear alarm node.
- 当上报温度回到预期范围内时(script 节点返回 False),若 alarm 存在则清除。
- Node C: Rule Chain node.
- 将入站消息转发到指定 Rule Chain Create & Clear Alarms with details。
配置 Rule Chains
本教程仅修改 Create & Clear Alarms rule chain,即在 Message flow 小节提到的节点中配置 Alarm Details 功能。
同时,我们将该 Rule Chain 重命名为 Create & Clear Alarms with details。
下图展示了上述 Rule Chains 的结构:
- Create & Clear Alarms with details:

- Root Rule Chain:

下载并导入用于 Create & Clear Alarms with details: 的 json file。
在 root rule chain 中按上图创建 Node C,将 telemetry 转发到导入后的 rule chain。
下文将说明如何修改该 rule chain,重点是节点 A 与 B。
修改 Create & Clear Alarms with details:
修改所需节点
在该 rule chain 中,你将修改 2 个节点,具体如下:
Node A: Create alarm
当上报温度不在预期范围内(script 节点返回 True)时,我们希望创建 Alarm。 同时将当前 temperature 写入 Alarm Details 字段。 若 alarm 已存在,则将 Alarm Details 中的 count 加 1;否则将 count 设为 1。
为实现该逻辑,需要重写 Details function:
Details function:
1
2
3
4
5
6
7
8
9
10
11
var details = {};
details.temperature = msg.temperature;
if (metadata.prevAlarmDetails) {
var prevDetails = JSON.parse(metadata.prevAlarmDetails);
details.count = prevDetails.count + 1;
} else {
details.count = 1;
}
return details;
Details function 会创建所需的 details 对象并设置初始参数。随后在 if 语句中判断是新 Alarm 还是已有 Alarm。 若已存在,则读取之前的 count 并递增。

如果在 Create Alarm 节点中新建了 Alarm,会通过关系 Created 传递到后续节点(若存在)。 如果 Alarm 被更新,会通过关系 Updated 传递到后续节点(若存在)。
Node B: Clear Alarm
当上报温度处于预期范围内(script 节点返回 False)时,我们希望清除已有 Alarm。 同时在清除时,将最新 temperature 写入 Alarm details。
为实现该逻辑,需要重写 Details function:
Alarm Details function:
1
2
3
4
5
6
7
var details = {};
if (metadata.prevAlarmDetails) {
details = JSON.parse(metadata.prevAlarmDetails);
}
details.clearedTemperature = msg.temperature;
return details;

如果 Clear Alarm 节点未找到已有 Alarm,则不会发生变更,原始消息会通过关系 False 传递到后续节点(若存在)。 如果 Alarm 存在,则会被清除并通过关系 Cleared 传递到后续节点。
Rule chain 配置完成后请保存。
Alarm entity JSON (reference)
下例展示了一个典型(默认)已创建 alarm 的 JSON 结构。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
"type": "High Temperature Alarm",
"originator": {
"id": "784f394c-42b6-435a-983c-b7beff2784f9",
"entityType": "DEVICE"
},
"originatorName": "SCADA device A1",
"status": "ACTIVE_UNACK",
"severity": "CRITICAL",
"acknowledged": false,
"cleared": false,
"assigneeId": {
"id": "784f394c-42b6-435a-983c-b7beff2784f9",
"entityType": "USER"
},
"createdTime": 1634058704565,
"startTs": 1634058704565,
"endTs": 1634111163522,
"ackTs": 1634115221948,
"clearTs": 1634114528465,
"assignTs": 1634115928465,
"details": {},
"propagate": true,
"propagateToOwner": true,
"propagateToOwnerHierarchy": true,
"propagateToTenant": true,
"propagateRelationTypes": [
"string"
],
"id": {
"id": "784f394c-42b6-435a-983c-b7beff2784f9",
"entityType": "ALARM"
}
}
Alarm Status Filter 节点仅按状态过滤(Active、Cleared、Acknowledged 等)。若需按类型或其他属性过滤,请在 rule chain 中使用 Script 或 Switch 等过滤节点。
配置 Dashboard
下载并导入本教程使用的 dashboard json file。
- 进入 Dashboards -> Add new Dashboard -> Import Dashboard,拖拽导入下载的 json 文件。
你也可以从零开始创建 Dashboard,下文将给出步骤:
创建 Dashboard
我们将为所有 Thermostat 设备创建 Dashboard,并添加 Alarm widget。先创建新 Dashboard:

点击 Edit dashboard,添加会解析到所有 Thermostat 类型设备的 alias:

向 Dashboard 添加 Alarm widget(Add new widget -> Alarm widget bundle -> Alarms),并选择已配置的 alias entity alarm source。 同时添加额外的 alarm fields。
- details.temperature.
- details.count.
- details.clearedTemperature.
然后点击字段的 edit 按钮,重命名各字段标签:
-
From: -> To:
- details.temperature -> Event Temperature.
- details.count -> Events count.
- details.clearedTemperature -> Clear Temperature.

上报 telemetry 并验证
设备 telemetry 上报将使用 Rest API(link)。 在此之前,需要从设备 Thermostat Home 复制 access token。

*you need to replace$ACCESS_TOKENwith actual device token
发送 temperature = 99,Alarm 应被创建:
1
curl -v -X POST -d '{"temperature":99}' http://localhost:8080/api/v1/$ACCESS_TOKEN/telemetry --header "Content-Type:application/json"

发送 temperature = 180,Alarm 应被更新且 count 字段递增:
1
curl -v -X POST -d '{"temperature":180}' http://localhost:8080/api/v1/$ACCESS_TOKEN/telemetry --header "Content-Type:application/json"

发送 temperature = 30,Alarm 应被清除并显示 cleared temperature:
1
curl -v -X POST -d '{"temperature":30}' http://localhost:8080/api/v1/$ACCESS_TOKEN/telemetry --header "Content-Type:application/json"

此外,你还可以了解如何:
- 定义额外的告警处理逻辑,例如发送邮件或向 Telegram App 发送通知。
具体可参考 另请参阅 小节中的链接。