Improve automation examples with realistic volatility thresholds

- Changed from > 15 to >= 15 (include moderate volatility, not just high)
- Updated titles and descriptions for accuracy (moderate+ instead of high-only)
- Added volatility threshold guide (CV ranges and meanings)
- Clarified what CV thresholds mean in real-world savings
- Made examples more practical and user-friendly

Co-authored-by: jpawlowski <75446+jpawlowski@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot] 2025-12-24 17:33:19 +00:00
parent 7dd1d2c8dc
commit cb4100db9c
7 changed files with 154 additions and 105 deletions

View file

@ -23,23 +23,23 @@ Coming soon...
These examples show how to handle low-volatility days where period classifications may flip at midnight despite minimal absolute price changes. These examples show how to handle low-volatility days where period classifications may flip at midnight despite minimal absolute price changes.
### Use Case: Only Act on High-Volatility Days ### Use Case: Only Act on Meaningful Price Variations
On days with low price variation (< 15% volatility), the difference between "cheap" and "expensive" periods is minimal. This automation only runs appliances when the savings are meaningful: On days with low price variation (coefficient of variation < 15%), the difference between "cheap" and "expensive" periods is minimal. This automation only runs appliances when volatility is moderate or higher, ensuring meaningful savings:
```yaml ```yaml
automation: automation:
- alias: "Dishwasher - Best Price (High Volatility Only)" - alias: "Dishwasher - Best Price (Moderate+ Volatility)"
description: "Start dishwasher during Best Price period, but only on days with meaningful price differences" description: "Start dishwasher during Best Price period, but only on days with meaningful price differences"
trigger: trigger:
- platform: state - platform: state
entity_id: binary_sensor.tibber_home_best_price_period entity_id: binary_sensor.tibber_home_best_price_period
to: "on" to: "on"
condition: condition:
# Only act if volatility > 15% (meaningful savings) # Only act if volatility >= 15% (moderate or higher volatility = meaningful savings)
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
# Optional: Ensure dishwasher is idle and door closed # Optional: Ensure dishwasher is idle and door closed
- condition: state - condition: state
entity_id: binary_sensor.dishwasher_door entity_id: binary_sensor.dishwasher_door
@ -54,10 +54,16 @@ automation:
``` ```
**Why this works:** **Why this works:**
- On high-volatility days (e.g., 25% span), Best Price periods save 5-10 ct/kWh - On moderate+ volatility days (CV ≥ 15%), Best Price periods offer worthwhile savings
- On low-volatility days (e.g., 8% span), savings are only 1-2 ct/kWh - On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span)
- User can manually start dishwasher on low-volatility days without automation interference - User can manually start dishwasher on low-volatility days without automation interference
**Volatility threshold guide:**
- CV < 15%: Low volatility - minimal price variation
- CV 15-30%: Moderate volatility - worthwhile to optimize timing
- CV 30-50%: High volatility - significant savings potential
- CV > 50%: Very high volatility - extreme price swings
### Use Case: Absolute Price Threshold ### Use Case: Absolute Price Threshold
Instead of relying on relative classification, check if the absolute price is cheap enough: Instead of relying on relative classification, check if the absolute price is cheap enough:
@ -97,7 +103,7 @@ automation:
### Use Case: Combined Volatility and Price Check ### Use Case: Combined Volatility and Price Check
Most robust approach: Check both volatility and absolute price: Most robust approach: Check both volatility and absolute price for smart charging decisions:
```yaml ```yaml
automation: automation:
@ -112,13 +118,13 @@ automation:
- condition: numeric_state - condition: numeric_state
entity_id: sensor.ev_battery_level entity_id: sensor.ev_battery_level
below: 80 below: 80
# Strategy: High volatility OR cheap enough # Strategy: Moderate+ volatility OR cheap enough
- condition: or - condition: or
conditions: conditions:
# Path 1: High volatility day - trust period classification # Path 1: Moderate+ volatility day (CV >= 15%) - trust period classification
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
# Path 2: Low volatility but price is genuinely cheap # Path 2: Low volatility but price is genuinely cheap
- condition: numeric_state - condition: numeric_state
entity_id: sensor.tibber_home_current_interval_price_ct entity_id: sensor.tibber_home_current_interval_price_ct
@ -135,9 +141,10 @@ automation:
``` ```
**Why this works:** **Why this works:**
- On high-volatility days (> 15%): Trust the Best Price classification - On moderate+ volatility days (CV ≥ 15%): Trust the Best Price classification
- On low-volatility days (< 15%): Only charge if price is actually cheap (< 18 ct/kWh) - On low-volatility days (CV < 15%): Only charge if price is actually cheap (< 18 ct/kWh)
- Handles midnight flips gracefully: Continues charging if price stays cheap - Handles midnight flips gracefully: Continues charging if price stays cheap
- Adjust the 18 ct/kWh threshold based on your typical local prices
### Use Case: Ignore Period Flips During Active Period ### Use Case: Ignore Period Flips During Active Period
@ -156,10 +163,10 @@ automation:
- condition: state - condition: state
entity_id: sensor.washing_machine_state entity_id: sensor.washing_machine_state
state: "idle" state: "idle"
# And volatility is meaningful # And volatility is meaningful (moderate or higher)
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
action: action:
- service: button.press - service: button.press
target: target:

