Replace water heater with home battery storage system

Water heater was not a realistic example - people want hot water immediately regardless of price. Home battery storage is the perfect example: purpose-built for price arbitrage, high consumption (5-10 kW), actual ad-hoc price checking makes sense

Co-authored-by: jpawlowski <75446+jpawlowski@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot] 2025-12-24 23:28:32 +00:00
parent a182882e0f
commit cd526a965e
7 changed files with 94 additions and 94 deletions

View file

@ -25,12 +25,12 @@ These examples show how to handle low-volatility days where period classificatio
### Use Case: Only Act on Meaningful Price Variations ### Use Case: Only Act on Meaningful Price Variations
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: On days with low price variation (coefficient of variation < 15%), the difference between "cheap" and "expensive" periods is minimal. This automation only charges devices when volatility is moderate or higher, ensuring meaningful savings:
```yaml ```yaml
automation: automation:
- alias: "Water Heater - Best Price (Moderate+ Volatility)" - alias: "Home Battery - Charge During Best Price (Moderate+ Volatility)"
description: "Heat water during Best Price period, but only on days with meaningful price differences" description: "Charge home battery during Best Price periods, 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
@ -40,24 +40,24 @@ automation:
- 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: Check water temperature is below target # Only charge if battery has capacity
- condition: numeric_state - condition: numeric_state
entity_id: sensor.water_heater_temperature entity_id: sensor.home_battery_level
below: 55 below: 90
action: action:
- service: switch.turn_on - service: switch.turn_on
target: target:
entity_id: switch.water_heater entity_id: switch.home_battery_charge
- service: notify.mobile_app - service: notify.mobile_app
data: data:
message: "Water heater started during Best Price period ({{ states('sensor.tibber_home_current_interval_price_ct') }} ct/kWh, volatility {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') }}%)" message: "Home battery charging during Best Price period ({{ states('sensor.tibber_home_current_interval_price_ct') }} ct/kWh, volatility {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') }}%)"
``` ```
**Why this works:** **Why this works:**
- On moderate+ volatility days (CV ≥ 15%), Best Price periods offer worthwhile savings - On moderate+ volatility days (CV ≥ 15%), Best Price periods offer worthwhile savings
- On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span) - On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span)
- Water heaters are ideal for price-based automation: high consumption (2-3 kW), thermal storage allows flexible timing - Home batteries are ideal for price-based automation: high consumption (5-10 kW), purpose-built for price arbitrage
- User can manually boost temperature anytime if needed - Battery can discharge during peak prices for additional savings or grid support
**Volatility threshold guide:** **Volatility threshold guide:**
- CV < 15%: Low volatility - minimal price variation - CV < 15%: Low volatility - minimal price variation

View file

