Updated on 12月 23, 2021
电能表改造并接入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-0 | 1200bps |
baud-1 | 2400bps |
baud-2 | 4800bps |
baud-3 | 9600bps |
注意!下面所提到的要点是说明书和上文提到的教程中所没有的!感谢 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 已经自动发现了新设备,按照提示添加进来即可。