mirror of
https://github.com/jpawlowski/hass.tibber_prices.git
synced 2026-03-29 21:03:40 +00:00
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:
parent
7dd1d2c8dc
commit
cb4100db9c
7 changed files with 154 additions and 105 deletions
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue