前面两篇我们讲了:
- 以太网温湿度变送器怎么把数据变成网络节点
- 边缘网关怎么把数据"干净地"送进时序数据库
这一篇接着往下走:数据已经在时序库里了,怎么在 Grafana 里把它用起来?
很多人的 Grafana 只停留在"画条曲线看看",但温湿度监控真正有价值的是三件事:
- 异常能告警(不是毛刺就炸群)
- 趋势能预测(空调快不行了提前知道)
- 排障能溯源(哪一段数据有问题一眼看清)
下面按"阈值 → 智能检测 → 趋势预测 → 告警降噪"四层来拆。

一、先搭一个能用的温湿度看板
假设数据已经写在 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 张图塞一屏。
八、踩坑清单(很实战)
- 时区不对
Grafana 用 UTC,业务用北京时间,曲线对不上。
→ 数据源和面板统一时区。 - 告警查询用了模板变量
面板能用$device,告警规则不能。
→ 告警查询写死 tag 或用 label matcher。 - 只存原始值不存质量戳
后面没法区分"传感器坏了"还是"真高温"。
→ 一定要带quality字段。 - 预测模型没训练够
只给 1 天数据,ML 学不到日周期。
→ 至少 14 天,理想 90 天。 - 阈值全年不变
冬天 30% 湿度已经很低,夏天 70% 才危险。
→ 阈值做成可配置,按季节/房间维度管理。
九、小结
温湿度监控在 Grafana 里的演进路径其实是这样:
画曲线
↓
静态阈值告警
↓
变化率 + 质量戳检测
↓
ML 异常检测(动态基线)
↓
趋势预测 + 前置告警
真正好的动环系统,不是"超温了叫一声",而是:
在空调彻底失效前 20 分钟,你就知道要去看一眼。