智能电表-ESPHome固件
电表简介
联网方式:WiFi
WIFI芯片:ESP8266
计量模块:PZEM-004T V3
固件:esphome
视频简介:https://www.bilibili.com/video/BV1Ua4y1z7WC/
esphome近期有大的更新,在使用上对比tasmota更加方便,所以默认都使用了esphome固件。
固件代码是开源的,可以看下面。
电表接线方式
1、接线示意图
2、接线要求
(1)接在总空开下
测总用电时,电表电源必须接在总空开下方(与总火线并联)
原因:
电表的计量芯片在计量时,会判断有功功率和无功功率。(分路空开下,只是总电流的一部分,导致功率因数低,计量不准。)
空开有家庭电路保护功能,可以放心接入(不要接总空开的上方入户线,没有保护,且一直是带电状态!!!)
接线正确判断标准:
待机功率因数应在 0.6 以上(低于50W时,功率因数会更低)。
用电时(电流越大功率因数越大),应在 0.9 以上。
(2)禁止带电接线
断闸接线,带电作业十分危险!
(3)铜线不外露
断电后,将电表的零火线,缠绕在空开出线上。电线塞进空开后,不要让铜线漏出来!
铜线外露,一是有触电的危险,二是有短路的危险!
(4)互感器方向
需要和电流方向一致,(同时需要扣紧,否则影响测量精度)
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、配置——仪表盘——能源
添加消耗电能实体(选择总用电,今日用电会在断电后,当日清零)
接入后,会开始统计(数据是整点更新)
实时电价配置
1、阶梯电价
进入 配置——辅助元素
创建template sensor
(1)阶梯
{% 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)实时电价
(实体电价依赖上面创建的阶梯传感器,如果报错,需删除备注)
代码备注见下面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、添加实时电价
进入 配置——仪表盘——能源,选择实时电价传感器实体
添加完成后,能源页面会显示“费用”,费用初始值为0,整点更新
峰谷电统计
峰谷电统计
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
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、更改能源面板电量实体
使用了校准传感器后,能源面板的实体也需要更改。
日历显示用电统计
日历里统计电量,可以看的很直观
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:
- id: global_yesterday_energy
type: float
restore_value: yes
initial_value: '0.000'
- 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
- 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里,点击 Firmware Upgrade 上传中文固件
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里集成里可以直接访问设备。