跳转到内容

电压和电流监测

电压和电流监测

本节介绍如何通过智能继电器实时监测电压和电流参数,以及如何利用这些数据判断设备运行状态。学习完成后,您将能够:

  • 理解电压和电流监测的技术原理
  • 通过 MQTT 获取实时电压/电流数据
  • 利用电流变化判断设备工作状态
  • 设计基于电流的异常检测逻辑

智能继电器(如 Shelly 1PM、Tasmota 设备)可提供的电参数:

参数单位说明典型值
VoltageV (伏特)AC 电压有效值220-240V (中国)
CurrentA (安培)实时电流0.1-16A
PowerW (瓦特)有功功率P = V × I × PF
Apparent PowerVA视在功率S = V × I
Reactive Powervar无功功率Q = √(S² - P²)
Power Factor功率因数0.0-1.0
Energy TotalkWh累计电量设备累计读数

通过电流值判断设备是否在运行:

设备电流曲线:
│ 2.5A ──┼────────────────── 正常运行
│ │ (电机运行中)
│ 0.3A ──┼──────┼─────┼─── 待机状态
│ │ │ │ (仅控制电路供电)
│ 0.0A ──┼──┼───┼──┼─┼─── 断电/离线
T1 T2 T3 T4 时间
  • 过流保护: 电流超过额定值 → 自动断电
  • 欠压报警: 电压低于阈值 → 通知维护
  • 功率突变: 功率突然升高/降低 → 设备故障预警
  • 计算设备运行时间和能耗
  • 识别高能耗设备和不合理用电模式
  • 提供能效优化建议
// 监控电压值,检测异常波动
var payload = msg.payload;
var voltage = payload.voltage || payload.ENERGY?.Voltage;
if (!voltage) {
return null;
}
// 电压阈值配置
var THRESHOLD = {
min: 200, // 最低电压 (V)
max: 250 // 最高电压 (V)
};
// 获取设备 ID
var 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;

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;
// 统计设备运行时间
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;
-- 实时电压监控面板
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)

Q1: 电压波动多少属于正常范围?

Section titled “Q1: 电压波动多少属于正常范围?”

中国标准(GB/T 12325):220V 单相供电电压偏差为额定值的 +7% 至 -10%。即 198V ~ 235.4V 属于正常范围。

Q2: 如何通过电流判断电机类设备状态?

Section titled “Q2: 如何通过电流判断电机类设备状态?”

电机启动时电流会是额定电流的 5-7 倍(启动电流),持续几秒后回落到正常运行值。通过监测这个特征可以判断电机启动是否正常。

功率因数低于 0.8 意味着无功功率占比高,常见于电机、变压器等感性负载。低 PF 会增加电网损耗,某些工业场景需要对 PF 进行补偿。

推荐做法:

  • 设置合理的电压/电流阈值,避免误报
  • 使用 Context 存储设备状态变化历史
  • 电流监测结合功率因数综合判断设备状态
  • 记录状态变化事件用于故障分析

避免做法:

  • 单一阈值判断设备状态(考虑启动电流)
  • 忽略电压校准导致数据偏差
  • 过高频率的采样导致 InfluxDB 存储膨胀
  • 在数据库中存储状态文本而非编码
  1. 电压监测用于检测电网质量和异常波动
  2. 电流监测可以判断设备的运行/待机/关闭状态
  3. 功率因数反映设备的用电效率
  4. Node-RED 的 Context 可存储状态变化历史
  5. 基于电流的模式分析可检测设备启动、运行和异常