Ontvang vandaag de stroomprijzen van morgen

Ontvang vandaag de stroomprijzen van morgen

Slimme Energiebesparing met Home Assistant

Ik ben altijd op zoek naar manieren om mijn huis slimmer en duurzamer te maken. En wat is er nu slimmer dan je elektriciteitsverbruik af te stemmen op de fluctuerende energieprijzen? Met Home Assistant, een open-source domotica-platform, kan ik precies dat doen! In dit artikel deel ik hoe ik een automatisering heb ingesteld om de stroomprijzen voor de volgende dag te ontvangen, zodat ik mijn apparaten kan laten draaien wanneer de prijzen het laagst zijn.

Wat is Home Assistant?

Voor degenen die het niet kennen: Home Assistant is een krachtig en veelzijdig platform voor huisautomatisering. Het stelt je in staat om verschillende slimme apparaten in je huis te koppelen en te besturen, van verlichting en verwarming tot zonnepanelen en slimme stekkers.

De Uitdaging: Slim Energiegebruik

Mijn doel was om mijn energieverbruik te optimaliseren door mijn apparaten te laten werken wanneer de energieprijzen het laagst zijn. Dit is niet alleen goed voor mijn portemonnee, maar ook voor het milieu, en het helpt ook nog eens bij het verminderen van netcongestie.

Hoe ik dit heb aangepakt

Ik besloot om de NordPool API te gebruiken, daarover kan je in een andere blog artikel meer leven, die de energieprijzen voor de volgende dag levert. Met een beetje scripting in Home Assistant kon ik een automatisering maken die mij elke dag de prijzen voor de volgende 24 uur stuurt.

Stap 1: De Basis - Input Boolean

De eerste stap was het instellen van een 'input_boolean' in Home Assistant. Dit is een eenvoudige schakelaar die ik gebruik om bij te houden of het bericht voor de dag al is verzonden of niet. Dit zorgt ervoor dat ik niet meerdere berichten per dag krijg.

input_boolean:
  nordpool_message_sent:
    name: Nordpool Message Sent
    initial: off

Stap 2: De Automatisering Opzetten

Vervolgens heb ik een automatisering gecreëerd die elk uur tussen 13:00 en 17:00 uur controleert of de gegevens voor de volgende dag beschikbaar zijn. Als dat het geval is, stuurt het een bericht met de prijzen.

De trigger

De trigger voor de automatisering is een tijdspatroon dat elk uur controleert.

trigger:
  - platform: time_pattern
    hours: /1
    minutes: "0"
    seconds: "0"

De voorwaarden

De voorwaarden zorgen ervoor dat de actie alleen wordt uitgevoerd als aan bepaalde criteria is voldaan. Dus zijn de van morgen in de NordPool api er al (tomorrow_valid = TRUE) en heeft hij het bericht niet al gestuurd en dat check ik met input_boolean.nordpool_message_sent

condition:
  - condition: time
    after: "13:00:00"
    before: "17:00:00"
  - condition: state
    entity_id: input_boolean.nordpool_message_sent
    state: "off"
  - condition: template
    value_template: "{{ state_attr('sensor.nordpool_kwh_nl_eur_5_10_0', 'tomorrow_valid') }}"

De actie

De actie is waar de magie gebeurt. Hier haal ik de prijsgegevens op vanuit de NordPool Sensor en formatteer ik ze in een bericht.

action:
  - variables:
      formatted_message: >
        {% set raw_data = state_attr('sensor.nordpool_kwh_nl_eur_5_10_0',
        'raw_tomorrow') %}
        {% set ns = namespace(rows=[]) %}
        {% for i in range(12) %}
          {% set start1 = raw_data[i].start %}
          {% set start

2 = raw_data[i+12].start %}
          {% if start1 is string %}
            {% set time1 = start1.split('T')[1][:5] %}
            {% set time2 = start2.split('T')[1][:5] %}
          {% else %}
            {% set time1 = start1.strftime('%H:%M') %}
            {% set time2 = start2.strftime('%H:%M') %}
          {% endif %}
          {% set value1 = '{:.3f}'.format(raw_data[i].value).replace('.', ',') %}
          {% set value2 = '{:.3f}'.format(raw_data[i+12].value).replace('.', ',') %}
          {% set row = time1 ~ ' € ' ~ value1 ~ ' ' ~ time2 ~ ' € ' ~ value2 %}
          {% set ns.rows = ns.rows + [row] %}
        {% endfor %}
        {{ ns.rows|join('\n') }}

Hier gebruik ik Jinja2-templating om de gegevens te verwerken. Het belangrijkste is dat ik ervoor zorg dat de prijzen in een leesbaar formaat worden gepresenteerd en dat ze per uur worden weergegeven.