@ -25,12 +25,12 @@ These examples show how to handle low-volatility days where period classificatio
### Use Case: Only Act on Meaningful Price Variations ### Use Case: Only Act on Meaningful Price Variations
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: On days with low price variation (coefficient of variation < 15%), the difference between "cheap" and "expensive" periods is minimal. This automation only charges devices when volatility is moderate or higher, ensuring meaningful savings:
```yaml ```yaml
automation: automation:
- alias: "Water Heater - Best Price (Moderate+ Volatility)" - alias: "Home Battery - Charge During Best Price (Moderate+ Volatility)"
description: "Heat water during Best Price period, but only on days with meaningful price differences" description: "Charge home battery during Best Price periods, 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
@ -40,24 +40,24 @@ automation:
- 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: Check water temperature is below target # Only charge if battery has capacity
- condition: numeric_state - condition: numeric_state
entity_id: sensor.water_heater_temperature entity_id: sensor.home_battery_level
below: 55 below: 90
action: action:
- service: switch.turn_on - service: switch.turn_on
target: target:
entity_id: switch.water_heater entity_id: switch.home_battery_charge
- service: notify.mobile_app - service: notify.mobile_app
data: data:
message: "Water heater started during Best Price period ({{ states('sensor.tibber_home_current_interval_price_ct') }} ct/kWh, volatility {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') }}%)" message: "Home battery charging during Best Price period ({{ states('sensor.tibber_home_current_interval_price_ct') }} ct/kWh, volatility {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') }}%)"
``` ```
**Why this works:** **Why this works:**
- On moderate+ volatility days (CV >= 15%), Best Price periods offer worthwhile savings - On moderate+ volatility days (CV >= 15%), Best Price periods offer worthwhile savings
- On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span) - On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span)
- Water heaters are ideal for price-based automation: high consumption (2-3 kW), thermal storage allows flexible timing - Home batteries are ideal for price-based automation: high consumption (5-10 kW), purpose-built for price arbitrage
- User can manually boost temperature anytime if needed - Battery can discharge during peak prices for additional savings or grid support
**Volatility threshold guide:** **Volatility threshold guide:**
- CV < 15%: Low volatility - minimal price variation - CV < 15%: Low volatility - minimal price variation
@ -84,17 +84,17 @@ automation:
below: 20 below: 20
# Optional: Check water temperature # Optional: Check water temperature
- condition: numeric_state - condition: numeric_state
entity_id: sensor.water_heater_temperature entity_id: sensor.home_battery_level
below: 55 # Only heat if below 55°C below: 90 # Only heat if below 55°C
action: action:
- service: switch.turn_on - service: switch.turn_on
target: target:
entity_id: switch.water_heater entity_id: switch.home_battery_charge
- delay: - delay:
hours: 2 # Heat for 2 hours hours: 2 # Heat for 2 hours
- service: switch.turn_off - service: switch.turn_off
target: target:
entity_id: switch.water_heater entity_id: switch.home_battery_charge
``` ```
**Why this works:** **Why this works:**

View file

@ -25,12 +25,12 @@ These examples show how to handle low-volatility days where period classificatio
### Use Case: Only Act on Meaningful Price Variations ### Use Case: Only Act on Meaningful Price Variations
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: On days with low price variation (coefficient of variation < 15%), the difference between "cheap" and "expensive" periods is minimal. This automation only charges devices when volatility is moderate or higher, ensuring meaningful savings:
```yaml ```yaml
automation: automation:
- alias: "Water Heater - Best Price (Moderate+ Volatility)" - alias: "Home Battery - Charge During Best Price (Moderate+ Volatility)"
description: "Heat water during Best Price period, but only on days with meaningful price differences" description: "Charge home battery during Best Price periods, 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
@ -40,24 +40,24 @@ automation:
- 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: Check water temperature is below target # Only charge if battery has capacity
- condition: numeric_state - condition: numeric_state
entity_id: sensor.water_heater_temperature entity_id: sensor.home_battery_level
below: 55 below: 90
action: action:
- service: switch.turn_on - service: switch.turn_on
target: target:
entity_id: switch.water_heater entity_id: switch.home_battery_charge
- service: notify.mobile_app - service: notify.mobile_app
data: data:
message: "Water heater started during Best Price period ({{ states('sensor.tibber_home_current_interval_price_ct') }} ct/kWh, volatility {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') }}%)" message: "Home battery charging during Best Price period ({{ states('sensor.tibber_home_current_interval_price_ct') }} ct/kWh, volatility {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') }}%)"
``` ```
**Why this works:** **Why this works:**
- On moderate+ volatility days (CV >= 15%), Best Price periods offer worthwhile savings - On moderate+ volatility days (CV >= 15%), Best Price periods offer worthwhile savings
- On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span) - On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span)
- Water heaters are ideal for price-based automation: high consumption (2-3 kW), thermal storage allows flexible timing - Home batteries are ideal for price-based automation: high consumption (5-10 kW), purpose-built for price arbitrage
- User can manually boost temperature anytime if needed - Battery can discharge during peak prices for additional savings or grid support
**Volatility threshold guide:** **Volatility threshold guide:**
- CV < 15%: Low volatility - minimal price variation - CV < 15%: Low volatility - minimal price variation
@ -84,17 +84,17 @@ automation:
below: 20 below: 20
# Optional: Check water temperature # Optional: Check water temperature
- condition: numeric_state - condition: numeric_state
entity_id: sensor.water_heater_temperature entity_id: sensor.home_battery_level
below: 55 # Only heat if below 55°C below: 90 # Only heat if below 55°C
action: action:
- service: switch.turn_on - service: switch.turn_on
target: target:
entity_id: switch.water_heater entity_id: switch.home_battery_charge
- delay: - delay:
hours: 2 # Heat for 2 hours hours: 2 # Heat for 2 hours
- service: switch.turn_off - service: switch.turn_off
target: target:
entity_id: switch.water_heater entity_id: switch.home_battery_charge
``` ```
**Why this works:** **Why this works:**

View file

@ -25,12 +25,12 @@ These examples show how to handle low-volatility days where period classificatio
### Use Case: Only Act on Meaningful Price Variations ### Use Case: Only Act on Meaningful Price Variations
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: On days with low price variation (coefficient of variation < 15%), the difference between "cheap" and "expensive" periods is minimal. This automation only charges devices when volatility is moderate or higher, ensuring meaningful savings:
```yaml ```yaml
automation: automation:
- alias: "Water Heater - Best Price (Moderate+ Volatility)" - alias: "Home Battery - Charge During Best Price (Moderate+ Volatility)"
description: "Heat water during Best Price period, but only on days with meaningful price differences" description: "Charge home battery during Best Price periods, 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
@ -40,24 +40,24 @@ automation:
- 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: Check water temperature is below target # Only charge if battery has capacity
- condition: numeric_state - condition: numeric_state
entity_id: sensor.water_heater_temperature entity_id: sensor.home_battery_level
below: 55 below: 90
action: action:
- service: switch.turn_on - service: switch.turn_on
target: target:
entity_id: switch.water_heater entity_id: switch.home_battery_charge
- service: notify.mobile_app - service: notify.mobile_app
data: data:
message: "Water heater started during Best Price period ({{ states('sensor.tibber_home_current_interval_price_ct') }} ct/kWh, volatility {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') }}%)" message: "Home battery charging during Best Price period ({{ states('sensor.tibber_home_current_interval_price_ct') }} ct/kWh, volatility {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') }}%)"
``` ```
**Why this works:** **Why this works:**
- On moderate+ volatility days (CV >= 15%), Best Price periods offer worthwhile savings - On moderate+ volatility days (CV >= 15%), Best Price periods offer worthwhile savings
- On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span) - On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span)
- Water heaters are ideal for price-based automation: high consumption (2-3 kW), thermal storage allows flexible timing - Home batteries are ideal for price-based automation: high consumption (5-10 kW), purpose-built for price arbitrage
- User can manually boost temperature anytime if needed - Battery can discharge during peak prices for additional savings or grid support
**Volatility threshold guide:** **Volatility threshold guide:**
- CV < 15%: Low volatility - minimal price variation - CV < 15%: Low volatility - minimal price variation
@ -84,17 +84,17 @@ automation:
below: 20 below: 20
# Optional: Check water temperature # Optional: Check water temperature
- condition: numeric_state - condition: numeric_state
entity_id: sensor.water_heater_temperature entity_id: sensor.home_battery_level
below: 55 # Only heat if below 55°C below: 90 # Only heat if below 55°C
action: action:
- service: switch.turn_on - service: switch.turn_on
target: target:
entity_id: switch.water_heater entity_id: switch.home_battery_charge
- delay: - delay:
hours: 2 # Heat for 2 hours hours: 2 # Heat for 2 hours
- service: switch.turn_off - service: switch.turn_off
target: target:
entity_id: switch.water_heater entity_id: switch.home_battery_charge
``` ```
**Why this works:** **Why this works:**

View file

