#使用IOTGW-NUC100构建智慧园区能源监测系统
#应用场景
工业园区、商业综合体、学校医院等场所需要对电、水、气等能源进行分项计量,以实现能耗分析、费用分摊、节能优化。传统方案使用有线抄表系统,改造成本高;本文介绍使用 IOTGW-NUC100 物联网网关,低成本 搭建智慧园区能源监测系统。
#系统架构
┌─────────────────────────────────────────────────────────────────┐
│ 云平台 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 能耗大屏 │ │ 费用分摊 │ │ 节能分析 │ │ 报表系统 │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │ │
│ ┌────┴──────────────┴──────────────┴──────────────┴─────┐ │
│ │ MQTT / HTTP API │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
▲
│ MQTT / HTTP
┌─────────────────────────────┼───────────────────────────────────┐
│ 边缘层 │ │ │
│ │ ┌─────────┴──────────┐ │
│ │ │ IOTGW-NUC100 │ │
│ │ │ ┌──────────────┐ │ │
│ │ │ │ Modbus采集 │ │ │
│ │ │ │ 数据聚合 │ │ │
│ │ │ │ 定时上报 │ │ │
│ │ │ └──────────────┘ │ │
│ │ └─────────┬──────────┘ │
│ │ │ RS485总线 │
└────────┼───────────────────┼───────────────────────────────────┘
│ Modbus-RTU
┌────────┼────────────────────────────────────────────────────────┐
│ 设备层 │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ │ 智能电表 │ │ 智能水表 │ │ 智能气表 │ │ 热量表 │ │
│ │ │ Modbus │ │ M-Bus │ │ Modbus │ │ Modbus │ │
│ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────────────────────────────┘#硬件准备
| 设备 | 型号 | 数量 | 说明 |
|---|---|---|---|
| 物联网网关 | IOTGW-NUC100 | 1台 | 主控 |
| 智能电表 | DDSU666 | 若干 | 单相导轨式 |
| 智能水表 | 超声波水表 | 若干 | Modbus/M-Bus |
| RS485集线器 | 8口 | 1台 | 扩展接口 |
| 网线/电源 | - | 若干 | - |
#电表接入配置
#DDSU666单相电表寄存器
| 寄存器地址 | 参数 | 数据类型 | 单位 |
|---|---|---|---|
| 0x0000 | 电压 | u32 | V |
| 0x0002 | 电流 | u32 | A |
| 0x0004 | 有功功率 | s32 | W |
| 0x0006 | 无功功率 | s32 | var |
| 0x0008 | 功率因数 | u32 | - |
| 0x000C | 正向有功总电能 | u32 | kWh |
#NodeRed配置
#读取电表数据
拖入「modbus read」节点:
名称:电表采集
单元ID:1(表地址)
功能码:Read Holding Registers (3)
起始地址:0
寄存器数量:8
轮询间隔:60秒#数据解析function
// DDSU666电表数据解析
var regs = msg.payload;
// 高低位字节转换(DDSU666格式)
function parseU32(high, low) {
return (low << 16) | high;
}
function parseS32(high, low) {
var val = parseU32(high, low);
if (val >= 0x80000000) {
return val - 0x100000000;
}
return val;
}
var voltage = parseU32(regs[1], regs[0]) / 10; // V
var current = parseU32(regs[3], regs[2]) / 100; // A
var power = parseS32(regs[5], regs[4]); // W
var pf = parseU32(regs[9], regs[8]) / 1000; // 功率因数
var energy = parseU32(regs[13], regs[12]); // kWh
return {
meter_id: "electric_01",
timestamp: new Date().toISOString(),
meter_type: "electricity",
data: {
voltage: voltage.toFixed(1),
current: current.toFixed(2),
power: power,
power_factor: pf.toFixed(3),
total_energy: energy,
power_level: power > 0 ? "positive" : "reverse"
}
};#水表接入配置
#M-Bus转RS485
水表通常使用M-Bus协议,需通过M-Bus转RS485转换器:
水表(M-Bus) ──→ [M-Bus转RS485] ──→ IOTGW RS485接口#水表数据解析
// 超声波水表数据解析(示例)
var regs = msg.payload;
return {
meter_id: "water_01",
timestamp: new Date().toISOString(),
meter_type: "water",
data: {
flow_rate: regs[0] / 100, // m³/h
total_flow: regs[2] / 1000, // m³(累计)
temperature: regs[4] / 10, // °C
pressure: regs[6] / 100, // MPa
battery_level: regs[8] // %
}
};#数据聚合与上报
#小时汇总统计
使用「function」节点实现本地聚合:
// 累计用电量差值计算
var current = msg.data.total_energy;
var last = context.get('last_energy') || current;
var consumption = current - last;
context.set('last_energy', current);
return {
meter_id: msg.meter_id,
timestamp: msg.timestamp,
period: "hourly",
consumption: consumption > 0 ? consumption : 0, // kWh
data: msg.data
};#MQTT上报配置
拖入「mqtt out」节点:
服务器:broker.example.com:1883
主题:energy/building_01/meters/+
QoS:1
保留:true上报JSON格式:
{
"meter_id": "electric_01",
"timestamp": "2026-04-16T10:00:00Z",
"meter_type": "electricity",
"data": {
"voltage": 220.5,
"current": 25.3,
"power": 5200,
"power_factor": 0.95,
"total_energy": 12580.5,
"power_level": "positive"
},
"consumption": {
"hourly": 5.2,
"daily": 125.8,
"monthly": 3850.2
}
}#能耗大屏展示
#Web大屏展示
使用HTML+Chart.js实现实时能耗大屏:
<!DOCTYPE html>
<html>
<head>
<title>园区能耗监测</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
<h1>实时能耗监控</h1>
<div style="display:flex;">
<canvas id="powerChart"></canvas>
<canvas id="consumptionPie"></canvas>
</div>
<script>
// 连接WebSocket获取实时数据
var ws = new WebSocket('ws://gateway-ip:1880/ws/energy');
ws.onmessage = function(e) {
var data = JSON.parse(e.data);
updateCharts(data);
};
</script>
</body>
</html>#关键指标展示
| 指标 | 计算方式 | 展示位置 |
|---|---|---|
| 实时功率 | 直接读取 | 大屏顶部 |
| 当日用电量 | 今日累计-昨日累计 | 卡片 |
| 分项用电 | 照明/空调/动力分别统计 | 饼图 |
| 用电趋势 | 24小时数据点 | 折线图 |
| 费用估算 | 用电量×单价 | 右上角 |
#分项计量配置
#尖峰平谷统计
// 根据时间段计算电费
var now = new Date();
var hour = now.getHours();
var price = 0;
var period = "";
if (hour >= 0 && hour < 6) {
price = 0.3; period = "低谷";
} else if (hour >= 6 && hour < 8) {
price = 0.6; period = "平段";
} else if (hour >= 8 && hour < 12) {
price = 0.9; period = "高峰";
} else if (hour >= 12 && hour < 18) {
price = 0.6; period = "平段";
} else if (hour >= 18 && hour < 21) {
price = 0.9; period = "高峰";
} else {
price = 0.6; period = "平段";
}
var consumption = msg.consumption;
var cost = consumption * price;
return {
...msg,
billing: {
period: period,
unit_price: price,
consumption: consumption,
cost: cost.toFixed(2)
}
};#节能分析
#用电异常检测
// 检测用电异常(如非工作时间大功率)
var now = new Date();
var hour = now.getHours();
var dayOfWeek = now.getDay();
var isWorkingHour = hour >= 8 && hour < 18;
var isWeekday = dayOfWeek > 0 && dayOfWeek < 6;
var power = msg.data.power;
if (!isWorkingHour && power > 1000) {
// 非工作时间功率超过1kW,可能存在异常
return {
alert: true,
level: "warning",
message: "非工作时间用电异常",
power: power,
expected_max: 500
};
}
if (isWeekday && !isWorkingHour && power < 50) {
// 工作日非工作时间功率过低,可能设备未关闭
return {
alert: true,
level: "info",
message: "建议检查下班后设备状态"
};
}#成本估算
| 设备 | 单价(元) | 数量(100点位) | 小计 |
|---|---|---|---|
| IOTGW-NUC100 | 899 | 2 | 1798 |
| 电表 DDSU666 | 280 | 60 | 16800 |
| 水表 | 450 | 30 | 13500 |
| RS485集线器 | 180 | 2 | 360 |
| 辅材/施工 | - | - | 5000 |
| 合计 | 37458 |
每点位成本约 375元,远低于传统有线抄表系统。
#总结
使用IOTGW-NUC100构建能源监测系统的优势:
- ✅ 多协议支持:Modbus/M-Bus/RS485全兼容
- ✅ 边缘计算:本地聚合、异常检测、减少云端压力
- ✅ 灵活扩展:RS485总线可并联多个设备
- ✅ 成本低廉:每点位成本不到400元
- ✅ 实时监测:秒级采集,分钟级上报
- ✅ 数据分析:本地OEE计算、节能分析
