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:
{% 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 sensorsensor.nordpool_kwh_nl_eur_5_10_0
. Deze data bevat de stroomprijzen voor de volgende dag.
- Deze regel haalt de gegevens op van de
{% 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.
- Hier wordt een 'namespace' object aangemaakt met een lege lijst genaamd
{% for i in range(12) %}
:- Deze 'for'-lus loopt door 12 uur van de
raw_data
.
- Deze 'for'-lus loopt door 12 uur van de
{% 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.
{% if start1 is string %}
:- Deze 'if'-conditie controleert of de
start
waarde een string is.
- Deze 'if'-conditie controleert of de
{% 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).
- Als
{% 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.
- Als
{% 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).
{% 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.
{% set ns.rows = ns.rows + [row] %}
:- Elke geformatteerde rij wordt toegevoegd aan de
rows
lijst in de 'namespace'.
- Elke geformatteerde rij wordt toegevoegd aan de
{% endfor %}
:- Dit markeert het einde van de 'for'-lus.
{{ 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.
- Ten slotte wordt de lijst van rijen samengevoegd tot één enkele string, gescheiden door nieuwe regels (
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!