)
物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载规则引擎中的「send notification发送通知」节点负责将告警、遥测、实体事件等消息以通知的形式推送给指定目标用户、客户、邮件/短信/Teams/Slack 通道。本指南围绕 rule_node.md 讲解其核心能力通知主题subject、正文message与按钮button的模板化与本地化。读完本文你将掌握该节点可用模板参数清单、${...}取值语法、upperCase/lowerCase/capitalize/translate后缀用法以及翻译 key 与收件人语言设置locale的联动机制并能结合实际 JSON 消息编写可直接落地的通知模板。一、为什么通知模板需要模板化与本地化通知模板定义了消息的静态内容但真实场景中通知内容必须随触发上下文动态变化不同设备上报的温湿度、不同告警的严重级别、收件人姓名的个性化称呼等。ThingsBoard 通过统一的模板化机制让规则引擎节点的主题、正文和按钮支持占位符插值同时借助translate后缀与收件人语言设置实现同一模板自动切换为收件人所用语言的本地化效果。从源码结构看这一机制服务于两大类通知来源规则引擎发起Rule Engine originated即本指南讲解的send notification节点消息数据与元数据直接来自流入节点的TbMsg模板参数最丰富通知规则发起Notification rule由 DefaultNotificationRuleProcessor.java 处理各类触发器告警、设备活动、资源短缺等自动生成通知。两者共用同一套TemplateUtils处理引擎与「模板可替换值TemplatableValue」抽象只是可用的模板参数集合不同。二、可用模板参数完整清单通知模板主题、正文、按钮支持模板化和本地化可用的模板参数取决于模板类型template type。针对规则引擎通知节点可用参数如下参数含义来源originatorType消息发起方originator的类型例如Device由节点根据TbMsg的 originator 自动填充originatorId发起方实体的 ID同上customerId所属客户 ID如果存在由节点解析 originator 的归属客户填充msgType消息类型取自TbMsg.getType()customerId客户 ID如有—消息 metadata 中的键入站消息元数据metadata中的值直接以键名引用元数据键值对消息 data 中的键入站消息数据data中的值以键名引用支持嵌套路径JSON 数据扁平化后的键值对recipientTitle收件人称呼若配置了姓和名则用姓名否则用邮箱收件人资料recipientEmail收件人邮箱收件人资料recipientFirstName收件人名收件人资料recipientLastName收件人姓收件人资料参数名必须用${...}包裹例如${recipientFirstName}。2.1 消息 metadata 与 data 参数在源码中的填充逻辑规则引擎节点的模板参数来源于 RuleEngineOriginatedNotificationInfo.java 的getTemplateData()方法其组装顺序为将消息元数据msgMetadata全部键值对放入模板上下文将消息数据msgData全部键值对放入模板上下文数据来自JacksonUtil.toFlatMap扁平化嵌套 JSON 对象会转换为形如building_1.temperature的点分路径键追加originatorType取实体类型的规范名称getNormalName()如Device、originatorId、msgType、customerId无客户时为空字符串。实际的数据采集发生在 TbNotificationNode.javaonMsg方法读取消息的 originator、metadata 与 data并查询该 originator 归属的CustomerId后构建通知信息。因此模板中能引用哪些 metadata/data 键取决于流入节点的消息内容——例如遥讯消息常带有deviceName、deviceType等元数据键告警消息的数据中则包含alarmSeverity、alarmStatus等字段。三、值修饰后缀upperCase / lowerCase / capitalize除直接插值外还可以用一个后缀修改参数值的大小写或首字母大写格式后缀作用示例upperCase全部转为大写${recipientFirstName:upperCase}lowerCase全部转为小写${recipientFirstName:lowerCase}capitalize首字母大写${recipientFirstName:capitalize}这三个内置修饰函数在 TemplateUtils.java 中注册private static final MapString, UnaryOperatorString FUNCTIONS Map.of( upperCase, String::toUpperCase, lowerCase, String::toLowerCase, capitalize, StringUtils::capitalize );处理时先按正则\$\{(.?)(:[a-zA-Z])?\}匹配出参数键与可选函数名再对取到的值依次应用对应函数最终以Matcher.quoteReplacement安全写回避免替换文本中的特殊字符破坏结果。四、模板的本地化translate 后缀与收件人语言要本地化通知内容使用translate后缀${some.translation.key:translate}。它表示以「翻译键」而非普通参数来解析占位符——系统会用该键去查找翻译文件如自定义翻译 JSON中对应语言的值。例如假设你定义了自定义翻译键custom.notifications.greetings其值为Hello, ${recipientFirstName}!那么模板${custom.notifications.greetings:translate}将被转换为Hello, John!4.1 翻译值内部还支持二次插值翻译后的文本仍可包含${...}占位符。在 TemplateUtils.processTemplate 的实现中translate被注册为自定义函数执行逻辑是先取出翻译值再对该值再次执行一轮模板处理value processTemplate(value, context, null)因此Hello, ${recipientFirstName}!中的姓名占位符同样会被收件人数据替换。4.2 语言locale如何确定所需语言取自收件人的资料设置profile settings默认使用英语。对应逻辑位于 NotificationProcessingContext.javaString locale recipient instanceof User user ? user.getLocale() : Locale.US.toString();即收件人是平台用户时取其资料中的 locale 设置在用户资料中对应lang字段例如en_US参见 User.java 的属性说明否则回退为Locale.US英语。只有模板值中确实包含收件人相关变量或translate键时系统才会针对该收件人执行逐人模板处理从而避免不必要的重复计算。翻译解析通过translate(key, locale)完成先按 locale 加载整份翻译 JSONtranslationProvider再用JacksonUtil.getByKeyPath按点分路径取出键对应文本找不到键时返回空字符串。同键同语言的解析结果会被缓存兼顾性能。五、完整示例基于消息数据的模板编写假设流入规则引擎节点send notification的消息数据如下{ building_1: { temperature: 24 } }模板Building 1: temperature is ${building_1.temperature}将被转换为Building 1: temperature is 24这正体现了「data 键名直接引用 嵌套路径点分访问」的用法${building_1.temperature}会被msgData扁平化后生成的键building_1.temperature命中。5.1 组合运用示例将参数、修饰符与翻译机制组合使用可写出更具实战价值的模板告警${msgType} 来自设备 ${deviceName} 当前状态${alarmStatus:capitalize}严重级别 ${alarmSeverity:upperCase} 致 ${recipientTitle}${recipientFirstName:lowerCase} ${custom.notifications.alarmBody:translate}其中deviceName、alarmStatus、alarmSeverity取决于消息 metadata/datarecipientTitle、recipientFirstName由收件人资料填充最后的翻译键负责加载本地化正文。六、模板在 send notification 节点中的执行链路要理解模板何时生效需要看完整链路节点触发send notification节点TbNotificationNode.java收到TbMsg后节点配置必须指定通知模板templateId与通知目标targets见 TbNotificationNodeConfiguration.java其中targets为NotEmpty的 UUID 列表templateId为NotNull。节点将消息上下文封装进RuleEngineOriginatedNotificationInfo并异步提交给通知中心NotificationCenter。模板预编译NotificationProcessingContext.init()会对每个启用状态的投递渠道模板先执行一次「不可变参数」处理此时尚无收件人合并request.getInfo().getTemplateData()中的消息级参数。逐收件人渲染当通知发送给具体收件人时getProcessedTemplate()以收件人的 locale 与资料字段recipientTitle、recipientEmail、recipientFirstName、recipientLastName构建附加上下文若模板包含这些变量或翻译键则重新执行TemplateUtils.processTemplate完成最终渲染。可被模板化的字段主题、正文、按钮由各投递渠道模板的TemplatableValue集合定义见 TemplatableValue.java。结果回写节点处理完成后节点把统计结果写入消息元数据notificationRequestResult并按成功/失败走Success或Failure分支TbNotificationNode.java供后续规则链分支使用。七、注意事项与常见问题未定义的参数会被保留若模板引用的键在上下文中不存在且没有可用函数TemplateUtils不会报错而是原样保留占位符源码中返回\\ matchResult.group()即保留${...}原文便于排查模板编写错误。空值安全上下文键存在但值为null时会被nullToEmpty转为空字符串不会引发 NPE例如无归属客户时customerId即为空字符串。大小写敏感参数键与后缀均区分大小写请与消息键名、文档列出的参数名保持一致。locale 未设置时回退英文收件人为非平台用户或未配置语言时翻译默认按en_US处理如需为特定用户启用本地化请在其用户资料中设置语言。模板类型决定可用参数本文参数清单针对规则引擎通知节点其他通知类型如告警触发、实体变更等见 ui-ngx/src/assets/help/en_US/notification 目录下的对应帮助文档的参数集合不同引用前务必核对对应模板类型的说明。{:copy-code}仅是 UI 标记文档示例中出现的{:copy-code}用于在管理界面渲染「复制代码」按钮并非模板语法正式配置时无需也不应包含。八、小结通过模板参数${originatorType}、${building_1.temperature}等实现消息动态内容插值通过upperCase/lowerCase/capitalize修饰输出格式通过translate后缀配合收件人语言设置完成通知本地化——这三层能力共同构成了 ThingsBoard 规则引擎通知节点的模板体系。掌握它们即可在 send notification 节点中编写出既个性化又国际化、可随消息上下文自动变化的通知模板。若需进一步验证行为可结合 TemplateUtils.java 与 NotificationProcessingContext.java 的源码阅读其精确语义。赞分享物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载相关推荐ThingsBoard 规则引擎 customer attributes 节点字段模板化Fields Templatization实战指南ThingsBoard 规则引擎 customer attributes 节点字段模板化Fields Templatization实战指南 customer物联网后端数据可视化消息队列ThingsBoard 规则引擎 Change Originator 节点字段模板化实战按消息元数据动态切换消息发起方ThingsBoard 规则引擎 Change Originator 节点字段模板化实战按消息元数据动态切换消息发起方 本指南围绕 ThingsBoard 规物联网后端数据可视化消息队列ThingsBoard 规则引擎进阶Originator Fields 节点字段模板化Fields Templatization实战指南ThingsBoard 规则引擎进阶Originator Fields 节点字段模板化Fields Templatization实战指南 导读 本篇技术指物联网后端数据可视化消息队列创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考