Gå til indhold
← Alle indlæg

Elspotpriser i Home Assistant: sådan lader bilen i de billige timer

Energi Data Service til spotpriser i realtid, et trappediagram i ApexCharts og automatisk opladning af Škoda Elroq uden at røre appen.

2. maj 2025 Opdateret 24. oktober 2026
Elspotpriser i Home Assistant: sådan lader bilen i de billige timer

En nat i februar kostede strømmen 0,18 kr./kWh kl. 3 og 3,40 kr./kWh kl. 8. Næsten 20 gange så dyrt på fem timer. Lader bilen efter en fast natplan, er det rent held, hvilken ende af det spænd du rammer.

Home Assistant kan se timepriserne. Resten følger af sig selv.

Energi Data Service

Energi Data Service er et gratis offentligt dansk API, og der skal ingen nøgle til. Integrationen i HA henter dagens og morgendagens timepriser for dit prisområde (DK1 eller DK2).

Installer den fra HACS, tilføj den under Integrationer, og vælg dit område. Så får du:

sensor.energi_data_service    — aktuel timepris (kr/kWh inkl. moms)

Attributterne raw_today og raw_tomorrow indeholder døgnets priser som {hour, price}-objekter, hvor hour er et tidspunkt i ISO-format. Morgendagens priser kommer omkring kl. 13, når Nord Pool-auktionen er afgjort.

Diagrammet

custom:apexcharts-card (HACS) med typen column passer godt her: hver søjle gælder en hel time, og så skifter prisen. Farvegrænser gør de dyre timer tydelige:

type: custom:apexcharts-card
graph_span: 30h
now:
  show: true
  label: Nu
series:
  - entity: sensor.energi_data_service
    type: column
    data_generator: |
      return entity.attributes.raw_today
        .concat(entity.attributes.raw_tomorrow || [])
        .map(h => [new Date(h.hour).getTime(), h.price]);
    color_threshold:
      - value: 0
        color: '#4caf50'
      - value: 1.0
        color: '#ff9800'
      - value: 1.5
        color: '#f44336'

Grøn under 1 kr., orange op til 1,50 kr. og rød derover. concat-delen tager højde for, at morgendagens priser ikke findes endnu. Uden den fejler diagrammet om formiddagen uden at sige noget.

Det billigste vindue

Som template-sensor

En template-sensor, der finder de billigste to sammenhængende timer, der er tilbage i dag:

template:
  - triggers:
      - trigger: state
        entity_id: sensor.energi_data_service
      - trigger: time_pattern
        minutes: "/15"
    sensor:
      - name: "Billigste opladningsvindue"
        state: >
          {% set prices = state_attr('sensor.energi_data_service', 'raw_today') %}
          {% if prices %}
            {% set ns = namespace(best_hour=0, best_avg=999) %}
            {% for i in range(prices | length - 1) %}
              {% set avg = (prices[i].price + prices[i+1].price) / 2 %}
              {% if avg < ns.best_avg and as_datetime(prices[i].hour).hour >= now().hour %}
                {% set ns.best_avg = avg %}
                {% set ns.best_hour = as_datetime(prices[i].hour).hour %}
              {% endif %}
            {% endfor %}
            {{ '%02d:00' % ns.best_hour }}
          {% else %}
            ukendt
          {% endif %}

Den vises som 02:00 eller 14:00 på dashboardet. Opladningsautomationen bruger den ikke direkte, for den kører hver time og beslutter ud fra prisen lige nu. Men den er nyttig til at tjekke, at bilen lader på et fornuftigt tidspunkt.

De to triggere er der af en grund. En anden af mine template-sensorer løb prislisten igennem på samme måde, og den holdt op med at opdatere uden at skrive så meget som en linje i loggen. Den stod fast på sin første værdi i over to timer, mens priserne skiftede. Uden triggere skal Home Assistant selv finde ud af, hvilke entiteter skabelonen afhænger af, og med en løkke over prislisten gik det galt. Med triggerne bliver sensoren regnet ud igen, hver gang prissensoren ændrer sig, og ellers hvert kvarter.

Som et dashboard-kort

Vil du helt undgå template-sensoren, kan dette markdown-kort beregne og vise det billigste tidsrum direkte, også for i morgen, når morgendagens priser er kommet:

type: markdown
content: >
  {%- set d=state_attr("sensor.energi_data_service","raw_today") -%}
  {%- set r=state_attr("sensor.energi_data_service","raw_tomorrow") -%}
  {%- set tv=state_attr("sensor.energi_data_service","tomorrow_valid") -%}
  {%- set tm=d|map(attribute="price")|min -%}{%- set th=tm*1.25 -%}
  {%- set t=namespace(mi=0,s=0,e=0) -%}
  {%- for h in d -%}{%- if h.price==tm -%}{%- set t.mi=loop.index0 -%}{%- endif -%}{%- endfor -%}
  {%- set t.s=t.mi -%}{%- set t.e=t.mi -%}
  {%- for i in range(23) -%}{%- if t.s>0 and d[t.s-1].price<=th -%}{%- set t.s=t.s-1 -%}{%- endif -%}{%- endfor -%}
  {%- for i in range(23) -%}{%- if t.e<23 and d[t.e+1].price<=th -%}{%- set t.e=t.e+1 -%}{%- endif -%}{%- endfor -%}
  {%- set ts=t.s -%}{%- set te=t.e+1 -%}{%- set tmi=t.mi -%}
  {%- if tv and r -%}
  {%- set rm=r|map(attribute="price")|min -%}{%- set rh=rm*1.25 -%}
  {%- set n=namespace(mi=0,s=0,e=0) -%}
  {%- for h in r -%}{%- if h.price==rm -%}{%- set n.mi=loop.index0 -%}{%- endif -%}{%- endfor -%}
  {%- set n.s=n.mi -%}{%- set n.e=n.mi -%}
  {%- for i in range(23) -%}{%- if n.s>0 and r[n.s-1].price<=rh -%}{%- set n.s=n.s-1 -%}{%- endif -%}{%- endfor -%}
  {%- for i in range(23) -%}{%- if n.e<23 and r[n.e+1].price<=rh -%}{%- set n.e=n.e+1 -%}{%- endif -%}{%- endfor -%}
  {%- set rs=n.s -%}{%- set re=n.e+1 -%}{%- set rmi=n.mi -%}
  {%- endif -%}
  ⚡ **Billigste strøm**

  **I dag** · {{ "%02d:00"|format(ts) }}–{{ "%02d:00"|format(te) }} · lavest **{{ "%.2f"|format(tm)|replace(".",",") }} kr/kWh** kl. {{ "%02d:00"|format(tmi) }}
  {%- if tv and r %}

  **I morgen** · {{ "%02d:00"|format(rs) }}–{{ "%02d:00"|format(re) }} · lavest **{{ "%.2f"|format(rm)|replace(".",",") }} kr/kWh** kl. {{ "%02d:00"|format(rmi) }}
  {%- endif %}

  💡 Start opvaskemaskinen eller vaskemaskinen midt på dagen for at spare mest

Logikken: find dagens laveste pris, og udvid tidsrummet med alle tilstødende timer, der ligger højst 25 % over den. Kortet opdaterer sig selv, når sensoren ændrer sig, så der skal ingen separat automation til.

Automationen, der styrer opladningen

Automationen bruger switch.skoda_elroq_charging fra MySkoda-integrationen (HACS) til at starte og stoppe opladningen.

alias: Elroq — Smart opladning
trigger:
  - platform: time_pattern
    minutes: "0"
condition:
  - condition: state
    entity_id: binary_sensor.skoda_elroq_charger_connected
    state: "on"
  - condition: numeric_state
    entity_id: sensor.skoda_elroq_battery_level
    below: 90
action:
  - choose:
      - conditions:
          - condition: numeric_state
            entity_id: sensor.energi_data_service
            below: 1.0
        sequence:
          - service: switch.turn_on
            target:
              entity_id: switch.skoda_elroq_charging
      - conditions:
          - condition: numeric_state
            entity_id: sensor.energi_data_service
            above: 1.5
        sequence:
          - service: switch.turn_off
            target:
              entity_id: switch.skoda_elroq_charging

Under 1,00 kr.: lad. Over 1,50 kr.: stop. Midt imellem: rør den ikke. Det tomme interval er med vilje. Uden det ville kontakten skifte frem og tilbage hver time, når prisen ligger lige omkring grænsen.

Med input_boolean.elroq_force_charge kan jeg tvinge opladningen igennem de morgener, hvor jeg har brug for fuldt batteri, uanset prisen.

Virker det?

Første hele måned: cirka 28 % lavere udgift til opladning end ved opladning hele natten. Besparelsen kommer næsten kun fra de nætter, hvor priserne svinger meget. Der er uger i Danmark, hvor forskellen er lille, og automationen ikke gør nogen forskel.

Det, jeg ikke havde forventet, var, at det ændrede, hvordan jeg tænker på de andre apparater. Elprisdiagrammet er nu et af de kort, jeg kigger mest på, og siden har jeg tilføjet kortet ovenfor, der selv viser det bedste tidspunkt at starte opvaskemaskinen eller vaskemaskinen. Den ændrede vane sparer sandsynligvis mere end den automatiske opladning af bilen.

Nye indlæg direkte i din RSS-læser: følg med via RSS I Google-søgning: vælg szimnau.dk som foretrukken kilde