电表简介

联网方式WiFi

WIFI芯片ESP8266

计量模块:PZEM-004T V3

固件:esphome

视频简介:https://www.bilibili.com/video/BV1Ua4y1z7WC/

电表接线方式

1、接线示意图

1c2ece665498b91803acb46898e0eefc9f443500.png

2、接线要求

(1)接在总空开下

测总用电时,电表电源必须接在总空开下方(与总火线并联)

原因:

电表的计量芯片在计量时,会判断有功功率和无功功率。(分路空开下,只是总电流的一部分,导致功率因数低,计量不准。)

空开有家庭电路保护功能,可以放心接入(不要接总空开的上方入户线,没有保护,且一直是带电状态!!!)

接线正确判断标准:

待机功率因数应在 0.6 以上(低于50W时,功率因数会更低)。

用电时(电流越大功率因数越大),应在 0.9 以上。

(2)禁止带电接线

断闸接线,带电作业十分危险!

(3)铜线不外露

断电后,将电表的零火线,缠绕在空开出线上。电线塞进空开后,不要让铜线漏出来!

铜线外露,一是有触电的危险,二是有短路的危险!

(4)互感器方向

需要和电流方向一致,(同时需要扣紧,否则影响测量精度)

微信图片_20231216144043.jpg

ESPHome固件

固件介绍

优点:

(1)可直接接入homeassistant,无需其他设置(homeassistant自动发现设备)

(2)不接入HA时,网页输入IP,也可以查看设备信息,可OTA升级

(3)传感器更新间隔,最低可设置为1秒。(默认为3秒的间隔,不推荐特别低!)

(4)可电量清零

首推esphome固件,因为电表通常不需要改变参数!

功能介绍

1、Reset Energy

点击后,执行电量清零

2、Restart

重启esp8266芯片

3、Current

电流

4、Energy

电量

5、Today energy

今日电量

6、Yesterday Energy

昨日电量

7、Frequency

频率

8、Power

功率

9、Power Factor

功率因数

10、Temperature

电表温度

11、uptime

设备运行时长

12、Voltage

电压

接入步骤

只需要在设备通电后,找到esp-meter的wifi热点。

配网后,可在homeassistant的集成顶部,发现esp-meter设备。

点击配置,就自动接入homeassistant!

1、没有自动发现,可以在“配置——设备与服务”,添加“esphome“集成,输入设备IP即可添加。

2、有esphome集成情况下,点击添加设备。

总之,接入非常简单!

EspHome年、月电量

在configuration.yaml里添加如下代码,保存后重启!



utility_meter:
#月度用电统计
  monthly_energy:
    source: sensor.esp_meter_energy
    cycle: monthly


#年度用电统计
  yearly_energy:
    source: sensor.esp_meter_energy
    cycle: yearly

中文翻译

默认设备接入homeassistant,都是英文格式。可以手动对每个实体翻译,也可以通过配置文件,转为中文。

1、打开configuration.yaml文件

configuration.yaml,在homeassistant的同级目录下,是HA的配置文件。

在代码里,输入下方需要翻译的固件,保存后,重启homeassistant。

PS:翻译只改变设备在HA页面上的名称,集成页面还是英文。

homeassistant:
  customize:
    button.esp_meter_reset_energy:
      friendly_name: 电量重置
    sensor.esp_meter_current:
      friendly_name: 电流
    sensor.esp_meter_power_factor:
      friendly_name: 功率因数
    sensor.esp_meter_frequency:
      friendly_name: 频率
    sensor.esp_meter_power:
      friendly_name: 功率
    sensor.esp_meter_energy:
      friendly_name: 总用电
    sensor.esp_meter_uptime:
      friendly_name: 运行时长
    sensor.esp_meter_voltage:
      friendly_name: 电压
    sensor.esp_meter_temperature:
      friendly_name: 温度
    button.esp_meter_restart:
      friendly_name: 重启	
    sensor.esp_meter_wifi_signal:
      friendly_name: WIFI信号强度
    sensor.esp_meter_ip:
      friendly_name: IP地址
	sensor.esp_meter_today_energy:
      friendly_name: 今日电量
	sensor.esp_meter_yesterday_energy:
      friendly_name: 昨日电量

能源面板接入

1、配置——仪表盘——能源

1702709351683.jpg1702709444325.jpg

1702709496081.jpg

添加消耗电能实体(选择总用电,今日用电会在断电后,当日清零)

1702709541550.jpg

接入后,会开始统计(数据是整点更新)

1702709880671.jpg

实时电价配置

1、阶梯电价

进入 配置——辅助元素

1702710193636.jpg

创建template sensor

1702710282854.jpg

(1)阶梯

1702710558461.jpg

{% if states("sensor.esp_meter_energy") | float <= 2760 %}
  1 
{% elif states("sensor.esp_meter_energy") | float >2760  and states("sensor.esp_meter_energy") | float <= 4800 %}
  2
{% elif states("sensor.esp_meter_energy") | float > 4800 %}
  3
{% endif %}

(2)实时电价

(实体电价依赖上面创建的阶梯传感器,如果报错,需删除备注

1702710503182.jpg

代码备注见下面tasmota代码

{% if now().strftime("%H")| int >= 8 and now().strftime("%H")|int < 22 and 
states("sensor.dang_qian_jie_ti")=="1" %}
  0.5953
{%elif now().strftime("%H")| int >= 8 and now().strftime("%H")|int < 22  and states("sensor.dang_qian_jie_ti")=="2" %}
  0.6453
{%elif now().strftime("%H")| int >= 8 and now().strftime("%H")|int < 22  and states("sensor.dang_qian_jie_ti")=="3" %}
  0.8953
{% elif states("sensor.dang_qian_jie_ti")=="1"%}
  0.3583
{% elif states("sensor.dang_qian_jie_ti")=="2" %}
  0.4083
{% elif states("sensor.dang_qian_jie_ti")=="3" %}
  0.6583
{% endif %}

2、添加实时电价

进入 配置——仪表盘——能源,选择实时电价传感器实体

1702711535984.jpg

添加完成后,能源页面会显示“费用”,费用初始值为0,整点更新

1702711614985.jpg峰谷电统计

峰谷电统计

1、峰谷电传感器

在configuration.yaml里,添加以下代码。(重启homeassistant生效)

(1)EspHome代码
utility_meter:
  daily_energy:
    source: sensor.esp_meter_energy
    cycle: daily
    tariffs:
      - peak
      - offpeak
#每日峰谷电统计

  monthly_energy:
    source: sensor.esp_meter_energy
    cycle: monthly
    tariffs:
      - peak
      - offpeak
#月度峰谷电统计

  yearly_energy:
    source: sensor.esp_meter_energy
    cycle: yearly
    tariffs:
      - peak
      - offpeak
#年度峰谷电统计


#还可以添加每周、每半月、季度的峰谷统计,详细查看官网说明
https://www.home-assistant.io/integrations/utility_meter/

2、峰谷电自动化

自动化作用是设置峰谷电切换时间

进入 配置——场景与自动化——创建自动化,以YAML编辑,粘贴下方代码,保存

alias: 峰谷电
description: ""
trigger:
  - platform: time
    at: "08:00:00"
    variables:
      tariff: peak
  - platform: time
    at: "22:00:00"
    variables:
      tariff: offpeak
condition: []
action:
  - service: select.select_option
    data:
      option: "{{ tariff }}"
    target:
      entity_id:
        - select.daily_energy
        - select.monthly_energy
        - select.yearly_energy
mode: single

季节电价设置

以湖南电费举例

1、创建月度用电传感器

在configuration.yaml里添加如下代码(实体是总用电量,如果不同,需修改为自己的)

utility_meter:
  monthly_energy:
    source: sensor.tasmota_energy_total
    cycle: monthly
#重启homeassistant生效,得到sensor.monthly_energy实体,这个实体用在下面的代码里

2、创建实时电价传感器

重启后,homeassistant点击配置——设备与服务——辅助元素——template,创建template传感器

{% set energy = states('sensor.monthly_energy') | float %}
{% set month = now().month %}
{% set spring_autumn = [3, 4, 5, 9, 10, 11] %}
{% set winter_summer = [1, 2, 6, 7, 8, 12] %}
{% if energy < 200 %}
  0.588
{% elif energy < 350 and month in spring_autumn %}
  0.638
{% elif energy < 450 and month in winter_summer %}
  0.638
{% elif energy >= 350 and month in spring_autumn %}
  0.888
{% elif energy >= 400 and month in winter_summer %}
  0.888
{% endif %}

3、实时电价添加到能源面板当中即可

UI卡片

1、卡片安装

(1)需要hacs商店安装卡片:apexcharts-card

https://github.com/RomRider/apexcharts-card

2、卡片添加

点击“添加卡片”,拉到最下面,点击手动模式,粘贴下方代码

(如果传感器实体不同,需自行更改)

type: vertical-stack
cards:
  - type: horizontal-stack
    cards:
      - type: entity
        entity: sensor.daily_energy  #需要先设置年、月、日用电
		name: 今日用电
      - type: entity
        entity: sensor.monthly_energy
		name: 本月用电
      - type: entity
        entity: sensor.esp_meter_temperature
        name: 电表温度
  - type: custom:apexcharts-card
    header:
      show: true
      show_states: true
      colorize_states: true
    experimental:
      color_threshold: true
    series:
      - entity: sensor.esp_meter_power
        color: red
        name: 功率
        color_threshold:
          - value: 100
            color: '#a8d4ff'
          - value: 500
            color: '#085eb4'
          - value: 1500
            color: '#5c08b4'
          - value: 3000
            color: '#b40878'
          - value: 5000
            color: '#b40810'
  - type: custom:apexcharts-card
    apex_config:
      chart:
        stacked: true
      legend:
        show: true
    graph_span: 14d
    span:
      end: day
    show:
      loading: false
      last_updated: false
    header:
      show: true
      show_states: false
      colorize_states: true
    series:
      - entity: sensor.esp_meter_energy
        name: 每日用电
        type: column
        unit: kWh
        color: '#5dabf9'
        group_by:
          func: diff
          duration: 1d
        show:
          datalabels: true

type: custom:apexcharts-card
header:
  show: true
  title: 每日峰谷电
  show_states: true
  colorize_states: true
chart_type: donut
series:
  - entity: sensor.daily_energy_peak
    name: 峰电
    color: orange
  - entity: sensor.daily_energy_offpeak
    name: 谷电
    color: green

电量校准

只要是外接的计量电表,和国网的电表数据,都会有出入(没有百分百一致的)。但正常数字变化都会有一定的规律。

所以,可以通过homeassistant的自动化,对计量数据进行一定的校准。

1、创建校准传感器

utility_meter:
  jiaozhun_energy:
    source: sensor.tasmota_energy_total
    cycle: daily


#如果之前在configuration.yaml里创建过峰谷电,则只需要把下方代码放到后面,不需要带utility_meter:
  jiaozhun_energy:
    source: sensor.tasmota_energy_total
    cycle: daily

创建传感器后,重启homeassistant,会生成sensor.jiaozhun_energy传感器

2、传感器校准自动化

以YAML编辑,粘贴下方代码

alias: 电量每日校准
description: ""
trigger:
  - platform: time
    at: "00:01:00"
condition: []
action:
  - service: utility_meter.calibrate
    data:
      value: "0.5"
    target:
      entity_id: sensor.jiaozhun_energy
mode: single

#这个自动化里,设置了每天0点后,自动增加0.5度电量(自行设置)。弥补缺少的计量

3、更改能源面板电量实体

使用了校准传感器后,能源面板的实体也需要更改。

1702709541550.jpg

日历显示用电统计

日历里统计电量,可以看的很直观

1、创建本地日历

配置——设备与服务——添加集成——搜索“本地日历”

2、创建自动化

alias: 日历——用电记录
description: ""
trigger:
  - platform: time
    at: "23:59:58"
condition: []
action:
  - service: calendar.create_event
    data:
      summary: "{{ states.sensor.tasmota_energy_today.state}}度"
      start_date: "{{ now().strftime('%Y-%m-%d')}}"
      end_date: "{{ (now() + timedelta(days=1)).strftime('%Y-%m-%d') }}"
    target:
      entity_id: calendar.yong_dian
mode: single


#这个自动化,是在11:59分,创建日历事件,事件就是每日用电的数据

ESPHOME固件

1、制作esphome固件

(1)esphome控制台创建新的设备

(2)输入设备名称

(3)选择esp8266芯片

(4)跳过install

(5)新建设备

原始设备代码是默认的

全选删除,粘贴电表配置文件

esphome:
  name: esp_meter
  friendly_name: Esp_meter

esp8266:
  board: esp01_1m

# Enable logging
logger:
  baud_rate: 0
# Enable Home Assistant API
api:
  reboot_timeout: 0s
    
ota:
  platform: esphome

web_server:
  port: 80

wifi:
  ssid: "Your_WiFi_SSID"
  password: "Your_WiFi_Password"

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp_meter"
    password: ""

captive_portal:

uart:
  rx_pin: GPIO03
  tx_pin: GPIO01
  baud_rate: 9600
  id: ubus

modbus:
  id: mbus
  uart_id: ubus

one_wire:
  - platform: gpio
    pin: GPIO14

globals:


  # flash保存00:00:00的抄表数(昨日抄表数)
  - id: global_yesterday_energy
    type: float
    restore_value: yes
    initial_value: '0.000'
  # flash保存00:00:00的昨日用电量
  - id: global_yesterday_usage
    type: float
    restore_value: yes
    initial_value: '0.000'

  - id: global_last_energy
    type: float
    restore_value: false
    initial_value: '-0.001'


sensor:
  - platform: dallas_temp
    name: temperature
    update_interval: 120s

#pzem004t电表传感器
  - platform: pzemac
    id: pzemac_main
    modbus_id: mbus
    energy:
      name: "Energy"
      filters:
        - multiply: 0.001
      unit_of_measurement: kWh
      accuracy_decimals: 2
      device_class: "energy"
      state_class: "total_increasing"
      id: main_energy
    voltage:
      name: "Voltage"
    current:
      name: "Current"
    power:
      name: "Power"
    power_factor:
      name: "Power Factor"
    frequency:
      name: "Frequency"
    update_interval: 3s

  - platform: uptime
    id: uptime_s
    update_interval: 300s
    internal: true
 
  - platform: wifi_signal
    name: "WiFi Signal"
    id: wifi_signal_db
    update_interval: 30s
    internal: true
    entity_category: "diagnostic"

  - platform: copy
    source_id: wifi_signal_db
    name: "WiFi Signal"
    filters:
      - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0);
    unit_of_measurement: "Signal %"
    entity_category: "diagnostic"


  # 昨日抄表数
  - platform: template
    name: Yesterday Energy
    id: yesterday_energy
    internal: True
    accuracy_decimals: 3
    device_class: "energy"
    state_class: "total_increasing"
    icon: mdi:lightning-bolt
    unit_of_measurement: kWh
    update_interval: 15s
    lambda: 
      return id(global_yesterday_energy);

  # 昨日用电量
  - platform: template
    name: Yesterday Energy
    id: yesterday_usage
    accuracy_decimals: 3
    device_class: "energy"
    state_class: "total_increasing"
    icon: mdi:lightning-bolt
    unit_of_measurement: kWh
    update_interval: 15s
    lambda: 
      return id(global_yesterday_usage);

  # 今日用电量
  - platform: template
    name: Today Energy
    id: today_usage
    accuracy_decimals: 3
    device_class: "energy"
    state_class: "total_increasing"
    icon: mdi:lightning-bolt
    unit_of_measurement: kWh
    update_interval: 10s
    lambda: 
      return id(main_energy).state - id(global_yesterday_energy);

text_sensor:
  - platform: wifi_info
    ip_address:
      name: "IP"
      id: id_sensor_ip
      icon: mdi:ip

  - platform: template
    name: "Uptime"
    lambda: |-
      uint32_t dur = id(uptime_s).state;
      int dys = 0;
      int hrs = 0;
      int mnts = 0;
      if (dur > 86399) {
        dys = trunc(dur / 86400);
        dur = dur - (dys * 86400);
      }
      if (dur > 3599) {
        hrs = trunc(dur / 3600);
        dur = dur - (hrs * 3600);
      }
      if (dur > 59) {
        mnts = trunc(dur / 60);
        dur = dur - (mnts * 60);
      }
      char buffer[17];
      sprintf(buffer, "%ud %02uh %02um %02us", dys, hrs, mnts, dur);
      return {buffer};
    icon: mdi:clock-start
    update_interval: 60s

button:
  - platform: restart
    name: "Restart"
  - platform: template
    name: "Reset Energy"
    icon: mdi:cached
    on_press:
      then:
        - delay: 1s
        - pzemac.reset_energy: pzemac_main
        - delay: 1s
        - pzemac.reset_energy: pzemac_main
        - delay: 1s
        - pzemac.reset_energy: pzemac_main

time:
  - platform: homeassistant
    timezone: UTC-8
    id: time_ha

  - platform: sntp
    id: time_sntp
    servers: ntp.aliyun.com 
    timezone: UTC-8

    on_time:
      - seconds: 0
        minutes: 0
        hours: 0 
        then:
          - if:
              condition:
                time.has_time: 
              then:
                - lambda: |-
                    id(global_yesterday_usage) = id(main_energy).state - id(global_yesterday_energy);
                    id(global_yesterday_energy) = id(main_energy).state;
                    id(yesterday_energy).publish_state( id(global_yesterday_energy) );
                    id(yesterday_usage).publish_state( id(global_yesterday_usage) );

      - seconds: /5
        then:
          - if:
              condition:
                time.has_time: 
              then:
                - lambda: |-
                    if(id(global_last_energy)==-0.001f) id(global_last_energy) = id(main_energy).state;
      