View file

@ -23,23 +23,23 @@ Coming soon...
These examples show how to handle low-volatility days where period classifications may flip at midnight despite minimal absolute price changes. These examples show how to handle low-volatility days where period classifications may flip at midnight despite minimal absolute price changes.
### Use Case: Only Act on High-Volatility Days ### Use Case: Only Act on Meaningful Price Variations
On days with low price variation (< 15% volatility), the difference between "cheap" and "expensive" periods is minimal. This automation only runs appliances when the savings are meaningful: On days with low price variation (coefficient of variation < 15%), the difference between "cheap" and "expensive" periods is minimal. This automation only runs appliances when volatility is moderate or higher, ensuring meaningful savings:
```yaml ```yaml
automation: automation:
- alias: "Dishwasher - Best Price (High Volatility Only)" - alias: "Dishwasher - Best Price (Moderate+ Volatility)"
description: "Start dishwasher during Best Price period, but only on days with meaningful price differences" description: "Start dishwasher during Best Price period, but only on days with meaningful price differences"
trigger: trigger:
- platform: state - platform: state
entity_id: binary_sensor.tibber_home_best_price_period entity_id: binary_sensor.tibber_home_best_price_period
to: "on" to: "on"
condition: condition:
# Only act if volatility > 15% (meaningful savings) # Only act if volatility >= 15% (moderate or higher volatility = meaningful savings)
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
# Optional: Ensure dishwasher is idle and door closed # Optional: Ensure dishwasher is idle and door closed
- condition: state - condition: state
entity_id: binary_sensor.dishwasher_door entity_id: binary_sensor.dishwasher_door
@ -54,10 +54,16 @@ automation:
``` ```
**Why this works:** **Why this works:**
- On high-volatility days (e.g., 25% span), Best Price periods save 5-10 ct/kWh - On moderate+ volatility days (CV >= 15%), Best Price periods offer worthwhile savings
- On low-volatility days (e.g., 8% span), savings are only 1-2 ct/kWh - On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span)
- User can manually start dishwasher on low-volatility days without automation interference - User can manually start dishwasher on low-volatility days without automation interference
**Volatility threshold guide:**
- CV < 15%: Low volatility - minimal price variation
- CV 15-30%: Moderate volatility - worthwhile to optimize timing
- CV 30-50%: High volatility - significant savings potential
- CV > 50%: Very high volatility - extreme price swings
### Use Case: Absolute Price Threshold ### Use Case: Absolute Price Threshold
Instead of relying on relative classification, check if the absolute price is cheap enough: Instead of relying on relative classification, check if the absolute price is cheap enough:
@ -97,7 +103,7 @@ automation:
### Use Case: Combined Volatility and Price Check ### Use Case: Combined Volatility and Price Check
Most robust approach: Check both volatility and absolute price: Most robust approach: Check both volatility and absolute price for smart charging decisions:
```yaml ```yaml
automation: automation:
@ -112,13 +118,13 @@ automation:
- condition: numeric_state - condition: numeric_state
entity_id: sensor.ev_battery_level entity_id: sensor.ev_battery_level
below: 80 below: 80
# Strategy: High volatility OR cheap enough # Strategy: Moderate+ volatility OR cheap enough
- condition: or - condition: or
conditions: conditions:
# Path 1: High volatility day - trust period classification # Path 1: Moderate+ volatility day (CV >= 15%) - trust period classification
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
# Path 2: Low volatility but price is genuinely cheap # Path 2: Low volatility but price is genuinely cheap
- condition: numeric_state - condition: numeric_state
entity_id: sensor.tibber_home_current_interval_price_ct entity_id: sensor.tibber_home_current_interval_price_ct
@ -135,8 +141,9 @@ automation:
``` ```
**Why this works:** **Why this works:**
- On high-volatility days (> 15%): Trust the Best Price classification - On moderate+ volatility days (CV >= 15%): Trust the Best Price classification
- On low-volatility days (< 15%): Only charge if price is actually cheap (< 18 ct/kWh) - On low-volatility days (< 15%): Only charge if price is actually cheap (< 18 ct/kWh)
- Adjust the 18 ct/kWh threshold based on your typical local prices
- Handles midnight flips gracefully: Continues charging if price stays cheap - Handles midnight flips gracefully: Continues charging if price stays cheap
### Use Case: Ignore Period Flips During Active Period ### Use Case: Ignore Period Flips During Active Period
@ -156,10 +163,10 @@ automation:
- condition: state - condition: state
entity_id: sensor.washing_machine_state entity_id: sensor.washing_machine_state
state: "idle" state: "idle"
# And volatility is meaningful # And volatility is meaningful (moderate or higher)
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
action: action:
- service: button.press - service: button.press
target: target:
@ -209,7 +216,7 @@ automation:
# Check if the PERIOD'S DAY has meaningful volatility # Check if the PERIOD'S DAY has meaningful volatility
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('binary_sensor.tibber_home_best_price_period', 'day_volatility_%') | float(0) > 15 }} {{ state_attr('binary_sensor.tibber_home_best_price_period', 'day_volatility_%') | float(0) >= 15 }}
action: action:
- service: climate.set_temperature - service: climate.set_temperature
target: target:

