了解如何配置Rule Engine以基于Originator遥测规则节点计算遥测增量读数。
用例
假设我们有一台使用温度传感器来收集和读取ThingsBoard中的温度读数的设备。
另外,我们假设当最后五分钟的温度读数和最新的温度读数之间的差值超过5度时需要生成警报。
请注意这只是一个简单的理论用例,用于演示平台的功能。你可以将本教程用作更复杂场景的基础。
先决条件
我们假设你已完成以下指南并查看了以下文章:
消息流
在本节中我们将解释本教程中每个节点的用途。将涉及两个规则链:
- Root rule chain - 实际上将遥测从设备保存到数据库中,并将消息重定向到Temperature delta validation链
- Temperature delta validation - 规则链,实际计算最后五分钟的温度与最新的温度读数之间的增量。
结果如果增量值超过5度,将创建/更新警报,否则将清除警报。
以下屏幕截图显示了以上规则链的外观:
- Temperature delta validation:
- Root Rule Chain:
下载json文件以获取Temperature delta validation。
如上图所示在根规则链中创建节点G以将遥测转发到导入的规则链。
创建新的规则链(Temperature delta validation)
转到Rule Chains -> Add new Rule Chain
配置:
- 名称 : Temperature delta validation
添加所需的节点
节点A: Originator telemetry
- 添加Originator telemetry节点并将其连接到关联类型为Success的Input节点。
此规则节点将所选消息发起者的遥测信息添加到所选时间范围内的消息元数据中。
规则节点具有三种获取模式:
- FIRST: 从最接近时间范围开始处的数据库中检索遥测
- LAST: 从最接近时间范围末尾的数据库中检索遥测
- ALL: 从数据库中检索指定时间范围内的所有遥测。
使用模式:LAST其时间范围为24小时前到5分钟。
- 在名称字段中输入Latest five-minute old record。
提取模式全部
发起方遥测节点还支持从特定时间范围获取所有遥测的功能。
我们不会在本教程中使用此功能但是如果你需要根据特定时间范围内的遥测变化来计算特定键的方差或预测遥测的进一步变化该功能可能会很有用。
在这种情况下你需要选择提取模式ALL。它将强制规则节点从指定的时间范围获取所有遥测并将其作为数组添加到消息元数据中。
该数组将包含带有时间戳和值的JSON对象。
出站邮件的元数据将是具有以下结构的JSON文档:
{
"temperature": "[{\"ts\":1540892498884,\"value\":22.4},{\"ts\":1540892528847,\"value\":20.45},{\"ts\":1540892558845,\"value\":22.3}]"
}
为了将数组转换为有效的JSON文档,你可以使用以下函数:
var temperatureArray = JSON.parse(metadata.temperature);
The temperature array will look like introduced below:
{
"temperatureArray": [{
"ts": 1540892498884,
"value": 22.4
}, {
"ts": 1540892528847,
"value": 20.45
}, {
"ts": 1540892558845,
"value": 22.3
}]
}
节点B: Script Transformation
添加Script Transformation节点并将其连接到关系类型为Success的Change Orignator节点。
该节点将使用以下脚本计算从消息payload读取的温度与从消息metadata读取的五分钟旧温度之间的增量:
var newMsg = {};
newMsg.deltaTemperature = parseFloat(Math.abs(msg.temperature - JSON.parse(metadata.temperature)).toFixed(2));
return {msg: newMsg, metadata: metadata, msgType: msgType};
- 在名称字段中输入Calculate delta。
节点C: Save Timeseries
- 添加Save TimeSeries节点,并将其连接到关系类型为Success的Script Transformation节点。 该节点会将TimeSeries数据从传入的消息payload中保存到数据库中,并将其链接到被标识为Message Originator的设备。
- 在名称字段中输入Save Time Series。
节点D: Filter Script
添加Filter Script节点并将其连接到关系类型为Success的Save TimeSeries节点。
此节点将使用以下脚本验证最新温度读数与五分钟前温度读数之间的计算出的增量值是否不超过5度:return msg.deltaTemperature > 5;
在名称字段中输入Validate delta。
节点E: Create alarm
- 添加Create alarm节点并将其连接到关联类型为True的Filter Script节点。
如果发布的增量温度不在预期范围内(过滤器脚本节点返回True)则此节点将加载最新消息,该消息具有配置为Message Originator的警报类型的最新警报,即Thermometer
。 - 在名称字段中输入Create alarm并警报类型中输入General Alarm。
节点F: Clear Alarm
- 添加Clear Alarm节点并将其连接到关联类型为False的Filter Script节点。
此节点将为消息始发者Thermometer
加载配置了警报类型的最新警报,并在发布的温度增量在预期范围内的情况下清除警报(如果存在)(脚本节点返回False)。 - 在名称字段中输入Clear Alarm并警报类型中输入General Alarm.
修改Root Rule Chain
节点G: Rule Chain
- 添加Rule Chain节点并将其连接到关系类型为Success“成功”**的Save Timeseries节点。
该节点将传入消息转发到指定的规则链Temperature delta validation**。 - 选择Rule Chain字段:Temperature delta validation。
以下屏幕截图显示了最终的Root Rule Chain应该是什么样子:
- 为上述规则链下载json文件并将其导入。
- 不要忘记将新规则链标记为root。
如何验证规则链和后遥测
对于发布设备遥测我们将使用Rest API遥测上传API。为此我们将需要从设备Thermometer中复制设备访问令牌。
**你需要将$ACCESS_TOKEN替换为实际的设备令牌**
为了验证规则链是否按预期工作,我们需要对同一设备两次遥测两次,间隔不小于5分钟且不超过24小时。
另外,让我们在Create Alarm节点中按下调试模式按钮,以验证是否在第二次遥测请求之后创建警报。
发布temperature = 20
curl -v -X POST -d '{"temperature":20}' http://localhost:8080/api/v1/$ACCESS_TOKEN/telemetry --header "Content-Type:application/json"
延迟5分钟后,让我们发送例如温度 = 26
curl -v -X POST -d '{"temperature":26}' http://localhost:8080/api/v1/$ACCESS_TOKEN/telemetry --header "Content-Type:application/json"
应创建警报:
另外你可以:
- 在创建和清除警报节点中配置警报详细信息功能。
- 通过添加警报部件以可视化警报来配置仪表板。
- 定义用于警报处理的其他逻辑,例如,发送电子邮件。
请参阅另请参阅分下第二到第四的链接,以了解如何执行此操作。