:TBEL 脚本编写完全指南)
物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载导读本指南围绕 ThingsBoard 告警规则中基于 TBELThingsBoard Expression Language脚本的条件表达式功能展开系统讲解expression()函数的签名、入参类型、ctx上下文对象以及真实告警场景的写法。读完本文你将掌握如何在设备配置文件的告警规则中编写自定义条件脚本利用遥测数据与属性的值和时间戳实现任意复杂度的告警触发判断并理解其在 ThingsBoard 告警引擎中的底层执行原理。告警规则条件与 TBEL 脚本函数在 ThingsBoard 中告警规则Alarm Rule定义于设备配置文件Device Profile中由告警条件condition、告警类型type、严重级别severity及可选的持续时间duration/重复次数repeating规格组成。告警条件支持两种表达方式基于过滤器的条件通过可视化的键值过滤如数值大于、字符串包含等谓词组合而成对应源码 AlarmCondition.java 中的条件过滤器集合TBEL 脚本函数即本文主题expression()允许用户直接用脚本对遥测和属性数据编写自定义条件表达式对应源码 TbelAlarmConditionExpression.java。TbelAlarmConditionExpression是一个仅含expression字符串字段的配置类其类型标识为AlarmConditionExpressionType.TBEL说明表达式是以纯文本脚本形式存储、由服务端在执行告警规则时动态求值的。函数签名与入参约定expression()是一个用户自定义脚本遵循如下固定签名function expression(ctx, arg1, arg2, ...): boolean要点说明返回值必须是布尔值true表示条件成立触发告警false表示条件不成立ctx为固定首参由系统注入的上下文对象用于访问所有参数及其元信息详见下文arg1, arg2, ...为告警规则配置中选定的参数它们以位置参数的形式注入脚本中可直接按变量名引用。支持的参数类型告警规则配置中可用的参数分为两类均来自实体设备自身参数类别说明属性Attributes实体属性值包括服务端属性、共享属性和客户端属性最新遥测Latest telemetry实体最近一次上报的遥测值这两类参数在注入脚本时都是单值允许的数据类型包括boolean布尔型int64/long长整型double双精度浮点型string字符串JSON对象/数组需要特别说明的是如果某个参数当前没有任何值例如设备从未上报过该遥测键脚本中引用该变量时取值可能为空因此条件判断应做好空值防护避免因空值导致脚本异常。快速上手从单位换算到条件判断文档给出最经典的入门示例——将华氏温度转换为摄氏温度并在摄氏值大于 36 时触发告警var temperatureC (temperatureF - 32) / 1.8; return temperatureC 36;这里temperatureF即告警规则配置中选定的参数最新遥测或属性脚本直接以变量名引用其值。这是最简单、最常见的写法对单值参数做数学换算再与阈值比较。深入理解 ctx 上下文对象除了直接以变量名访问参数值还可以通过ctx以对象形式访问每个参数。系统注入的ctx对象包含每个参数对应的对象ctx.args.paramName该对象包含value与ts两个字段latestTs属性所有参数遥测中的最新时间戳毫秒。一个参数在ctx中的结构如下{ temperatureF: { ts: 1740644636669, value: 98.7 } }字段含义字段类型说明tslong该参数遥测值的采集时间戳单位为毫秒epoch millisvalue任意参数的实际值类型为配置时所选类型布尔/整数/浮点/字符串/JSONctx.latestTs则代表本次参与求值的所有参数遥测中最新的时间戳单位为毫秒。当你需要基于数据新鲜度或数据到达时刻做条件判断时latestTs与各参数的ts就非常有用。进阶用法联合使用值与时间戳在入门示例的基础上文档展示了如何同时利用参数的值和时间戳构造复合条件——既要求摄氏温度大于 36又要求该温度遥测的采集时间恰好在整点时刻var temperatureC (ctx.args.temperatureF.value - 32) / 1.8; var temperatureTs ctx.args.temperatureF.ts; return temperatureC 36 ((temperatureTs / 1000) % 3600) 0;该脚本的解读ctx.args.temperatureF.value取得温度数值做华氏转摄氏换算ctx.args.temperatureF.ts取得该遥测的时间戳毫秒(temperatureTs / 1000) % 3600 0判断时间戳对应的秒数是否为整点每 3600 秒整除从而限定只有整点采样的数据才参与告警判断。这类值 时间戳的组合逻辑是纯可视化过滤器难以表达的充分体现了脚本式条件表达式的灵活性。从源码理解 expression 的底层执行为了更深入理解expression()在服务端的运行机制可以从当前仓库源码中找到对应实现1. 表达式的存储结构TbelAlarmConditionExpressionTbelAlarmConditionExpression.java以NotBlank注解约束expression字段非空说明脚本必须至少包含有效内容其getType()返回TBEL标志着该条件使用 TBEL 脚本而非普通过滤器。2. 脚本参数的映射机制TBEL 脚本执行时参数以名称到值的映射注入。参考 TbelScript.javapublic Map createVars(Object[] args) { var result new HashMap(); for (int i 0; i argNames.length; i) { result.put(argNames[i], args[i]); } return result; }这印证了文档中arg1, arg2, ... 按告警规则配置顺序注入脚本内以变量名引用的机制服务端将配置的参数名与运行时取得的参数值一一配对构建脚本变量环境。3. 告警状态机的求值过程告警规则的求值由 AlarmRuleState.java 与 AlarmState.java 协同完成AlarmRuleState.eval(DataSnapshot)根据告警条件规格简单/持续/重复对条件进行求值AlarmState.createOrClearAlarms遍历按严重级别降序排序的创建规则一旦某个规则条件为true则创建/更新告警并调用ctx.getAlarmService()持久化告警实体随后通过pushMsg向下游规则链发出Alarm Created、Alarm Updated、Alarm Severity Updated或Alarm Cleared消息。其中DataSnapshotDataSnapshot.java承载了实体的最新遥测与属性快照正是expression()运行时取值的数据来源而 DeviceState.java 中通过findLatest(...)拉取最新遥测的逻辑为参数含ts提供了实际数据。4. TBEL 语言运行时TBEL 由 ThingsBoard 内置的脚本执行器支撑位于 common/script/script-api 模块其中TbelScriptExecutionTask、DefaultTbelInvokeService等类实现了脚本的加载与调用。这意味着expression()无需部署独立的 JS 执行器而是由 ThingsBoard 平台原生解释执行编写时须遵循 TBEL 语法规范支持var、函数、数学运算、逻辑运算等基础语法。编写实践建议基于文档示例与源码机制编写告警规则条件脚本时建议遵循以下原则明确返回值语义始终以return true;表示触发告警return false;表示不触发复杂的多分支逻辑可在 return 前用中间变量组织。善用ctx.args获取元信息需要用到参数时间戳或统一访问所有参数时优先使用ctx.args.name.value与ctx.args.name.ts不要与直接变量名混用导致歧义。时间戳单位一致性ts与latestTs均为毫秒进行秒级或分钟级运算时记得除以 1000如整点判断示例。空值与类型防护参数可能缺失或类型不匹配建议在取值后先判空再做算术运算避免脚本执行异常导致告警规则评估失败。保持脚本短小聚焦expression()面向单一条件判断复杂业务建议拆分为规则链中多个节点协作脚本内避免过重的循环与 I/O 逻辑。小结ThingsBoard 告警规则条件表达式expression()以 TBEL 脚本形式为遥测与属性数据提供了远超可视化过滤器的灵活判断能力既可以按变量名直接引用参数做单位换算与阈值比较也可以通过ctx.args访问每个参数的值与时间戳乃至利用latestTs感知数据新鲜度构造数值 时间的复合告警条件。结合 TbelAlarmConditionExpression.java、AlarmRuleState.java 与 TbelScript.java 等源码读者可以清晰掌握从表达式配置 → 参数注入 → 脚本求值 → 告警状态机处理的完整链路进而在实际项目中编写出可靠、可控的自定义告警条件。赞分享物联网后端数据可视化消息队列【免费下载链接】thingsboardAll-in-one IoT Platform - Device management, data collection, processing and visualization.项目地址https://gitcode.com/GitHub_Trending/th/thingsboard点击查看免费下载相关推荐如何永久保存你的微信聊天记录WeChatMsg终极指南如何永久保存你的微信聊天记录WeChatMsg终极指南 你有没有想过那些珍贵的微信对话可能有一天会消失不见 和家人的温馨聊天、与朋友的深夜谈心、工作中ThingsBoard Switch 规则节点 TBEL 脚本编写完全指南按条件将消息路由到多条链路ThingsBoard Switch 规则节点 TBEL 脚本编写完全指南按条件将消息路由到多条链路 导读 本指南聚焦 ThingsBoard 规则引擎中 S物联网后端数据可视化消息队列ThingsBoard 规则引擎 Clear Alarm 节点详解用 TBEL 编写 Details 函数构造告警详情ThingsBoard 规则引擎 Clear Alarm 节点详解用 TBEL 编写 Details 函数构造告警详情 导读 本文聚焦 ThingsBoard物联网后端数据可视化消息队列创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考