『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 14489|回复: 14

培正PZEM-004T v3 三项四线+阶梯+峰谷 新手折腾成果

[复制链接]

35

主题

153

帖子

1078

积分

金牌会员

Rank: 6Rank: 6

积分
1078
金钱
925
HASS币
10
发表于 2019-12-21 13:38:45 | 显示全部楼层 |阅读模式
1,硬件
ESP模块: Tasmota新版本可以支持一组tx/rx接三个004T模块。所以用ESP 01s就可以了。杀鸡不用牛刀
培正电表需要先单个接入Tasmota上,然后在控制台执行 ModuleAddress 1/2/3  分别对应三个单表,然后并联接入选择的RX/TX口
ESP刷机的时候我没有用任何上拉下拉电阻。暂时用应该没什么关系。直接把gpio0和GND接入 负极。。vcc和en接入正极。。rx接tx,tx接rx后刷机。
刷完后vcc和EN搞了一条线短接。按理说3.3v也不会低于2.8v所以也没什么电阻接上。。

2,软件
按照论坛里的大神们提供的方法配置好mqtt连接上hass后在configuration.yaml中添加各种传感器。比如电压电流等。。

峰谷电参考论坛里的大神资料用官方的utility_meter:配置节点搞定。直接可以根据电表过来的数据自己累加峰谷电量。。并且可以记录当天,当月和当年的用电量。也会自己清零,不用自己计算。只是无法记录昨天,上个月和上一年的情况。这个可以想办法用influxDB数据库来记录一下。还在折腾。

阶梯电价因为utility_meter:有提供年用电量的统计。所以可以根据年电量来计算现在处于那个阶梯。。具体如下:


#峰谷电价
utility_meter:
  energy:
    source: sensor.dianliang#总电量的传感器,一般可以直接读取Tasmota传过来的总电量数据,然后这个插件会自动根据数据累加和扣除
    cycle: yearly #重置计数器的频率。有效值是hourly,daily,weekly,monthly和yearly。因为我这里是年阶梯的。所以我配置以年为重置参数
//以下三个分别定义了天,月,年三个传感器。数据来源是上面这个传感器根据定义的峰谷时间分别纪录到峰和谷两个传感器上。
  daily_energy:
    source: sensor.energy
    cycle: daily
    tariffs:
      - peak
      - offpeak

  monthly_energy:
    source: sensor.energy
    cycle: monthly
    tariffs:
      - peak
      - offpeak

  yearly_energy:
    source: sensor.energy
    cycle: yearly
    tariffs:
      - peak
      - offpeak


//这个自动化会在每天8电和22点执行一次。作用是转换峰和谷。意思就是在8点后切换一次把电量记录到峰传感器,在到22点切换一次后记录到谷传感器,,。。这里的转换是没有判断的。所以软件执行时间不对。可能会转换反转,可以在开发者工具总手动转换。或者用什么方法来判断一下??
//因为定义了天,月,年三个。所以需要触发3个action
automation:
- alias: fengguzhuanhuan
  trigger:
    - platform: time
      at: '08:00:00'
    - platform: time
      at: '22:00:00'
  action:
    - service: utility_meter.next_tariff
      entity_id: utility_meter.daily_energy
    - service: utility_meter.next_tariff
      entity_id: utility_meter.monthly_energy
    - service: utility_meter.next_tariff
      entity_id: utility_meter.yearly_energy



然后阶梯电价。我的方法是定义一个传感器,读取当年电量后比较处于那个阶梯,传感器如下:
#当前阶梯电费 当前年电量小于2760 0.568-0.288.   2761-4800 0.618-0.338    阶梯三 4801以上 0.868-0.588
  - platform: template
    sensors:
      dang_qian_jie_ti:
        value_template: >
          {% if states("sensor.energy") | float <= 2760 %}
          1
          {% elif states("sensor.energy") | float >=2760  and states("sensor.energy") | float <= 4800 %}
          2
          {% elif states("sensor.energy") | float > 4800 %}
          3
          {% else %}
          4
          {% endif %}
        friendly_name:  '当前阶梯'
        unit_of_measurement: "L"

这个传感器在计算电费的时候调用,根据返回值确定当前属于那个电费。比如要计算当天电费的时候:

#今日峰电费
  - platform: template
    sensors:
      jin_ri_fen_dian_fei:
        value_template: >
          {% if (states("sensor.dang_qian_jie_ti")) == "1" %}
          {% set dianjia = 0.568 %}
          {% elif (states("sensor.dang_qian_jie_ti")) == "2" %}
          {% set dianjia = 0.618 %}
          {% elif (states("sensor.dang_qian_jie_ti")) == "3" %}
          {% set dianjia = 0.868 %}
          {% else %}
          {% set dianjia = 1.000 %}#调试用,如果出现电量和价格一样,则有错误
          {% endif %}
          {{(states("sensor.daily_energy_peak") | float * dianjia) | round(2)}}
        friendly_name:  '今日峰电费'
        unit_of_measurement: "RMB"
        icon_template: mdi:currency-cny

#今日谷电费
  - platform: template
    sensors:
      jin_ri_gu_dian_fei:
        value_template: >
          {% if (states("sensor.dang_qian_jie_ti")) == "1" %}
          {% set dianjia = 0.288 %}
          {% elif (states("sensor.dang_qian_jie_ti")) == "2" %}
          {% set dianjia = 0.338 %}
          {% elif (states("sensor.dang_qian_jie_ti")) == "3" %}
          {% set dianjia = 0.588 %}
          {% else %}
          {% set dianjia = 1.000 %}#调试用,如果出现电量和价格一样,则有错误
          {% endif %}
          {{(states("sensor.daily_energy_offpeak") | float * dianjia) | round(2)}}
        friendly_name:  '今日谷电费'
        unit_of_measurement: "RMB"
        icon_template: mdi:currency-cny

#今日总电费
  - platform: template
    sensors:
      jin_ri_zong_dian_fei:
        value_template: >
          {{states("sensor.jin_ri_fen_dian_fei")|float + states("sensor.jin_ri_gu_dian_fei")|float | round(2)}}
        unit_of_measurement: "RMB"
        friendly_name: '今日总电费'
        icon_template: mdi:currency-cny



有几点注意,
1,三个培正模块时tasmota返回的json数据用了数组。所以定义传感器值的时候要带一个数组位置如:
value_template: "{{value_json['ENERGY'].Power[0] }}"

2,本方法无法记录昨天的峰谷电价,同样也无法记录上个月和上一年的。。学习influxDB中,希望用这个来补充。。

3,阶梯无法做到很准确。比如某一天的电费刚好从第一阶梯跨越到第二阶梯的时候。那么全天电费都会按照第二阶梯计算。当月也会,当年也会。所以就不用做当年电费了。跨越阶梯后电费会不准的。。。只能寄望于influxDB的方法来改进。
4,应该无需清零培正电表的数据,hass插件会自己根据配置修正(清零)传感器的值。(其实我不知道三路培正如何清零?一样用EnergyReset?不用指定编号麽?一起清零麽?)

另外有几个疑问线请教各位大佬。。
1,我看见自己家的情况。功率因数偏低。不知道是怎么造成的。有那些电器会造成功率因数偏低?LED灯据说偏低?
2,功率因数偏低的后果是什么?会增加电费麽?电费是按照实际功率结算还是视在功率?。功率因数偏低看上去电流就大了许多。是不是会增加线损?如图的第三项实际值开了10个5w的筒灯和一些待机状态的厨房电器。

3,我希望使用influxDB实现如下功能。记录每日的峰和谷电量两个传感器的实时数据。用一个cq每天将0点前的最后一条数据存入一个10年的rp表。其他数据全部清楚,然后hass通过读取这个10年的rp表来计算每天/每月/每年的电量。不知道这个cq如何写?我尝试用如下cq似乎数据不对。
CREATE CONTINUOUS QUERY cq_day_offpeak ON homeassistant
BEGIN
        SELECT last(value) INTO homeassistant."10_year".KWH FROM homeassistant."3_day".KWH WHERE entity_id = 'daily_energy_offpeak' GROUP BY time(1d, -479m)
END


功率.png

评分

参与人数 1金钱 +30 收起 理由
+ 30 感谢楼主分享!

查看全部评分

回复

使用道具 举报

9

主题

519

帖子

2281

积分

金牌会员

Rank: 6Rank: 6

积分
2281
金钱
1762
HASS币
0
发表于 2019-12-21 21:11:27 | 显示全部楼层
代码格式,能否改成代码格式的
回复

使用道具 举报

12

主题

328

帖子

1792

积分

论坛技术达人

积分
1792
金钱
1459
HASS币
40
发表于 2019-12-23 16:16:48 | 显示全部楼层
小功率的led灯等,功率因素都是偏低的,不用管,没啥影响,上级配电站会进行补偿的
回复

使用道具 举报

4

主题

100

帖子

802

积分

高级会员

Rank: 4

积分
802
金钱
702
HASS币
0
发表于 2020-1-16 13:33:06 | 显示全部楼层
可以用 state_attr('sensor.daily_energy_peak','last_period') 来获取昨日的峰时用电量,谷峰亦然。
切换峰谷时的话我用了类似以下的判断语句,楼主可以参考一下:
{% if (states('sensor.time') >= '06:00') and (states('sensor.time') < '22:00') and (states('utility_meter.daily_energy') == 'offpeak') %} utility_meter.next_tariff
回复

