TB规则引擎是一个可高度定制,可配置的处理复杂事件的系统。使用规则引擎可以过滤、富集和转换来自物联网设备和相关资产的传入消息。您还可以触发各种操作,例如通知或与外部系统通信等。
关键概念
规则引擎消息
规则引擎消息是一个可排序的、不可变的数据结构,它表示系统中的各种消息。例如:
- 传入的遥测数据、属性更新或者设备RPC请求;
- 实体生命周期事件:创建、更新、删除、分配、未分配、属性更新;
- 设备状态事件:连接、未连接、激活、未激活等;
- 其他系统事件
规则引擎消息包含以下信息:
- 消息ID:基于时间的通用唯一标识符;
- 消息发起者:设备、资产或其他实体标识符;
- 消息类型:“Post telemetry” 或 “Inactivity Event”等;
- 消息的有效载荷:实际消息有效载荷的JSON体;
- 元数据:消息相关的附加数据键值对列表。
重新定义消息类型 预定义消息类型列表如下表所示:
消息类型 | 显示名称 | 描述 | 消息元数据 | 消息有效负载 |
---|---|---|---|---|
POST_ATTRIBUTES_REQUEST | Post attributes | 设备请求发布客户端属性(参见属性api) | deviceName-消息发起者名称, deviceType - 发起者设备类型 | key/value json: { "currentState": "IDLE" } |
POST_TELEMETRY_REQUEST | Post telemetry | 设备请求发布遥测(参见遥测上传api) | deviceName - 消息发起者名称,deviceType - 发起者设备类型,ts - 时间戳(毫秒) | key/value json: { "temperature": 22.7 } |
TO_SERVER_RPC_REQUEST | RPC Request from Device | 设备的RPC请求(参考客户端RPC) | deviceName - 发起者设备名称,deviceType - 发起者设备类型,requestId - 客户端提供的RPC请求ID | Json包含方法和参数: { "method": "getTime", "params": { "param1": "val1" } } |
RPC_CALL_FROM_SERVER_TO_DEVICE | RPC Request to Device | 从服务器到设备的RPC请求(请参阅服务器端RPC api) | requestUUID - 内部请求ID由持续支持用于识别应答目标,expirationTime - 请求将过期的时间,oneway - 指定请求类型:true -无响应,false -带响应 | json containing method and params: { "method": "getGpioStatus", "params": { "param1": "val1" } } |
ACTIVITY_EVENT | Activity Event | 指示设备变得活跃的事件 | deviceName - 发起者名称,deviceType - 发起者类型 | json包含设备活动信息: {"active": true,"lastConnectTime": 1526979083267,"lastActivityTime": 1526979083270,"lastDisconnectTime": 1526978493963,"lastInactivityAlarmTime": 1526978512339,"inactivityTimeout": 10000} |
INACTIVITY_EVENT | Inactivity Event | 指示设备不活跃的事件 | deviceName - 发起者设备名称,deviceType - 发起者设备类型 | json 包含设备活动信息, 参见 Activity Event 有效负载 |
CONNECT_EVENT | Connect Event | 设备连接上时发生的事件 | deviceName - 发起者设备名称,deviceType - 发起者设备类型 | json 包含设备活动信息, 参见 Activity Event 有效负载 |
DISCONNECT_EVENT | Disconnect Event | 设备断开连接时发生的事件 | deviceName - 发起者设备名称,deviceType - 发起者设备类型 | json 包含设备活动信息, 参见 Activity Event 有效负载 |
ENTITY_CREATED | Entity Created | 在系统中创建新实体时产生的事件 | userName - 创建实体的用户名称,userId - 用户 Id | json containing created entity details: {"id": {"entityType": "DEVICE","id": "efc4b9e0-5d0f-11e8-8559-37a7f8cdca74" },"createdTime": 1526918366334,..."name": "my-device","type": "temp-sensor"} |
ENTITY_UPDATED | Entity Updated | 更新现有实体时产生的事件 | userName - 更新实体的用户名称,userId - 用户 Id | json 包含更新的实体详情, see Entity Created payload |
ENTITY_DELETED | Entity Deleted | 删除现有实体产生的事件 | userName - 删除实体的用户名称,userId - 用户Id | json containing deleted entity details, see Entity Created payload |
ENTITY_ASSIGNED | Entity Assigned | 将现有实体分配给客户时产生的事件 | userName - 执行分配操作的用户名,userId - 用户Id,assignedCustomerName - 分配客户名称,assignedCustomerId - 分配的客户ID | json containing assigned entity details, see Entity Created payload |
ENTITY_UNASSIGNED | Entity Unassigned | 当现有实体未从客户分配时产生的事件 | userName - 执行未分配操作的用户名,userId - 用户Id,unassignedCustomerName - 未分配的用户名称,unassignedCustomerId - 未分配的用户Id | json containing unassigned entity details, see Entity Created payload |
ADDED_TO_ENTITY_GROUP | Added to Group | 将实体添加到实体组时产生的事件。这种消息类型是特定于ThingsBoard PE的。 | userName - 执行分配操作的用户名,userId - 用户Id,addedToEntityGroupName -实体组名称,addedToEntityGroupId - 实体组Id | 清空 json 有效负载 |
REMOVED_FROM_ENTITY_GROUP | Removed from Group | 从实体组中删除实体时产生的事件。这种消息类型是特定于ThingsBoard PE的。 | userName - 执行未分配操作的用户名,userId - 用户Id,removedFromEntityGroupName -实体组名称,removedFromEntityGroupId - 实体组ID | 清空json有效负载 |
ATTRIBUTES_UPDATED | Attributes Updated | 执行实体属性更新时产生的事件 | userName - 执行属性更新的用户名,userId - 用户Id,scope - 更新属性范围 (can be either SERVER_SCOPE or SHARED_SCOPE) | key/value json with updated attributes: { "softwareVersion": "1.2.3" } |
ATTRIBUTES_DELETED | Attributes Deleted | 删除某些实体属性时产生的事件 | userName - 删除属性的用户名,userId - 用户Id,scope - 删除属性范围(can be either SERVER_SCOPE or SHARED_SCOPE) json 包含已删除属性键列表的属性字段: { "attributes": ["modelNumber", "serial"] } | |
ALARM | Alarm event | 当创建、更新或删除警报时产生的事件 | 来自原始消息元数据的所有字段。 isNewAlarm - true 如果一个新的alram刚刚被创建 isExistingAlarm - true 如果警报已经存在 isClearedAlarm - true 如果清楚警报 | json containing created alarm details: { "tenantId": { ... }, "type": "High Temperature Alarm", "originator": { ... }, "severity": "CRITICAL", "status": "CLEARED_UNACK", "startTs": 1526985698000, "endTs": 1526985698000, "ackTs": 0, "clearTs": 1526985712000, "details": { "temperature": 70, "ts": 1526985696000 }, "propagate": true, "id": "33cd8999-5dac-11e8-bbab-ad47060c9431", "createdTime": 1526985698000, "name": "High Temperature Alarm" } |
规则节点
规则节点是规则引擎的基础组件。使用规则节点在同一时间处理单个传入消息,并传出一个或多个消息。规则节点是规则引擎的主要逻辑单元。规则节点可以过滤、富集、转换传入消息、执行操作或与外部系统通信。
规则节点关系
每个规则节点都有可能会有其他规则节点有关联。每一个节点关系都会有各自的节点类型,使用标签来识别关系之间的逻辑意义。规则节点生成传出消息时,指定关系类型来路由消息到下一个节点。 典型的节点关系是“成功”和“失败”。代表逻辑操作的规则节点会使用“true”或“false”类型。其他一些特定的规则节点可能会使用完全不同的关系类型,例如:“Post Telemetry”, “Attributes Updated”, “Entity Created”, 等。
规则链
规则链指规则节点的逻辑组及其之前的关系。例如,以下规则链可以:
- 保存所有遥测消息到数据库;
- 若消息显示温度高于50度,则启动“高温报警”;
- 若消息显示温度低于-40度,则启动低温报警;
- 记录失败过程,执行温度检查脚本以便在控制台中检查是否为逻辑或语法错误。
租户管理员可以定义一个根规则链和任意多个其他规则链。根规则链处理所有传入的消息,并可能将它们转发给其他规则链以进行其他处理。其他规则链也可以将消息转发给不同的规则链。 例如,下面的规则链将:
- 若消息显示温度高于50度,则启动“高温报警”;
- 若消息显示温度低于50度,则清楚“高温报警”;
- 将有关“创建”和“清除”警报的事件转发到外部规则链,该规则链将会向相应用户发送通知。
消息队列
所有传入的消息都存储在队列中,然后由根规则链进行处理。消息处理完成后,将会被从队列中删除。考虑到安全性和性能因素,系统管理员可以为每个租户配置最大的队列尺寸和其他重要参数。要了解更多关于消息队列、确认标准和规则引擎内部的信息,请参阅架构页面。
规则节点类型
根据节点的特性将节点分类到不同的组:
- 过滤节点--用于过滤和路由消息;
- 富集节点--用于更新传入消息的元数据;
- 转换节点--用于改变传入消息字段,如发起人、类型、有效负载、元数据;
- 动作节点--根据传入消息执行各种动作;
- 外部节点--用于与外部系统交互。
配置
每个规则节点都可能有特定的配置参数,这些参数取决于规则节点的实现方式。例如,“Filter - script”规则节点可以通过处理传入数据的定制JS函数进行配置。“外部发送电子邮件”节点配置允许指定邮件服务器连接参数。 可以通过双击规则链编辑器中的节点打开规则节点配置窗口:
测试JS函数
一些规则节点具有特定的UI特性,允许用户测试JS函数。单击Test Filter函数之后,您将看到JS编辑器,可以使用该编辑器替换输入参数并验证函数的输出。
你可以定义如下参数:
- 消息类型--左上角区域
- 消息有效负载--左侧消息模块
- 右侧元数据模块的元数据
- 过滤器模块JS脚本
- 按下测试输出后,将返回到正确的输出部分。
故障调试
TB为每个规则节点提供检查传入和传出消息的功能。用户可在主配置窗口中选择“debug模式”复选框(参见配置部分的第一个图像)启用调试功能。 调试功能启用后,用户就可以查看相应关系类型中的传入和传出的消息信息。清参照以下调试示例图:
导入/导出
你可以将规则链导出为JSON格式,并将其导入到同一个或另一个TB实例中。 打开规则链页并单击位于特定规则链卡上的export按钮,可以导出规则链。
要导入规则链,您应该打开规则链页面并单击屏幕右下角的“+”按钮,然后单击import按钮。