This is just a copy of config from https://github.com/emporia-vue-local/esphome, just edited for use with 3 phase systems. All instructions can be found there.
Last active
February 17, 2023 23:43
-
-
Save adamjezek98/07800fd0f9b215471968e24b5b6bce8f to your computer and use it in GitHub Desktop.
Emporia Vue 2 power meter with ESPHome and 3 phase distribution systems
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
esphome: | |
name: emporia | |
esp32: | |
board: esp32dev | |
framework: | |
type: esp-idf | |
# Enable logging | |
logger: | |
external_components: | |
- source: github://emporia-vue-local/esphome@dev | |
components: [ emporia_vue ] | |
# Enable Home Assistant API | |
api: | |
encryption: | |
key: "XXXXXXXXXX=" | |
ota: | |
password: "XXXXXXXXXXXXXX" | |
wifi: | |
ssid: !secret wifi_ssid | |
password: !secret wifi_password | |
# Enable fallback hotspot (captive portal) in case wifi connection fails | |
ap: | |
ssid: "Emporia Fallback Hotspot" | |
password: "XXXXXXXXXXXXXXX" | |
preferences: | |
# the default of 1min is far too short--flash chip is rated | |
# for approx 100k writes. | |
flash_write_interval: "48h" | |
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_1 # 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.022 # 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 1 Voltage" | |
filters: [*moving_avg, *pos] | |
frequency: | |
name: "Phase 1 Frequency" | |
filters: [*moving_avg, *pos] | |
- id: phase_2 # 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.022 # 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 2 Voltage" | |
filters: [*moving_avg, *pos] | |
phase_angle: | |
name: "Phase 2 Phase Angle" | |
filters: [*moving_avg, *pos] | |
- id: phase_3 # Verify that this specific phase/leg is connected to correct input wire color on device listed below | |
input: BLUE # Vue device wire color | |
calibration: 0.022 # 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 3 Voltage" | |
filters: [*moving_avg, *pos] | |
phase_angle: | |
name: "Phase 3 Phase Angle" | |
filters: [*moving_avg, *pos] | |
ct_clamps: | |
- phase_id: phase_1 | |
input: "A" # Verify the CT going to this device input also matches the phase/leg | |
power: | |
name: "Phase 1 Power" | |
id: phase_1_power | |
device_class: power | |
filters: [*moving_avg, *pos] | |
- phase_id: phase_2 | |
input: "B" # Verify the CT going to this device input also matches the phase/leg | |
power: | |
name: "Phase 2 Power" | |
id: phase_2_power | |
device_class: power | |
filters: [*moving_avg, *pos] | |
- phase_id: phase_3 | |
input: "C" # Verify the CT going to this device input also matches the phase/leg | |
power: | |
name: "Phase 3 Power" | |
id: phase_3_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_1, input: "1", power: { name: "Circuit 1 Power", id: cir1, filters: [ *moving_avg, *pos ] } } | |
- { phase_id: phase_2, input: "2", power: { name: "Circuit 2 Power", id: cir2, filters: [ *moving_avg, *pos ] } } | |
- { phase_id: phase_3, input: "3", power: { name: "Circuit 3 Power", id: cir3, filters: [ *moving_avg, *pos ] } } | |
- { phase_id: phase_1, input: "4", power: { name: "Circuit 4 Power", id: cir4, filters: [ *moving_avg, *pos ] } } | |
- { phase_id: phase_2, input: "5", power: { name: "Circuit 5 Power", id: cir5, filters: [ *moving_avg, *pos ] } } | |
- { phase_id: phase_3, input: "6", power: { name: "Circuit 6 Power", id: cir6, filters: [ *moving_avg, *pos ] } } | |
- { phase_id: phase_1, input: "7", power: { name: "Circuit 7 Power", id: cir7, filters: [ *moving_avg, *pos ] } } | |
- { phase_id: phase_2, input: "8", power: { name: "Circuit 8 Power", id: cir8, filters: [ *moving_avg, *pos ] } } | |
- { phase_id: phase_3, input: "9", power: { name: "Circuit 9 Power", id: cir9, filters: [ *moving_avg, *pos ] } } | |
- { phase_id: phase_1, input: "10", power: { name: "Circuit 10 Power", id: cir10, filters: [ *moving_avg, *pos ] } } | |
- { phase_id: phase_2, input: "11", power: { name: "Circuit 11 Power", id: cir11, filters: [ *moving_avg, *pos ] } } | |
- { phase_id: phase_3, input: "12", power: { name: "Circuit 12 Power", id: cir12, filters: [ *moving_avg, *pos ] } } | |
- { phase_id: phase_1, input: "13", power: { name: "Circuit 13 Power", id: cir13, filters: [ *moving_avg, *pos ] } } | |
- { phase_id: phase_2, input: "14", power: { name: "Circuit 14 Power", id: cir14, filters: [ *moving_avg, *pos ] } } | |
- { phase_id: phase_3, input: "15", power: { name: "Circuit 15 Power", id: cir15, filters: [ *moving_avg, *pos ] } } | |
- { phase_id: phase_1, input: "16", power: { name: "Circuit 16 Power", id: cir16, filters: [ *moving_avg, *pos ] } } | |
- platform: template | |
name: "Total Power" | |
lambda: return id(phase_1_power).state + id(phase_2_power).state + id(phase_3_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 2 Daily Energy" } | |
- { power_id: cir3, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 3 Daily Energy" } | |
- { power_id: cir4, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 4 Daily Energy" } | |
- { power_id: cir5, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 5 Daily Energy" } | |
- { power_id: cir6, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 6 Daily Energy" } | |
- { power_id: cir7, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 7 Daily Energy" } | |
- { power_id: cir8, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 8 Daily Energy" } | |
- { power_id: cir9, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 9 Daily Energy" } | |
- { power_id: cir10, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 10 Daily Energy" } | |
- { power_id: cir11, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 11 Daily Energy" } | |
- { power_id: cir12, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 12 Daily Energy" } | |
- { power_id: cir13, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 13 Daily Energy" } | |
- { power_id: cir14, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 14 Daily Energy" } | |
- { power_id: cir15, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 15 Daily Energy" } | |
- { power_id: cir16, platform: total_daily_energy, accuracy_decimals: 0, name: "Circuit 16 Daily Energy" } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment