用 Grafana 做温湿度异常检测:从阈值告警到趋势预测

前面两篇我们讲了:

  • 以太网温湿度变送器怎么把数据变成网络节点
  • 边缘网关怎么把数据"干净地"送进时序数据库

这一篇接着往下走:数据已经在时序库里了,怎么在 Grafana 里把它用起来?

很多人的 Grafana 只停留在"画条曲线看看",但温湿度监控真正有价值的是三件事:

  1. 异常能告警(不是毛刺就炸群)
  2. 趋势能预测(空调快不行了提前知道)
  3. 排障能溯源(哪一段数据有问题一眼看清)

下面按"阈值 → 智能检测 → 趋势预测 → 告警降噪"四层来拆。


一、先搭一个能用的温湿度看板

假设数据已经写在 InfluxDB 里,measurement 结构如下:

复制代码
measurement: environment
tags:      device_id, location, room
fields:    temperature, humidity, dew_point

1. 温度趋势面板(Flux 查询)

复制代码
from(bucket: "sensor_data")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r._measurement == "environment")
  |> filter(fn: (r) => r._field == "temperature")
  |> filter(fn: (r) => r.device_id == "${device}")
  |> aggregateWindow(every: v.windowPeriod, fn: mean)

湿度同理,双 Y 轴放一张图里:

  • 左轴:温度 ℃
  • 右轴:湿度 %RH

2. 面板阈值配色(别只画线)

在 Panel → Thresholds 里配:

指标 正常 预警 严重
温度 18~27℃ >28℃ >32℃
湿度 40~60% <30% 或 >70% <20% 或 >80%

经验值:

机房冬季重点看下限(静电),夏季重点看露点(结露)。

别全局写死一个阈值,按房间/季节分组配置。


二、第一层:静态阈值告警(先解决"能报警")

Grafana Alerting 里新建规则:

查询 A(最近值)

复制代码
from(bucket: "sensor_data")
  |> range(start: -5m)
  |> filter(fn: (r) => r._measurement == "environment")
  |> filter(fn: (r) => r._field == "temperature")
  |> filter(fn: (r) => r.device_id == "rack-a-01")
  |> last()

表达式

  • Reduce:last()
  • Threshold:is above 28

评估策略

  • Evaluate every:30s
  • Pending period:1m(连续 2 次越限才触发)

关键:Pending 一定要有。

传感器偶发毛刺、网络重传、空调启停瞬间,都会产生假峰值。

通知渠道接:

  • 企业微信 / 钉钉机器人
  • Webhook → 运维平台
  • 严重级别再叠加短信

三、第二层:别只盯绝对值,看"变化率"

真实机房里,最危险的往往不是"现在 30℃",而是:

10 分钟内从 22℃ 涨到 29℃

这时候绝对值还没超阈值,但空调已经出问题了。

温升速率检测(Flux 思路)

复制代码
last_temp = 
  from(bucket: "sensor_data")
    |> range(start: -10m)
    |> filter(fn: (r) => r._field == "temperature" and r.device_id == "rack-a-01")
    |> last()

first_temp = 
  from(bucket: "sensor_data")
    |> range(start: -10m)
    |> filter(fn: (r) => r._field == "temperature" and r.device_id == "rack-a-01")
    |> first()

// 用 map 做差值(示意)

告警条件:

  • 当前温度 > 26℃
  • 且 10 分钟温升 > 3℃

这种规则能抓到:

  • 空调压缩机失效
  • 冷通道封闭破损
  • 机柜风扇停转

四、第三层:异常检测(让 Grafana 学"什么是正常")

静态阈值有个死穴:

白天和夜里负载不同,温湿度基线本来就在变

这时候可以用两类做法。


方案 A:Grafana ML / Dynamic Alerting(Cloud 或插件)

Grafana ML 会基于历史数据训练:

  • 趋势(trend)
  • 周期性(日/周)
  • 置信区间(upper / lower band)

它产出三个信号:

复制代码
metric:predicted   # 预测值
metric:actual      # 真实值
metric:anomalous   # 0 正常 / 1 偏高 / -1 偏低

告警规则示例:

复制代码
# 实际值明显偏离预测下界
temperature:anomalous != 0

或者:

复制代码
abs(temperature:predicted - temperature:actual) > 2

优点:

  • 不用手工调阈值
  • 自动适应日周期、周周期
  • 毛刺不误报,真异常才响

方案 B:自托管轻量异常检测(边缘算)

如果不想上云 ML,可以在边缘网关里算"滚动基线":

复制代码
import numpy as np

def zscore_anomaly(values, window=60, k=3):
    arr = np.array(values)
    baseline = arr[-window:]
    mu, sigma = baseline.mean(), baseline.std()
    if sigma == 0:
        return False
    z = (arr[-1] - mu) / sigma
    return abs(z) > k

Grafana 只负责展示 quality 字段:

  • good
  • spike
  • drift
  • anomaly

面板里用不同颜色标记,比"红绿线"信息量大得多。


五、第四层:趋势预测(在坏之前先知道)

温湿度监控的高级形态,不是"超了再报",而是:

按当前趋势,未来 30 分钟会不会到危险区?

1. Grafana ML Forecast

在 Cloud 里建 Forecast Job:

  • 训练窗口:30d
  • 预测窗口:1h
  • 算法:Prophet / MSTL

面板里会看到:

  • 蓝色预测线
  • 阴影置信带
  • 绿色实际值

告警可以这样写:

复制代码
temperature:predicted{ml_forecast="yhat_upper"} > 30

含义:

不用等真的 30℃,只要"预测会上去"就提前预警。

适合场景:

  • 夜间无人值守机房
  • 配电室、档案库、药仓
  • 空调定时切换失败

2. 自托管简单线性外推(够用版)

边缘侧用最近 N 个点做一元线性回归:

复制代码
import numpy as np

def linear_forecast(ts, vals, future_minutes=30):
    x = np.array(ts)
    y = np.array(vals)
    A = np.polyfit(x, y, 1)
    x_future = x[-1] + future_minutes * 60
    return np.polyval(A, x_future)

把预测值也写进时序库:

复制代码
field: temperature_forecast_30m

Grafana 里画三条线:

  • 实际温度
  • 30 分钟预测
  • 危险阈值线

值班人员看一眼就知道:

现在 26℃,但半小时后会到 31℃


六、告警降噪:别把运维逼疯

温湿度系统最容易出现"告警疲劳"。

1. 分级

级别 触发条件 通知方式
Info 湿度略偏干 仅看板标记
Warning 连续 2 分钟越限 企微/钉钉
Critical 预测将超阈值 / 设备离线 电话+短信

2. 抑制策略

  • 同设备 5 分钟内不重复发
  • 维护期静默(label: maintenance=true)
  • 多设备同区域同时异常 → 聚合为"机房级事件"

3. 标签体系

告警 rule 上打标:

复制代码
labels:
  device_id: rack-a-01
  room: A机房
  metric: temperature
  severity: warning

后面可以用 Alertmanager 做路由:

  • A 机房 → A 组值班
  • B 机房 → B 组值班

七、一个"能落地"的温湿度检测看板长什么样

建议分 4 个 Row:

Row 1:总览

  • 当前温度 / 湿度 Stat 面板
  • 在线设备数
  • 活跃告警数

Row 2:实时趋势

  • 温湿度双 Y 轴
  • 阈值带
  • 预测虚线

Row 3:异常诊断

  • 温升速率
  • 露点温度
  • 数据质量分布(good/bad/spike)

Row 4:事件与追溯

  • 告警时间线
  • 设备离线记录
  • 边缘网关缓存积压

大屏原则:

**一眼看状态,点进去看细节。**​

别把 20 张图塞一屏。


八、踩坑清单(很实战)

  1. 时区不对
    Grafana 用 UTC,业务用北京时间,曲线对不上。
    → 数据源和面板统一时区。
  2. 告警查询用了模板变量
    面板能用 $device,告警规则不能。
    → 告警查询写死 tag 或用 label matcher。
  3. 只存原始值不存质量戳
    后面没法区分"传感器坏了"还是"真高温"。
    → 一定要带 quality 字段。
  4. 预测模型没训练够
    只给 1 天数据,ML 学不到日周期。
    → 至少 14 天,理想 90 天。
  5. 阈值全年不变
    冬天 30% 湿度已经很低,夏天 70% 才危险。
    → 阈值做成可配置,按季节/房间维度管理。

九、小结

温湿度监控在 Grafana 里的演进路径其实是这样:

复制代码
画曲线
  ↓
静态阈值告警
  ↓
变化率 + 质量戳检测
  ↓
ML 异常检测(动态基线)
  ↓
趋势预测 + 前置告警

真正好的动环系统,不是"超温了叫一声",而是:

在空调彻底失效前 20 分钟,你就知道要去看一眼。

相关推荐
开源推荐官1 小时前
多门店 O2O 商城选型复盘:从开发视角对比主流开源系统
java·架构·开源·php
赵渝强老师1 小时前
【赵渝强老师】YashanDB Developer Center(YDC,崖山数据库开发者中心)
数据库·国产数据库·yashandb·崖山数据库
lusklusklusk1 小时前
SQL Server 为什么普通 SELECT 会阻塞 UPDATE?——行级 S 锁到表级 S 锁的锁升级原理与实验验证
数据库·mysql·oracle
Leo.yuan1 小时前
企业业务人员如何独立完成数据分析?2026年自助BI工具选型与应用指南
大数据·数据库·人工智能
roman_日积跬步-终至千里1 小时前
数仓开发的三层责任:业务定义、模型设计与 SQL 实现
数据库·数据仓库·sql·数据建模
瀚高PG实验室2 小时前
瀚高数据库创建新数据库卡住问题排查
数据库·postgresql·瀚高数据库
瑶总迷弟2 小时前
银河麒麟 V10 ARM64 安装 Oracle 19c 静默部署操作手册
数据库·oracle
程序员塔塔喵2 小时前
【MySQL篇|第十而二篇】深层次讲解MVCC机制
mysql·mvcc
飞浪纪元[FWC–FE]2 小时前
Qt 工程创建与 CMake / qmake 构建规范
开发语言·数据库·qt