ThingsBoard-设备告警推送
官方文档:
Create and Clear Alarms | ThingsBoard社区版
1、创建告警配置
简单实例
持续时间
仅当温度超过特定阈值设置时间才发出警报。
假设要将1分钟的持续时间替换为指定的设备、客户或租户的设置的动态值。
建议使用服务端属性这个功能。
请为设备创建一个服务器端属性“highTemperatureDurationThreshold” 其整数值是 “1”。
重复类型
仅当传感器连续3次报告温度超过阈值时才发出警报。
假设要将指定的设备、客户或租户的设置的动态值替换警报条件超出的设定次数。
建议使用服务端属性这个功能。
请为设备创建一个服务器端属性“highTemperatureRepeatingThreshold” 其整数值是 “3”。
自定义警报规则时间
高级
假设我们的用户能够从仪表板UI设置阈值并启用或禁用每个设备的某些警报,因为我们可以在警报规则中使用动态值进行匹配通过布尔值temperatureAlarmFlag和数字temperatureAlarmThreshold两个属性进行控制,然后匹配条件则是”temperatureAlarmFlag = True AND temperature is greater than temperatureAlarmThreshold“同步满足是产生警报。
租户或客户属性的动态阈值
如何根据设备的“temperatureAlarmFlag”属性值启用或禁用规则,如果想为属于租户或客户的所有设备启用或禁用某些规则怎么办?为避免为每个设备配置属性可以配置警报规则以将常量值与租户或客户属性的值进行比较因此使用“常量”键类型并将其与动态值进行比较。
规则链配置
设备配置规则节点根据设备配置中定义的警报规则创建和清除警报。 默认情况下这是处理链中的第一个规则节点并对所有输入消息的属性和遥测值做处理。
规则节点中有两个重要的设置:
Persist state of alarm rules - 强制规则节点存储处理状态默认为禁用如果有持续时间或重复条件可以启用此设置;假设有一个条件“温度大于50度并持续1小时”并且在下午1点上报第一个温度大于50度的事件; 下午2点应该会收到警报(假设温度条件不会改变); 如果将在下午1点之后和下午2点之前重新启动服务器则规则节点需要从数据库中查找状态。
如果启用此选项和‘Fetch state of alarm rules’选项规则节点将能够产生警报否则规则节点将不会产生警报,由于性能原因默认禁用此设置如果需要启用并且输入消息至少符合一个警报条件。
Fetch state of alarm rules - 强制规则节点恢复初始化时的处理状态默认为禁用如果有持续时间或重复条件可以启用此设置;必须与’Persist state of alarm rules’选项同时使用,但是在较少情况下可能设置’Persist state of alarm rules’为禁用。
假设有许多频繁或持续发送数据的设备可以避免在初始化时从数据库加载状态当收到指定设备的第一条消息到达时规则节点将从数据库中获取状态。
2、生成报警、消除报警
3、自定义规则链判断告警
4、通过kafka 推送报警消息
创建报警 根据"cleared": false,区分告警还是销警
{
"id": {
"entityType": "ALARM",
"id": "73cf3f6c-2e3e-44a1-9841-b3583a736411"
},
"createdTime": 1736669031589,
"tenantId": {
"entityType": "TENANT",
"id": "fdb7d750-cf4d-11ef-9e5f-3501d5c87d74"
},
"customerId": null,
"type": "温度过高报警",
"originator": {
"entityType": "DEVICE",
"id": "ad815df0-cf4e-11ef-9e5f-3501d5c87d74"
},
"severity": "CRITICAL",
"acknowledged": false,
"cleared": false,
"assigneeId": null,
"startTs": 1736669031578,
"endTs": 1736669031578,
"ackTs": 0,
"clearTs": 0,
"assignTs": 0,
"propagate": false,
"propagateToOwner": false,
"propagateToTenant": false,
"propagateRelationTypes": [],
"originatorName": "Test 设备",
"originatorLabel": "Test 设备",
"assignee": null,
"name": "温度过高报警",
"status": "ACTIVE_UNACK",
"details": {
"data": "温度过高,当前值100.12"
}
}
消除报警
{
"id": {
"entityType": "ALARM",
"id": "73cf3f6c-2e3e-44a1-9841-b3583a736411"
},
"createdTime": 1736669031589,
"tenantId": {
"entityType": "TENANT",
"id": "fdb7d750-cf4d-11ef-9e5f-3501d5c87d74"
},
"customerId": null,
"type": "温度过高报警",
"originator": {
"entityType": "DEVICE",
"id": "ad815df0-cf4e-11ef-9e5f-3501d5c87d74"
},
"severity": "CRITICAL",
"acknowledged": false,
"cleared": true,
"assigneeId": null,
"startTs": 1736669031578,
"endTs": 1736669031578,
"ackTs": 0,
"clearTs": 1736669056509,
"assignTs": 0,
"propagate": false,
"propagateToOwner": false,
"propagateToTenant": false,
"propagateRelationTypes": [],
"originatorName": "Test 设备",
"originatorLabel": "Test 设备",
"assignee": null,
"name": "温度过高报警",
"status": "CLEARED_UNACK",
"details": {
"data": "温度正常,当前温度1.12"
}
}
备注:tb 报警不会返回entityKeys,修改源码后返回的
Set<AlarmConditionFilterKey> entityKeys = ruleState.getEntityKeys();
if (CollectionsUtil.isNotEmpty(entityKeys)){
newDetails.put("entityKeys", entityKeys.stream().map(AlarmConditionFilterKey::getKey).collect(Collectors.joining(",")));
}