常见grafana查询案例

如下查询利用了 TimescaleDB 的特性(如 time_bucket)和 Grafana 的宏(如 $__timeFilter, $__interval, 以及自定义变量)。

前提条件:

  1. Grafana 数据源配置: 确保你已经在 Grafana 中正确配置了连接到你的 TimescaleDB 数据库的数据源。
  2. Grafana 变量 (Variables): 为了使仪表板更具交互性,预先创建 Grafana 变量,例如:
    • $substation: 用于选择变电站 (Substation)。查询: SELECT DISTINCT Substation FROM DimXTU;
    • $xtu_id: 用于选择 XTU。查询: SELECT DISTINCT XTU_ID FROM DimXTU WHERE Substation = '$substation'; (级联选择)
    • $ftu_id: 用于选择 FTU。查询: SELECT DISTINCT FTU_ID FROM DimFTU WHERE XTUKey IN (SELECT XTUKey FROM DimXTU WHERE XTU_ID = '$xtu_id') AND IsCurrent = TRUE; (级联选择) 或 SELECT DISTINCT FTU_ID FROM DimFTU WHERE IsCurrent = TRUE; (选择所有当前的 FTU)

用于 Grafana 的 SQL 查询示例:

1. 单个 FTU 实时电压曲线 (Time Series Panel)

SQL

SELECT
  fr.ReadingTimestamp AS "time",  -- Grafana 需要时间列别名为 "time"
  fr.UA_Voltage AS "UA Voltage",
  fr.UB_Voltage AS "UB Voltage",
  fr.UC_Voltage AS "UC Voltage"
FROM FactPowerReadings fr
JOIN DimFTU df ON fr.FTUKey = df.FTUKey
WHERE
  $__timeFilter(fr.ReadingTimestamp) -- 使用 Grafana 的时间范围过滤器
  AND df.FTU_ID = '$ftu_id'          -- 使用 Grafana 变量选择 FTU
  AND df.IsCurrent = TRUE            -- 确保我们使用的是当前有效的 FTU 记录
ORDER BY fr.ReadingTimestamp ASC;

2. 单个 FTU 实时电流曲线 (Time Series Panel)

SQL

SELECT
  fr.ReadingTimestamp AS "time",
  fr.IA_Current AS "IA Current",
  fr.IB_Current AS "IB Current",
  fr.IC_Current AS "IC Current",
  fr.I0_Current AS "I0 Current"
FROM FactPowerReadings fr
JOIN DimFTU df ON fr.FTUKey = df.FTUKey
WHERE
  $__timeFilter(fr.ReadingTimestamp)
  AND df.FTU_ID = '$ftu_id'
  AND df.IsCurrent = TRUE
ORDER BY fr.ReadingTimestamp ASC;

3. 单个 FTU 实时功率曲线 (Time Series Panel)

SQL

SELECT
  fr.ReadingTimestamp AS "time",
  fr.ActivePower_Total AS "Total Active Power",
  fr.ReactivePower_Total AS "Total Reactive Power",
  fr.ApparentPower_Total AS "Total Apparent Power"
FROM FactPowerReadings fr
JOIN DimFTU df ON fr.FTUKey = df.FTUKey
WHERE
  $__timeFilter(fr.ReadingTimestamp)
  AND df.FTU_ID = '$ftu_id'
  AND df.IsCurrent = TRUE
ORDER BY fr.ReadingTimestamp ASC;

4. 按变电站/XTU 聚合的总有功功率 (Time Series Panel)

SQL

SELECT
  time_bucket('$__interval', fr.ReadingTimestamp) AS "time", -- 按 Grafana 动态计算的时间间隔聚合
  AVG(fr.ActivePower_Total) AS "Average Active Power"
  -- SUM(fr.ActivePower_Total) AS "Total Active Power" -- 如果想看总和
