问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

使用智能电表打造家庭用电量监控

创作时间:
2025-01-21 20:46:05
作者:
@小白创作中心

使用智能电表打造家庭用电量监控

随着智能电表的普及和物联网技术的发展,家庭用电量监控已经成为可能。本文将详细介绍如何使用智能电表和DL/T 645协议搭建家庭用电量监控系统,包括硬件准备、协议交互、数据保存和展示等环节。

硬件准备

首先,我们需要一个支持DL/T 645协议的导轨电表,这种电表在淘宝上很容易找到,一般都可以读取电压、电流、有功功率等数据。标准的导轨电表可以直接装入配电箱,与普通电表相比,除了火零输入和输出端口外,还多了两个通信端口。我的电表使用的是RS485协议,因此还需要一个RS485转TTL模块,通过USB接口连接到电脑,实现串口通信。

由于通信距离较短,我直接使用两条铁氟龙线作为RS485数据线,连接到弱电箱中的小服务器上。

DL/T 645协议交互

DL/T 645是国内的电力数据传输协议,用于智能电表的数据读取。我使用C语言编写了一个通过DL/T 645协议读取数据的库,地址位于:https://github.com/greensea/dlt645。根据实际测试,读取电压、电流、有功功率、频率和总电量这五个数据需要大约700毫秒,因此将采样频率设置为每秒一次。

为了方便后续处理,我编写了一个小程序,每秒钟读取一次上述五个数据,并将数据写入一个临时文件中。选择临时文件的原因是C语言开发相对复杂,通过临时文件可以方便地与其他语言进行数据传递。

数据保存

接下来使用Go语言继续开发数据处理程序。程序会每隔一秒读取一次临时文件,然后将数据保存到MySQL数据库中。数据库中保存了时间戳以及上述五个测量数据。

数据展示

数据收集完成后,接下来就是数据展示环节。我最初尝试使用Netdata进行数据展示,但发现其资源消耗较大,且需要额外的Python脚本来传输数据,还经常出现奇怪的问题。因此,我改用了Grafana进行数据展示。

展示电压、功率的变化情况相对简单,直接从数据库读取数据并输出即可。但日用电量的展示则需要一些额外的处理。如果要显示最近30天的每日用电量,最简单的方法是读取最近30天的数据,但这会导致数据量非常大(1秒采样频率下,30天的数据量高达2592000条)。因此,我选择了一个更合理的方案:读取每个月第一天的00:00:00的总用电量,然后通过减法计算出每月的用电量。这个查询需要使用存储过程来实现。

BEGIN
    DECLARE i INT DEFAULT 0;
    DECLARE start_date DATE;
    DECLARE end_date DATE;
    DECLARE ts INT;
    DECLARE ee DOUBLE DEFAULT 0;
    
    SET start_date = DATE_SUB(CURDATE(), INTERVAL 11 MONTH);
    SET end_date = CURDATE();
    
    DROP TEMPORARY TABLE IF EXISTS monthly_e;
    CREATE TEMPORARY TABLE IF NOT EXISTS monthly_e (
        ts INT,
        ts_readable DATETIME,
        ee DOUBLE
    );
    
    WHILE i < num_months DO
        SET ts = UNIX_TIMESTAMP(DATE_FORMAT(DATE_ADD(start_date, INTERVAL i+1 MONTH), '%Y-%m-01 00:00:00'));
        -- 由于历史遗留问题,create_time 字段使用了不同的时间戳单位,这里只好用 IF 进行区分处理
        IF tname = 'b_longjing' THEN
        	SET ee = (SELECT `e` FROM b_longjing WHERE create_time < ts ORDER BY create_time DESC LIMIT 1);
        ELSEIF tname = 'b_fz' THEN
        	SET ee = (SELECT `e` FROM b_fz  WHERE create_time < ts * 1000 ORDER BY create_time DESC LIMIT 1);	    
        ELSEIF tname = 'b_fzsolar' THEN
        	SET ee = (SELECT `e` FROM b_fzsolar WHERE create_time < ts * 1000 ORDER BY create_time DESC LIMIT 1);	    	    
        END IF;
        
        INSERT INTO monthly_e (ts, ts_readable, ee)
        VALUES (ts, FROM_UNIXTIME(ts), ee);
        
        SET i = i + 1;
    END WHILE;
    
    SELECT * FROM monthly_e;
    
    DROP TEMPORARY TABLE IF EXISTS mo nt hl y;
END

其他发现

自从搭建了这个电力监测系统后,我发现了一些有趣的现象:

  1. 本地居民用电存在两套电网:众所周知,一个电网内所有用户的频率是相同的。我不仅在我家里部署了这套电力监测系统,还在另一套用于出租的房子那边部署了这套电力监测系统,结果发现两边的交流电频率居然完全不同,这说明我们本地用着至少两套电网。从频率曲线就可以看出,这绝非电表的误差,绿色的电网频率波动明显比蓝色电网更大,而蓝色电网的频率则非常稳定。猜测可能是绿色电网有更多的工业用户,或者绿色电网本身的容量比较小。

  2. 电网容量不足:下图是某个时间段绿色电网的频率变化,可以看到频率最低跌到了49.41Hz,已经跌出了标准范围(50Hz±0.5Hz)。这种电网频率突降的情况我发现过好多次,最近更是一天会出现几次。这就是典型的电网容量不足,网内突然出现用电大户,导致频率暴跌。

通过与AI的深入探讨,我们分析了这次频率突降的过程:

  1. 大型负荷开始启动,电网负荷持续增加,频率开始下降
  2. 大型负荷持续启动中,电网负荷持续快速增加,频率开始暴跌,最低至49.41Hz
  3. 一次调频机组迅速投入,将频率拉回到49.7Hz左右
  4. 二次调频投入,将频率拉回至49.9Hz左右
  5. 负荷仍在持续增加,超出二次调频能力后,频率再次下跌
  6. 三次调频投入,迅速将频率上拉至最高50.15Hz
  7. 随后频率基本稳定,不知道是电网输出功率稳住了,还是这大型负荷终于启动好了

需要注意的是,以上分析仅是基于数据和AI讨论得出的结论,可能与实际情况存在差异,仅供参考。

通过这个项目,我不仅实现了家庭用电量的实时监控,还意外发现了一些有趣的电力现象。这个系统不仅可以帮助我们更好地了解家庭用电情况,还能为电力部门提供有价值的参考数据。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号