openHAB · Preis und CO2

Strompreis und CO2 in openHAB nutzen, ohne eigenes Add-on

Für openHAB reicht ein normaler HTTP-Abruf mit JSONPATH. Die Seite ist absichtlich so aufgebaut, dass du direkt mit einer Thing-Datei und einer Item-Datei starten kannst.

Wichtiger Punkt

Du brauchst keine Spezialintegration. Für den Einstieg reicht in openHAB das HTTP Binding zusammen mit der JSONPATH-Transformation.

Was vorher installiert sein muss

Installiere in openHAB das HTTP Binding und die JSONPATH Transformation. Ohne JSONPATH bleiben die Felder leer, obwohl der Endpunkt selbst funktioniert.

Empfohlener Endpunkt

Für openHAB gibt es einen eigenen Pfad. Technisch liefert er dieselbe kompakte Summary wie andere Automationen, aber der Traffic lässt sich dadurch sauber getrennt auswerten.

https://api.energypriceforecast.eu/api/v1/openhab/summary?country=de&hours=48&window_hours=4
Preisflat.current_price, flat.is_cheapest_window_now und price.next_full_window für robuste Regeln.
CO2flat.current_co2_g_kwh, flat.is_greenest_window_now und co2.best_window.
Metameta.allowed_horizon_hours, meta.used_calls_today und weitere API-Hinweise.

Was die API genau liefert

Der openHAB-Pfad liefert keine Spezialstruktur nur für openHAB, sondern eine kompakte Automation-Summary. Genau das ist der Vorteil: dieselben Kerninfos bleiben auch außerhalb von openHAB lesbar und testbar.

Teil Was darin steckt Wofür es nützlich ist
flatDie einfachsten Felder wie aktueller Preis, aktuelles CO2, Boolean-Felder für aktive beste Fenster und Restlaufzeiten.Perfekt für den schnellen Einstieg ohne viel Parsing.
priceAktueller Preis-Slot sowie best_window und next_full_window als strukturierte Blöcke.Mehr Kontext für Regeln und Visualisierung.
co2Aktueller CO2-Wert sowie best_window und next_full_window für CO2.Für ökologisch orientierte Logik.
combinedEin kombiniertes Preis/CO2-Fenster.Wenn du nicht selbst gewichten willst.
sourceMetadaten darüber, ob Preiswerte aus Day-Ahead oder Forecast stammen.Wichtig zum Einordnen und Debuggen.
metaZugriffs- und Vertragsinfos wie API-Key-Status, erlaubter Horizont und Tageszähler.Hilft bei Support, Limits und sauberem Nutzer-Tracking.

Zeitraum und Auflösung

Das Beispiel nutzt hours=48 und window_hours=4. Das ist nur ein Startwert, nicht die gesamte technische Obergrenze.

Angefragter ZeitraumMit hours legst du fest, wie weit die API in die Zukunft schauen soll. Öffentlich belastbar kommunizieren wir für die Preisprognose aktuell maximal 120 Stunden.
Tatsächlich erlaubtOhne API-Key ist der aktuelle Free-Zugriff serverseitig auf 48 Stunden begrenzt. Mit Key kann mehr erlaubt sein, aber mehr als 120 Stunden Preisprognose sollten aktuell nicht als verlässliche öffentliche Zusage verstanden werden. Maßgeblich ist immer meta.allowed_horizon_hours.
Fenster-SucheDas beste 4-Stunden-Fenster wird standardmäßig im nächsten 24-Stunden-Horizont gesucht. Wenn du mehr willst, erhöhe zusätzlich summary_hours.

Wichtig: source.price.day_ahead_entries und source.price.forecast_entries zählen Slots, nicht Stunden. Wenn Day-Ahead in Viertelstunden kommt, sind Werte wie 97 oder 132 plausibel. Ein forecast_entries von 0 ist ebenfalls möglich, wenn der angefragte Zeitraum aktuell schon vollständig durch veröffentlichte Day-Ahead-Slots abgedeckt wird.

Schnellstart für Copy-Paste

  1. In openHAB das HTTP Binding und JSONPATH installieren.
  2. Eine Datei strompreisvorhersage.things anlegen und den Thing-Block unten einfügen.
  3. Eine Datei strompreisvorhersage.items anlegen und den Item-Block unten einfügen.
  4. Dateien speichern und openHAB neu laden. Danach sollten die Items Werte haben.
Für Einsteiger gedachtDas Grundbeispiel nutzt absichtlich nur vier Felder, die in fast jedem Setup sofort verständlich sind.
Was du anpassen musstMeist nur country=de. Für Dänemark immer dk1 oder dk2 verwenden.
Was du danach siehstAktueller Preis, aktuelle CO2-Intensität, ob das beste Fenster gerade aktiv ist, und sonst der nächste vollständige Start in der Zukunft.

Thing-Datei für openHAB

Diese Variante läuft ohne API-Key und fragt die Daten alle 15 Minuten ab.

Thing http:url:strompreisvorhersage "StrompreisVorhersage" [
  baseURL="https://api.energypriceforecast.eu/api/v1/openhab/summary?country=de&hours=48&window_hours=4",
  refresh=900
] {
  Channels:
    Type number : currentPrice "Aktueller Preis" [ stateTransformation="JSONPATH($.flat.current_price)" ]
    Type number : currentCo2 "Aktuelle CO2-Intensität" [ stateTransformation="JSONPATH($.flat.current_co2_g_kwh)" ]
    Type string : cheapestWindowStart "Günstigstes Fenster Start" [ stateTransformation="JSONPATH($.flat.cheapest_window_start)" ]
    Type string : greenestWindowStart "Grünstes Fenster Start" [ stateTransformation="JSONPATH($.flat.greenest_window_start)" ]
    Type string : isCheapestWindowNow "Bestes Preisfenster läuft jetzt" [ stateTransformation="JSONPATH($.flat.is_cheapest_window_now)" ]
    Type number : cheapestWindowRemainingMinutes "Bestes Preisfenster Restlaufzeit" [ stateTransformation="JSONPATH($.flat.cheapest_window_remaining_minutes)" ]
    Type string : nextFullCheapestWindowStart "Nächstes vollständiges Preisfenster" [ stateTransformation="JSONPATH($.price.next_full_window.start)" ]
}

Wenn du lieber einen anderen Markt willst, ändere nur den Parameter country in der URL.

Optional mit eigenem API-Key

Für Nutzer-Tracking, höhere Limits oder spätere Produktstufen kannst du denselben Abruf mit einem Bearer-Token versehen. In openHAB geht das direkt über den Header des HTTP Things.

Thing http:url:strompreisvorhersage "StrompreisVorhersage" [
  baseURL="https://api.energypriceforecast.eu/api/v1/openhab/summary?country=de&hours=72&window_hours=4",
  refresh=900,
  headers="Authorization=Bearer DEIN_API_KEY"
] {
  Channels:
    Type number : currentPrice "Aktueller Preis" [ stateTransformation="JSONPATH($.flat.current_price)" ]
    Type number : currentCo2 "Aktuelle CO2-Intensität" [ stateTransformation="JSONPATH($.flat.current_co2_g_kwh)" ]
    Type string : apiKeyState "API-Key-Status" [ stateTransformation="JSONPATH($.meta.api_key_state)" ]
    Type number : allowedHorizon "Erlaubter Horizont" [ stateTransformation="JSONPATH($.meta.allowed_horizon_hours)" ]
    Type number : usedCallsToday "Verbrauchte Calls heute" [ stateTransformation="JSONPATH($.meta.used_calls_today)" ]
}

Wenn du keinen eigenen Key hast, lass den Header einfach weg. Die Basisnutzung funktioniert weiterhin ohne Key.

Item-Datei für openHAB

Diese Items binden die wichtigsten Kanäle direkt ein.

Number Strompreis_Aktuell "Aktueller Preis [%.4f EUR/kWh]" { channel="http:url:strompreisvorhersage:currentPrice" }
Number Strompreis_CO2 "Aktuelle CO2-Intensität [%.1f gCO2/kWh]" { channel="http:url:strompreisvorhersage:currentCo2" }
String Strompreis_Guenstigstes_Fenster_Start "Günstigstes Fenster Start [%s]" { channel="http:url:strompreisvorhersage:cheapestWindowStart" }
String Strompreis_Gruenstes_Fenster_Start "Grünstes Fenster Start [%s]" { channel="http:url:strompreisvorhersage:greenestWindowStart" }
String Strompreis_Bestes_Fenster_Jetzt "Bestes Preisfenster läuft jetzt [%s]" { channel="http:url:strompreisvorhersage:isCheapestWindowNow" }
Number Strompreis_Bestes_Fenster_Restminuten "Bestes Preisfenster Restlaufzeit [%.0f min]" { channel="http:url:strompreisvorhersage:cheapestWindowRemainingMinutes" }
String Strompreis_Naechstes_Vollfenster_Start "Nächstes vollständiges Preisfenster [%s]" { channel="http:url:strompreisvorhersage:nextFullCheapestWindowStart" }

Wenn du die Meta-Kanäle aus dem API-Key-Beispiel mitnimmst, kannst du dafür zusätzlich passende Number- oder String-Items anlegen.

Für Automationen: nicht nur auf Startzeiten warten

Für reine Anzeige reicht cheapest_window_start. Für Automationen ist aber meist wichtiger, ob das rechnerisch beste Fenster bereits läuft. Genau dafür ist flat.is_cheapest_window_now gedacht. Wenn der Wert true ist, musst du nicht auf eine künftige Startzeit triggern.

rule "Verbraucher im besten Preisfenster freigeben"
when
  Time cron "0 */5 * * * ?"
then
  if (Strompreis_Bestes_Fenster_Jetzt.state.toString == "true") {
    // Gerät einschalten oder Freigabe setzen
  }
end

Pragmatische Regel: price.next_full_window.start ist gut für Planung. flat.is_cheapest_window_now ist besser für die eigentliche Laufentscheidung.

Welche Meta-Felder du kennen solltest

Feld Bedeutung Typischer Einsatz
meta.api_key_statemissing, valid, inactive oder ein anderer Fehlerstatus.Schnell sehen, ob ein hinterlegter Key wirklich greift.
meta.allowed_horizon_hoursDer serverseitig erlaubte Maximalhorizont für diesen Zugriff.Prüfen, ob dein Plan oder Key mehr als 48 Stunden freischaltet.
meta.used_horizon_hoursDer tatsächlich für die Antwort verwendete Horizont.Erkennen, wenn eine Anfrage serverseitig gekürzt wurde.
flat.is_cheapest_window_nowtrue, wenn das beste Preisfenster bereits läuft.Saubere Automationsbedingung statt nur auf eine Startzeit zu warten.
flat.cheapest_window_remaining_minutesRestlaufzeit des aktuell besten Preisfensters.Geräte nur so lange laufen lassen, wie das Fenster noch aktiv ist.
price.best_windowBestes Preisfenster im Horizont, auch wenn es schon aktiv ist.Hauptquelle für Automation.
price.next_full_windowNächstes vollständiges Preisfenster, das erst in der Zukunft beginnt.Planung und Visualisierung.
meta.rate_limit_dailyTageslimit für diesen Zugriff.Sauberes Monitoring pro Integration oder Kunde.
meta.used_calls_todayWie viele Requests der Key heute schon verbraucht hat.Support und Limits verständlich machen.
meta.featuresWelche Antwortfähigkeiten in dieser Response tatsächlich geliefert wurden.Debugging, wenn du zwischen Summary und Serien-Daten unterscheidest.

Caching und Fehlerfälle

Wie oft sollte openHAB abrufen?

Ein Intervall von 15 Minuten ist für den Einstieg sinnvoll. Die Summary ist kein Sekundendaten-Feed. Kürzere Polling-Intervalle erhöhen nur die Last und helfen in der Praxis selten.

Was bedeutet 401?

Der API-Key fehlt, ist falsch oder wurde deaktiviert. Öffne die URL testweise im Browser oder mit einem Tool wie curl und prüfe den Authorization-Header.

Was bedeutet 403?

Der Zugriff ist grundsätzlich erkannt, aber für Route, Markt oder Vertragszustand nicht erlaubt. Das ist kein Tippfehler, sondern eine serverseitige Freigabeentscheidung.

Was bedeutet 429?

Das Tageslimit für diesen Zugriff ist erreicht. Genau dafür sind meta.rate_limit_daily und meta.used_calls_today nützlich.

Kleine Testphase

Für die neue openHAB-Anbindung läuft aktuell eine kleine Testphase. Gesucht sind vor allem Rückmeldungen aus echten Installationen: Ist die Copy-Paste-Anleitung klar genug, greifen die JSONPATH-Felder sauber und ist das Verhalten der API im Alltag nachvollziehbar?

Wenn du openHAB aktiv nutzt und das testen möchtest, schreib kurz mit deinem Setup und Markt an StrompreisVorhersage@proton.me. Die ersten Tests werden bewusst noch persönlich begleitet.

Verwandt: Home Assistant, ioBroker und Node-RED.