环境监测异常预警规则
适用于矿山(瓦斯)、电力(温度)、冷链(温度)、水利(水位)等场景的环境参数监测与异常预警。
规则文件内容
请复制以下内容,保存为 .cursor/rules/environment-monitoring-alert.mdc:
markdown
---
description: 环境监测数据异常判断与分级预警规则
globs: src/modules/monitoring/**, src/modules/sensor/**, src/modules/alert/**
---
# 环境监测异常预警规则
## 1. 核心原则
- **实时监测**:传感器数据实时采集,每秒/每分钟检查一次。
- **双重判断**:绝对值阈值 + 趋势变化,防止漏报和误报。
- **分级预警**:根据严重程度分级报警(预警/报警/紧急)。
- **误报控制**:平衡灵敏度和误报率,避免频繁误报导致麻痹。
## 2. 异常判定逻辑
### 2.1 绝对值阈值判断
$$ 当前值 > 预警阈值 \Rightarrow 预警 $$
$$ 当前值 > 报警阈值 \Rightarrow 报警 $$
$$ 当前值 > 紧急阈值 \Rightarrow 紧急 $$
### 2.2 趋势变化判断
$$ 变化率 = \frac{当前值 - 起始值}{时间窗口} $$
$$ 变化率 > 快速上升阈值 \Rightarrow 立即报警 $$
### 2.3 判定规则(以瓦斯浓度为例)
| 判定条件 | 严重程度 | 处理动作 |
| :--- | :--- | :--- |
| **浓度 > 0.5%** | 预警 (warning) | 推送预警,提醒关注 |
| **浓度 > 0.8%** | 报警 (alert) | 推送报警,准备撤离 |
| **浓度 > 1.0%** | 紧急 (emergency) | 强制撤离,停止作业 |
| **15分钟上升 > 0.3%** | 报警 (alert) | 快速上升,立即报警 |
### 2.4 自动响应规则
**预警响应(浓度 > 0.5%):**
1. 推送预警到调度室、安全科
2. 显示当前值、历史趋势图
3. 提醒加强通风
**报警响应(浓度 > 0.8% 或快速上升):**
1. 推送报警到调度室、安全科、矿长
2. 通知该区域人员准备撤离
3. 启动应急通风系统
**紧急响应(浓度 > 1.0%):**
1. 强制撤离该区域所有人员
2. 停止该区域所有作业
3. 启动应急预案
## 3. 代码实现规范 (TypeScript)
### 3.1 绝对值阈值判断
```typescript
/**
* 检测环境参数是否超过阈值
* @param currentValue 当前值
* @param thresholds 阈值配置
* @returns 异常检测结果
*/
export function checkAbsoluteThreshold(
currentValue: number,
thresholds: ThresholdConfig
): ThresholdResult {
if (currentValue >= thresholds.emergency) {
return { severity: 'emergency', exceeded: true };
}
if (currentValue >= thresholds.alert) {
return { severity: 'alert', exceeded: true };
}
if (currentValue >= thresholds.warning) {
return { severity: 'warning', exceeded: true };
}
return { severity: 'normal', exceeded: false };
}3.2 趋势变化判断
typescript
/**
* 检测环境参数是否快速上升
* @param history 历史数据(时间窗口内)
* @param rapidRiseThreshold 快速上升阈值
* @returns 趋势检测结果
*/
export function checkRapidRise(
history: SensorData[],
rapidRiseThreshold: number
): TrendResult {
if (history.length < 2) {
return { isRapidRise: false };
}
const startValue = history[0].value;
const endValue = history[history.length - 1].value;
const rise = endValue - startValue;
if (rise >= rapidRiseThreshold) {
const duration = (history[history.length - 1].timestamp.getTime() -
history[0].timestamp.getTime()) / 1000;
return {
isRapidRise: true,
rise,
duration,
riseRate: rise / (duration / 60) // 每分钟上升速率
};
}
return { isRapidRise: false };
}3.3 综合判断函数
typescript
/**
* 综合判断环境监测异常
* @param currentValue 当前值
* @param history 历史数据
* @param config 配置参数
* @returns 异常判断结果
*/
export function checkEnvironmentAnomaly(
currentValue: number,
history: SensorData[],
config: MonitoringConfig
): AnomalyResult {
// 绝对值判断
const thresholdResult = checkAbsoluteThreshold(currentValue, config.thresholds);
// 趋势判断
const trendResult = checkRapidRise(history, config.rapidRiseThreshold);
// 综合判断
if (trendResult.isRapidRise) {
return {
isAnomalous: true,
severity: 'alert',
reason: 'RAPID_RISE',
details: trendResult
};
}
if (thresholdResult.exceeded) {
return {
isAnomalous: true,
severity: thresholdResult.severity,
reason: 'THRESHOLD_EXCEEDED',
details: thresholdResult
};
}
return { isAnomalous: false };
}3.4 自动报警函数
typescript
/**
* 触发分级报警
* @param anomaly 异常事件
*/
export async function triggerEnvironmentAlert(
anomaly: EnvironmentAnomaly
): Promise<void> {
const { severity, sensorId, currentValue, location } = anomaly;
switch (severity) {
case 'warning':
// 预警
await alertService.push({
channels: ['调度室', '安全科'],
priority: 'MEDIUM',
message: `${location} ${anomaly.parameterName}预警:当前值${currentValue}`,
actions: ['加强通风', '持续监测']
});
break;
case 'alert':
// 报警
await alertService.push({
channels: ['调度室', '安全科', '矿长'],
priority: 'HIGH',
message: `${location} ${anomaly.parameterName}报警:当前值${currentValue}`,
actions: ['准备撤离', '启动应急通风']
});
// 通知该区域人员
await notifyAreaWorkers(location, '准备撤离');
break;
case 'emergency':
// 紧急
await alertService.push({
channels: ['全体人员', '应急指挥中心'],
priority: 'CRITICAL',
message: `${location} ${anomaly.parameterName}紧急:当前值${currentValue},立即撤离!`,
actions: ['强制撤离', '停止作业', '启动应急预案']
});
// 强制撤离
await emergencyService.evacuate(location);
break;
}
}4. 数据模型约束
4.1 传感器数据记录
typescript
interface SensorData {
id: string;
sensorId: string; // 传感器ID
parameterName: string; // 参数名称(如"瓦斯浓度")
value: number; // 当前值
unit: string; // 单位(如"%")
location: string; // 位置
timestamp: Date;
}4.2 异常事件记录
typescript
interface EnvironmentAnomaly {
id: string;
sensorId: string;
parameterName: string;
currentValue: number;
location: string;
severity: 'warning' | 'alert' | 'emergency';
reason: 'THRESHOLD_EXCEEDED' | 'RAPID_RISE';
detectedAt: Date;
status: 'PENDING' | 'CONFIRMED' | 'RESOLVED';
// 处置记录
disposal?: {
confirmedBy: string;
confirmedAt: Date;
actions: string[]; // 处置措施
result: string; // 处置结果
resolvedAt: Date;
};
}4.3 阈值配置
typescript
interface ThresholdConfig {
warning: number; // 预警阈值
alert: number; // 报警阈值
emergency: number; // 紧急阈值
rapidRiseThreshold: number; // 快速上升阈值
timeWindow: number; // 时间窗口(秒)
}5. 开发注意事项
- 阈值可配置:不同场景、不同参数的阈值不同,必须支持配置。
- 误报控制:设置合理的阈值和时间窗口,避免频繁误报。
- 数据平滑:传感器数据可能有波动,建议使用移动平均等方法平滑。
- 历史数据:保留足够的历史数据用于趋势分析(建议至少30分钟)。
- 性能优化:实时监测需要优化查询性能,建议使用时序数据库(如InfluxDB)。
6. 测试用例
6.1 正常场景
- 参数值在正常范围内 → 无报警
6.2 绝对值异常
- 瓦斯浓度 = 0.6% → 触发预警
- 瓦斯浓度 = 0.9% → 触发报警
- 瓦斯浓度 = 1.1% → 触发紧急
6.3 趋势异常
- 15分钟内从0.3%上升到0.7%(上升0.4%)→ 触发报警
6.4 边界场景
- 传感器故障(数据异常波动)→ 标记为设备故障,不触发报警
- 传感器维护中 → 不触发报警
7. 场景配置示例
7.1 矿山瓦斯监测
typescript
const GAS_MONITORING_CONFIG: MonitoringConfig = {
parameterName: '瓦斯浓度',
unit: '%',
thresholds: {
warning: 0.5,
alert: 0.8,
emergency: 1.0
},
rapidRiseThreshold: 0.3, // 15分钟上升0.3%
timeWindow: 900, // 15分钟
checkInterval: 60 // 每分钟检查一次
};7.2 电力变压器温度监测
typescript
const TRANSFORMER_TEMP_CONFIG: MonitoringConfig = {
parameterName: '变压器温度',
unit: '℃',
thresholds: {
warning: 85,
alert: 95,
emergency: 105
},
rapidRiseThreshold: 10, // 30分钟上升10℃
timeWindow: 1800, // 30分钟
checkInterval: 60 // 每分钟检查一次
};7.3 冷链温度监测
typescript
const COLD_CHAIN_TEMP_CONFIG: MonitoringConfig = {
parameterName: '冷库温度',
unit: '℃',
thresholds: {
warning: 8,
alert: 10,
emergency: 12
},
rapidRiseThreshold: 3, // 10分钟上升3℃
timeWindow: 600, // 10分钟
checkInterval: 60 // 每分钟检查一次
};7.4 水利水位监测
typescript
const WATER_LEVEL_CONFIG: MonitoringConfig = {
parameterName: '水位',
unit: 'm',
thresholds: {
warning: 50, // 警戒水位
alert: 55, // 保证水位
emergency: 58 // 设计水位
},
rapidRiseThreshold: 2, // 1小时上升2米
timeWindow: 3600, // 1小时
checkInterval: 300 // 每5分钟检查一次
};
## 适用场景
- **矿山安全**:瓦斯浓度、一氧化碳浓度、温度监测
- **电力运维**:变压器温度、局部放电、负载监测
- **冷链物流**:冷库温度、冷藏车温度监测
- **水利工程**:水位、流量、闸门开度监测
- **环保监测**:空气质量、水质、噪音监测
## 技术迁移
### 复用已有资产
- **生鲜场景:冷库温度监测规则** - 复用阈值判断、报警推送逻辑
### 差异点
- 监测参数:温度 → 瓦斯浓度/水位/其他参数
- 阈值设置:不同场景阈值不同
- 响应动作:预警/报警 → 预警/报警/强制撤离
### 技术复用度
- 规则引擎逻辑:100%复用
- 报警推送逻辑:100%复用
- 数据采集层:需要适配不同传感器(20%新开发)
## 相关资产
- [人员定位异常监测规则 →](./personnel-location-anomaly) - 人员定位信号异常
- [设备巡检到期预警规则 →](./inspection-overdue-alert) - 计划任务到期提醒
- [传感器数据采集规则 →](./sensor-anomaly-monitoring) - 传感器数据采集与异常检测
## 实施指南
### 步骤1:配置规则文件
```bash
# 创建规则文件目录
mkdir -p .cursor/rules
# 复制规则文件
cp environment-monitoring-alert.mdc .cursor/rules/步骤2:配置阈值参数
typescript
// config/monitoring-rules.ts
export const MONITORING_CONFIGS = {
gas: GAS_MONITORING_CONFIG,
transformer: TRANSFORMER_TEMP_CONFIG,
coldChain: COLD_CHAIN_TEMP_CONFIG,
waterLevel: WATER_LEVEL_CONFIG
};步骤3:在Cursor中使用
在Cursor中告诉AI:
"参考 environment-monitoring-alert.mdc 中的业务规则,
实现瓦斯浓度监测与预警功能"
AI会基于规则生成准确的判断逻辑、报警逻辑等。步骤4:测试验证
bash
# 运行单元测试
npm test -- environment-monitoring
# 模拟异常场景
npm run simulate:gas-alert