(6)OTA更新固件

(7)等待编译

如果是第一次编译,通常要等待几分钟至十几分钟

(8)上传成功

可以通过路由器查看ip地址,网页里输入电表ip,即可查看

Esphome转为Tasmota固件

1、上传固件

esphome默认可被homeassistant发现,接入后可以在设备页看到IP地址,浏览器打开IP地址,即可OTA升级。(或者在路由器里查看,wifi名称为:“Esp-meter”

中文固件下载:tasmota-CN.bin.gz

2、内存不足ota失败

先上传tasmota最小固件

固件下载:tasmota-minimal.bin.gz

然后在tasmota里,点击 Firmware Upgrade 上传中文固件

UM``V7R9MVGGXTXSRBIT59M.png

3、tasmota设置

OTA成功后,会自动生成tasmota开头的wifi热点,连接后即可配置网络。随后路由器中找到tasmota的IP地址,浏览器打开。

或可以按下面模块设置:

配置后的样子:

4、数据更新间隔设置

4、时区、wifi设置

在控制台里输入命令,回车运行。

1、设置时区

timezone 8

2、WiFi模式

wificonfig 2

wificonfig 2,可以让设备在连接不到网络时,自动生成热点。方便后面重新换其他地方使用。

默认是wificonfig 4,如果路由器wifi更改信息了,电表就无法配置,

3、静态IP设置

IPAddress1 192.168.0.123

不建议设置静态IP,因为设备本身就是通过MQTT通讯的,不要求固定IP。

并且接入HA后,在tasmota里集成里可以直接访问设备。