62 lines
2.1 KiB
Markdown
62 lines
2.1 KiB
Markdown
# Boiler Control - AppDaemon
|
|
|
|
AppDaemon script that optimizes when to power (heat up) the boiler with respect to the hourly (dynamic) electricity prices.
|
|
|
|
## Configuration
|
|
Copy boilercontrol.py to your appdaemon config `/apps` folder.
|
|
|
|
In `apps.yaml`, activate the app by adding something like this:
|
|
```yml
|
|
boiler_control:
|
|
module: boilercontrol
|
|
class: BoilerControl
|
|
# Switch entity that turns on/off the boiler
|
|
boiler_switch: switch.boiler_switch_0
|
|
# Sensor entity which contains the current dynamic electricity prices. This sensor should have an attribute "raw_today", which contains a dictionary with the prices per hour
|
|
price_sensor: sensor.nordpool
|
|
# (Optional) sensor to add to home assistant which contains the output of the optimization script
|
|
output_sensor: sensor.boiler_control_output
|
|
|
|
# Minimal number of hours the boiler should be powered per day
|
|
boiler_on_for_hours: 6
|
|
# The algorithm splits the day up into equal size "periods", and tries to ensure the boiler gets at least one hour of power during each period.
|
|
# This variable controls how many periods of boiler activity each day should have
|
|
boiler_reheat_periods_per_day: 4
|
|
```
|
|
|
|
You can use [ApexCharts](https://github.com/RomRider/apexcharts-card) to display to output of the algorithm. Config:
|
|
```yml
|
|
type: custom:apexcharts-card
|
|
graph_span: 24h
|
|
header:
|
|
title: Energy price today (€/kWh)
|
|
show: true
|
|
span:
|
|
start: day
|
|
now:
|
|
show: true
|
|
label: Now
|
|
series:
|
|
- entity: sensor.nordpool
|
|
float_precision: 3
|
|
type: column
|
|
data_generator: |
|
|
return entity.attributes.raw_today.map((start, index) => {
|
|
return [new Date(start["start"]).getTime() + 30 * 1000 * 60, entity.attributes.raw_today[index]["value"]];
|
|
});
|
|
- entity: sensor.boiler_control_output
|
|
float_precision: 0
|
|
name: Boiler controller
|
|
type: line
|
|
curve: stepline
|
|
stroke_width: 2
|
|
data_generator: |
|
|
const val = entity.attributes.average_price
|
|
return [[0,0], ...entity.attributes.merged_blocks.flatMap(b => {
|
|
return [[new Date(b["start"]).getTime(), val], [new Date(b["end"]).getTime(), 0]]
|
|
})]
|
|
yaxis:
|
|
- min: 0
|
|
decimals: 2
|
|
```
|