FROM FactPowerReadings fr
JOIN DimFTU df ON fr.FTUKey = df.FTUKey
JOIN DimXTU dx ON df.XTUKey = dx.XTUKey
WHERE
  $__timeFilter(fr.ReadingTimestamp)
  AND dx.XTU_ID = '$xtu_id' -- 根据 XTU 过滤
  -- 或者按变电站过滤: AND dx.Substation = '$substation'
  AND df.IsCurrent = TRUE
GROUP BY "time"
ORDER BY "time" ASC;

5. FTU 数据新鲜度 (Table Panel or Stat Panel)

SQL

SELECT
  df.FTU_ID,
  dx.Substation, -- 可选,显示所属变电站
  MAX(fr.ReadingTimestamp) AS "Last Reading Timestamp",
  NOW() - MAX(fr.ReadingTimestamp) AS "Time Since Last Reading" -- 计算延迟
FROM FactPowerReadings fr
JOIN DimFTU df ON fr.FTUKey = df.FTUKey
JOIN DimXTU dx ON df.XTUKey = dx.XTUKey
WHERE
  df.IsCurrent = TRUE
  -- Optional filters based on Grafana variables:
  -- AND dx.Substation = '$substation'
  -- AND dx.XTU_ID = '$xtu_id'
  -- AND df.FTU_ID = '$ftu_id'
GROUP BY df.FTU_ID, dx.Substation
ORDER BY "Last Reading Timestamp" ASC; -- 将最久未上报的排在前面

6. FTU/XTU 状态概览 (Pie Chart or Stat Panel)

SQL

SELECT
  Status,
  COUNT(*) AS "Count"
FROM DimFTU
WHERE
  IsCurrent = TRUE
  -- Optional: Filter by substation or XTU using joins if needed
  -- JOIN DimXTU dx ON DimFTU.XTUKey = dx.XTUKey
  -- WHERE dx.Substation = '$substation'
GROUP BY Status;

SQL

SELECT
  Status,
  COUNT(*) AS "Count"
FROM DimXTU
-- Optional: Filter by substation
-- WHERE Substation = '$substation'
GROUP BY Status;

7. 电压/电流越限告警 (触发 Grafana Alerting)

SQL

SELECT
  fr.ReadingTimestamp AS "time",
  df.FTU_ID,
  GREATEST(fr.UA_Voltage, fr.UB_Voltage, fr.UC_Voltage) AS "Max Phase Voltage" -- 找到三相中最高的电压
FROM FactPowerReadings fr
JOIN DimFTU df ON fr.FTUKey = df.FTUKey
WHERE
  fr.ReadingTimestamp >= NOW() - INTERVAL '5 minutes' -- 只看最近 5 分钟的数据
  AND df.IsCurrent = TRUE
  AND (
    fr.UA_Voltage > 240 OR fr.UB_Voltage > 240 OR fr.UC_Voltage > 240 -- 假设 240V 是上限阈值
    -- 也可以检查线电压: fr.UAB_Voltage > 415 OR ...
  )
ORDER BY fr.ReadingTimestamp DESC;


集成到 Grafana 的步骤:

  1. 进入你的 Grafana 仪表板。
  2. 添加一个新的面板 (Add Panel)。
  3. 在查询编辑器中,选择你的 TimescaleDB 数据源。
  4. 将上面提供的 SQL 查询之一粘贴到查询编辑器中。确保切换到 “Code” 或 “SQL Editor” 模式(如果适用)。
  5. 根据需要调整查询(例如,选择不同的指标,修改聚合方式,添加/删除 WHERE 子句中的变量过滤)。
  6. 在 “Panel options” 中选择合适的 可视化类型 (Visualization)。
  7. 配置图例 (Legend)、轴 (Axes)、阈值 (Thresholds) 等可视化选项。
  8. 如果使用了 Grafana 变量 ($ftu_id, $substation 等),确保这些变量已在仪表板设置 (Dashboard settings -> Variables) 中创建。
  9. 保存面板和仪表板。