InfluxDB:如何用Flux按天汇总stateDuration得到的设备‘on’总时长?
解决设备每日"on"状态总时长的Flux查询方案
直接用以下查询即可实现按天汇总设备"on"状态的总时长:
from(bucket: "hass") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "binary_sensor.slave_ch_active_boiler_caldaia_ot") |> filter(fn: (r) => r["_field"] == "state") |> filter(fn: (r) => r["domain"] == "binary_sensor") |> filter(fn: (r) => r["entity_id"] == "slave_ch_active_boiler_caldaia_ot") |> stateDuration(fn: (r) => r._value == "on", column: "state_duration", unit: 1s) // 按自然天划分时间窗口 |> window(every: 1d) // 提取每个on时段的最终时长(stateDuration持续输出时,最后一条值为该时段总时长) |> last(column: "state_duration") // 汇总当天所有on时段的总时长 |> sum(column: "state_duration") // 整理结果格式,移除窗口标记 |> duplicate(column: "_stop", as: "_time") |> window(every: inf)
关键步骤说明
window(every: 1d):将数据按天分割为独立的处理单元,确保后续汇总只针对单天的数据。last(column: "state_duration"):stateDuration在设备处于"on"状态时会持续输出递增的时长值,每个on时段的最后一条记录就是该时段的完整时长,用last()精准提取这个值。sum(column: "state_duration"):把当天所有on时段的时长累加,得到该设备当天的总运行时长。- 最后两行的窗口处理:移除自动生成的窗口起止标记,将结果格式化为每个日期对应一个总时长的简洁形式。
内容的提问来源于stack exchange,提问作者Cybergatto
相关产品推荐
相关产品推荐