@ -25,12 +25,12 @@ These examples show how to handle low-volatility days where period classificatio
### Use Case: Only Act on Meaningful Price Variations ### Use Case: Only Act on Meaningful Price Variations
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: On days with low price variation (coefficient of variation < 15%), the difference between "cheap" and "expensive" periods is minimal. This automation only charges devices when volatility is moderate or higher, ensuring meaningful savings:
```yaml ```yaml
automation: automation:
- alias: "Water Heater - Best Price (Moderate+ Volatility)" - alias: "Home Battery - Charge During Best Price (Moderate+ Volatility)"
description: "Heat water during Best Price period, but only on days with meaningful price differences" description: "Charge home battery during Best Price periods, 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
@ -40,24 +40,24 @@ automation:
- 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: Check water temperature is below target # Only charge if battery has capacity
- condition: numeric_state - condition: numeric_state
entity_id: sensor.water_heater_temperature entity_id: sensor.home_battery_level
below: 55 below: 90
action: action:
- service: switch.turn_on - service: switch.turn_on
target: target:
entity_id: switch.water_heater entity_id: switch.home_battery_charge
- service: notify.mobile_app - service: notify.mobile_app
data: data:
message: "Water heater started during Best Price period ({{ states('sensor.tibber_home_current_interval_price_ct') }} ct/kWh, volatility {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') }}%)" message: "Home battery charging during Best Price period ({{ states('sensor.tibber_home_current_interval_price_ct') }} ct/kWh, volatility {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') }}%)"
``` ```
**Why this works:** **Why this works:**
- On moderate+ volatility days (CV >= 15%), Best Price periods offer worthwhile savings - On moderate+ volatility days (CV >= 15%), Best Price periods offer worthwhile savings
- On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span) - On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span)
- Water heaters are ideal for price-based automation: high consumption (2-3 kW), thermal storage allows flexible timing - Home batteries are ideal for price-based automation: high consumption (5-10 kW), purpose-built for price arbitrage
- User can manually boost temperature anytime if needed - Battery can discharge during peak prices for additional savings or grid support
**Volatility threshold guide:** **Volatility threshold guide:**
- CV < 15%: Low volatility - minimal price variation - CV < 15%: Low volatility - minimal price variation
@ -84,17 +84,17 @@ automation:
below: 20 below: 20
# Optional: Check water temperature # Optional: Check water temperature
- condition: numeric_state - condition: numeric_state
entity_id: sensor.water_heater_temperature entity_id: sensor.home_battery_level
below: 55 # Only heat if below 55°C below: 90 # Only heat if below 55°C
action: action:
- service: switch.turn_on - service: switch.turn_on
target: target:
entity_id: switch.water_heater entity_id: switch.home_battery_charge
- delay: - delay:
hours: 2 # Heat for 2 hours hours: 2 # Heat for 2 hours
- service: switch.turn_off - service: switch.turn_off
target: target:
entity_id: switch.water_heater entity_id: switch.home_battery_charge
``` ```
**Why this works:** **Why this works:**

View file

@ -25,12 +25,12 @@ These examples show how to handle low-volatility days where period classificatio
### Use Case: Only Act on Meaningful Price Variations ### Use Case: Only Act on Meaningful Price Variations
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: On days with low price variation (coefficient of variation < 15%), the difference between "cheap" and "expensive" periods is minimal. This automation only charges devices when volatility is moderate or higher, ensuring meaningful savings:
```yaml ```yaml
automation: automation:
- alias: "Water Heater - Best Price (Moderate+ Volatility)" - alias: "Home Battery - Charge During Best Price (Moderate+ Volatility)"
description: "Heat water during Best Price period, but only on days with meaningful price differences" description: "Charge home battery during Best Price periods, 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
@ -40,24 +40,24 @@ automation:
- 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: Check water temperature is below target # Only charge if battery has capacity
- condition: numeric_state - condition: numeric_state
entity_id: sensor.water_heater_temperature entity_id: sensor.home_battery_level
below: 55 below: 90
action: action:
- service: switch.turn_on - service: switch.turn_on
target: target:
entity_id: switch.water_heater entity_id: switch.home_battery_charge
- service: notify.mobile_app - service: notify.mobile_app
data: data:
message: "Water heater started during Best Price period ({{ states('sensor.tibber_home_current_interval_price_ct') }} ct/kWh, volatility {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') }}%)" message: "Home battery charging during Best Price period ({{ states('sensor.tibber_home_current_interval_price_ct') }} ct/kWh, volatility {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') }}%)"
``` ```
**Why this works:** **Why this works:**
- On moderate+ volatility days (CV >= 15%), Best Price periods offer worthwhile savings - On moderate+ volatility days (CV >= 15%), Best Price periods offer worthwhile savings
- On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span) - On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span)
- Water heaters are ideal for price-based automation: high consumption (2-3 kW), thermal storage allows flexible timing - Home batteries are ideal for price-based automation: high consumption (5-10 kW), purpose-built for price arbitrage
- User can manually boost temperature anytime if needed - Battery can discharge during peak prices for additional savings or grid support
**Volatility threshold guide:** **Volatility threshold guide:**
- CV < 15%: Low volatility - minimal price variation - CV < 15%: Low volatility - minimal price variation
@ -84,17 +84,17 @@ automation:
below: 20 below: 20
# Optional: Check water temperature # Optional: Check water temperature
- condition: numeric_state - condition: numeric_state
entity_id: sensor.water_heater_temperature entity_id: sensor.home_battery_level
below: 55 # Only heat if below 55°C below: 90 # Only heat if below 55°C
action: action:
- service: switch.turn_on - service: switch.turn_on
target: target:
entity_id: switch.water_heater entity_id: switch.home_battery_charge
- delay: - delay:
hours: 2 # Heat for 2 hours hours: 2 # Heat for 2 hours
- service: switch.turn_off - service: switch.turn_off
target: target:
entity_id: switch.water_heater entity_id: switch.home_battery_charge
``` ```
**Why this works:** **Why this works:**

