电表简介

联网方式WiFi

WIFI芯片ESP8266

计量模块:PZEM-004T V3

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

电表样式

1、盒装款

2、导轨款

电表接线方式

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)可电量清零

缺点:

(1)esphome需要代码操作(比如ds18b20温度传感器,必须在日志里找到address,手动配置才行)

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

功能介绍

1、Reset Energy

点击后,执行电量清零

2、Restart

重启esp8266芯片

3、Current

电流

4、Energy

电量

5、Frequency

频率

6、Power

功率

7、Power Factor

功率因数

8、Temperature

电表温度

9、uptime

设备运行时长

10、Voltage

电压

接入步骤

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

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

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

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

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

总之,接入非常简单!

EspHome年、月、日电量

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


#每日用电统计
utility_meter:
  daily_energy:
    source: sensor.esp_meter_energy
    cycle: daily

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


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

Tasmota固件

固件介绍

优点:

(1)通过MQTT方式接入,可以使用公网MQTT,也可以使用带TSL加密的MQTT服务器

(2)使用公网MQTT,可以将多个网络下的设备,接入同一个homeassistant主机

(3)可电量清零,电量数值设定

缺点:

(1)对于不会添加MQTT服务的玩家,接入比较麻烦

(2)传感器更新间隔最低为10秒

1、设备通电后,会生成WiFi热点,通过手机或者电脑连接

wifi.png

2、连接后即可配置网络(如果不跳出,浏览器输入:192.168.4.1

wifi2.jpg

3、配网成功后,通过路由器后台查看ip

wifi4.png

4、浏览器输入该设备ip,查看、配置设备

wifi5.png

1、电表配置MQTT

点击“设置”,即可看到MQTT选项

wifi6.pngwifi7.png

wifi8.png

2、查看是否连接MQTT成功

进入“控制台”

wifi9.png

成功接入的样子

wifi15.png

未成功的样子(需要检查MQTT地址,端口,账号密码是否正确)

wifi11.png

2、接入HA

在homeassistant添加MQTT集成(本地化需先安装MQTT服务,或使用公网MQTT服务器)

MQTT安装和配置,请看:https://www.bilibili.com/video/BV1EC4y1D7yT/

配置好后,会自动发现tasmota集成

接入的成功的样子(可对照网页里中文,手动翻译一下)

wifi14.png

中文翻译

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

1、打开configuration.yaml文件

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

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

PS:翻译只改变设备在HA页面上的名称。

2、tasmota固件翻译

homeassistant:
  customize:
    sensor.tasmota_energy_apparentpower:
      friendly_name: 视在功率
    sensor.tasmota_energy_current:
      friendly_name: 电流
    sensor.tasmota_energy_factor:
      friendly_name: 功率因数
    sensor.tasmota_energy_frequency:
      friendly_name: 频率
    sensor.tasmota_energy_power:
      friendly_name: 功率
    sensor.tasmota_energy_reactivepower:
      friendly_name: 无功功率
    sensor.tasmota_energy_today:
      friendly_name: 今日用电
    sensor.tasmota_energy_total:
      friendly_name: 总用电
    sensor.tasmota_energy_totalstarttime:
      friendly_name: 启动时间
    sensor.tasmota_energy_voltage:
      friendly_name: 电压
    sensor.tasmota_energy_yesterday:
      friendly_name: 昨日用电
    sensor.tasmota_restart_reason:
      friendly_name: 重启原因
    sensor.tasmota_last_restart_time:
      friendly_name: 上次重启时间
    sensor.tasmota_ssid:
      friendly_name: 无线网名称

3、EspHome固件翻译

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地址

能源面板接入

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

1702709351683.jpg1702709444325.jpg

1702709496081.jpg

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

1702709541550.jpg

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

1702709880671.jpg

实时电价配置

1、阶梯电价

进入 配置——辅助元素

1702710193636.jpg

创建template sensor

1702710282854.jpg

(1)阶梯

1702710558461.jpg

EspHome代码
{% 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 %}

Tasmota代码 (删除备注)
{% if states("sensor.tasmota_energy_total") | float <= 2760 %}
  1 
#如果不是"sensor.tasmota_energy_total",需要修改为自己电表的总电流实体#

#当电量低于2760kWH,第一阶梯,根据地区修改#

{% elif states("sensor.tasmota_energy_total") | float >2760  and states("sensor.tasmota_energy_total") | float <= 4800 %}

#当电量大于2760kWH,小于4800kWh,第二阶梯#
  2
{% elif states("sensor.tasmota_energy_total") | float > 4800 %}

#当电量大于4800kWh,第三阶梯#
  3
{% endif %}

(2)实时电价

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

1702710503182.jpg

EspHome代码

代码备注见下面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 %}
Tasmota代码 (删除备注)
{% if now().strftime("%H")| int >= 8 and now().strftime("%H")|int < 22 and 
states("sensor.dang_qian_jie_ti")=="1" %}

#8点到22点,峰电;其余时段,谷电;可根据地区自行修改代码里的数字"int >= 8 " "int < 22 "

  0.5953
#阶梯1,峰电#

{%elif now().strftime("%H")| int >= 8 and now().strftime("%H")|int < 22  and states("sensor.dang_qian_jie_ti")=="2" %}
  0.6453
#阶梯2,峰电#

{%elif now().strftime("%H")| int >= 8 and now().strftime("%H")|int < 22  and states("sensor.dang_qian_jie_ti")=="3" %}
  0.8953
#阶梯3,峰电#


#阶梯1,谷电#
{% elif states("sensor.dang_qian_jie_ti")=="1"%}
  0.3583

{% elif states("sensor.dang_qian_jie_ti")=="2" %}
  0.4083
#阶梯2,谷电#


{% elif states("sensor.dang_qian_jie_ti")=="3" %}
  0.6583
#阶梯3,谷电#

{% 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)Tasmota代码
utility_meter:
  daily_energy:
    source: sensor.tasmota_energy_total
    cycle: daily
    tariffs:
      - peak
      - offpeak
#每日峰谷电统计

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

  yearly_energy:
    source: sensor.tasmota_energy_total
    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、卡片添加

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

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

(1)EspHome代码
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
(2)Tasmota代码
type: vertical-stack
cards:
  - type: horizontal-stack
    cards:
      - type: entity
        entity: sensor.tasmota_energy_today
      - type: entity
        entity: sensor.tasmota_energy_yesterday
      - type: entity
        entity: sensor.tasmota_ds18b20_temperature
        name: 电表温度
  - type: custom:apexcharts-card
    header:
      show: true
      show_states: true
      colorize_states: true
    experimental:
      color_threshold: true
    series:
      - entity: sensor.tasmota_energy_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.tasmota_energy_total
        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分,创建日历事件,事件就是每日用电的数据

Tasmota电量设定与清零

tasmota固件有电量设置与清零的功能,可以将总电量设置为当前电网数值

1、进入控制台

2、输入框中,输入设置的电量数值

比如设置100度电,则输入energytotal 100000 (在100的数值上,加3个0)

设置电量前,最好先清零今日用电,输入energytoday 0,因为默认将设置的与当前数值相加

设置成功后,总用电量就会变为100kWh

3、电量清零

电量清零,输入 energytotal 0

清零后会变为0,剩余的0.238是今日电量,如果也需要清零,则输入 energytoday 0

Tasmota转为Esphome固件

前言:不喜欢折腾的,不必这样做,因为比较麻烦,且功能没有大的区别!

1、固件升级为minimal

(必须先升级为最小体积版本,原先的固件因为存储空间不足,无法直接OTA其他固件)

固件地址地址:http://ota.tasmota.com/tasmota/tasmota-minimal.bin.gz

或者直接点击下载tasmota-minimal.bin.gz

点击下载tasmota-minimal.bin.gz

升级后的样子

2、制作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:

ota:

web_server:
  port: 80

wifi:
  # 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

#DS18B20传感器
dallas:
  - pin: GPIO14
    update_interval: 20s

sensor:
#DS18B20传感器
  - platform: dallas
    address: 0x603ce1d444789328
#address需要在log里找到,替换后重新install
    name: "Temperature"

#pzem004t电表传感器
  - platform: pzemac
    id: pzem_ac
    modbus_id: mbus
    energy:
      name: "Energy"
      filters:
        - multiply: 0.001
      unit_of_measurement: kWh
      accuracy_decimals: 2
      device_class: "energy"
      state_class: "total_increasing"
    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"

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: pzem_ac
        - delay: 1s
        - pzemac.reset_energy: pzem_ac
        - delay: 1s
        - pzemac.reset_energy: pzem_ac
        - delay: 1s
        - pzemac.reset_energy: pzem_ac
        - delay: 1s
        - pzemac.reset_energy: pzem_ac

time:
  - platform: homeassistant
    id: homeassistant_time

(6)OTA更新固件

(7)等待编译

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

(8)上传成功

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

3、温度传感器更改

tasmota里是自动寻找配置DS18b20传感器,esphome必须手动在日志里查找ds18b20的地址

(1)在esphome控制台里,点击设备LOGS

(2)在日志开头部分,会有ds18b20地址

(3)复制地址,粘贴到原先yaml文件

(4)再次点击install,成功后即可显示温度传感器

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里集成里可以直接访问设备。