View file

@ -23,23 +23,23 @@ Coming soon...
These examples show how to handle low-volatility days where period classifications may flip at midnight despite minimal absolute price changes. These examples show how to handle low-volatility days where period classifications may flip at midnight despite minimal absolute price changes.
### Use Case: Only Act on High-Volatility Days ### Use Case: Only Act on Meaningful Price Variations
On days with low price variation (< 15% volatility), the difference between "cheap" and "expensive" periods is minimal. This automation only runs appliances when the savings are meaningful: On days with low price variation (coefficient of variation < 15%), the difference between "cheap" and "expensive" periods is minimal. This automation only runs appliances when volatility is moderate or higher, ensuring meaningful savings:
```yaml ```yaml
automation: automation:
- alias: "Dishwasher - Best Price (High Volatility Only)" - alias: "Dishwasher - Best Price (Moderate+ Volatility)"
description: "Start dishwasher during Best Price period, but only on days with meaningful price differences" description: "Start dishwasher during Best Price period, but only on days with meaningful price differences"
trigger: trigger:
- platform: state - platform: state
entity_id: binary_sensor.tibber_home_best_price_period entity_id: binary_sensor.tibber_home_best_price_period
to: "on" to: "on"
condition: condition:
# Only act if volatility > 15% (meaningful savings) # Only act if volatility >= 15% (moderate or higher volatility = meaningful savings)
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
# Optional: Ensure dishwasher is idle and door closed # Optional: Ensure dishwasher is idle and door closed
- condition: state - condition: state
entity_id: binary_sensor.dishwasher_door entity_id: binary_sensor.dishwasher_door
@ -54,10 +54,16 @@ automation:
``` ```
**Why this works:** **Why this works:**
- On high-volatility days (e.g., 25% span), Best Price periods save 5-10 ct/kWh - On moderate+ volatility days (CV >= 15%), Best Price periods offer worthwhile savings
- On low-volatility days (e.g., 8% span), savings are only 1-2 ct/kWh - On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span)
- User can manually start dishwasher on low-volatility days without automation interference - User can manually start dishwasher on low-volatility days without automation interference
**Volatility threshold guide:**
- CV < 15%: Low volatility - minimal price variation
- CV 15-30%: Moderate volatility - worthwhile to optimize timing
- CV 30-50%: High volatility - significant savings potential
- CV > 50%: Very high volatility - extreme price swings
### Use Case: Absolute Price Threshold ### Use Case: Absolute Price Threshold
Instead of relying on relative classification, check if the absolute price is cheap enough: Instead of relying on relative classification, check if the absolute price is cheap enough:
@ -97,7 +103,7 @@ automation:
### Use Case: Combined Volatility and Price Check ### Use Case: Combined Volatility and Price Check
Most robust approach: Check both volatility and absolute price: Most robust approach: Check both volatility and absolute price for smart charging decisions:
```yaml ```yaml
automation: automation:
@ -112,13 +118,13 @@ automation:
- condition: numeric_state - condition: numeric_state
entity_id: sensor.ev_battery_level entity_id: sensor.ev_battery_level
below: 80 below: 80
# Strategy: High volatility OR cheap enough # Strategy: Moderate+ volatility OR cheap enough
- condition: or - condition: or
conditions: conditions:
# Path 1: High volatility day - trust period classification # Path 1: Moderate+ volatility day (CV >= 15%) - trust period classification
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
# Path 2: Low volatility but price is genuinely cheap # Path 2: Low volatility but price is genuinely cheap
- condition: numeric_state - condition: numeric_state
entity_id: sensor.tibber_home_current_interval_price_ct entity_id: sensor.tibber_home_current_interval_price_ct
@ -135,8 +141,9 @@ automation:
``` ```
**Why this works:** **Why this works:**
- On high-volatility days (> 15%): Trust the Best Price classification - On moderate+ volatility days (CV >= 15%): Trust the Best Price classification
- On low-volatility days (< 15%): Only charge if price is actually cheap (< 18 ct/kWh) - On low-volatility days (< 15%): Only charge if price is actually cheap (< 18 ct/kWh)
- Adjust the 18 ct/kWh threshold based on your typical local prices
- Handles midnight flips gracefully: Continues charging if price stays cheap - Handles midnight flips gracefully: Continues charging if price stays cheap
### Use Case: Ignore Period Flips During Active Period ### Use Case: Ignore Period Flips During Active Period
@ -156,10 +163,10 @@ automation:
- condition: state - condition: state
entity_id: sensor.washing_machine_state entity_id: sensor.washing_machine_state
state: "idle" state: "idle"
# And volatility is meaningful # And volatility is meaningful (moderate or higher)
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
action: action:
- service: button.press - service: button.press
target: target:
@ -209,7 +216,7 @@ automation:
# Check if the PERIOD'S DAY has meaningful volatility # Check if the PERIOD'S DAY has meaningful volatility
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('binary_sensor.tibber_home_best_price_period', 'day_volatility_%') | float(0) > 15 }} {{ state_attr('binary_sensor.tibber_home_best_price_period', 'day_volatility_%') | float(0) >= 15 }}
action: action:
- service: climate.set_temperature - service: climate.set_temperature
target: target:

