Energietarieven

Via o.a. Nordpool integratie is het mogelijk om de energieprijzen voor vandaag en morgen te ontvangen. Deze worden dan als attributen van een sensor dagelijks opgehaald vanaf de API server van Nordpool en bekend gemaakt binnen Home Assistant. Hiermee kan dan het goedkoopste uur gevonden worden voor de variabele energieprijzen om op dat moment je energie-slurpende apparaten aan te zetten.

Nordpool Integratie via HACS

Via HACS dient eerst de integratie toegevoegd te worden. Kies ‘Integraties” -> “+” en zoek op ‘Nordpool”

Kies voor Nordpool en dan rechtsonder op ‘Download‘ in de getoonde info-pagina. Nogmaals Download om Nordpool te installeren

Grafieken kaart installeren via HACS

Om grafieken te kunnen weergeven is een Frontend toevoeging vanuit HACS noodzakelijk, dit is de ApexCharts. Zoek in HACS Frontend naar Apex en kies voor apexcharts-card:

Kies rechtsonder voor ‘Download‘ en dan nogmaals voor Download

Herstart nu Home Assistant

Nordpool integratie in Home Assistant Integrations

Hiervoor wordt nu eerst een input_number helper gemaakt voor extra energiekosten zoals BTW en toeslagen. Kies voor Instellingen -> Apparaten & Diensten -> Helpers en voeg een Numerieke helper toe genaamd nordpool_additional_costs en gebruik de volgende instellingen en kies voor AANMAKEN.

Ook maken we een input_number voor het aantal uren dat vooruit gekeken wordt om de laagste prijs te bepalen. Kies wederom voor het aanmaken van een Numeriek en geef het de naam nordpool_hours_ahead met de volgende instellingen:

Nu kan de integratie van Nordpool toegevoegd worden. Kies voor Instellingen -> Apparaten & Diensten -> Integraties in Home Assistant en zoek op Nordpool.

Kies voor Nord Pool om de integratie toe te voegen en de instellingen aan te passen:

Kies dan voor OPSLAAN,

en tenslotte voor VOLTOOIEN.

In Home Assistant zal nu een sensor toegevoegd zijn genaamd nordpool_kwh_nl_eur_3_10_021 met attributen voor energieprijzen per uur voor vandaag en morgen. De sensor zal de prijzen dagelijks opnieuw ophalen van Nord Pool.

Wellicht handig om deze entiteits-id te hernoemen naar een kortere naam, bijvoorbeeld sensor.nordpool

Templates voor sensors

In Home Assistant worden nu twee sensors aangemaakt via templates.Gebruik hiervoor Visual Studio Server als Add-on. Deze kan standaard toegevoegd worden vanuit de Home Assistant Add-ons.

Gebruik een templates.yaml file voor de templates en maak een verwijzing hiervoor in de configuration.yaml van Home Assistant:

template: !include templates.yaml

Voeg nu de volgende code toe aan templates.yaml voor de energieprijzen sensor:

- sensor:
    - name: "Nordpool Energieprijzen"
      unique_id: "nordpool_energieprijzen"
      icon: mdi:currency-eur
      unit_of_measurement: "€"
      state: >
        {{ states('sensor.nordpool')}}
      attributes:
        times: >
          {% set ns = namespace(times=[]) -%}
          {%- set today = state_attr('sensor.nordpool','raw_today') -%}
          {%- for hours in today -%}
            {%- set ns.times = ns.times + [as_local((hours.start)).strftime("%Y-%m-%d %H:%M:%S")] -%}
          {%- endfor -%}
          {%- set tomorrow = state_attr('sensor.nordpool','raw_tomorrow') -%}
          {%- for hours in tomorrow -%}
            {%- set ns.times = ns.times + [as_local((hours.start)).strftime("%Y-%m-%d %H:%M:%S")] -%}
          {%- endfor -%}
          {{ ns.times }}
        prices: >
          {% set ns = namespace(prices=[]) -%}
          {%- set today = state_attr('sensor.nordpool','raw_today') -%}
          {%- for hours in today -%}
            {%- set ns.prices = ns.prices + [hours.value + states('input_number.nordpool_additional_costs') | float] -%}
          {%- endfor -%}
          {%- set tomorrow = state_attr('sensor.nordpool','raw_tomorrow') -%}
          {%- for hours in tomorrow -%}
            {%- set ns.prices = ns.prices + [hours.value + states('input_number.nordpool_additional_costs') | float] -%}
          {%- endfor -%}
          {{ ns.prices }}