View file

@ -25,12 +25,12 @@ These examples show how to handle low-volatility days where period classificatio
### Use Case: Only Act on Meaningful Price Variations ### Use Case: Only Act on Meaningful Price Variations
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: On days with low price variation (coefficient of variation < 15%), the difference between "cheap" and "expensive" periods is minimal. This automation only charges devices when volatility is moderate or higher, ensuring meaningful savings:
```yaml ```yaml
automation: automation:
- alias: "Water Heater - Best Price (Moderate+ Volatility)" - alias: "Home Battery - Charge During Best Price (Moderate+ Volatility)"
description: "Heat water during Best Price period, but only on days with meaningful price differences" description: "Charge home battery during Best Price periods, 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
@ -40,24 +40,24 @@ automation:
- 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: Check water temperature is below target # Only charge if battery has capacity
- condition: numeric_state - condition: numeric_state
entity_id: sensor.water_heater_temperature entity_id: sensor.home_battery_level
below: 55 below: 90
action: action:
- service: switch.turn_on - service: switch.turn_on
target: target:
entity_id: switch.water_heater entity_id: switch.home_battery_charge
- service: notify.mobile_app - service: notify.mobile_app
data: data:
message: "Water heater started during Best Price period ({{ states('sensor.tibber_home_current_interval_price_ct') }} ct/kWh, volatility {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') }}%)" message: "Home battery charging during Best Price period ({{ states('sensor.tibber_home_current_interval_price_ct') }} ct/kWh, volatility {{ state_attr('sensor.tibber_home_volatility_today', 'coefficient_of_variation') }}%)"
``` ```
**Why this works:** **Why this works:**
- On moderate+ volatility days (CV >= 15%), Best Price periods offer worthwhile savings - On moderate+ volatility days (CV >= 15%), Best Price periods offer worthwhile savings
- On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span) - On low-volatility days (CV < 15%), price differences are minimal (typically < 3 ct/kWh span)
- Water heaters are ideal for price-based automation: high consumption (2-3 kW), thermal storage allows flexible timing - Home batteries are ideal for price-based automation: high consumption (5-10 kW), purpose-built for price arbitrage
- User can manually boost temperature anytime if needed - Battery can discharge during peak prices for additional savings or grid support
**Volatility threshold guide:** **Volatility threshold guide:**
- CV < 15%: Low volatility - minimal price variation - CV < 15%: Low volatility - minimal price variation
@ -84,17 +84,17 @@ automation:
below: 20 below: 20
# Optional: Check water temperature # Optional: Check water temperature
- condition: numeric_state - condition: numeric_state
entity_id: sensor.water_heater_temperature entity_id: sensor.home_battery_level
below: 55 # Only heat if below 55°C below: 90 # Only heat if below 55°C
action: action:
- service: switch.turn_on - service: switch.turn_on
target: target:
entity_id: switch.water_heater entity_id: switch.home_battery_charge
- delay: - delay:
hours: 2 # Heat for 2 hours hours: 2 # Heat for 2 hours
- service: switch.turn_off - service: switch.turn_off
target: target:
entity_id: switch.water_heater entity_id: switch.home_battery_charge
``` ```
**Why this works:** **Why this works:**