View file

@ -23,23 +23,23 @@ Coming soon...
These examples show how to handle low-volatility days where period classifications may flip at midnight despite minimal absolute price changes. These examples show how to handle low-volatility days where period classifications may flip at midnight despite minimal absolute price changes.
### Use Case: Only Act on High-Volatility Days ### Use Case: Only Act on Meaningful Price Variations
On days with low price variation (< 15% volatility), the difference between "cheap" and "expensive" periods is minimal. This automation only runs appliances when the savings are meaningful: On days with low price variation (coefficient of variation < 15%), the difference between "cheap" and "expensive" periods is minimal. This automation only runs appliances when volatility is moderate or higher, ensuring meaningful savings:
```yaml ```yaml
automation: automation:
- alias: "Dishwasher - Best Price (High Volatility Only)" - alias: "Dishwasher - Best Price (Moderate+ Volatility)"
description: "Start dishwasher during Best Price period, but only on days with meaningful price differences" description: "Start dishwasher during Best Price period, but only on days with meaningful price differences"
trigger: trigger:
- platform: state - platform: state
entity_id: binary_sensor.tibber_home_best_price_period entity_id: binary_sensor.tibber_home_best_price_period
to: "on" to: "on"
condition: condition:
# Only act if volatility > 15% (meaningful savings) # Only act if volatility >= 15% (moderate or higher volatility = meaningful savings)
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
# Optional: Ensure dishwasher is idle and door closed # Optional: Ensure dishwasher is idle and door closed
- condition: state - condition: state
entity_id: binary_sensor.dishwasher_door entity_id: binary_sensor.dishwasher_door
@ -54,10 +54,16 @@ automation:
``` ```
**Why this works:** **Why this works:**
- On high-volatility days (e.g., 25% span), Best Price periods save 5-10 ct/kWh - On moderate+ volatility days (CV >= 15%), Best Price periods offer worthwhile savings
- On low-volatility days (e.g., 8% span), savings are only 1-2 ct/kWh - On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span)
- User can manually start dishwasher on low-volatility days without automation interference - User can manually start dishwasher on low-volatility days without automation interference
**Volatility threshold guide:**
- CV < 15%: Low volatility - minimal price variation
- CV 15-30%: Moderate volatility - worthwhile to optimize timing
- CV 30-50%: High volatility - significant savings potential
- CV > 50%: Very high volatility - extreme price swings
### Use Case: Absolute Price Threshold ### Use Case: Absolute Price Threshold
Instead of relying on relative classification, check if the absolute price is cheap enough: Instead of relying on relative classification, check if the absolute price is cheap enough:
@ -97,7 +103,7 @@ automation:
### Use Case: Combined Volatility and Price Check ### Use Case: Combined Volatility and Price Check
Most robust approach: Check both volatility and absolute price: Most robust approach: Check both volatility and absolute price for smart charging decisions:
```yaml ```yaml
automation: automation:
@ -112,13 +118,13 @@ automation:
- condition: numeric_state - condition: numeric_state
entity_id: sensor.ev_battery_level entity_id: sensor.ev_battery_level
below: 80 below: 80
# Strategy: High volatility OR cheap enough # Strategy: Moderate+ volatility OR cheap enough
- condition: or - condition: or
conditions: conditions:
# Path 1: High volatility day - trust period classification # Path 1: Moderate+ volatility day (CV >= 15%) - trust period classification
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
# Path 2: Low volatility but price is genuinely cheap # Path 2: Low volatility but price is genuinely cheap
- condition: numeric_state - condition: numeric_state
entity_id: sensor.tibber_home_current_interval_price_ct entity_id: sensor.tibber_home_current_interval_price_ct
@ -135,8 +141,9 @@ automation:
``` ```
**Why this works:** **Why this works:**
- On high-volatility days (> 15%): Trust the Best Price classification - On moderate+ volatility days (CV >= 15%): Trust the Best Price classification
- On low-volatility days (< 15%): Only charge if price is actually cheap (< 18 ct/kWh) - On low-volatility days (< 15%): Only charge if price is actually cheap (< 18 ct/kWh)
- Adjust the 18 ct/kWh threshold based on your typical local prices
- Handles midnight flips gracefully: Continues charging if price stays cheap - Handles midnight flips gracefully: Continues charging if price stays cheap
### Use Case: Ignore Period Flips During Active Period ### Use Case: Ignore Period Flips During Active Period
@ -156,10 +163,10 @@ automation:
- condition: state - condition: state
entity_id: sensor.washing_machine_state entity_id: sensor.washing_machine_state
state: "idle" state: "idle"
# And volatility is meaningful # And volatility is meaningful (moderate or higher)
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
action: action:
- service: button.press - service: button.press
target: target:
@ -209,7 +216,7 @@ automation:
# Check if the PERIOD'S DAY has meaningful volatility # Check if the PERIOD'S DAY has meaningful volatility
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('binary_sensor.tibber_home_best_price_period', 'day_volatility_%') | float(0) > 15 }} {{ state_attr('binary_sensor.tibber_home_best_price_period', 'day_volatility_%') | float(0) >= 15 }}
action: action:
- service: climate.set_temperature - service: climate.set_temperature
target: target:

View file

@ -23,23 +23,23 @@ Coming soon...
These examples show how to handle low-volatility days where period classifications may flip at midnight despite minimal absolute price changes. These examples show how to handle low-volatility days where period classifications may flip at midnight despite minimal absolute price changes.
### Use Case: Only Act on High-Volatility Days ### Use Case: Only Act on Meaningful Price Variations
On days with low price variation (< 15% volatility), the difference between "cheap" and "expensive" periods is minimal. This automation only runs appliances when the savings are meaningful: On days with low price variation (coefficient of variation < 15%), the difference between "cheap" and "expensive" periods is minimal. This automation only runs appliances when volatility is moderate or higher, ensuring meaningful savings:
```yaml ```yaml
automation: automation:
- alias: "Dishwasher - Best Price (High Volatility Only)" - alias: "Dishwasher - Best Price (Moderate+ Volatility)"
description: "Start dishwasher during Best Price period, but only on days with meaningful price differences" description: "Start dishwasher during Best Price period, but only on days with meaningful price differences"
trigger: trigger:
- platform: state - platform: state
entity_id: binary_sensor.tibber_home_best_price_period entity_id: binary_sensor.tibber_home_best_price_period
to: "on" to: "on"
condition: condition:
# Only act if volatility > 15% (meaningful savings) # Only act if volatility >= 15% (moderate or higher volatility = meaningful savings)
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
# Optional: Ensure dishwasher is idle and door closed # Optional: Ensure dishwasher is idle and door closed
- condition: state - condition: state
entity_id: binary_sensor.dishwasher_door entity_id: binary_sensor.dishwasher_door
@ -54,10 +54,16 @@ automation:
``` ```
**Why this works:** **Why this works:**
- On high-volatility days (e.g., 25% span), Best Price periods save 5-10 ct/kWh - On moderate+ volatility days (CV >= 15%), Best Price periods offer worthwhile savings
- On low-volatility days (e.g., 8% span), savings are only 1-2 ct/kWh - On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span)
- User can manually start dishwasher on low-volatility days without automation interference - User can manually start dishwasher on low-volatility days without automation interference
**Volatility threshold guide:**
- CV < 15%: Low volatility - minimal price variation
- CV 15-30%: Moderate volatility - worthwhile to optimize timing
- CV 30-50%: High volatility - significant savings potential
- CV > 50%: Very high volatility - extreme price swings
### Use Case: Absolute Price Threshold ### Use Case: Absolute Price Threshold
Instead of relying on relative classification, check if the absolute price is cheap enough: Instead of relying on relative classification, check if the absolute price is cheap enough:
@ -97,7 +103,7 @@ automation:
### Use Case: Combined Volatility and Price Check ### Use Case: Combined Volatility and Price Check
Most robust approach: Check both volatility and absolute price: Most robust approach: Check both volatility and absolute price for smart charging decisions:
```yaml ```yaml
automation: automation:
@ -112,13 +118,13 @@ automation:
- condition: numeric_state - condition: numeric_state
entity_id: sensor.ev_battery_level entity_id: sensor.ev_battery_level
below: 80 below: 80
# Strategy: High volatility OR cheap enough # Strategy: Moderate+ volatility OR cheap enough
- condition: or - condition: or
conditions: conditions:
# Path 1: High volatility day - trust period classification # Path 1: Moderate+ volatility day (CV >= 15%) - trust period classification
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
# Path 2: Low volatility but price is genuinely cheap # Path 2: Low volatility but price is genuinely cheap
- condition: numeric_state - condition: numeric_state
entity_id: sensor.tibber_home_current_interval_price_ct entity_id: sensor.tibber_home_current_interval_price_ct
@ -135,8 +141,9 @@ automation:
``` ```
**Why this works:** **Why this works:**
- On high-volatility days (> 15%): Trust the Best Price classification - On moderate+ volatility days (CV >= 15%): Trust the Best Price classification
- On low-volatility days (< 15%): Only charge if price is actually cheap (< 18 ct/kWh) - On low-volatility days (< 15%): Only charge if price is actually cheap (< 18 ct/kWh)
- Adjust the 18 ct/kWh threshold based on your typical local prices
- Handles midnight flips gracefully: Continues charging if price stays cheap - Handles midnight flips gracefully: Continues charging if price stays cheap
### Use Case: Ignore Period Flips During Active Period ### Use Case: Ignore Period Flips During Active Period
@ -156,10 +163,10 @@ automation:
- condition: state - condition: state
entity_id: sensor.washing_machine_state entity_id: sensor.washing_machine_state
state: "idle" state: "idle"
# And volatility is meaningful # And volatility is meaningful (moderate or higher)
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
action: action:
- service: button.press - service: button.press
target: target:
@ -209,7 +216,7 @@ automation:
# Check if the PERIOD'S DAY has meaningful volatility # Check if the PERIOD'S DAY has meaningful volatility
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('binary_sensor.tibber_home_best_price_period', 'day_volatility_%') | float(0) > 15 }} {{ state_attr('binary_sensor.tibber_home_best_price_period', 'day_volatility_%') | float(0) >= 15 }}
action: action:
- service: climate.set_temperature - service: climate.set_temperature
target: target:

