求用InfluxDB Flux计算家庭光伏系统能耗与馈网电量的正确语句
家庭光伏电表数据的购电/馈网电量计算(Flux修正)
场景背景
使用Shelly 3EM记录带光伏电站的家庭三相电表数据,其中一相为电网消耗+光伏发电的总和信号,功率采样周期5秒,数据存储于InfluxDB,通过Grafana可视化。已实现净功率计算(正值为购电,负值为馈网),现需准确计算实际购电量与馈网电量(单位:Wh)。
原语句问题
原计算购电量的Flux语句得到的结果(约181000)远大于实际值(约3kWh),核心问题:
integral使用v.windowPeriod作为单位,导致积分单位错误:功率单位是W,采样周期5秒,积分应先得到瓦秒(Ws),再转换为瓦时(Wh),而非直接用窗口周期计算。
正确Flux语句
1. 计算实际购电量(从电网购入的电量)
from(bucket: "Stromverbrauch") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "shelly_em3_main") |> filter(fn: (r) => r["_field"] == "power1" or r["_field"] == "power2" or r["_field"] == "power3") |> pivot(rowKey: ["_time"], columnKey: ["_field"], valueColumn: "_value") |> map(fn: (r) => ({r with _value: r.power1 + r.power2 + r.power3})) |> drop(columns: ["power1", "power2", "power3"]) // 仅保留购电时段的正功率 |> map(fn: (r) => ({r with _value: if r._value > 0 then r._value else 0.0})) // 按秒积分得到瓦秒,转换为瓦时(1 Wh = 3600 Ws) |> integral(unit: 1s) |> map(fn: (r) => ({r with _value: r._value / 3600.0})) |> yield(name: "grid_import_wh")
2. 计算馈网电量(光伏过剩送入电网的电量)
from(bucket: "Stromverbrauch") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "shelly_em3_main") |> filter(fn: (r) => r["_field"] == "power1" or r["_field"] == "power2" or r["_field"] == "power3") |> pivot(rowKey: ["_time"], columnKey: ["_field"], valueColumn: "_value") |> map(fn: (r) => ({r with _value: r.power1 + r.power2 + r.power3})) |> drop(columns: ["power1", "power2", "power3"]) // 仅保留馈网时段的负功率,取绝对值转为正值 |> map(fn: (r) => ({r with _value: if r._value < 0 then -r._value else 0.0})) |> integral(unit: 1s) |> map(fn: (r) => ({r with _value: r._value / 3600.0})) |> yield(name: "grid_export_wh")
关键说明
- 积分单位用
1s确保计算的是瓦秒(Ws),除以3600后得到标准瓦时(Wh),和电表读数单位一致。 - 不要提前使用
aggregateWindow(除非需要降采样优化),原始采样数据的积分结果更准确。
内容的提问来源于stack exchange,提问作者WolfiG
相关产品推荐
相关产品推荐

