培正 PZEM-004T 是一个电能监控模块,能够监测家庭用电的电压,电流,频率,实时功率,耗电量等信息;支持通过 UART 协议进行读取;因此可以使用 ESP8266 或者 ESP32 等模块,将用电信息添加到 HomeAssistant 中

homelab-homeassistant-power-monitor-pannel.png

硬件

硬件价格数量备注
peacefair PZEM-004T 100A 主机+开合式CT421电表,建议使用开合式CT,不需要改动电路
220V 转 5V1A 供电模块81用于为培正电表和 3v 模块供电
5V 转 3.3V 供电模块3.51用于为 ESP-01S 模块供电
40P杜邦线母对母2.61用于连接所有的模块
40P杜邦线母对公2.61用于连接所有的模块

##1. ESP-01S 刷入 esphome 固件

运行 esphome 容器

docker run -d \
 --name="esphome" \
 -p 6052:6052 \
 -e TZ=Asia/Shanghai \
 --hostname="esphome" \
 -v ~/esphome/config:/config \
 --privileged \
 esphome/esphome

刷入固件

启动后访问 http://localhost:6052/,选择添加设备,完整配置文件如下:

substitutions:
  name: "power-monitor"
  friendly_name: "Power Monitor"

esphome:
  name: ${name}
  project:
    name: "power.monitor"
    version: "1.0.0"

esp8266:
  board: esp01_1m # ESP-01/01S

logger:
  baud_rate: 0 # 和 UART 冲突,关闭日志

# 启用 Home Assistant API
api:

# 手动升级密码
ota:
  password: "12345678"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # WiFi 连接失败时启用 AP
  ap:
    ssid: ${name}
    password: "12345678"

captive_portal:
web_server:
  port: 80

status_led:
  pin: GPIO2

# ESP 01/01S 的引脚为 GPIO1 和 GPIO3
uart:
  rx_pin:
    number: GPIO3
  tx_pin:
    number: GPIO1
  baud_rate: 9600
  id: mod_uart

modbus:
  send_wait_time: 50ms
  uart_id: mod_uart
  id: mod_bus

text_sensor:
  - platform: version
    name: "${friendly_name} Version"
    hide_timestamp: false

sensor:
  - platform: pzemac
    current: # 电流
      name: "${friendly_name} Current"
    voltage: # 电压
      name: "${friendly_name} Voltage"
    energy: # 总电量
      name: "${friendly_name} Energy"
      # 转换成 kWh
      filters:
        - multiply: 0.001
      unit_of_measurement: "kWh"
      # 保留小数点后三位
      accuracy_decimals: 3
    power: # 当前功率
      name: "${friendly_name} Power"
      filters:
        - multiply: 1
      unit_of_measurement: "Wh"
      accuracy_decimals: 1
    frequency: # 频率
      name: "${friendly_name} Frequency"
    power_factor: # 功率因子
      name: "${friendly_name} Power Factor"
    update_interval: 15s # 15s 同步一次,太短可能会导致 ESP 不断重启

  # 启动时间
  - platform: uptime
    name: "${friendly_name} Uptime"
    id: uptime_sensor
    update_interval: 1s

将 ESP-01S 连接到电脑,然后刷入即可

2. 连接培正电表

接线方式如图:

homelab-homeassitant-module-connect-graph.svg

连接好之后将互感线圈挂到入户线或需要测量的电线上,然后通电启动;待启动成功后访问 http://power-monitor.local/(和 esphome 配置中的 substitutions.name一致) 即可看到相关的数据

homelab-homeassistant-power-monitor-homepage.png

3. 配置 Home Assistant

在 Home Assistant 添加 ESPHome 组件,将 power-monitor 添加到实体中

homelab-homeassistant-power-monitor-entity.png

配置能源面板

进入 HomeAssistant-配置-仪表盘-能源,添加用电数据,实体选择 Power Monitor Energy

homelab-homeassistant-power-monitor-energy2.png

添加后提示 Unexpected device classLast reset missing 错误

homelab-homeassistant-power-monitor-energy-error.png

因为 ESPHome 传感器没有提供 Home Assistant 需要的重置时间和传感器类型,当配置为能源时,会提示 Last reset missingUnexpected device class 错误;需要在配置文件 configuration.yaml 中为其指定类型和重置时间

homeassistant:
  customize_glob:
    sensor.power_monitor_power:
      last_reset: "1970-01-01T00:00:00+00:00"
      device_class: energy
      state_class: measurement

重启后即可看到用电信息:

homelab-homeassistant-power-monitor-power-dashboard.png