You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ThingsBoard中构建规则链计算发动机开机时长?

ThingsBoard计算发动机开机时长规则链构建方案

核心思路

通过存储设备上一次的启停状态及对应时间戳,在状态发生切换(从开机到停机)时,计算两次状态变更的时间差,得到单次开机时长,按需累加总时长。

规则链节点配置步骤

  • 消息过滤节点:添加Message Type节点,仅允许POST_TELEMETRY_REQUEST类型的消息进入后续流程,过滤无关消息。
  • 实体属性读取节点:添加Entity Attributes节点,配置读取设备的服务器端属性:last_status(存储上一次状态值)、last_timestamp(存储上一次状态变更的时间戳)。
  • 核心计算脚本节点:添加Script节点,编写JavaScript逻辑处理状态变更与时长计算:
    var currentStatus = msg.status;
    var currentTs = msg.ts || Date.now();
    var lastStatus = metadata.last_status;
    var lastTs = metadata.last_timestamp;
    
    // 首次上报状态,初始化属性
    if (lastStatus === undefined) {
        metadata.last_status = currentStatus;
        metadata.last_timestamp = currentTs;
        return {msg: msg, metadata: metadata, msgType: msgType};
    }
    
    // 状态从开机(1)切换到停机(0),计算时长
    if (lastStatus === 1 && currentStatus === 0) {
        var durationMs = currentTs - lastTs;
        // 转换为分钟(按需调整单位)
        var durationMin = durationMs / (1000 * 60);
        // 将计算结果加入遥测消息
        msg.running_duration_min = durationMin;
        // 可选:累加总开机时长(需额外存储total_running_duration属性)
        // var totalDuration = metadata.total_running_duration || 0;
        // metadata.total_running_duration = totalDuration + durationMin;
    }
    
    // 更新最新状态和时间戳
    metadata.last_status = currentStatus;
    metadata.last_timestamp = currentTs;
    
    return {msg: msg, metadata: metadata, msgType: msgType};
    
  • 遥测存储节点:添加Telemetry节点,将包含running_duration_min的消息存储到设备遥测中,用于后续查看或报表统计。
  • 实体属性更新节点:添加Entity Attributes节点(配置为写入模式),将last_status和last_timestamp(如需累加总时长则加上total_running_duration)写入设备服务器端属性,覆盖旧值。

关于Delta enrichment无效的原因

Delta enrichment节点仅适用于连续数值型数据的增量计算(如温度变化、电量差值),无法识别离散的状态切换逻辑,因此无法直接用来计算开机时长,必须通过脚本结合属性存储的方式实现状态变更的时间差计算。

内容的提问来源于stack exchange,提问作者Philip Raistrick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 12:48:26