ThingsBoard 规则引擎 Change Originator 节点字段模板化实战:按消息元数据动态切换消息发起方
物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载本指南围绕 ThingsBoard 规则引擎中change originator更换消息发起方转换节点的**字段模板化Fields templatization**能力展开。字段模板化允许节点配置字段以模板形式书写运行时用当前消息的载荷msg或元数据metadata中的值替换模板从而让规则节点以动态配置处理每条消息。读完本文你将掌握模板语法、change originator 节点的全部配置项客户/租户/关联实体/告警发起方/按名称模式指定实体五种来源并能独立搭建按传感器类型把消息转发给对应管理资产的典型场景同时理解其底层实现与验证方法。什么是字段模板化Fields TemplatizationThingsBoard 规则引擎的字段模板化特性允许节点使用动态配置处理传入消息在配置字段中书写模板占位符节点处理消息时用消息体msg或消息元数据metadata中的值替换这些占位符从而根据每条消息的实际内容生成不同的配置。仓库中承载这一功能的帮助文档 common_node_fields_templatization.md 给出了权威定义Fields templatization feature allows you to process the incoming messages with dynamic configuration by substitution of templates specified in the configuration fields with values from message or message metadata.核心价值在于同一套节点配置可以服务不同类型、不同属性的海量设备无需为每种设备单独创建规则节点。change originator 节点配合模板化可以根据消息元数据如deviceType动态解析目标实体的名称从而把消息的发起方originator切换到对应实体。change originator 节点配置总览change originator 是一个TRANSFORMATION转换类型节点定义于后端源码 TbChangeOriginatorNode.java节点名称change originator节点版本1节点描述将消息发起方更换为Tenant租户/ Customer客户/ Related Entity关联实体/ Alarm Originator告警发起方/ Entity by name pattern按名称模式指定实体输出连接Success、Failure五种发起方来源OriginatorSource发起方来源由originatorSource配置字段决定前端枚举定义于 rule-node-config.models.ts后端同名枚举 OriginatorSource.java 与之对应共五种取值取值中文含义行为说明CUSTOMER客户使用原消息发起方所属的客户作为新发起方。仅对已分配给客户、且类型为User/Asset/Device的发起方有效可搭配preserveOriginatorIfCustomer开关使用TENANT租户直接使用当前租户作为新发起方RELATED关联实体基于配置的关系查询relations query查找关联实体作为新发起方若命中多个实体只取第一个其余丢弃ALARM_ORIGINATOR告警发起方仅当传入消息的发起方是告警实体时使用该告警的发起方作为新发起方ENTITY按名称模式指定实体指定实体类型与名称模式按模式匹配的实体作为新发起方支持的实体类型为Device、Asset、Entity View、Edge、User配置字段与表单校验节点配置表单由前端组件 change-originator-config.component.ts 和模板 change-originator-config.component.html 实现配置字段包括originatorSource发起方来源必填preserveOriginatorIfCustomer布尔开关仅在originatorSource CUSTOMER时显示。开启后若原发起方本身就是CUSTOMER类型则保留原发起方不变entityType实体类型仅当originatorSource ENTITY时必填entityNamePattern实体名称模式仅当originatorSource ENTITY时必填且要求非纯空白字符relationsQuery关系查询配置仅当originatorSource RELATED时必填。前端表单会根据当前选择的originatorSource动态启停相关字段的校验见 updateValidators保证配置在提交时满足后端要求。实战示例按传感器类型动态切换消息发起方下面完整复现关联文档 change_originator_node_fields_templatization.md 中给出的典型场景。业务场景假设一个租户管理两个资产TemperatureManager资产负责聚合温度传感器的数据用于环境监测与告警HumidityManager资产负责收集湿度传感器的数据分析相对湿度并与温度数据关联实现大气状况综合监测与自动化环境调节。每台设备上报的消息其元数据metadata中都会携带一个deviceType属性取值为Temperature或Humidity用于标识传感器类型。需求是根据deviceType把消息的发起方originator从具体传感器设备切换为对应的管理资产使后续规则节点如数据持久化、告警规则以该资产为上下文继续处理。节点配置要实现上述需求可在规则链中放置一个change originator节点并配置originatorSourceENTITY按名称模式指定实体entityTypeAssetentityNamePattern$[deviceType]或${deviceType}根据模板语法书写详见下一节即用消息元数据中的deviceType值替换模板运行时解析为TemperatureManager或HumidityManager。其核心思想是把实体名称模式与消息元数据绑定使得温度传感器消息 → TemperatureManager、湿度传感器消息 → HumidityManager的映射完全由模板动态完成无需配置多个节点。温度传感器消息示例假设收到来自Temperature传感器设备名TH-001的如下消息并转发给配置了上述模板的 change originator 节点{ msg: { temperature: 32 }, metadata: { deviceType: Temperature, deviceName: TH-001, ts: 1685379440000 } }节点处理时模板被元数据中的deviceType Temperature替换目标实体解析为TemperatureManager资产消息发起方由设备TH-001切换为TemperatureManager。湿度传感器消息示例来自Humidity传感器设备名HM-001的消息{ msg: { humidity: 77 }, metadata: { deviceType: Humidity, deviceName: HM-001, ts: 1685379440000 } }同样模板被deviceType Humidity替换目标实体解析为HumidityManager资产消息发起方切换为HumidityManager。通过 Debug 事件验证结果在规则链的 Debug 模式调试模式下可以捕获 change originator 节点的调试事件来验证行为处理来自Temperature传感器的消息时调试事件中IN消息的发起方类型为DEVICE对应真实传感器如TH-001经 change originator 节点处理后OUT消息的发起方类型变为ASSET表明发起方已被成功切换为对应管理资产TemperatureManager。处理来自Humidity传感器的消息时同样可以看到IN为DEVICE、OUT为ASSET即HumidityManager的转换过程。调试事件清晰地展示了设备 → 资产的发起方迁移路径验证了基于元数据字段替换的动态配置确实生效。这两个示例共同展示了change originator 节点配合元数据字段替换实现动态配置的完整用法。模板语法详解字段模板化的占位符语法由后端工具类 TbNodeUtils.java 实现主要包括两类模板写法含义来源${metadataKey}从消息元数据中取值formatMetadataVarTemplate形如${key}TbNodeUtils.java$[dataKey]从**消息体msg JSON**中取值支持a.b.c形式的嵌套路径formatDataVarTemplate形如$[key]TbNodeUtils.javaprocessPattern(pattern, tbMsg)的处理顺序TbNodeUtils.java为先对元数据执行模板替换逐个元数据键替换${key}再解析消息体 JSON用$[key]取值替换嵌套路径按点号逐级查找若引用的键在消息体中不存在或不是值节点则保留原模板文本。因此在前面的示例中entityNamePattern既可以写${deviceType}取元数据也可以写$[deviceType]若deviceType位于消息体内两种来源均可作为动态解析依据。后端实现原理从配置到发起方切换配置加载与校验节点初始化时通过 loadNodeConfiguration 反序列化配置并调用 validateConfig 校验originatorSource必须指定选择RELATED时relationsQuery不能为空选择ENTITY时entityType与entityNamePattern不能为空且实体类型必须通过 EntitiesByNameAndTypeLoader 的类型白名单检查。配置类 TbChangeOriginatorNodeConfiguration.java 的默认配置为originatorSource CUSTOMER、preserveOriginatorIfCustomer false并预置默认关系查询。transform 主流程每条消息进入节点后transform 方法执行如下逻辑调用getNewOriginator(ctx, msg)异步解析新发起方的实体 ID若解析结果为空或为isNullUid()则抛出NoSuchElementException(Failed to find new originator!)走Failure分支若新发起方与原发起方相同则消息原样透传否则调用ctx.transformMsgOriginator(msg, newOriginator)生成携带新发起方的消息副本走Success分支。五种来源的解析逻辑getNewOriginator的分支实现TbChangeOriginatorNode.java与配置表格一一对应CUSTOMER先检查preserveOriginatorIfCustomer且原发起方已是CUSTOMER时直接保留否则调用ctx.getEntityService().fetchEntityCustomerIdAsync(...)异步查询发起方所属客户TENANT直接返回ctx.getTenantId()RELATED委托 EntitiesRelatedEntityIdAsyncLoader 按关系查询解析命中多个时取第一个ALARM_ORIGINATOR委托 EntitiesAlarmOriginatorIdAsyncLoader 从告警实体解析其发起方ENTITY用TbNodeUtils.processPattern(config.getEntityNamePattern(), msg)对名称模式执行模板替换得到动态实体名后通过 EntitiesByNameAndTypeLoader 按租户、实体类型、名称查找目标实体。这正是字段模板化 change originator的结合点。版本升级兼容节点支持从版本 0 升级到版本 1若旧配置缺少preserveOriginatorIfCustomer字段会自动补写为trueupgrade保证旧规则链升级后行为兼容。测试用例验证仓库提供了完整的单元测试 TbChangeOriginatorNodeTest.java可验证本文涉及的核心行为按名称模式动态解析实体givenOriginatorSourceIsEntity_whenOnMsg_thenTellSuccess覆盖了三种名称模式静态名称test-asset元数据模板${md-name-pattern}替换自元数据键md-name-pattern消息体模板${msg-name-pattern}该用例中从消息体 JSON 取值验证数据来源。 测试断言节点确实以TbNodeUtils.processPattern(entityNamePattern, msg)解析后的名称调用findAssetByTenantIdAndName查询资产并最终以新发起方调用tellSuccess。目标实体不存在givenOriginatorSourceIsEntityAndEntityCouldNotFound_whenOnMsg_thenTellFailure当按名称找不到资产时节点抛出IllegalStateException(Failed to find asset with name test-asset!)并走Failure分支告警发起方解析TbChangeOriginatorNodeTest.java原发起方为告警时节点通过findAlarmByIdAsync取回告警并以其发起方设备作为新发起方配置升级兼容TbChangeOriginatorNodeTest.java验证 v0 → v1 升级时preserveOriginatorIfCustomer的补齐行为。常见问题与注意事项模板键必须存在于消息或元数据中若entityNamePattern引用的键不存在模板替换不生效解析出的实体名可能仍是模板原文导致查找失败并走Failure分支ENTITY来源要求实体类型在支持范围内Device、Asset、Entity View、Edge、User且名称必须在该租户下唯一存在RELATED来源命中多个实体时只取第一个其余被丢弃配置关系查询时应保证方向、关系类型与层级能唯一定位目标CUSTOMER来源仅对已分配给客户的User/Asset/Device发起方有效若需要客户消息保持客户发起方不变的场景记得开启preserveOriginatorIfCustomerALARM_ORIGINATOR要求原发起方是告警实体否则解析失败一般与告警相关规则链配合使用。小结本文以 change originator 节点的字段模板化为主线完整覆盖了模板语法、五种发起方来源、配置表单校验、设备 → 管理资产的实战场景与 Debug 验证方法并从源码层面剖析了 TbChangeOriginatorNode.java 的解析流程与 TbChangeOriginatorNodeTest.java 的验证用例。掌握了这套方法你就可以在一条规则链中灵活实现同一节点、多种实体上下文的动态路由让规则链配置随消息内容自适应显著降低规则链的重复度。赞分享物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载相关推荐ThingsBoard 规则引擎字段模板化实战originator attributes 节点动态属性查询ThingsBoard 规则引擎字段模板化实战originator attributes 节点动态属性查询 导读 本文围绕 ThingsBoard 规则引擎中物联网后端数据可视化消息队列CANN ops-math ClipByValue 算子深度解析功能、参数、GE IR 图模式调用与源码实现CANN ops math ClipByValue 算子深度解析功能、参数、GE IR 图模式调用与源码实现 ClipByValue裁剪取值是 CANN物联网后端数据可视化消息队列ThingsBoard 下行数据编码器Encoder函数实战指南将规则引擎消息转换为外部集成负载ThingsBoard 下行数据编码器Encoder函数实战指南将规则引擎消息转换为外部集成负载 导读 本文聚焦 ThingsBoard Integrat物联网后端数据可视化消息队列上一篇Vulcain项目常见问题解决方案下一篇AWS Copilot CLI 常见问题解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →