如何在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
相关产品推荐
相关产品推荐

