电压和电流监测
电压和电流监测
本节介绍如何通过智能继电器实时监测电压和电流参数,以及如何利用这些数据判断设备运行状态。学习完成后,您将能够:
- 理解电压和电流监测的技术原理
- 通过 MQTT 获取实时电压/电流数据
- 利用电流变化判断设备工作状态
- 设计基于电流的异常检测逻辑
Electrical Parameters Overview
Section titled “Electrical Parameters Overview”智能继电器(如 Shelly 1PM、Tasmota 设备)可提供的电参数:
| 参数 | 单位 | 说明 | 典型值 |
|---|---|---|---|
| Voltage | V (伏特) | AC 电压有效值 | 220-240V (中国) |
| Current | A (安培) | 实时电流 | 0.1-16A |
| Power | W (瓦特) | 有功功率 | P = V × I × PF |
| Apparent Power | VA | 视在功率 | S = V × I |
| Reactive Power | var | 无功功率 | Q = √(S² - P²) |
| Power Factor | — | 功率因数 | 0.0-1.0 |
| Energy Total | kWh | 累计电量 | 设备累计读数 |
Use Cases
Section titled “Use Cases”1. 设备状态判断
Section titled “1. 设备状态判断”通过电流值判断设备是否在运行:
设备电流曲线:││ 2.5A ──┼────────────────── 正常运行│ │ (电机运行中)│ 0.3A ──┼──────┼─────┼─── 待机状态│ │ │ │ (仅控制电路供电)│ 0.0A ──┼──┼───┼──┼─┼─── 断电/离线│ T1 T2 T3 T4 时间2. 异常检测
Section titled “2. 异常检测”- 过流保护: 电流超过额定值 → 自动断电
- 欠压报警: 电压低于阈值 → 通知维护
- 功率突变: 功率突然升高/降低 → 设备故障预警
3. 能效分析
Section titled “3. 能效分析”- 计算设备运行时间和能耗
- 识别高能耗设备和不合理用电模式
- 提供能效优化建议
Voltage Monitoring in Node-RED
Section titled “Voltage Monitoring in Node-RED”Function: 电压监测逻辑
Section titled “Function: 电压监测逻辑”// 监控电压值,检测异常波动var payload = msg.payload;var voltage = payload.voltage || payload.ENERGY?.Voltage;
if (!voltage) { return null;}
// 电压阈值配置var THRESHOLD = { min: 200, // 最低电压 (V) max: 250 // 最高电压 (V)};
// 获取设备 IDvar deviceId = payload.device || msg.topic.split('/')[2] || "unknown";
// 构建监测消息var monitoringResult = { device: deviceId, voltage: voltage, status: "normal", timestamp: Date.now()};
// 电压异常检测if (voltage < THRESHOLD.min) { monitoringResult.status = "undervoltage"; monitoringResult.alert = "电压过低: " + voltage + "V"; monitoringResult.severity = "warning";} else if (voltage > THRESHOLD.max) { monitoringResult.status = "overvoltage"; monitoringResult.alert = "电压过高: " + voltage + "V"; monitoringResult.severity = "critical";}
msg.payload = monitoringResult;
// 发送到 InfluxDB 和告警流程return msg;Current Monitoring for Device State
Section titled “Current Monitoring for Device State”Function: 基于电流的设备状态判断
Section titled “Function: 基于电流的设备状态判断”// 通过电流值判断设备运行状态var payload = msg.payload;var current = payload.current || payload.ENERGY?.Current;
if (current === undefined) { return null;}
var deviceId = msg.topic.split('/')[2] || "unknown";
// 设备状态阈值(根据实际设备调整)var STATE = { OFF: { max: 0.05 }, // 断电 STANDBY: { max: 0.5 }, // 待机 RUNNING: { min: 0.5 }, // 运行中 OVERLOAD: { min: 14.0 } // 过载};
var state, powerState;if (current < STATE.OFF.max) { state = "off"; powerState = 0;} else if (current < STATE.STANDBY.max) { state = "standby"; powerState = 1;} else if (current < STATE.OVERLOAD.min) { state = "running"; powerState = 2;} else { state = "overload"; powerState = 3;}
// 获取上一次状态,检测变化var prevState = context.get("deviceState_" + deviceId) || "unknown";
// 状态变化检测if (prevState !== state) { context.set("deviceState_" + deviceId, state); node.status({fill: "blue", shape: "dot", text: state});
// 状态变化时触发额外逻辑 msg.state_changed = true; msg.prev_state = prevState;}
msg.payload = { device: deviceId, current: current, state: state, powerState: powerState, timestamp: Date.now()};
return msg;Power Consumption Pattern Analysis
Section titled “Power Consumption Pattern Analysis”Function: 运行时间统计
Section titled “Function: 运行时间统计”// 统计设备运行时间var current = msg.payload.current || 0;var deviceId = msg.topic.split('/')[2] || "unknown";var runningThreshold = 0.5; // 运行电流阈值
// 使用 Context 存储运行状态var runState = context.get("runState_" + deviceId) || { isRunning: false, startTime: null, totalRunTime: 0, // 累计运行时间 (秒) lastUpdate: Date.now()};
var now = Date.now();var isRunning = current > runningThreshold;
// 状态切换if (isRunning && !runState.isRunning) { // 设备启动 runState.isRunning = true; runState.startTime = now; node.status({fill: "green", shape: "dot", text: "运行中"});} else if (!isRunning && runState.isRunning) { // 设备停止 runState.isRunning = false; var runDuration = (now - runState.startTime) / 1000; runState.totalRunTime += runDuration; runState.startTime = null; node.status({fill: "yellow", shape: "dot", text: "已停止"});}
// 更新累计运行时间if (runState.isRunning) { runState.totalRunTime += (now - runState.lastUpdate) / 1000;}
runState.lastUpdate = now;context.set("runState_" + deviceId, runState);
// 输出运行统计msg.payload = { device: deviceId, isRunning: isRunning, totalRunTimeHours: Math.round(runState.totalRunTime / 3600 * 100) / 100, currentPower: msg.payload.power || 0, estimatedEnergy: msg.payload.power ? (msg.payload.power * runState.totalRunTime / 3600 / 1000) : 0, timestamp: now};
return msg;Voltage/Current Dashboard Panels
Section titled “Voltage/Current Dashboard Panels”Grafana Flux 查询示例
Section titled “Grafana Flux 查询示例”-- 实时电压监控面板from(bucket: "nodered") |> range(start: -1h) |> filter(fn: (r) => r._measurement == "energy_consumption") |> filter(fn: (r) => r._field == "voltage") |> aggregateWindow(every: 1m, fn: mean) |> yield(name: "voltage")
-- 电流与设备状态面板from(bucket: "nodered") |> range(start: -1h) |> filter(fn: (r) => r._measurement == "energy_consumption") |> filter(fn: (r) => r._field == "current") |> aggregateWindow(every: 1m, fn: mean)Common Customer Questions
Section titled “Common Customer Questions”Q1: 电压波动多少属于正常范围?
Section titled “Q1: 电压波动多少属于正常范围?”中国标准(GB/T 12325):220V 单相供电电压偏差为额定值的 +7% 至 -10%。即 198V ~ 235.4V 属于正常范围。
Q2: 如何通过电流判断电机类设备状态?
Section titled “Q2: 如何通过电流判断电机类设备状态?”电机启动时电流会是额定电流的 5-7 倍(启动电流),持续几秒后回落到正常运行值。通过监测这个特征可以判断电机启动是否正常。
Q3: 功率因数 (PF) 低说明什么?
Section titled “Q3: 功率因数 (PF) 低说明什么?”功率因数低于 0.8 意味着无功功率占比高,常见于电机、变压器等感性负载。低 PF 会增加电网损耗,某些工业场景需要对 PF 进行补偿。
✅ 推荐做法:
- 设置合理的电压/电流阈值,避免误报
- 使用 Context 存储设备状态变化历史
- 电流监测结合功率因数综合判断设备状态
- 记录状态变化事件用于故障分析
❌ 避免做法:
- 单一阈值判断设备状态(考虑启动电流)
- 忽略电压校准导致数据偏差
- 过高频率的采样导致 InfluxDB 存储膨胀
- 在数据库中存储状态文本而非编码
Summary
Section titled “Summary”- 电压监测用于检测电网质量和异常波动
- 电流监测可以判断设备的运行/待机/关闭状态
- 功率因数反映设备的用电效率
- Node-RED 的 Context 可存储状态变化历史
- 基于电流的模式分析可检测设备启动、运行和异常