Zoals je in de code kunt zien worden hier de input_numbers gebruikt om de tarieven te bepalen voor vandaag en morgen met de extra kosten die straks instelbaar zijn in het dashboard.

Herstart nu Home Assistant om de templates in te lezen en de sensor aan te maken.

Ter controle zoek in de Ontwikkelhulpmiddelen -> Statusssen voor sensor.nordpool_energieprijzen

Apex grafieken aanmaken in nieuw dashboard

Maak een nieuw dashboard aan via Instellingen -> Dashboard en maak een dashboard met de naam Energieprijzen aan:

Kies voor ‘MAAK AAN’ en kies in de zijbalk voor dit dashboard. Kies vervolgens rechtsboven via de 3 stippen voor ‘Configureer UI’ en kies ervoor om het dashboard leeg over te nemen:

Voeg een nieuwe kaart toe en kies voor de ApexChart card:

Vervang de standaard code van deze kaart door de volgende code:

type: custom:apexcharts-card
graph_span: 23h
header:
  title: Energprijzen vandaag (€/kWh)
  show: true
span:
  start: day
now:
  show: true
  label: Now
series:
  - entity: sensor.nordpool_energieprijzen
    color: green
    type: column
    float_precision: 2
    data_generator: |
      return entity.attributes.times.map((time, index) => {
        return [new Date(time).getTime(), entity.attributes.prices[index]];
      });
yaxis:
  - decimals: 2
    apex_config:
      tickAmount: 10

Waardoor de grafiek er alsvolgt uit ziet:

Een tweede grafiek kan getoond worden met de prijzen voor morgen, gebruik dan deze code voor de 2e Apex Chart:

type: custom:apexcharts-card
graph_span: 23h
header:
  title: Energprijzen morgen (€/kWh)
  show: true
span:
  start: day
  offset: +1d
now:
  show: true
  label: Now
series:
  - entity: sensor.nordpool_energieprijzen
    color: green
    type: column
    float_precision: 2
    data_generator: |
      return entity.attributes.times.map((time, index) => {
        return [new Date(time).getTime(), entity.attributes.prices[index]];
      });
yaxis:
  - decimals: 2
    apex_config:
      tickAmount: 10

Mooi is het om deze twee grafieken in een horizontale kaart te plaatsen zodat ze naast elkaar worden getoond in het dashboard.

Onder de grafieken kunnen nu in een 2e horizontale kaart, de extra kosten en het aantal uren vooruit kijken ingesteld worden. Het resultaat is dan bijvoorbeeld zo:

Goedkoopste tijd

Een sensor voor de goedkoopste tijd uit de array met prijzen halen wordt ook met een template gedaan. Dus, wederom een sensor aanmaken in templates.yaml:

sensor:
    - name: "Nordpool Goedkoopste Tijd"
      unique_id: "nordpool_goedkoopste_tijd"
      icon: mdi:clock
      state: >
        {% set hours_ahead = states('input_number.nordpool_hours_ahead') | int %}
        {% set current_time = as_timestamp(now()) %}
        {% set ns = namespace(times=[], prices=[], lowest_price=100, cheapest_time=now(), hour_counter=0) %}
        {% set today = state_attr('sensor.nordpool','raw_today') %}
        {% for hours in today -%}
          {% if ns.hour_counter < hours_ahead -%}
            {% set retrieved_time = as_timestamp(as_local(hours.start)) %}
            {% if retrieved_time > current_time - 3600 %}
              {% set retrieved_price = (hours.value | float(0) + states('input_number.nordpool_additional_costs') | float(0)) %}
              {% if retrieved_price < ns.lowest_price %}
                {% set ns.cheapest_time = retrieved_time %}
                {% set ns.lowest_price = retrieved_price %}
              {% endif %}
              {% set ns.hour_counter = ns.hour_counter + 1 %}
            {% endif %}
          {% endif %}
        {% endfor %}
        {% if ns.hour_counter < hours_ahead -%}
          {% set tomorrow = state_attr('sensor.nordpool','raw_tomorrow') %}
          {% for hours in tomorrow %}
            {% if ns.hour_counter < hours_ahead %}
              {% set retrieved_time = as_timestamp(as_local(hours.start)) %}
              {% if retrieved_time > current_time - 3600 %}
                {% set retrieved_price = (hours.value | float(0) + states('input_number.nordpool_additional_costs') | float(0)) %}
                {% if retrieved_price < ns.lowest_price %}
                  {% set ns.cheapest_time = retrieved_time %}
                  {% set ns.lowest_price = retrieved_price %}
                {% endif %}
                {% set ns.hour_counter = ns.hour_counter + 1 %}
              {% endif %}
            {% endif %}
          {% endfor %}
        {% endif %}
        {{ ns.cheapest_time | timestamp_custom('%H:%M', true) }}

De goedkoopste tijd wordt hiermee bepaald aan de hand van het aantal uren dat ‘vooruit gekeken’ moet worden. Deze variable is met een input_number in te stellen en kan op het dashboard geplaatst worden zoals hierboven in de image te zien is..

Laagste prijs

Nu we de goedkoopste tijd hebben willen we ook het bijbehorende tarief van die tijd weten. Dat wordt wederom gedaan met een template:

- sensor:
    - name: "Nordpool Laagste Prijs"
      unique_id: nordpool_laagste_prijs
      icon: mdi:currency-eur
      unit_of_measurement: "€"
      state: >
        {% set hours_ahead = states('input_number.nordpool_hours_ahead') | int %}
        {% set current_time = as_timestamp(now()) %}
        {% set ns = namespace(times=[], prices=[], lowest_price=100, hour_counter=0) %}
        {% set today = state_attr('sensor.nordpool','raw_today') %}
        {% for hours in today -%}
          {% if ns.hour_counter < hours_ahead -%}
            {% set retrieved_time = as_timestamp(as_local(hours.start)) %}
            {% if retrieved_time > current_time - 3600 %}
              {% set retrieved_price = (hours.value | float(0) + states('input_number.nordpool_additional_costs') | float(0)) %}
              {% if retrieved_price < ns.lowest_price %}
                {% set ns.lowest_price = retrieved_price %}
              {% endif %}
              {% set ns.hour_counter = ns.hour_counter + 1 %}
            {% endif %}
          {% endif %}
        {% endfor %}
        {% if ns.hour_counter < hours_ahead -%}
          {% set tomorrow = state_attr('sensor.nordpool','raw_tomorrow') %}
          {% for hours in tomorrow %}
            {% if ns.hour_counter < hours_ahead %}
              {% set retrieved_time = as_timestamp(as_local(hours.start)) %}
              {% if retrieved_time > current_time - 3600 %}
                {% set retrieved_price = (hours.value | float(0) + states('input_number.nordpool_additional_costs') | float(0)) %}
                {% if retrieved_price < ns.lowest_price %}
                  {% set ns.lowest_price = retrieved_price %}
                {% endif %}
                {% set ns.hour_counter = ns.hour_counter + 1 %}
              {% endif %}
            {% endif %}
          {% endfor %}
        {% endif %}
        {{ ns.lowest_price | round(2) }}

en ook hier weer gebruik makend van het aantal uren ‘vooruit kijken’ en extra kosten meerekenen.

Sensors

Plaats de sensors in een entiteiten-kaart op het dashboard: