@
PeteSapai
Ik heb het in een aantal stappen opgedeeld.
Stap 1: ophalen prijzen Tibber
In configuration.yaml:
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| - platform: rest
unique_id: TIB-001
unit_of_measurement: €/kWh
name: Tibber elektriciteitsprijs API
device_class: monetary
icon: mdi:home-lightning-bolt
resource: https://api.tibber.com/v1-beta/gql
method: POST
scan_interval: 900
payload: '{ "query": "{ viewer { homes { currentSubscription { priceInfo { current { total energy tax level } today { total energy tax startsAt level } tomorrow { total energy tax startsAt level }}}}}}" }'
json_attributes_path: "$.data.viewer.homes[1].currentSubscription.priceInfo"
json_attributes:
- current
- today
- tomorrow
value_template: '{{ value_json["data"]["viewer"]["homes"][1]["currentSubscription"]["priceInfo"]["current"]["total"] }}'
headers:
Authorization: !secret tibbertoken
Content-Type: application/json
User-Agent: REST |
Bovenstaande code geeft mij een nieuwe sensor genaamd
sensor.tibber_elektriciteitsprijs_api.
Vervolgens heb ik een template sensor (in templates.yaml) die eigenlijk 2 dingen doet (ik noem ze even stap 2 en stap 3):
Stap 2: goedkoopste 3 uur vinden
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
| - name: Boiler optimale starttijd
unique_id: BOILER_OPT_START
icon: mdi:clock
state: >-
{% set totals = states.sensor.tibber_elektriciteitsprijs_api.attributes.today | default([0]) | map(attribute='total') | list %}
{% set hour3array=namespace(sums=[]) %}
{% for i in range(0, totals|length - 2) %}
{% set subset = totals[i:i+3] %}
{% set subset_sum = subset|sum %}
{% set hour3array.sums = hour3array.sums + [subset_sum] %}
{% endfor %}
{% set min_value3 = hour3array.sums | min %} |
Bovenstaande code checkt alle uurprijzen van vandaag en telt elke mogelijke 3 uren (3 uur omdat mijn boiler er gemiddeld 3 uur over doet om weer volledig op te warmen) bij elkaar op. Dus de uurprijs van bijvoorbeeld 13:00, 14:00 en 15:00, vervolgens 14:00, 15:00 en 16:00 enzovoort. Deze prijzen worden in een array (hour3array.sums) weggeschreven die er voor vandaag zo uit ziet:
YAML:
1
| [0.8341, 0.7534000000000001, 0.659, 0.5744, 0.5434, 0.5857, 0.7444, 0.9017, 0.9925999999999999, 0.9333, 0.8480999999999999, 0.7366999999999999, 0.6349, 0.5564, 0.5227, 0.6043000000000001, 0.7350000000000001, 0.8936999999999999, 0.9621, 0.9522999999999999, 0.9115, 0.8640999999999999] |
Hierbij weet je dat de 0.8341 bij 0:00 hoort, de 0.7534 hoort bij 1:00 enzovoort. Door hier de minimale waarde te pakken, weet je welk tijdstip het het goedkoopst is. In dit geval is 0.5227 het laagste getal uit bovenstaande array. Die hoort bij 14:00.
Stap 3: index voor tijdstip
Nu wil je dus nog automatisch weten welk tijdstip bij die prijs hoort. Dit kun je doen door de index te nemen:
YAML:
1
2
3
| {% set index_value = hour3array.sums.index(min_value3) %}
{% set time_value = now().replace(hour=(index_value), minute=0, second=0, microsecond=0) | as_timestamp() %}
{{ time_value | timestamp_custom('%H:%M') }} |
Met andere woorden: geef me de index van 0.5227 in de hour3array. Hier komt '14' uit. Dit zet ik vervolgens om naar een timestamp.
Volledig template:
YAML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| - name: Boiler optimale starttijd
unique_id: BOILER_OPT_START
icon: mdi:clock
state: >-
{% set totals = states.sensor.tibber_elektriciteitsprijs_api.attributes.today | default([0]) | map(attribute='total') | list %}
{% set hour3array=namespace(sums=[]) %}
{% for i in range(0, totals|length - 2) %}
{% set subset = totals[i:i+3] %}
{% set subset_sum = subset|sum %}
{% set hour3array.sums = hour3array.sums + [subset_sum] %}
{% endfor %}
{% set min_value3 = hour3array.sums | min %}
{% set index_value = hour3array.sums.index(min_value3) %}
{% set time_value = now().replace(hour=(index_value), minute=0, second=0, microsecond=0) | as_timestamp() %}
{{ time_value | timestamp_custom('%H:%M') }} |
Dit geeft een nieuwe sensor genaamd
sensor.boiler_optimale_starttijd.
Vervolgens kun je dit weer als trigger in een automatisering gebruiken:
YAML:
1
2
| platform: template
value_template: "{{states('sensor.time')==states('sensor.boiler_optimale_starttijd')}}" |