产品定价 立即试用
社区版
文档 > 核心概念 > 字段计算
入门
指南 安装 架构 API 常见问题
目录

字段计算

4.0.0及以上版本


字段计算可将原始数据实时转换为可执行化洞察。 字段计算可视为IoT实体的内置”逻辑层”。 不再仅存储原始数据,数据到达时即可自动生成高价值指标。

通过组合多源数据——如传入的时间序列、现有实体属性,乃至相关资产的数据——可在数据到达时执行自定义逻辑。 结果输出会自动存储为时间序列数据属性,确保计算洞察可立即用于可视化、报表或进一步自动化。

为支持复杂工作流,字段计算执行可链式:一个字段的输出可自动触发另一个字段执行,从而逐步构建数据处理流水线。

字段计算可在系统中两个层级应用:

  • 实体层级:在此层级,计算应用于单一特定实体——设备资产
  • 配置文件层级:在设备配置资产配置内定义字段计算时,该逻辑会由关联该配置文件的每个实体继承。

这种灵活性允许用户为每个实体定义独立计算,或对一组相似实体应用标准化逻辑,从而优化数据处理与管理。

除实时处理外,ThingsBoard支持字段计算的重新处理,可将相同计算逻辑应用于历史时间序列数据,并为所选时间范围生成缺失或更新结果。


创建字段计算

设备资产设备配置资产配置中创建字段计算的流程相同。

  • 在左侧菜单中打开”字段计算”页面。
  • 点击右上角”+“按钮。
  • 在下拉菜单中选择创建新字段计算

类型

ThingsBoard支持多种字段计算类型,各自针对特定任务场景:


配置

基本设置

“基本设置”区域定义字段计算的基本配置:

  • 标题 —— 描述字段计算用途的名称。
  • 实体类型 —— 应用字段计算的目标实体或实体配置文件。
  • 类型 —— 决定计算模型和可用配置块的字段计算类型

参数

参数定义字段计算读取哪些数据并将其作为变量暴露给计算逻辑。每个参数映射到所选实体的特定数据源(属性或时间序列),可在简单表达式、TBEL脚本或其它字段计算类型中引用。

点击添加参数按钮并填写必填字段:

实体类型
定义数据读取来源:

  • 当前实体 —— 应用字段计算的同一设备/资产(设备配置/资产配置)。
    若在设备配置资产配置层级创建,则对关联该配置文件的每个实体执行计算。
  • 另一个设备/资产 —— 特定引用实体
  • 客户 —— 与实体关联的客户
  • 当前租户 —— 租户实体
  • 当前所有者 —— 当前实体的所有者
  • 相关实体(适用于特定字段计算类型)—— 通过关系动态解析的实体


参数类型

字段计算支持以下参数类型:

使用存储为实体属性的静态半静态数据

示例:model、maxTemperature、safeZone、buildingId

配置:

  • 参数类型:Attribute
  • 选择作用域:ServerClientShared
  • 指定属性键
  • 设置参数名称,即脚本逻辑中使用的变量名。
  • 可选设置属性的默认值

使用指定时序键的最新遥测值

示例:temperature、humidity、latitude、longitude

配置:

  • 参数类型:Latest telemetry
  • 指定时序键
  • 设置参数名称,即脚本逻辑中使用的变量名。
  • 可选设置时序的默认值

使用指定时间窗口内的历史时序数据进行趋势分析。

示例:speed、voltage

配置:

  • 参数类型:Time series rolling
  • 指定时序键
  • 设置参数名称,即脚本逻辑中使用的变量名。
  • 定义数据采集时间窗口,确定用于计算的历史遥测时间范围。
  • 设置可处理的最大数据点数(该设置由系统管理员在租户配置中配置。)

计算

字段计算根据所选类型支持多种计算模型。计算可定义为单一表达式、TBEL脚本、地理区域评估、向相关实体传播值或聚合。

更多能力与配置选项详见对应字段计算类型文档。

输出

无论类型如何,字段计算都会产生一个或多个输出值,随后按配置的输出策略存储为时间序列或属性并处理(立即或通过规则链)。

结果可存储为:

  • 时间序列 —— 函数返回JSON对象或JSON对象数组,可带或不带时间戳,包含计算值。
  • 属性 —— 函数返回不含时间戳信息的JSON对象,包含计算值。属性可存储在服务器共享范围。

输出策略

输出策略定义字段计算结果的处理方式。支持两种策略:

  • Process immediately(默认)— 立即处理并存储结果,不经过Rule Chain。
  • Process via Rule Chains — 将结果传入实体的Default Rule Chain,进行额外处理逻辑。

结果会立即处理,无需使用 Rule Chain,确保最低延迟并根据所选选项直接处理。

时序数据选项:

  • Save to time series — 将历史值存储到 ts_kv
  • Save to latest values — 若时间戳更新,则更新 ts_kv_latest
  • Send to WebSockets — 向活跃的 WebSocket 订阅者推送更新(不写入数据库)。
  • Send to Calculated fields — 将更新转发给其他字段计算。
    可构建依赖字段链,单次事件可触发多次二次计算,无需使用 Rule Chain。
  • Custom TTL — 为此时序设置自定义存储时长(TTL)。
    若关闭,则使用租户配置中定义的 TTL。

属性选项:

  • Save to database — 将属性写入持久化存储。
  • Send to WebSockets — 向活跃的 WebSocket 订阅者推送更新(不写入数据库)。
  • Send to Calculated fields — 通知其他字段计算属性变更,实现级联计算。
  • Update attribute only on value change — 仅在值实际变化时更新属性。
  • Send attributes updates notification — 生成“属性已更新”事件并发送至 Default Rule Chain。

结果不会直接写入数据库。ThingsBoard 会生成内部消息:

  • POST_TELEMETRY_REQUEST,或
  • POST_ATTRIBUTES_REQUEST

并将其路由到实体的 Default Rule Chain

在以下场景可使用该策略:

  • 额外处理逻辑
  • 过滤、脚本或转换
  • 条件持久化
  • enrichment、路由或转发

要存储结果,Rule Chain 中需包含 save time seriessave attributes 节点。

这是在引入直接处理之前使用的经典处理模型。

调试

ThingsBoard提供内置工具,用于实时验证和排查字段计算问题。

启用调试模式 *建议在开发时启用

每个字段计算可切换至调试模式。启用后,ThingsBoard会记录每次执行的详细信息,包括触发执行的输入参数(如传入时间序列或属性更新)及计算结果或执行问题(脚本错误、缺失参数、无效值等)。

调试模式

启用调试模式可追踪与执行相关的事件、状态及潜在错误,便于开发和排障。

文档信息图标

注意:调试模式可能迅速增加磁盘占用,因为所有调试事件都会存入数据库。 自ThingsBoard 3.9起,平台仅在创建后的前15分钟内存储完整调试事件,之后仅保留错误事件。

调试模式设置可组合使用或完全关闭。


查看调试事件

点击字段计算行中的事件图标查看记录的调试事件。

每个事件包括:

  • 实体ID —— 执行字段计算的实体ID(目标实体)
  • 消息ID —— 唯一执行标识
  • 消息类型 —— 触发字段计算执行的内部请求类型
  • 参数 —— 执行时使用的已解析参数值,包含时间戳(如有)
  • 结果 —— 字段计算产生的输出
  • 错误 —— 执行失败原因(执行失败时显示)


基于脚本的字段计算的测试模式

针对基于脚本的字段计算(如脚本、传播(计算结果模式)),ThingsBoard提供测试脚本函数(TBEL)模式,可在应用变更前使用真实输入数据验证执行。

此模式可:

  • 使用相同输入数据重新运行计算
  • 临时修改参数数据或脚本逻辑(不保存配置变更
  • 验证输出JSON结构和时间戳
  • 查看脚本执行的准确输出
  • 快速复现错误并修正逻辑

用法:

在事件行点击使用此消息测试运行测试函数。

  • 左面板——脚本编辑器
    显示字段计算使用的TBEL calculate(ctx, …)函数。可直接在此窗口修改脚本。
  • 右上面板——参数
    显示计算中使用的参数列表。可调整参数值、类型和时间戳以模拟不同输入数据。
  • 右下面板——输出 显示脚本执行后的返回结果(或执行失败时的错误信息)。

流程:

  • 更新脚本和/或参数值。
  • 点击测试使用提供的输入执行函数。
  • 在输出区域核对返回的JSON结构和值。
  • 结果正确后点击保存保存变更。
  • 如需,将变更应用到字段计算配置以激活更新后的逻辑。

规则引擎集成

字段计算与ThingsBoard规则引擎集成,即平台的消息路由与处理系统。 执行无缝接入数据工作流,在以下规则节点处理时间序列或属性时自动触发:

  • 保存时间序列:新时间序列持久化时触发计算。
  • 保存属性:客户端、共享或服务器端属性更新时触发计算。
  • 字段计算:专用节点,用于手动调用字段评估或实现复杂链式逻辑。

数据重新处理

telemetry数据重新处理功能仅在ThingsBoard PEThingsBoard Cloud版本中提供。

字段计算重新处理用于将字段计算逻辑应用到历史数据。 在修改现有计算或添加新字段,并希望变更不仅作用于新数据,也作用于已收集时间序列时尤为有用。

注意: 仅包含基于属性参数的字段计算无法重新处理。字段计算必须至少包含一个基于时间序列的参数,即”最新时间序列”或”时间序列滚动”数据。

关键功能

  • 历史数据重算 —— 将更新后的逻辑应用于已收集的时间序列。
  • 灵活时间范围 —— 为重新处理选择特定时间段。
  • 以时间序列存储结果 —— 处理后的数据在ThingsBoard中保存为时间序列,可用于小部件、规则或分析。

配置方法

  • 选择目标实体配置文件,进入”字段计算“选项卡,创建新字段计算或选择需要历史时间序列重新处理的已有字段。
  • 点击对应字段旁的”重新处理字段计算“图标。
  • 在弹出窗口中定义要重新处理的时间序列时间区间。
  • 点击”重新处理” —— 系统将按最新逻辑开始重算并更新历史时间序列数据。
  • 重新处理完成后点击完成

使用数据重新处理功能的示例

假设Smart Device实时发送温度与湿度数据。随后配置字段计算计算露点。 在时间序列小部件上可见,露点值仅在13:44:35之后出现——此前未执行该计算。

要重算历史时段(字段计算创建前)的露点,按以下步骤操作:

  • 进入相应Smart Device字段计算选项卡。点击所需字段所在行的重新处理字段计算图标。

  • 在对话窗口中指定重新计算的时间间隔,然后点击重新处理

  • 流程完成后,点击完成

结果是所选历史整个时段内会生成并存储dewPoint值。



任务管理器

任务管理器用于查看任务状态、跟踪进度、查看结果,以及定位数据处理过程中的错误。


滚动参数的内置方法

时间序列滚动参数支持用于计算的内置函数。这些函数接受可选的ignoreNaN布尔参数。

方法 默认行为(ignoreNaN=true 其他选项(ignoreNaN=false
max() 返回最高值,忽略NaN值。 如果存在任何NaN值则返回NaN。
min() 返回最低值,忽略NaN值。 如果存在任何NaN值则返回NaN。
mean(), avg() 计算平均值,忽略NaN值。 如果存在任何NaN值则返回NaN。
std() 计算标准差,忽略NaN。 如果存在任何NaN值则返回NaN。
median() 返回中位数,忽略NaN值。 如果存在任何NaN值则返回NaN。
count() 计数,忽略NaN值。 计数所有值,包括NaN。
last() 返回最近的值,跳过NaN值。 返回最后一个值,即使是NaN。
first() 返回最旧的值,跳过NaN值。 返回第一个值,即使是NaN。
sum() 计算总和,忽略NaN值。 如果存在任何NaN值则返回NaN。


假设以下时间序列滚动参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
  "temperature": {
    "timeWindow": {
      "startTs": 1740643762896,
      "endTs": 1740644662896
    },
    "values": [
      { "ts": 1740644350000, "value": 72.32 },
      { "ts": 1740644360000, "value": 72.86 },
      { "ts": 1740644370000, "value": 73.58 },
      { "ts": 1740644380000, "value": "NaN" }
    ]
  }
}


用法和结果

1
2
3
4
5
6
7
var avgTemp = temperature.mean(); // Returns 72.92
var tempMax = temperature.max(); // Returns 73.58
var valueCount = temperature.count(); // Returns 3

var avgTempNaN = temperature.mean(false);  // Returns NaN
var tempMaxNaN = temperature.max(false);   // Returns NaN
var valueCountNaN = temperature.count(false); // Returns 4

适用场景

  • 统计分析:计算均值、中位数和标准差用于趋势分析。
  • 数据筛选:识别时间窗口内的最大最小值。
  • 质量控制:用count() 和std() 检测缺失值或异常值。
  • 能效监控:汇总一段时间内的功耗以评估能耗模式。

合并时间序列参数

时间序列滚动参数可合并以在多个数据集间对齐时间戳。 合并函数通过收集所有参数的时间戳并按这些时间戳合并值,将两个或多个滚动参数合并。 若某参数在某一时间戳无对应值,则使用该参数的前一个值;若无前值则赋NaN。 结果为新的滚动参数,包含时间窗口和按每个时间戳对应各参数值的数组。

方法 说明 返回
merge(other, settings) 与另一个滚动参数合并。对齐时间戳并用前一个可用值填充缺失值。 包含时间窗口和对齐值的合并对象。
mergeAll(others, settings) 合并多个滚动参数。对齐时间戳并用前一个可用值填充缺失值。 包含时间窗口和对齐值的合并对象。

参数

参数 说明
otherothers 要合并的另一个滚动参数或滚动参数数组。
settings(可选) 配置对象,支持:
- ignoreNaN——控制是否应忽略NaN值。
- timeWindow——定义自定义时间窗口。

假设以下参数及其值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
{
  "humidity": {
    "timeWindow": {
      "startTs": 1741356332086,
      "endTs": 1741357232086
    },
    "values": [{
      "ts": 1741356882759,
      "value": 43
    }, {
      "ts": 1741356918779,
      "value": 46
    }]
  },
  "pressure": {
    "timeWindow": {
      "startTs": 1741356332086,
      "endTs": 1741357232086
    },
    "values": [{
      "ts": 1741357047945,
      "value": 1023
    }, {
      "ts": 1741357056144,
      "value": 1026
    }, {
      "ts": 1741357147391,
      "value": 1025
    }]
  },
  "temperature": {
    "timeWindow": {
      "startTs": 1741356332086,
      "endTs": 1741357232086
    },
    "values": [{
      "ts": 1741356874943,
      "value": 76
    }, {
      "ts": 1741357063689,
      "value": 77
    }]
  }
}

用法:

1
var mergedData = temperature.merge(humidity, { ignoreNaN: false });

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
  "mergedData": {
    "timeWindow": {
      "startTs": 1741356332086,
      "endTs": 1741357232086
    },
    "values": [{
      "ts": 1741356874943,
      "values": [76.0, "NaN"]
    }, {
      "ts": 1741356882759,
      "values": [76.0, 43.0]
    }, {
      "ts": 1741356918779,
      "values": [76.0, 46.0]
    }, {
      "ts": 1741357063689,
      "values": [77.0, 46.0]
    }]
  }
}

用法:

1
var mergedData = temperature.mergeAll([humidity, pressure], { ignoreNaN: true });

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
  "mergedData": {
    "timeWindow": {
      "startTs": 1741356332086,
      "endTs": 1741357232086
    },
    "values": [{
      "ts": 1741357047945,
      "values": [76.0, 46.0, 1023.0]
    }, {
      "ts": 1741357056144,
      "values": [76.0, 46.0, 1026.0]
    }, {
      "ts": 1741357063689,
      "values": [77.0, 46.0, 1026.0]
    }, {
      "ts": 1741357147391,
      "values": [77.0, 46.0, 1025.0]
    }]
  }
}

适用场景

在多个传感器以不同间隔提供数据流时,合并time series arguments很有用。 通过对齐timestamps并填充缺失值,合并可实现:

  • 传感器数据同步:对齐测量相关参数(如温湿度)的多个传感器读数。
  • 异常检测:合并多源telemetry以识别系统性能不一致或偏差。
  • 能耗分析:合并各设备的功耗数据以提供统一的能耗趋势视图。
  • 预测性维护:合并振动、温度和运行状态数据以预测设备故障。

导出/导入字段计算

可将字段计算导出为JSON文件,并导入到同一或另一ThingsBoard实例。


导出字段计算

  • 进入字段计算页面。
  • 在对应字段计算行中点击导出按钮。


导入字段计算

可从JSON配置文件导入字段计算配置。 在实体或配置文件间迁移字段计算配置时尤其有用,可保证一致性并减少手动配置。

导入步骤:

  • 进入字段计算页面。点击”+“图标按钮,从下拉菜单中选择导入字段计算

  • 在打开的窗口中,上传包含字段计算配置的JSON文件,然后点击导入

  • 在打开的对话框中,指定将应用字段计算的实体或配置文件

  • 如果参数有任何问题,它们将被高亮显示。

  • 确保导入的字段正确应用并更新任何必要的参数。

  • 点击添加完成导入。

  • 您已导入字段计算配置。

注意:确保导入的字段正确应用并更新所需参数:

  • 若引用实体为当前实体,不会报错。
  • 若引用实体在tenant中不存在,将作为错误在使用的argument处高亮。
  • 若引用实体为当前tenant且导入到另一tenant,将自动调整为新区tenant且无错误。

管理字段计算

在”字段计算”页面集中管理所有字段计算。

每个字段计算包含操作面板:

  1. 复制 —— 复制配置以快速创建新字段计算。
  2. 导出 —— 下载配置为JSON文件用于备份或迁移。
  3. 事件 —— 查看执行事件,包括状态变更和错误。
  4. 调试 —— 启用调试模式并查看详细执行数据。
  5. 删除 —— 从系统中移除字段计算。


查看字段计算的详细信息

点击字段计算可查看其详情。


修改字段计算

修改字段计算时,点击进入详情视图,再点击橙色铅笔按钮。 完成修改后,点击橙色检查按钮应用更新。

字段计算概览视频

更习惯可视化学习?可观看此短视频快速了解ThingsBoard中的字段计算。 涵盖核心概念、支持的计算类型,以及实时处理和转换数据的实践示例。

 


反馈意见

欢迎在github为ThingsBoard加星。 如有疑问,请联系我们