正泰DDSU电表使用ESPHome接入homeassistant

DIY 3 年前

摘要

正泰DDSU666导轨电表支持基于RS485的DL/T645协议(默认)或Modbus协议。本文主要记录了①正泰DDSU666电能表如何切换至Modbus模式;②基于ESPHome接入Homeassistant;③注意事项。

电表切换至Modbus模式

DDSU666出厂默认的是DL/T645协议模式,切换至Modbus协议的办法如下:

  1. 使用usb-rs485将电表连接至电脑;
  2. 观察电表自带的显示屏,获取电表的地址(屏显“DLT645”后面跟着的两屏共12位16进制数字即为地址);
  3. 按下图格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为68 xx xx 至 33 33 33的校验和后两位,不包括前面4个FE
  1. 使用串口助手连接电表,默认DL/T645连接参数为(8n2,2400bps),发送上述指令,观察电表屏显,当“DLT645”变成“Modbus”即为切换成功,观察屏显“Modbus”后一屏的数字,该数字为电表的modbus从机地址,以10进制显示,注意,modbus的默认波特率为9600。

硬件及接线

使用sonoff basic r3作为运行esphome的设备,原因是电源输入为AC220V,毕竟要呆在配电箱里,boom了就不好玩了。参照下图接线即可,sonoff basic r3的引脚见下图。

ESPHome配置

注意几个点:

  1. 串口参数
  2. 传感器参数设置,特别是value_type
esphome:
  name: chint-meter #名称
  platform: ESP8266
  board: esp01_1m

# Enable logging
logger:
  baud_rate: 0 #禁用串口日志,否则可能工作不正常,未验证

# Enable Home Assistant API
api:

ota:
  password: "XXXXX" #自动生成的

wifi:
  ssid: "wifi_ssid" #wifi
  password: "wifi_password" #密码

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Chint-Meter Fallback Hotspot" #自动生成
    password: "xxxx" #自动生成

captive_portal:

external_components: #引入组件
  - source:
      type: git
      url: https://github.com/esphome/esphome
      ref: dev
    components: [ modbus, modbus_controller ]

uart:
  id: mod_bus
  tx_pin: 1
  rx_pin: 3
  baud_rate: 9600
  stop_bits: 2

modbus:
  id: modbus1
  send_wait_time: 2000ms

modbus_controller:
  - id: epever
    ## the Modbus device addr
    address: 0x24 #上文获取的modbus从机地址
    modbus_id: modbus1
    setup_priority: -10
    update_interval: 10s

sensor:
  #电压
  - platform: modbus_controller
    modbus_controller_id: epever
    id: power_meter_voltage
    name: "power-meter-voltage"
    address: 0x2000
    unit_of_measurement: "V"
    register_type: holding
    skip_updates: 30
    value_type: S_DWORD #这里有坑,详见下面的lambda
    accuracy_decimals: 1
    lambda: |-  #正常情况下使用value_type,该处应该是esphome的bug,使用lambda进行手动解析,DDSU666电表输出的数据为IEE754标准的float,大端模式,而esphome的float是小端模式,需要对收到的数据进行换向
        union My_un {
          char temp[4];
          float foo;
          } un;
        un.temp[0] = data[3];
        un.temp[1] = data[2];
        un.temp[2] = data[1];
        un.temp[3] = data[0];
        ESP_LOGI("","foo=%f,0x%2X%2X%2X%2X",un.foo,un.temp[0],un.temp[1],un.temp[2],un.temp[3]);
        return un.foo ;

  #瞬时功率
  - platform: modbus_controller
    modbus_controller_id: epever
    id: power_meter_power
    name: "power-meter-power"
    address: 0x2004
    unit_of_measurement: "W"
    register_type: holding
    value_type: S_DWORD
    accuracy_decimals: 1
    lambda: |-
        union My_un {
          char temp[4];
          float foo;
          } un;
        un.temp[0] = data[3];
        un.temp[1] = data[2];
        un.temp[2] = data[1];
        un.temp[3] = data[0];
        ESP_LOGI("","foo=%f,0x%2X%2X%2X%2X",un.foo,un.temp[0],un.temp[1],un.temp[2],un.temp[3]);
        return un.foo ;
    filters:
      - multiply: 1000

  #电能(度)
  - platform: modbus_controller
    modbus_controller_id: epever
    id: power_meter_energy
    name: "power-meter-energy"
    address: 0x4000
    unit_of_measurement: "kWh"
    register_type: holding
    skip_updates: 30
    value_type: S_DWORD
    accuracy_decimals: 2
    lambda: |-
        union My_un {
          char temp[4];
          float foo;
          } un;
        un.temp[0] = data[3];
        un.temp[1] = data[2];
        un.temp[2] = data[1];
        un.temp[3] = data[0];
        ESP_LOGI("","foo=%f,0x%2X%2X%2X%2X",un.foo,un.temp[0],un.temp[1],un.temp[2],un.temp[3]);
        return un.foo ;

效果

参考资料

  1. ESPHome文档
  2. DDSU666电表modbus通讯 接入node red
  3. 清晰讲解LSB、MSB和大小端模式及网络字节序

评论(0)

发布评论

相关文章