Skip to content

Instantly share code, notes, and snippets.

@tronikos
Created June 26, 2024 00:00
Show Gist options
  • Save tronikos/00ab6377a3a94b241603dab0d82765a2 to your computer and use it in GitHub Desktop.
Save tronikos/00ab6377a3a94b241603dab0d82765a2 to your computer and use it in GitHub Desktop.
blueprint:
name: Energy Disaggregation
description: Approximate power usage of an appliance
domain: automation
input:
power_helper:
name: Input helper to store the approximate power usage
description: in W
selector:
entity:
filter:
- domain: input_number
timer_helper:
name: Timer to reset power to 0W
description: Needed in case we miss the current decrease when appliance isn't under load
selector:
entity:
filter:
- domain: timer
power_derivative:
name: power derivative
description: (You first need to create a derivative sensor of your power sensor)
selector:
entity:
filter:
- domain: sensor
integration: derivative
power_derivative_factor:
name: Power derivative factor
description: Factor to multiple the derivative to get W. E.g. if derivatives are in W/s over 10s, multiply by 10
default: 1
selector:
number:
min: 0.1
max: 100.0
step: 0.1
mode: box
lower_bound:
name: Lower bound for power derivative
description: Assume appliance started if power increased by at least this
default: 4500
selector:
number:
min: -25000
max: 25000.0
step: 0.1
unit_of_measurement: W
mode: box
upper_bound:
name: Upper bound for power derivative
description: Assume appliance started if power increased by at most this
default: 5500
selector:
number:
min: -25000
max: 25000.0
step: 0.1
unit_of_measurement: W
mode: box
delay:
name: Delay
description: Time duration the current increase/decrease has to stay within the above limits
default:
seconds: 5
selector:
duration: {}
trigger_variables:
power_derivative_factor: !input power_derivative_factor
trigger:
- platform: numeric_state
entity_id: !input power_derivative
value_template: "{{ state.state | float() * power_derivative_factor }}"
above: !input lower_bound
below: !input upper_bound
for: !input delay
- platform: numeric_state
entity_id: !input power_derivative
value_template: "{{ state.state | float() * -1 * power_derivative_factor }}"
above: !input lower_bound
below: !input upper_bound
for: !input delay
- platform: event
event_type: timer.finished
event_data:
entity_id: !input timer_helper
id: timer-finished
variables:
power_derivative: !input power_derivative
power_derivative_factor: !input power_derivative_factor
condition: []
action:
- choose:
- conditions:
- condition: trigger
id:
- timer-finished
sequence:
- service: input_number.set_value
data:
value: 0
target:
entity_id: !input power_helper
- conditions:
- condition: numeric_state
entity_id: !input power_derivative
value_template: "{{ state.state | float() * power_derivative_factor }}"
above: !input lower_bound
below: !input upper_bound
sequence:
- service: input_number.set_value
data:
value: >-
{{ states(power_derivative) | float * power_derivative_factor | float }}
target:
entity_id: !input power_helper
- service: timer.start
data: {}
target:
entity_id: !input timer_helper
- conditions:
- condition: numeric_state
entity_id: !input power_derivative
value_template: "{{ state.state | float() * power_derivative_factor * -1 }}"
above: !input lower_bound
below: !input upper_bound
sequence:
- service: input_number.set_value
data:
value: 0
target:
entity_id: !input power_helper
mode: single
max_exceeded: silent
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment