I recently updated to my pair of Emporia Vue energy monitors to reflect changes recommended by the Dev. (since the last update I did 5 months ago) After doing this I noticed that my entity names had changed, but it wasn’t completely uniform in its scheme.
Everything was formatted like sensor.emporiavue1_balance_power, but now it seems it is only the entities that I added today that are formatted like that and all of the previously existing entities no longer have the name field included.
Did I miss an update to HA or ESPHome where this was discussed or it specific to something I am doing??
New Format
esphome:
name: emporiavue1
friendly_name: vue1
external_components:
- source: github://emporia-vue-local/esphome@dev
components:
- emporia_vue
esp32:
board: esp32dev
framework:
type: esp-idf
version: recommended
# Enable Home Assistant API
api:
encryption:
# Encryption key is generated by the new device wizard.
key: !secret emporiavue1_api_key
services:
- service: play_rtttl
variables:
song_str: string
then:
- rtttl.play:
rtttl: !lambda 'return song_str;'
ota:
# Create a secure password for pushing OTA updates.
password: !secret emporiavue1_ota_password
# Enable logging
logger:
logs:
# by default, every reading will be printed to the UART, which is very slow
# This will disable printing the readings but keep other helpful messages
sensor: INFO
wifi:
# Wifi credentials are stored securely by new device wizard.
ssid: !secret wifi_ssid
password: !secret wifi_password
preferences:
# please also make sure `restore: false` is set on all `platform: total_daily_energy`
# sensors below.
flash_write_interval: "48h"
output:
- platform: ledc
pin: GPIO12
id: buzzer
- platform: gpio
pin: GPIO27
id: buzzer_gnd
rtttl:
output: buzzer
on_finished_playback:
- logger.log: 'Song ended!'
button:
- platform: template
name: "Two Beeps"
on_press:
- rtttl.play: "two short:d=4,o=5,b=100:16e6,16e6"
light:
- platform: status_led
name: "D3_LED"
pin: 23
restore_mode: ALWAYS_ON
entity_category: config
i2c:
sda: 21
scl: 22
scan: false
frequency: 200kHz # recommended range is 50-200kHz
id: i2c_a
time:
- platform: sntp
id: my_time
# these are called references in YAML. They allow you to reuse
# this configuration in each sensor, while only defining it once
.defaultfilters:
- &throttle_avg
# average all raw readings together over a 5 second span before publishing
throttle_average: 5s
- &throttle_time
# only send the most recent measurement every 60 seconds
throttle: 60s
- &invert
# invert and filter out any values below 0.
lambda: 'return max(-x, 0.0f);'
- &pos
# filter out any values below 0.
lambda: 'return max(x, 0.0f);'
- &abs
# take the absolute value of the value
lambda: 'return abs(x);'
sensor:
- platform: emporia_vue
i2c_id: i2c_a
phases:
- id: phase_a # Verify that this specific phase/leg is connected to correct input wire color on device listed below
input: BLACK # Vue device wire color
calibration: 0.023111138 # 0.022 is used as the default as starting point but may need adjusted to ensure accuracy
# To calculate new calibration value use the formula <in-use calibration value> * <accurate voltage> / <reporting voltage>
voltage:
name: "Phase A Voltage"
filters: [*throttle_avg, *pos]
frequency:
name: "Phase A Frequency"
filters: [*throttle_avg, *pos]
- id: phase_b # Verify that this specific phase/leg is connected to correct input wire color on device listed below
input: RED # Vue device wire color
calibration: 0.021701306 # 0.022 is used as the default as starting point but may need adjusted to ensure accuracy
# To calculate new calibration value use the formula <in-use calibration value> * <accurate voltage> / <reporting voltage>
voltage:
name: "Phase B Voltage"
filters: [*throttle_avg, *pos]
phase_angle:
name: "Phase B Phase Angle"
filters: [*throttle_avg, *pos]
ct_clamps:
# Do not specify a name for any of the power sensors here, only an id. This leaves the power sensors internal to ESPHome.
# Copy sensors will filter and then send power measurements to HA
# These non-throttled power sensors are used for accurately calculating energy
- phase_id: phase_a
input: "A" # Verify the CT going to this device input also matches the phase/leg
power:
id: phase_a_power
filters: [*pos]
- phase_id: phase_b
input: "B" # Verify the CT going to this device input also matches the phase/leg
power:
id: phase_b_power
filters: [*pos]
# Pay close attention to set the phase_id for each breaker by matching it to the phase/leg it connects to in the panel
- { phase_id: phase_b, input: "1", power: { id: cir1, filters: [ *pos ] } }
- { phase_id: phase_b, input: "2", power: { id: cir2, filters: [ *pos, multiply: 2 ] } }
- { phase_id: phase_b, input: "3", power: { id: cir3, filters: [ *pos, multiply: 2 ] } }
- { phase_id: phase_a, input: "4", power: { id: cir4, filters: [ *pos, multiply: 2 ] } }
- { phase_id: phase_b, input: "5", power: { id: cir5, filters: [ *pos ] } }
- { phase_id: phase_a, input: "6", power: { id: cir6, filters: [ *pos ] } }
- { phase_id: phase_b, input: "7", power: { id: cir7, filters: [ *pos ] } }
- { phase_id: phase_a, input: "8", power: { id: cir8, filters: [ *pos ] } }
- { phase_id: phase_b, input: "9", power: { id: cir9, filters: [ *pos ] } }
- { phase_id: phase_a, input: "10", power: { id: cir10, filters: [ *pos ] } }
- { phase_id: phase_b, input: "11", power: { id: cir11, filters: [ *pos ] } }
- { phase_id: phase_a, input: "12", power: { id: cir12, filters: [ *pos ] } }
- { phase_id: phase_b, input: "13", power: { id: cir13, filters: [ *pos ] } }
- { phase_id: phase_b, input: "14", power: { id: cir14, filters: [ *pos ] } }
- { phase_id: phase_a, input: "15", power: { id: cir15, filters: [ *pos ] } }
# - { phase_id: phase_a, input: "16", power: { id: cir16, filters: [ *pos ] } }
on_update:
then:
- component.update: total_power
- component.update: balance_power
# The copy sensors filter and send the power state to HA
- { platform: copy, name: "Phase A Power", source_id: phase_a_power, filters: *throttle_avg }
- { platform: copy, name: "Phase B Power", source_id: phase_b_power, filters: *throttle_avg }
- { platform: copy, name: "Total Power", source_id: total_power, filters: *throttle_avg }
- { platform: copy, name: "Balance Power", source_id: balance_power, filters: *throttle_avg }
- { platform: copy, name: "Circuit 1 Power", source_id: cir1, filters: *throttle_avg }
- { platform: copy, name: "Circuit 5 Power", source_id: cir2, filters: *throttle_avg }
- { platform: copy, name: "Circuit 9 Power", source_id: cir3, filters: *throttle_avg }
- { platform: copy, name: "Circuit 13 Power", source_id: cir4, filters: *throttle_avg }
- { platform: copy, name: "Circuit 17 Power", source_id: cir5, filters: *throttle_avg }
- { platform: copy, name: "Circuit 19 Power", source_id: cir6, filters: *throttle_avg }
- { platform: copy, name: "Circuit 21 Power", source_id: cir7, filters: *throttle_avg }
- { platform: copy, name: "Circuit 23 Power", source_id: cir8, filters: *throttle_avg }
- { platform: copy, name: "Circuit 25 Power", source_id: cir9, filters: *throttle_avg }
- { platform: copy, name: "Circuit 27 Power", source_id: cir10, filters: *throttle_avg }
- { platform: copy, name: "Circuit 29 Power", source_id: cir11, filters: *throttle_avg }
- { platform: copy, name: "Circuit 31 Power", source_id: cir12, filters: *throttle_avg }
- { platform: copy, name: "Circuit 33 Power", source_id: cir13, filters: *throttle_avg }
- { platform: copy, name: "Circuit 35 Power", source_id: cir14, filters: *throttle_avg }
- { platform: copy, name: "Circuit 3 Power", source_id: cir15, filters: *throttle_avg }
# - { platform: copy, name: "Circuit 16 Power", source_id: cir16, filters: *throttle_avg }
- platform: template
lambda: return id(phase_a_power).state + id(phase_b_power).state;
update_interval: never # will be updated after all power sensors update via on_update trigger
id: total_power
device_class: power
state_class: measurement
unit_of_measurement: "W"
- platform: total_daily_energy
name: "Total Daily Energy"
power_id: total_power
accuracy_decimals: 0
restore: false
filters: *throttle_time
- platform: template
lambda: !lambda |-
return max(0.0f, id(total_power).state -
id( cir1).state -
id( cir2).state -
id( cir3).state -
id( cir4).state -
id( cir5).state -
id( cir6).state -
id( cir7).state -
id( cir8).state -
id( cir9).state -
id(cir10).state -
id(cir11).state -
id(cir12).state -
id(cir13).state -
id(cir14).state -
id(cir15).state);
# id(cir16).state);
update_interval: never # will be updated after all power sensors update via on_update trigger
id: balance_power
device_class: power
state_class: measurement
unit_of_measurement: "W"
- platform: total_daily_energy
name: "Balance Daily Energy"
power_id: balance_power
accuracy_decimals: 0
restore: false
filters: *throttle_time
- { power_id: cir1, platform: total_daily_energy, accuracy_decimals: 0, restore: false, name: "Circuit 1 Daily Energy", filters: *throttle_time }
- { power_id: cir2, platform: total_daily_energy, accuracy_decimals: 0, restore: false, name: "Circuit 5 Daily Energy", filters: *throttle_time }
- { power_id: cir3, platform: total_daily_energy, accuracy_decimals: 0, restore: false, name: "Circuit 9 Daily Energy", filters: *throttle_time }
- { power_id: cir4, platform: total_daily_energy, accuracy_decimals: 0, restore: false, name: "Circuit 13 Daily Energy", filters: *throttle_time }
- { power_id: cir5, platform: total_daily_energy, accuracy_decimals: 0, restore: false, name: "Circuit 17 Daily Energy", filters: *throttle_time }
- { power_id: cir6, platform: total_daily_energy, accuracy_decimals: 0, restore: false, name: "Circuit 19 Daily Energy", filters: *throttle_time }
- { power_id: cir7, platform: total_daily_energy, accuracy_decimals: 0, restore: false, name: "Circuit 21 Daily Energy", filters: *throttle_time }
- { power_id: cir8, platform: total_daily_energy, accuracy_decimals: 0, restore: false, name: "Circuit 23 Daily Energy", filters: *throttle_time }
- { power_id: cir9, platform: total_daily_energy, accuracy_decimals: 0, restore: false, name: "Circuit 25 Daily Energy", filters: *throttle_time }
- { power_id: cir10, platform: total_daily_energy, accuracy_decimals: 0, restore: false, name: "Circuit 27 Daily Energy", filters: *throttle_time }
- { power_id: cir11, platform: total_daily_energy, accuracy_decimals: 0, restore: false, name: "Circuit 29 Daily Energy", filters: *throttle_time }
- { power_id: cir12, platform: total_daily_energy, accuracy_decimals: 0, restore: false, name: "Circuit 31 Daily Energy", filters: *throttle_time }
- { power_id: cir13, platform: total_daily_energy, accuracy_decimals: 0, restore: false, name: "Circuit 33 Daily Energy", filters: *throttle_time }
- { power_id: cir14, platform: total_daily_energy, accuracy_decimals: 0, restore: false, name: "Circuit 35 Daily Energy", filters: *throttle_time }
- { power_id: cir15, platform: total_daily_energy, accuracy_decimals: 0, restore: false, name: "Circuit 3 Daily Energy", filters: *throttle_time }
# - { power_id: cir16, platform: total_daily_energy, accuracy_decimals: 0, restore: false, name: "Circuit 16 Daily Energy", filters: *throttle_time }
Old Format
esphome:
name: emporiavue1
friendly_name: vue1
external_components:
- source: github://emporia-vue-local/esphome@dev
components:
- emporia_vue
esp32:
board: esp32dev
framework:
type: esp-idf
version: recommended
# Enable Home Assistant API
api:
encryption:
# Encryption key is generated by the new device wizard.
key: !secret emporiavue1_api_key
services:
- service: play_rtttl
variables:
song_str: string
then:
- rtttl.play:
rtttl: !lambda 'return song_str;'
ota:
# Create a secure password for pushing OTA updates.
password: !secret emporiavue1_ota_password
# Enable logging
logger:
wifi:
# Wifi credentials are stored securely by new device wizard.
ssid: !secret wifi_ssid
password: !secret wifi_password
preferences:
# the default of 1min is far too short--flash chip is rated
# for approx 100k writes.
flash_write_interval: "48h"
output:
- platform: ledc
pin: GPIO12
id: buzzer
rtttl:
output: buzzer
on_finished_playback:
- logger.log: 'Song ended!'
button:
- platform: template
name: "Two Beeps"
on_press:
- rtttl.play: "two short:d=4,o=5,b=100:16e6,16e6"
light:
- platform: status_led
name: "D3_LED"
pin: 23
restore_mode: ALWAYS_ON
i2c:
sda: 21
scl: 22
scan: false
frequency: 200kHz # recommended range is 50-200kHz
id: i2c_a
time:
- platform: sntp
id: my_time
# these are called references in YAML. They allow you to reuse
# this configuration in each sensor, while only defining it once
.defaultfilters:
- &moving_avg
# we capture a new sample every 0.24 seconds, so the time can
# be calculated from the number of samples as n * 0.24.
sliding_window_moving_average:
# we average over the past 2.88 seconds
window_size: 12
# we push a new value every 1.44 seconds
send_every: 6
- &invert
# invert and filter out any values below 0.
lambda: 'return max(-x, 0.0f);'
- &pos
# filter out any values below 0.
lambda: 'return max(x, 0.0f);'
- &abs
# take the absolute value of the value
lambda: 'return abs(x);'
sensor:
- platform: emporia_vue
i2c_id: i2c_a
phases:
- id: phase_a # Verify that this specific phase/leg is connected to correct input wire color on device listed below
input: BLACK # Vue device wire color
calibration: 0.023111138 # 0.022 is used as the default as starting point but may need adjusted to ensure accuracy
# To calculate new calibration value use the formula <in-use calibration value> * <accurate voltage> / <reporting voltage>
voltage:
name: "Phase A Voltage"
filters: [*moving_avg, *pos]
frequency:
name: "Phase A Frequency"
filters: [*moving_avg, *pos]
- id: phase_b # Verify that this specific phase/leg is connected to correct input wire color on device listed below
input: RED # Vue device wire color
calibration: 0.021701306 # 0.022 is used as the default as starting point but may need adjusted to ensure accuracy
# To calculate new calibration value use the formula <in-use calibration value> * <accurate voltage> / <reporting voltage>
voltage:
name: "Phase B Voltage"
filters: [*moving_avg, *pos]
phase_angle:
name: "Phase B Phase Angle"
filters: [*moving_avg, *pos]
ct_clamps:
- phase_id: phase_a
input: "A" # Verify the CT going to this device input also matches the phase/leg
power:
name: "Phase A Power"
id: phase_a_power
device_class: power
filters: [*moving_avg, *pos]
- phase_id: phase_b
input: "B" # Verify the CT going to this device input also matches the phase/leg
power:
name: "Phase B Power"
id: phase_b_power
device_class: power
filters: [*moving_avg, *pos]
# Pay close attention to set the phase_id for each breaker by matching it to the phase/leg it connects to in the panel
- { phase_id: phase_b, input: "1", power: { name: "Circuit 1 Power", id: cir1, filters: [ *moving_avg, *pos ] } }
- { phase_id: phase_b, input: "2", power: { name: "Circuit 5 Power", id: cir2, filters: [ *moving_avg, *pos, multiply: 2 ] } }
- { phase_id: phase_b, input: "3", power: { name: "Circuit 9 Power", id: cir3, filters: [ *moving_avg, *pos, multiply: 2 ] } }
- { phase_id: phase_a, input: "4", power: { name: "Circuit 13 Power", id: cir4, filters: [ *moving_avg, *pos, multiply: 2 ] } }
- { phase_id: phase_b, input: "5", power: { name: "Circuit 17 Power", id: cir5, filters: [ *moving_avg, *pos ] } }
- { phase_id: phase_a, input: "6", power: { name: "Circuit 19 Power", id: cir6, filters: [ *moving_avg, *pos ] } }
- { phase_id: phase_b, input: "7", power: { name: "Circuit 21 Power", id: cir7, filters: [ *moving_avg, *pos ] } }
- { phase_id: phase_a, input: "8", power: { name: "Circuit 23 Power", id: cir8, filters: [ *moving_avg, *pos ] } }
- { phase_id: phase_b, input: "9", power: { name: "Circuit 25 Power", id: cir9, filters: [ *moving_avg, *pos ] } }
- { phase_id: phase_a, input: "10", power: { name: "Circuit 27 Power", id: cir10, filters: [ *moving_avg, *pos ] } }
- { phase_id: phase_b, input: "11", power: { name: "Circuit 29 Power", id: cir11, filters: [ *moving_avg, *pos ] } }
- { phase_id: phase_a, input: "12", power: { name: "Circuit 31 Power", id: cir12, filters: [ *moving_avg, *pos ] } }
- { phase_id: phase_b, input: "13", power: { name: "Circuit 33 Power", id: cir13, filters: [ *moving_avg, *pos ] } }
- { phase_id: phase_b, input: "14", power: { name: "Circuit 35 Power", id: cir14, filters: [ *moving_avg, *pos ] } }
- { phase_id: phase_a, input: "15", power: { name: "Circuit 3 Power", id: cir15, filters: [ *moving_avg, *pos ] } }
# - { phase_id: phase_a, input: "16", power: { name: "Circuit 16 Power", id: cir16, filters: [ *moving_avg ] } }
- platform: template
name: "Total Power"
lambda: return id(phase_a_power).state + id(phase_b_power).state;
update_interval: 1s
id: total_power
unit_of_measurement: "W"
- platform: total_daily_energy
name: "Total Daily Energy"
power_id: total_power
accuracy_decimals: 0
- { power_id: cir1, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 1 Daily Energy" }
- { power_id: cir2, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 5 Daily Energy" }
- { power_id: cir3, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 9 Daily Energy" }
- { power_id: cir4, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 13 Daily Energy" }
- { power_id: cir5, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 17 Daily Energy" }
- { power_id: cir6, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 19 Daily Energy" }
- { power_id: cir7, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 21 Daily Energy" }
- { power_id: cir8, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 23 Daily Energy" }
- { power_id: cir9, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 25 Daily Energy" }
- { power_id: cir10, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 27 Daily Energy" }
- { power_id: cir11, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 29 Daily Energy" }
- { power_id: cir12, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 31 Daily Energy" }
- { power_id: cir13, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 33 Daily Energy" }
- { power_id: cir14, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 35 Daily Energy" }
- { power_id: cir15, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 3 Daily Energy" }
# - { power_id: cir16, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 16 Daily Energy" }