View file

@ -23,23 +23,23 @@ Coming soon...
These examples show how to handle low-volatility days where period classifications may flip at midnight despite minimal absolute price changes. These examples show how to handle low-volatility days where period classifications may flip at midnight despite minimal absolute price changes.
### Use Case: Only Act on High-Volatility Days ### Use Case: Only Act on Meaningful Price Variations
On days with low price variation (< 15% volatility), the difference between "cheap" and "expensive" periods is minimal. This automation only runs appliances when the savings are meaningful: On days with low price variation (coefficient of variation < 15%), the difference between "cheap" and "expensive" periods is minimal. This automation only runs appliances when volatility is moderate or higher, ensuring meaningful savings:
```yaml ```yaml
automation: automation:
- alias: "Dishwasher - Best Price (High Volatility Only)" - alias: "Dishwasher - Best Price (Moderate+ Volatility)"
description: "Start dishwasher during Best Price period, but only on days with meaningful price differences" description: "Start dishwasher during Best Price period, but only on days with meaningful price differences"
trigger: trigger:
- platform: state - platform: state
entity_id: binary_sensor.tibber_home_best_price_period entity_id: binary_sensor.tibber_home_best_price_period
to: "on" to: "on"
condition: condition:
# Only act if volatility > 15% (meaningful savings) # Only act if volatility >= 15% (moderate or higher volatility = meaningful savings)
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
# Optional: Ensure dishwasher is idle and door closed # Optional: Ensure dishwasher is idle and door closed
- condition: state - condition: state
entity_id: binary_sensor.dishwasher_door entity_id: binary_sensor.dishwasher_door
@ -54,10 +54,16 @@ automation:
``` ```
**Why this works:** **Why this works:**
- On high-volatility days (e.g., 25% span), Best Price periods save 5-10 ct/kWh - On moderate+ volatility days (CV >= 15%), Best Price periods offer worthwhile savings
- On low-volatility days (e.g., 8% span), savings are only 1-2 ct/kWh - On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span)
- User can manually start dishwasher on low-volatility days without automation interference - User can manually start dishwasher on low-volatility days without automation interference
**Volatility threshold guide:**
- CV < 15%: Low volatility - minimal price variation
- CV 15-30%: Moderate volatility - worthwhile to optimize timing
- CV 30-50%: High volatility - significant savings potential
- CV > 50%: Very high volatility - extreme price swings
### Use Case: Absolute Price Threshold ### Use Case: Absolute Price Threshold
Instead of relying on relative classification, check if the absolute price is cheap enough: Instead of relying on relative classification, check if the absolute price is cheap enough:
@ -97,7 +103,7 @@ automation:
### Use Case: Combined Volatility and Price Check ### Use Case: Combined Volatility and Price Check
Most robust approach: Check both volatility and absolute price: Most robust approach: Check both volatility and absolute price for smart charging decisions:
```yaml ```yaml
automation: automation:
@ -112,13 +118,13 @@ automation:
- condition: numeric_state - condition: numeric_state
entity_id: sensor.ev_battery_level entity_id: sensor.ev_battery_level
below: 80 below: 80
# Strategy: High volatility OR cheap enough # Strategy: Moderate+ volatility OR cheap enough
- condition: or - condition: or
conditions: conditions:
# Path 1: High volatility day - trust period classification # Path 1: Moderate+ volatility day (CV >= 15%) - trust period classification
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
# Path 2: Low volatility but price is genuinely cheap # Path 2: Low volatility but price is genuinely cheap
- condition: numeric_state - condition: numeric_state
entity_id: sensor.tibber_home_current_interval_price_ct entity_id: sensor.tibber_home_current_interval_price_ct
@ -135,8 +141,9 @@ automation:
``` ```
**Why this works:** **Why this works:**
- On high-volatility days (> 15%): Trust the Best Price classification - On moderate+ volatility days (CV >= 15%): Trust the Best Price classification
- On low-volatility days (< 15%): Only charge if price is actually cheap (< 18 ct/kWh) - On low-volatility days (< 15%): Only charge if price is actually cheap (< 18 ct/kWh)
- Adjust the 18 ct/kWh threshold based on your typical local prices
- Handles midnight flips gracefully: Continues charging if price stays cheap - Handles midnight flips gracefully: Continues charging if price stays cheap
### Use Case: Ignore Period Flips During Active Period ### Use Case: Ignore Period Flips During Active Period
@ -156,10 +163,10 @@ automation:
- condition: state - condition: state
entity_id: sensor.washing_machine_state entity_id: sensor.washing_machine_state
state: "idle" state: "idle"
# And volatility is meaningful # And volatility is meaningful (moderate or higher)
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
action: action:
- service: button.press - service: button.press
target: target:
@ -209,7 +216,7 @@ automation:
# Check if the PERIOD'S DAY has meaningful volatility # Check if the PERIOD'S DAY has meaningful volatility
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('binary_sensor.tibber_home_best_price_period', 'day_volatility_%') | float(0) > 15 }} {{ state_attr('binary_sensor.tibber_home_best_price_period', 'day_volatility_%') | float(0) >= 15 }}
action: action:
- service: climate.set_temperature - service: climate.set_temperature
target: target:

View file

@ -23,23 +23,23 @@ Coming soon...
These examples show how to handle low-volatility days where period classifications may flip at midnight despite minimal absolute price changes. These examples show how to handle low-volatility days where period classifications may flip at midnight despite minimal absolute price changes.
### Use Case: Only Act on High-Volatility Days ### Use Case: Only Act on Meaningful Price Variations
On days with low price variation (< 15% volatility), the difference between "cheap" and "expensive" periods is minimal. This automation only runs appliances when the savings are meaningful: On days with low price variation (coefficient of variation < 15%), the difference between "cheap" and "expensive" periods is minimal. This automation only runs appliances when volatility is moderate or higher, ensuring meaningful savings:
```yaml ```yaml
automation: automation:
- alias: "Dishwasher - Best Price (High Volatility Only)" - alias: "Dishwasher - Best Price (Moderate+ Volatility)"
description: "Start dishwasher during Best Price period, but only on days with meaningful price differences" description: "Start dishwasher during Best Price period, but only on days with meaningful price differences"
trigger: trigger:
- platform: state - platform: state
entity_id: binary_sensor.tibber_home_best_price_period entity_id: binary_sensor.tibber_home_best_price_period
to: "on" to: "on"
condition: condition:
# Only act if volatility > 15% (meaningful savings) # Only act if volatility >= 15% (moderate or higher volatility = meaningful savings)
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
# Optional: Ensure dishwasher is idle and door closed # Optional: Ensure dishwasher is idle and door closed
- condition: state - condition: state
entity_id: binary_sensor.dishwasher_door entity_id: binary_sensor.dishwasher_door
@ -54,10 +54,16 @@ automation:
``` ```
**Why this works:** **Why this works:**
- On high-volatility days (e.g., 25% span), Best Price periods save 5-10 ct/kWh - On moderate+ volatility days (CV >= 15%), Best Price periods offer worthwhile savings
- On low-volatility days (e.g., 8% span), savings are only 1-2 ct/kWh - On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span)
- User can manually start dishwasher on low-volatility days without automation interference - User can manually start dishwasher on low-volatility days without automation interference
**Volatility threshold guide:**
- CV < 15%: Low volatility - minimal price variation
- CV 15-30%: Moderate volatility - worthwhile to optimize timing
- CV 30-50%: High volatility - significant savings potential
- CV > 50%: Very high volatility - extreme price swings
### Use Case: Absolute Price Threshold ### Use Case: Absolute Price Threshold
Instead of relying on relative classification, check if the absolute price is cheap enough: Instead of relying on relative classification, check if the absolute price is cheap enough:
@ -97,7 +103,7 @@ automation:
### Use Case: Combined Volatility and Price Check ### Use Case: Combined Volatility and Price Check
Most robust approach: Check both volatility and absolute price: Most robust approach: Check both volatility and absolute price for smart charging decisions:
```yaml ```yaml
automation: automation:
@ -112,13 +118,13 @@ automation:
- condition: numeric_state - condition: numeric_state
entity_id: sensor.ev_battery_level entity_id: sensor.ev_battery_level
below: 80 below: 80
# Strategy: High volatility OR cheap enough # Strategy: Moderate+ volatility OR cheap enough
- condition: or - condition: or
conditions: conditions:
# Path 1: High volatility day - trust period classification # Path 1: Moderate+ volatility day (CV >= 15%) - trust period classification
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
# Path 2: Low volatility but price is genuinely cheap # Path 2: Low volatility but price is genuinely cheap
- condition: numeric_state - condition: numeric_state
entity_id: sensor.tibber_home_current_interval_price_ct entity_id: sensor.tibber_home_current_interval_price_ct
@ -135,8 +141,9 @@ automation:
``` ```
**Why this works:** **Why this works:**
- On high-volatility days (> 15%): Trust the Best Price classification - On moderate+ volatility days (CV >= 15%): Trust the Best Price classification
- On low-volatility days (< 15%): Only charge if price is actually cheap (< 18 ct/kWh) - On low-volatility days (< 15%): Only charge if price is actually cheap (< 18 ct/kWh)
- Adjust the 18 ct/kWh threshold based on your typical local prices
- Handles midnight flips gracefully: Continues charging if price stays cheap - Handles midnight flips gracefully: Continues charging if price stays cheap
### Use Case: Ignore Period Flips During Active Period ### Use Case: Ignore Period Flips During Active Period
@ -156,10 +163,10 @@ automation:
- condition: state - condition: state
entity_id: sensor.washing_machine_state entity_id: sensor.washing_machine_state
state: "idle" state: "idle"
# And volatility is meaningful # And volatility is meaningful (moderate or higher)
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) > 15 }} {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') | float(0) >= 15 }}
action: action:
- service: button.press - service: button.press
target: target:
@ -209,7 +216,7 @@ automation:
# Check if the PERIOD'S DAY has meaningful volatility # Check if the PERIOD'S DAY has meaningful volatility
- condition: template - condition: template
value_template: > value_template: >
{{ state_attr('binary_sensor.tibber_home_best_price_period', 'day_volatility_%') | float(0) > 15 }} {{ state_attr('binary_sensor.tibber_home_best_price_period', 'day_volatility_%') | float(0) >= 15 }}
action: action:
- service: climate.set_temperature - service: climate.set_temperature
target: target: