电能表改造并接入HA

一、简介

本次的改造目标是从普通电能表中采集电流、电压、电度等数据,并通过 Wi-Fi 接入智能家居系统中。

DDSU666 是一款单相电能表,适用于家庭环境,可以采集电流、电压等信息,也可以统计电度。大致可分为带通讯版和不带通讯版,本次改造所使用的必须为带通讯的版本。
另外, DDSU666 还分一个带按键的新版,还有一个不带按键的旧版,本例中使用的旧版。

ESP8266 是一款强大的 MCU,支持 Wi-Fi、蓝牙、串口、GPIO 等等。

HomeAssistant 是一个开源的智能家居平台。

大部分代码来自于 liwei19920307 的项目 ESP485,GitHub地址:https://github.com/liwei19920307/ESP485/

关于实现原理、软件配置等,在 ESP485 项目中原作者已经作了非常详尽的解释,在本文中仅做简要提及。本文将侧重于对我在实践中踩过的的坑进行总结,对 ESP485 项目文档中未提及的部分进行补充。

二、差异

在 ESP485 项目中,原作者使用的 ESP32,而本例中使用的是 ESP8266,并且原作者使用的是新款 DDSU666,而本例中使用的是旧款。

三、所需材料

  • DDSU666 电能表(带通讯)
  • RS485 转 TTL 模块
  • ESP8266
  • 220v 转 5v 降压模块
  • TTL 转 USB 模块

四、改造步骤

1、接线

将电能表与 ESP8266 通过 RS485 转 TTL 模块连接起来,将 ESP8266 的 D1 和 D2 分别作为 RX 和 TX(此处与原作者不同)。

之所以使用 ESP8266 的 D1 和 D2 而不直接使用硬件自带的 RX 和 TX ,是因为我在实际测试中,使用 RX 和 TX 时存在似乎可以正常发送数据,但无法接收数据的问题。

另外,新旧款的电能表在接入 220v 家用电时,接线端口也不同。新款的电能表为下端火线入、零线入,上端为火线出、零线出;而旧款的电能表下端为火线入、火线出,上端为零线入、零线出。接线方式一定要注意!我就因为参考了新款电表的接线图而导致家里跳闸!!

2、设置电能表通讯协议

DDSU666 支持的通讯协议有两种,一种是 DLT645,另一种是 Modbus,我们这里需要使用 Modbus 协议。如果很不巧你买到的电能表当前使用的协议不是 Modbus,那么你需要将电能表设置为 Modbus 协议。新款的 DDSU666 似乎可以通过按键来切换通讯协议,而旧款由于没有按键,需要我们通过 RS485 发送指令来切换协议。

切换协议的方法,可以参考此教程,也可以参考电能表的说明书,下载地址:
http://im.chint.com/Upload/File/20210811160117.pdf

简而言之就是,观察电能表的屏幕,屏幕上会轮播很多页,其中一页就是当前电能表所使用的协议类型,如果一页显示了 DLT645,那么紧接着的后两页为电能表的通讯地址,抄下通讯地址备用,紧接着第三页为通讯所使用的波特率,对应关系见下表。

屏幕显示波特率
baud-01200bps
baud-12400bps
baud-24800bps
baud-39600bps

注意!下面所提到的要点是说明书和上文提到的教程中所没有的!感谢 bnnyygy 写一篇帖子,对我帮助很大。

首先将 RS485 转 TTL,再由 TTL 转 USB 连接上电脑,然后打开串口调试工具,设置正确的波特率,8 个数据位,无校验位,2 个停止位,这个地方容易出错,我怀疑不同电能表可能不太一样,如果你使用 2 个停止位没效果的话,可以试试改成 1 个停止位。

参照说明书, DL/T 645-2007 协议切换到 ModBus-RTU 通讯协议的数据帧如下:
FE FE FE FE 68 xx xx xx xx xx xx 68 14 0E 33 33 35 3D 35 33 33 33 33 33 33 33 33 33 CS 16
其中:xx xx xx xx xx xx 为表通讯地址;CS 为校验码。

需要注意的是,在填入通讯地址时,要将之前抄下来的地址反过来写,比如:我的电能表通讯地址是 20 12 01 00 46 41,所以在代入到指令中应当写为 41 46 00 01 12 20

另外,关于校验码的生成,我们需要截取 68 xx xx 到最后一个 33 之间的数据,从而生成校验码。举个例子,我将表的通讯地址代入后,数据帧如下:
FE FE FE FE 68 41 46 00 01 12 20 68 14 0E 33 33 35 3D 35 33 33 33 33 33 33 33 33 33 CS 16
那么,我需要生成校验码的一段为:
68 41 46 00 01 12 20 68 14 0E 33 33 35 3D 35 33 33 33 33 33 33 33 33 33
通过在线生成校验和的工具,计算出的校验和为:
0484
取后一字节,即:84
代入到数据帧中:
FE FE FE FE 68 41 46 00 01 12 20 68 14 0E 33 33 35 3D 35 33 33 33 33 33 33 33 33 33 84 16

建议使用我提供的链接来计算校验和,因为我试过其他的在线生成校验和的网站,有的网站生成出来的结果不正确,应该是算法略有不同。

将数据帧发送出去,此时观察电能表屏幕,应当可以看到通讯协议变为了 Modbus。


下一页出现的数字为 Modbus 协议下的地址,抄下备用,再下一页出现的为波特率,此时波特率可能跟上次的不一样,对应上文中的表格,记下波特率,再下一页是另外的串口参数,类似于 8n2 这样的,注意,这里不同的电能表可能有区别,在上文中提到的教程里,别人家的电能表显示的 8n1,这里的 8 代表 8 个数据位,n 代表无校验位,1 或者 2 代表停止位。

3、烧录程序

大部分内容跟 ESP485 项目中提供的内容相同,需要修改的地方节选如下,对应参数如有不同自行修改:

esphome:
  name: chnt-ddsu666
  platform: ESP8266
  board: nodemcuv2

uart:
  id: esp485_uart
  rx_pin: D1
  tx_pin: D2
  baud_rate: 9600
  data_bits: 8
  parity: NONE
  stop_bits: 2

五、大功告成

通过 IP 地址访问 ESP8266,可以看到数据已经成功采集。

打开 HomeAssistant 的页面,可以看到通知,HA 已经自动发现了新设备,按照提示添加进来即可。

发表评论

邮箱地址不会被公开。 必填项已用*标注