如何使用Azure TSI Gen2 Rest APIs计算停机时间报表
针对该需求的可行实现方案
以下方案完全基于Azure TSI REST API实现,无需借助额外计算资源:
方案1:单API请求直接返回计算结果(推荐)
依托Azure TSI Gen2查询API的内置函数能力,可在单次请求中完成全部计算逻辑,直接返回各段停机时长:
- 调用
TSI Query - GetSeries接口,请求参数按以下规则配置:- 限定查询的时间范围、筛选指定plc_id的设备数据
- 排序规则设置为按时间戳升序排列
- 新增计算列「状态变更标记」,使用内置
$prev函数判断连续状态是否中断,表达式为:$event.status != $prev($event.status) ? 1 : ($ts.timeIntervalIndex == 0 ? 1 : 0) - 对状态变更标记做累加求和生成「区间组ID」,同时添加筛选条件仅保留status=0的时序点,同组ID的所有点属于同一段连续停机区间
- 最后按区间组ID聚合,分别取每组的最小时间戳(区间起始)和最大时间戳(区间结束),二者差值即为对应区间的停机时长
方案2:轻量拆分实现
如果不想编写复杂的TSI查询表达式,可拆分为两步API调用实现:
- 第一步调用
GetSeries接口,拉取目标时间范围、指定plc_id的全量时序数据,请求中设置按时间戳升序、仅返回status和timestamp两个字段 - 第二步可直接在API请求中添加筛选条件过滤掉所有status=1的点,遍历返回结果识别连续时间戳的区间,计算起止差值即可
关键注意事项
- 需提前将业务上报的
timestamp字段设置为TSI时序模型的时间戳属性,否则TSI默认会使用IoT Hub数据接入的系统时间,会导致计算误差 - 数据量超过单页返回上限时,需携带API返回的延续标记(continuation token)发起后续请求,拉取全量数据
- 批量查询多设备停机时长时,可在查询逻辑中新增按plc_id分组的规则,单次请求即可返回所有设备的统计结果
内容的提问来源于stack exchange,提问作者Indrajeet Singh
相关产品推荐
相关产品推荐