使用道具 举报

35

主题

153

帖子

1078

积分

金牌会员

Rank: 6Rank: 6

积分
1078
金钱
925
HASS币
10
 楼主| 发表于 2020-1-19 07:51:35 | 显示全部楼层
切换使用了两个自动化。不会出错了。
现在有个问题请教。如何修改电量,方便和物理电表同步?
- alias: fengshi_peak
  trigger:
    - platform: time
      at: '08:00:00'
  action:
    - service: utility_meter.select_tariff
      data:
        entity_id:
          - utility_meter.daily_energy
          - utility_meter.monthly_energy
          - utility_meter.yearly_energy
        tariff: peak

- alias: fengshi_offpeak
  trigger:
    - platform: time
      at: '22:00:00'
  action:
    - service: utility_meter.select_tariff
      data:
        entity_id:
          - utility_meter.daily_energy
          - utility_meter.monthly_energy
          - utility_meter.yearly_energy
        tariff: offpeak
回复

使用道具 举报

69

主题

692

帖子

4183

积分

论坛元老

Rank: 8Rank: 8

积分
4183
金钱
3486
HASS币
80
发表于 2020-3-20 20:38:16 | 显示全部楼层
boyyao 发表于 2020-1-19 07:51
切换使用了两个自动化。不会出错了。
现在有个问题请教。如何修改电量,方便和物理电表同步?
- alias: fen ...

ESP模块: Tasmota新版本可以支持一组tx/rx接三个004T模块。所以用ESP 01s就可以了。杀鸡不用牛刀
培正电表需要先单个接入Tasmota上,然后在控制台执行 ModuleAddress 1/2/3  分别对应三个单表,然后并联接入选择的RX/TX口

这个具体怎么做,能否详细图解一下,让小白能follow,谢谢。
回复

使用道具 举报

69

主题

692

帖子

4183

积分

论坛元老

Rank: 8Rank: 8

积分
4183
金钱
3486
HASS币
80
发表于 2020-7-13 15:51:45 | 显示全部楼层
楼主,我的三相四线入户,原来按照此法已经搞好,但断电后,无法显示数据了。

我原来用商家提供的上位机先把三个pzem的通讯地址分别改为1、2、3,然后的控制台输入ModuleAddress 1/2/3,成功显示三项的数据。

可是,停电后没了数据,我把pzem拆下来,发现通讯地址全部恢复默认的 1, 我从新用上位机修改,但无法保存,只要断电就会恢复默认1.

请教楼主,你是怎么修改和保存pzem的通讯地址的,谢谢。
回复

使用道具 举报

35

主题

153

帖子

1078

积分

金牌会员

Rank: 6Rank: 6

积分
1078
金钱
925
HASS币
10
 楼主| 发表于 2020-7-19 14:44:09 | 显示全部楼层
zhenxiwen 发表于 2020-7-13 15:51
楼主,我的三相四线入户,原来按照此法已经搞好,但断电后,无法显示数据了。

我原来用商家提供的上位机先 ...

使用esphome吧。。我现在已经转成esphome了。感觉比之前稳定。。
我之前是模块一个一个装。然后分别设置ModuleAddress的。
回复

使用道具 举报

69

主题

692

帖子

4183

积分

论坛元老

Rank: 8Rank: 8

积分
4183
金钱
3486
HASS币
80
发表于 2020-7-19 22:10:12 | 显示全部楼层
本帖最后由 zhenxiwen 于 2020-7-19 22:11 编辑
boyyao 发表于 2020-7-19 14:44
使用esphome吧。。我现在已经转成esphome了。感觉比之前稳定。。
我之前是模块一个一个装。然后分别设置M ...

要重新焊接和刷机,特别是计算电量电费的yaml配置要重新调整,工作量太大,暂时不想折腾。
另外,我看esphome没有energy总用电量、昨天用电量、今天用电量这三个数据,我的计算电费都要用到这三个数据。我不知道你是怎么得到总用电量、今天用电量、昨天用电量这三个数据的,你能否把你的yaml分享出来,谢谢。
回复

使用道具 举报

35

主题

153

帖子

1078

积分

金牌会员

Rank: 6Rank: 6

积分
1078
金钱
925
HASS币
10
 楼主| 发表于 2020-8-17 23:01:11 | 显示全部楼层
zhenxiwen 发表于 2020-7-19 22:10
要重新焊接和刷机,特别是计算电量电费的yaml配置要重新调整,工作量太大,暂时不想折腾。
另外,我看esph ...

老版本的是没有耗能统计,我用的是论坛里提供的方法修改的增加了能耗。但是新版的已经有了。
substitutions:
  device_name: pzem_004t_v3  #设备名称(多个改成不一样的)
  wifi_ssid: 'zzzzzz'    #WiFi_SSID名称
  wifi_password: 'zzzzz'    #WiFi密码
  wifi_ssid_AP: 'pzem_004t_v3'  
  wifi_password_AP: 'zzzzz'  #ap_WiFi密码
  wifi_static_ip: 192.168.3.40
  wifi_gateway: 192.168.3.1
  wifi_subnet: 255.255.255.0
  wifi_dns1: 192.168.3.1
  wifi_dns2: 192.168.3.1
  wifi_fast_connect: 'false'   #如果SSID是隐藏的,设置为true
  wifi_reboot_timeout: 0s  #WiFi离线多久后重启设备,秒s/分钟min/小时h,不需要此功能设置为0s
  ota_password: 'zzzzz'    #OTA密码
  api_password: 'zzzzz'    #API密码
  api_reboot_timeout: 0s  #与客户端(如Home Assistant)失去连接多久后重启设备,秒s/分钟min/小时h,不需要此功能设置为0s


esphome:
  name: $device_name
  platform: ESP8266
  board: esp01_1m

wifi:
ssid: $wifi_ssid
  password: $wifi_password
#可选,手工指定IP地址
  manual_ip:
    static_ip: $wifi_static_ip
    gateway: $wifi_gateway
    subnet: $wifi_subnet
    dns1: $wifi_dns1           #(可选)
    dns2: $wifi_dns2           #(可选)
  use_address: $wifi_static_ip #(可选,字符串)手动覆盖用于连接ESP的地址。默认为自动生成的值。例如,如果您更改了静态IP并想将OTA刷新为先前配置的IP地址。  

  domain: .local   #(可选,字符串):设置用于上传的节点主机名的域。例如,如果将其设置为.local,则所有上传将发送到<HOSTNAME>.local。默认为.local。
  reboot_timeout: $wifi_reboot_timeout   #(可选)wifi连接失败后重启时间,0s禁用。默认为15min。
  power_save_mode: "NONE" #(可选,字符串) WiFi省电模式。NONE(省电最少,ESP8266默认) LIGHT(ESP32默认) HIGH(最省电)
  fast_connect: $wifi_fast_connect       #(可选,on,off)直连WIFI,而不进行信号强弱扫描
  id: #(可选)手动指定用于代码生成的ID。
  
#无线没有连接的时候用以下信息转为AP模式
  ap:
    ssid: $wifi_ssid_AP
    password: $wifi_password_AP
    channel: 1        #(可选)AP应该在1到14上运行的信道。默认为1。
    manual_ip:        #(可选)手动设置AP的IP选项。与工作站模式的manual_ip相同
        static_ip: 192.168.4.1
        gateway: 192.168.4.1
        subnet: 255.255.255.0
    ap_timeout: 1min #(可选)启用配置的后备热点的时间。默认为1min。   
    
captive_portal:

# Enable logging
# logger:
#   level: NONE
#   hardware_uart: UART1

# web_server:

# Enable Home Assistant API
api:
  password: $api_password
  reboot_timeout: $api_reboot_timeout

ota:
  password: $ota_password

sensor:                               #传感器
  - platform: pzemac
    current:
      name: "CH_1_Current"
    voltage:
      name: "CH_1_Voltage"
    power:
      name: "CH_1_Power"
    energy:
      name: "CH_1_Energy"      
    frequency:
      name: "CH_1_Frequency"
    power_factor:
      name: "CH_1_Power Factor"
    update_interval: 5s
    address: 1

  - platform: pzemac
    current:
      name: "CH_2_Current"
    voltage:
      name: "CH_2_Voltage"
    power:
      name: "CH_2_Power"
    energy:
      name: "CH_2_Energy"  
    frequency:
      name: "CH_2_Frequency"
    power_factor:
      name: "CH_2_Power Factor"
    update_interval: 5s

    address: 2
  - platform: pzemac
    current:
      name: "CH_3_Current"
    voltage:
      name: "CH_3_Voltage"
    power:
      name: "CH_3_Power"
    energy:
      name: "CH_3_Energy"    
    frequency:
      name: "CH_3_Frequency"
    power_factor:
      name: "CH_3_Power Factor"
    update_interval: 5s
    address: 3   

uart:
   tx_pin: 1
   rx_pin: 3
   baud_rate: 9600
   stop_bits: 1


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-19 17:19 , Processed in 2.940604 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表