之前我们已经学习了Thingsboard安装、设备接入、简单的数据可视化内容,今天来继续学习下thingsboard其他特性。
规则引擎
应用场景
ThingsBoard规则引擎是一个支持高度可定制复杂事件处理的框架,它的应用场景如下:
- 实时数据校验、检测、修改
- 数据聚合。如将多个设备数据聚合到其他集合中
- 根据预定条件 触发报警
- 设备生命周期事件触发操作。如设备上线、掉线报警
- 加载预先定义的阈值。如设备负载温度阈值
- 触发外部API调用
- 告警通知,如邮件、SNS
- 集成外部组件,如kafka、spark等 (专业版才支持)
规则组件
规则引擎是一个易于使用的框架,用于构建基于事件的工作流。主要由三个组件构成:
- 消息 - 任意来源的事件消息。可以终端上报数据、设备生命周期事件、外部API调用产生的数据
- 规则节点 - 可以理解为入站消息处理的一个功能点。ThingsBoard支持不同规则节点,如过滤、转换、事件处理
- 规则链 - 由多个相关联的规则节点共同组成的规则链条,前一个节点的输出作为后一个节点的输入。可以理解为责任链开发模式
为了有个初步的概念,先看一下规则链的展现形式。点击 “规则链库” , 选中 “Root Rule Chain”, 点击 “打开规则链”
如上图,黄色的部分表示不同的规则类型,可根据不同需求酌情选择,右侧是根规则链的组成。
业务案例
前提准备
- 在设备列表新增一个传感器设备 ( Temperature Sensors )
- 点击设备获取访问令牌
- 模拟设备数据上报
curl -v -X POST -d '{"temperature":90}' http://localhost:8080/api/v1/$ACCESS_TOKEN/telemetry --header "Content-Type:application/json"
# 替换上面的ip、ACCESS_TOKEN (上面复制的token)
-
数据验证
curl -v -X POST -d "{\"temperature\": 90}" http://192.168.0.5:8080/api/v1/L26p17Z0Ww5xVuXxinqB/telemetry --header "Content-Type:application/json" # 执行上面的命令,可以发现系统已经接收到最新的值。
校验规则
假设温度传感器采集并推送数据到ThingsBoard平台,正常情况下温度的值在 -40°C 到 +80°C之间.基于这种业务场景,我们存储正常温度的值,同时对非正常温度数据记录日志。
-
打开根规则链 拖入 script rule node 到规则面板中
-
输入验证脚本
return typeof msg.temperature === 'undefined'
|| (msg.temperature >= -40 && msg.temperature <= 80);
-
存储之前 先验证数据
-
加入日志规则节点
- 分别上报数据
# 第一次
curl -v -X POST -d "{\"temperature\": 120}" http://192.168.0.5:8080/api/v1/L26p17Z0Ww5xVuXxinqB/telemetry --header "Content-Type:application/json"
# 第二次
curl -v -X POST -d "{\"temperature\": 40}" http://192.168.0.5:8080/api/v1/L26p17Z0Ww5xVuXxinqB/telemetry --header "Content-Type:application/json"
- 测试结果
日志记录,打开日志规则详情 查看详情
正常数据
触发报警
使用Thingsboard为终端设备配置电子邮件、短信通知非常的简单,只需要配置简单的规则即可实现。在Thingsboard中 规则引擎是一个非常有用的特性。报警规则有以下属性组成:
-
报警类型 - 报警类型在设备报警规则组内部必须唯一
-
触发条件 - 定义报警触发的条件,触发条件由以下规则组成
- 报警级别 - Thingsboard 依据报警级别降序验证触发条件。例如,一个报警同时达到严重、轻微、警告不同级别的要求,只会发出级别最高的报警。同一个规则中的两个条件不能具有相同的报警级别
- 关键字过滤 - 用于属性值的逻辑判断。如“(temperature< 0 or temperature> 20) And softwareVersion = ‘2.5.5’”
- 条件类型 - 支持简单、连续时间、重复等类型。如连续3次或者5分钟类。只要第一个匹配事件发生,即可触发报警。
- 定时任务 - 定义规则处于启用状态的时间计划。一直启用、特定时间启用、用户自定义。
- 报警明细 - 报警信息模板支持使用 ${attributeName} 语法来替换动态属性值
-
清除条件 - 必要的时候清空报警条件
-
高级设置 - 支持向不同租户、终端用户、其他实体进行报警传播
业务场景
假设需要对冰箱内部高价值的物品进行实时跟踪,现在来学习下如何使用报警规则满足不同的报警要求。
新增报警条件
- 点击"设备配置" -> 选中 default 配置 -> 添加报警规则
- 添加报警条件,这里设置温度 > 80
- 选择报警级别
添加报警规则引擎
发送报警数据
curl -v -X POST -d "{\"temperature\": 120}" http://192.168.0.5:8080/api/v1/L26p17Z0Ww5xVuXxinqB/telemetry --header "Content-Type:application/json"
如上图已经触发报警。
邮件通知
我们在上面触发报警时,更进一步发送邮件通知,以此来完成更好的用户体验。
设置系统邮件
首先使用超级管理员账号,登录系统,点击系统 -> 发送邮件 设置邮箱基本信息,并进行测试。后续需要用到此项设置
Transform Script 引擎
metadata.temperature = msg.temperature;
return {msg: msg, metadata: metadata, msgType: msgType};
上面这一步非常重要 将温度数据放入到元数据中,后续邮件模板中 ${temperature} 可以引用元数据中的值,此外 该规则节点需要放置到报警规则节点前面。
To Mail 引擎
添加To Mail 引擎,关联之前校验引擎节点,返回False时 发送邮件。
Send Mail 引擎
整体规则链关联如下
发送异常数据
curl -v -X POST -d "{\"temperature\": 118}" http://192.168.0.5:8080/api/v1/L26p17Z0Ww5xVuXxinqB/telemetry --header "Content-Type:application/json"
验证结果
邮件规则日志
至此 邮件发送成功!