Ik zal de code regel voor regel uitleggen:

  1. {% set raw_data = state_attr('sensor.nordpool_kwh_nl_eur_5_10_0', 'raw_tomorrow') %}:

    • Deze regel haalt de gegevens op van de raw_tomorrow attribuut van de sensor sensor.nordpool_kwh_nl_eur_5_10_0. Deze data bevat de stroomprijzen voor de volgende dag.
  2. {% set ns = namespace(rows=[]) %}:

    • Hier wordt een 'namespace' object aangemaakt met een lege lijst genaamd rows. Dit wordt gebruikt om de uiteindelijke geformatteerde data op te slaan.
  3. {% for i in range(12) %}:

    • Deze 'for'-lus loopt door 12 uur van de raw_data.
  4. {% set start1 = raw_data[i].start %} en {% set start2 = raw_data[i+12].start %}:

    • Deze regels halen de starttijden op voor elk uur en het corresponderende uur +12 uren later. Zo kom ik dus aan 2 kolommen met ieder 12 uur = 24 uur.
  5. {% if start1 is string %}:

    • Deze 'if'-conditie controleert of de start waarde een string is.
  6. {% set time1 = start1.split('T')[1][:5] %} en {% set time2 = start2.split('T')[1][:5] %}:

    • Als start een string is, splitst deze code de string bij de 'T' (wat typisch een scheidingsteken is in ISO 8601 datum-tijd formaten) en pakt de tijd (eerste 5 karakters).
  7. {% else %}: {% set time1 = start1.strftime('%H:%M') %} en {% set time2 = start2.strftime('%H:%M') %}:

    • Als start geen string is, wordt aangenomen dat het een datum-tijd object is, en deze regels formatteren het naar een tijd in het formaat uur:minuten.
  8. {% set value1 = '{:.3f}'.format(raw_data[i].value).replace('.', ',') %} en {% set value2 = '{:.3f}'.format(raw_data[i+12].value).replace('.', ',') %}:

    • Deze regels formatteren de stroomprijs naar een string met 3 decimalen, en vervangen de punt in het getal door een komma (voor Nederlandse notatie).
  9. {% set row = time1 ~ ' € ' ~ value1 ~ ' ' ~ time2 ~ ' € ' ~ value2 %}:

    • Hier wordt een string samengesteld voor elke rij, waarbij de tijd en de prijs gecombineerd worden met ' € ' als scheidingsteken.
  10. {% set ns.rows = ns.rows + [row] %}:

    • Elke geformatteerde rij wordt toegevoegd aan de rows lijst in de 'namespace'.
  11. {% endfor %}:

    • Dit markeert het einde van de 'for'-lus.
  12. {{ ns.rows|join('\n') }}:

    • Ten slotte wordt de lijst van rijen samengevoegd tot één enkele string, gescheiden door nieuwe regels (\n), die als het uiteindelijke bericht wordt gebruikt.

Deze code is dus verantwoordelijk voor het ophalen, verwerken, en formatteren van de stroomprijsgegevens zodat ze op een leesbare manier kunnen worden gepresenteerd in een notificatie.

Notificaties Versturen

Ik heb ervoor gekozen om het bericht op verschillende manieren te versturen: naar mijn iPhone, als een blijvende notificatie in Home Assistant en via een ntfy-shellcommando.

  - service: notify.mobile_app_iphone_van_xxxx
    data:
      title: Stroom inkoop prijs van Morgen
      message: "{{ formatted_message }}"
  - service: persistent_notification.create
    data:
      title: Stroom inkoop prijs van Morgen
      message: "{{ formatted_message }}"
  - service: shell_command.ntfy
    data:
      topic: eprijzen_middag
      title: Stroom inkoop prijs van Morgen
      markdown: "Yes"
      message: "{{ formatted_message }}"

Deze flexibiliteit zorgt ervoor dat ik het bericht kan ontvangen op de manier die het beste past bij mijn situatie. Je kan zelf even kijken wat handig is voor jou. Via je mobiel, pas dan notify.mobile_app_iphone_van_xxxx dit even aan, kan het zijn dat het bericht al snel te lang wordt. Daarom gebruik ik dan eigenlijk ook liever de persistent_notification.create die maakt namelijk een notificatie aan in Home Assistent zelf. Of gebruik shell_command.ntfy via ntfy waarbij je een externe service gebruikt om berichten te sturen. Meer hier over vindt je hier.

Het bericht resetten

Ten slotte zorgt een actie ervoor dat de input_boolean weer wordt uitgeschakeld, zodat ik de volgende dag opnieuw een bericht kan ontvangen en dus niet ieder uur tussen 13u en 17u het bericht ontvang.

  - service: input_boolean.turn_on
    entity_id: input_boolean.nordpool_message_sent

Het Resultaat

Dankzij deze automatisering weet ik wat de prijzen van morgen zijn en kan ik mijn nog niet zo slimme apparaten wel slim inplannen, zoals de vaatwasser of de wasmachine, op momenten dat de energieprijzen het laagst zijn. Dit is niet alleen goed voor mijn portemonnee, maar het helpt ook om het elektriciteitsnet minder te belasten tijdens piekuren.

Conclusie

Met een beetje creativiteit en de kracht van Home Assistant is het mogelijk om een echt slim huis te creëren dat niet alleen comfortabel is, maar ook bijdraagt aan een duurzamere wereld. Deze automatisering is slechts een klein voorbeeld van wat mogelijk is. Ik hoop dat het je inspireert om je eigen slimme huisoplossingen te ontwikkelen!

Did you find this article valuable?

Support Theo van der Sluijs Blog by becoming a sponsor. Any amount is appreciated!