Add Emporia Vue energy monitor (#42)

* Add the emporia-vue2 device
* Move time component from individual devices to the base device package
* Remove ESPSense component since I don't have a Sense energy monitor
* Update README
* Adjust BLE scan settings on garage fridge to improve wifi reliability
This commit is contained in:
Chris Nussbaum 2022-11-01 16:25:09 -05:00 committed by GitHub
parent 1af1341879
commit 557dae7ffc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 136 additions and 139 deletions

View File

@ -45,9 +45,6 @@ This a modified version of the [Tuya fan](https://esphome.io/components/fan/tuya
### Tuya Light Plus
This an enhanced version of the standard [Tuya light](https://esphome.io/components/light/tuya.html) component that adds a bunch of extra features. I use this component with [Feit Dimmers](https://www.feit.com/product/smart-wi-fi-dimmer/) but it will likely work with other Tuya dimmers. More details on features and how to use this component are available [here](./components/tuya_light_plus/README.md).
### ESPSense
This excellent component is not mine and doesn't live in this repository but most of my devices are using it so I felt it was worthy of a mention here. More details are available [here](https://github.com/cbpowell/ESPSense).
## Misc Devices
### [Basement Bathroom Sensor](./devices/basement_bathroom_sensor.yaml)
@ -77,6 +74,11 @@ This project was one of the first projects I have done that I would call woodwor
<br/><br/><img src="./images/scripture_of_the_day/front.jpg" alt="Front" width="600" /><img src="./images/scripture_of_the_day/back.jpg" alt="Back" width="600" />
## Energy Monitor
### [Emporia Gen 2 Vue](https://www.emporiaenergy.com/how-the-vue-energy-monitor-works)
This device is sinificantly cheaper then a Sense Energy Monitor, can monitor 16 circuits in addition to the mains (Sense can only do 2 additional), and comes with all of the additional CT clamps. Like the Sense it is intended to work with a cloud service but because it is based on an ESP32 it can be flashed with ESPHome and made a local only device. More details can be found [here](https://gist.github.com/flaviut/93a1212c7b165c7674693a45ad52c512).
## Smart Plugs
### [TOPGREENER TGWF115PQM Smart Plugs](https://www.amazon.com/gp/product/B07D8ZVJN2)
I have a bunch of these smart plugs that I use for various things where I want to monitor the power consumption and/or be able to completely turn off the power (because they have a significant standby power draw). The TOPGREENER units are cheap, can be flashed with [Tuya-Convert](https://github.com/ct-Open-Source/tuya-convert) (or they could last time I bought one), and have power monitoring.

View File

@ -15,8 +15,6 @@ external_components:
type: local
path: ../components
components: [ binary_light_with_power ]
- source: github://cbpowell/ESPSense
components: [ espsense ]
binary_sensor:
- platform: gpio
@ -36,12 +34,6 @@ binary_sensor:
then:
- fan.toggle: the_fan
espsense:
plugs:
- name: Basement Bathroom Light
power_sensor: light_power
voltage: 120
fan:
- platform: binary
id: the_fan
@ -76,6 +68,3 @@ sensor:
name: Basement Bathroom Light
power_id: light_power
method: left
time:
- platform: homeassistant

View File

@ -15,8 +15,6 @@ external_components:
type: local
path: ../components
components: [ binary_light_with_power, gpio_switch_with_power ]
- source: github://cbpowell/ESPSense
components: [ espsense ]
binary_sensor:
- platform: gpio
@ -36,15 +34,6 @@ binary_sensor:
then:
- switch.toggle: heater
espsense:
plugs:
- name: Basement Shower Light
power_sensor: light_power
voltage: 120
- name: Basement Bathroom Heater
power_sensor: heat_power
voltage: 120
light:
- platform: binary_light_with_power
id: the_light
@ -85,6 +74,3 @@ sensor:
name: Basement Bathroom Heater
power_id: heat_power
method: left
time:
- platform: homeassistant

123
devices/emporia-vue2.yaml Normal file
View File

@ -0,0 +1,123 @@
substitutions:
device_id: emporia-vue2
device_name: Emporia Vue2 Power Monitor
board: esp32dev
ip_address: !secret emporia-vue2-ip
ota_pwd: !secret emporia-vue2-ota-pwd
api_pwd: !secret emporia-vue2-api-pwd
ap_wifi_pwd: !secret emporia-vue2-ap-pwd
packages:
device_base: !include ../packages/device_base_esp32.yaml
wifi:
power_save_mode: light
external_components:
- source: github://flaviut/esphome@emporia-vue-2022.4.0
components: [ emporia_vue ]
i2c:
sda: 21
scl: 22
scan: false
frequency: 200kHz
id: i2c_a
# 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.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 A Voltage"
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.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 B Voltage"
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: "Furnace Power", id: cir1, filters: [ *moving_avg, *pos ] } }
- { phase_id: phase_b, input: "2", power: { name: "Dryer Power", id: cir2, filters: [ *moving_avg, *pos, multiply: 2 ] } }
- { phase_id: phase_b, input: "3", power: { name: "Garage 1 Power", id: cir3, filters: [ *moving_avg, *pos ] } }
- { phase_id: phase_b, input: "4", power: { name: "Hot Water Heater Power", id: cir4, filters: [ *moving_avg, *pos, multiply: 2 ] } }
# - { phase_id: phase_a, input: "5", power: { name: "Circuit 5 Power", id: cir5, filters: [ *moving_avg, *pos ] } }
# - { phase_id: phase_a, input: "6", power: { name: "Circuit 6 Power", id: cir6, filters: [ *moving_avg, *pos ] } }
# - { phase_id: phase_a, input: "7", power: { name: "Circuit 7 Power", id: cir7, filters: [ *moving_avg, *pos ] } }
# - { phase_id: phase_b, input: "8", power: { name: "Circuit 8 Power", id: cir8, filters: [ *moving_avg, *pos ] } }
- { phase_id: phase_a, input: "9", power: { name: "Fire Pit/Fountain Power", id: cir9, filters: [ *moving_avg, *pos ] } }
- { phase_id: phase_a, input: "10", power: { name: "Pool Accessories Total Power", id: cir10, filters: [ *moving_avg, *pos ] } }
- { phase_id: phase_a, input: "11", power: { name: "Garage 2 Power", id: cir11, filters: [ *moving_avg, *pos ] } }
- { phase_id: phase_a, input: "12", power: { name: "Air Conditioner Power", id: cir12, filters: [ *moving_avg, *pos, multiply: 2 ] } }
- { phase_id: phase_a, input: "13", power: { name: "Dish Washer Power", id: cir13, filters: [ *moving_avg, *pos ] } }
- { phase_id: phase_b, input: "14", power: { name: "Garbage Disposal Power", id: cir14, filters: [ *moving_avg, *pos ] } }
- { phase_id: phase_b, input: "15", power: { name: "Kitchen 1 Power", id: cir15, filters: [ *moving_avg, *pos ] } }
- { phase_id: phase_a, input: "16", power: { name: "Kitchen 2 Power", id: cir16, filters: [ *moving_avg, *pos ] } }
- 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: "Furnace" }
- { power_id: cir2, platform: total_daily_energy, accuracy_decimals: 0, name: "Dryer" }
- { power_id: cir3, platform: total_daily_energy, accuracy_decimals: 0, name: "Garage 1" }
- { power_id: cir4, platform: total_daily_energy, accuracy_decimals: 0, name: "Hot Water Heater" }
# - { 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: "Fire Pit/Fountain" }
- { power_id: cir10, platform: total_daily_energy, accuracy_decimals: 0, name: "Pool Accessories Total" }
- { power_id: cir11, platform: total_daily_energy, accuracy_decimals: 0, name: "Garage 2" }
- { power_id: cir12, platform: total_daily_energy, accuracy_decimals: 0, name: "Air Conditioner" }
- { power_id: cir13, platform: total_daily_energy, accuracy_decimals: 0, name: "Dish Washer" }
- { power_id: cir14, platform: total_daily_energy, accuracy_decimals: 0, name: "Garbage Disposal" }
- { power_id: cir15, platform: total_daily_energy, accuracy_decimals: 0, name: "Kitchen 1" }
- { power_id: cir16, platform: total_daily_energy, accuracy_decimals: 0, name: "Kitchen 2" }

View File

@ -14,10 +14,6 @@ packages:
wifi:
power_save_mode: light
external_components:
- source: github://cbpowell/ESPSense
components: [ espsense ]
climate:
- platform: pid
name: Garage Fridge
@ -39,15 +35,8 @@ climate:
esp32_ble_tracker:
scan_parameters:
interval: 16ms
window: 16ms
# espsense:
# plugs:
# - name: ${device_name}
# power_sensor: garage_fridge_power
# current_sensor: garage_fridge_current
# voltage_sensor: garage_fridge_voltage
interval: 1100ms
window: 1100ms
modbus:

View File

@ -15,14 +15,6 @@ external_components:
type: local
path: ../components
components: [ binary_light_with_power ]
- source: github://cbpowell/ESPSense
components: [ espsense ]
espsense:
plugs:
- name: ${device_name}
power_sensor: power
voltage: 120
light:
- platform: binary_light_with_power
@ -43,6 +35,3 @@ sensor:
name: ${device_name}
power_id: power
method: left
time:
- platform: homeassistant

View File

@ -15,8 +15,6 @@ external_components:
type: local
path: ../components
components: [ treo_led_pool_light, binary_light_with_power ]
- source: github://cbpowell/ESPSense
components: [ espsense ]
binary_sensor:
- platform: gpio
@ -57,12 +55,6 @@ binary_sensor:
then:
- switch.turn_off: patio_lights_indicator
espsense:
plugs:
- name: Pool Lights
power_sensor: pool_light_power
voltage: 120
light:
- platform: treo_led_pool_light
id: pool_lights
@ -89,6 +81,3 @@ switch:
- platform: gpio
id: patio_lights_indicator
pin: 13
time:
- platform: homeassistant

View File

@ -15,19 +15,6 @@ external_components:
type: local
path: ../components
components: [ pool_controller ]
- source: github://cbpowell/ESPSense
components: [ espsense ]
espsense:
plugs:
- name: Pool Pump
power_sensor: pool_pump_power
current_sensor: pool_pump_current
voltage_sensor: voltage
- name: Pool Cleaner
power_sensor: pool_cleaner_power
current_sensor: pool_cleaner_current
voltage_sensor: voltage
i2c:
sda: GPIO12
@ -127,7 +114,3 @@ switch:
id: pool_cleaner
icon: mdi:robot-vacuum
restore_mode: Always Off
time:
- platform: homeassistant
id: the_time

View File

@ -28,4 +28,5 @@ packages:
restart_button: !include button/restart.yaml
version_sensor: !include text_sensor/version.yaml
wifi_info_sensor: !include text_sensor/wifi_info.yaml
time: !include time/time.yaml

View File

@ -6,19 +6,11 @@ external_components:
type: local
path: ../components
components: [ tuya_light_plus ]
- source: github://cbpowell/ESPSense
components: [ espsense ]
packages:
base: !include device_base_esp8266.yaml
uart: !include uart/tuya.yaml
espsense:
plugs:
- name: ${device_name}
power_sensor: power
voltage: 120
sensor:
- platform: total_daily_energy
name: ${device_name}
@ -26,7 +18,4 @@ sensor:
power_id: power
method: left
time:
- platform: homeassistant
tuya:

View File

@ -7,19 +7,11 @@ external_components:
type: local
path: ../components
components: [ tuya_dimmer_as_fan ]
- source: github://cbpowell/ESPSense
components: [ espsense ]
packages:
base: !include device_base_esp8266.yaml
uart: !include uart/tuya.yaml
espsense:
plugs:
- name: ${device_name}
power_sensor: power
voltage: 120
fan:
- platform: tuya_dimmer_as_fan
id: tuya_fan
@ -38,7 +30,4 @@ sensor:
power_id: power
method: left
time:
- platform: homeassistant
tuya:

View File

@ -7,8 +7,6 @@ external_components:
type: local
path: ../components
components: [ binary_light_with_power ]
- source: github://cbpowell/ESPSense
components: [ espsense ]
packages:
base: !include device_base_esp8266.yaml
@ -34,12 +32,6 @@ binary_sensor:
then:
- light.turn_off: shelly_light
espsense:
plugs:
- name: ${device_name}
power_sensor: light_power
voltage: 120
light:
- platform: binary_light_with_power
id: shelly_light
@ -63,6 +55,3 @@ sensor:
status_led:
pin: GPIO0
time:
- platform: homeassistant

5
packages/time/time.yaml Normal file
View File

@ -0,0 +1,5 @@
substitutions:
time_platform: homeassistant
time:
- platform: ${time_platform}

View File

@ -4,10 +4,6 @@ substitutions:
restore_mode: ALWAYS_ON
log_baud_rate: '0'
external_components:
- source: github://cbpowell/ESPSense
components: [ espsense ]
packages:
base: !include device_base_esp8266.yaml
@ -20,12 +16,6 @@ binary_sensor:
on_press:
then:
- switch.toggle: relay
espsense:
plugs:
- name: ${device_name}
power_sensor: power
voltage: 120
sensor:
- platform: hlw8012
@ -64,6 +54,3 @@ switch:
id: relay
pin: GPIO14
restore_mode: ${restore_mode}
time:
- platform: homeassistant

View File

@ -4,10 +4,6 @@ substitutions:
restore_mode: ALWAYS_ON
log_baud_rate: '0'
external_components:
- source: github://cbpowell/ESPSense
components: [ espsense ]
packages:
base: !include device_base_esp8266.yaml
@ -21,12 +17,6 @@ binary_sensor:
then:
- switch.toggle: relay
espsense:
plugs:
- name: ${device_name}
power_sensor: power
voltage: 120
fan:
- platform: binary
name: ${device_name}
@ -66,6 +56,3 @@ status_led:
pin:
number: GPIO13
inverted: False
time:
- platform: homeassistant