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.
- eigener openHAB-Endpunkt für sauberes Nutzungs-Tracking
- Copy-Paste-Beispiele für Thing, Items und optionale Meta-Felder
- aktueller Preis, aktuelles CO2 und klare Felder für aktive oder kommende beste Fenster
Du brauchst keine Spezialintegration. Für den Einstieg reicht in openHAB das HTTP Binding zusammen mit der JSONPATH-Transformation.
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=4flat.current_price, flat.is_cheapest_window_now und price.next_full_window für robuste Regeln.flat.current_co2_g_kwh, flat.is_greenest_window_now und co2.best_window.meta.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 |
|---|---|---|
flat | Die 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. |
price | Aktueller Preis-Slot sowie best_window und next_full_window als strukturierte Blöcke. | Mehr Kontext für Regeln und Visualisierung. |
co2 | Aktueller CO2-Wert sowie best_window und next_full_window für CO2. | Für ökologisch orientierte Logik. |
combined | Ein kombiniertes Preis/CO2-Fenster. | Wenn du nicht selbst gewichten willst. |
source | Metadaten darüber, ob Preiswerte aus Day-Ahead oder Forecast stammen. | Wichtig zum Einordnen und Debuggen. |
meta | Zugriffs- 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.
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.meta.allowed_horizon_hours.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
- In openHAB das HTTP Binding und JSONPATH installieren.
- Eine Datei
strompreisvorhersage.thingsanlegen und den Thing-Block unten einfügen. - Eine Datei
strompreisvorhersage.itemsanlegen und den Item-Block unten einfügen. - Dateien speichern und openHAB neu laden. Danach sollten die Items Werte haben.
country=de. Für Dänemark immer dk1 oder dk2 verwenden.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_state | missing, valid, inactive oder ein anderer Fehlerstatus. | Schnell sehen, ob ein hinterlegter Key wirklich greift. |
meta.allowed_horizon_hours | Der serverseitig erlaubte Maximalhorizont für diesen Zugriff. | Prüfen, ob dein Plan oder Key mehr als 48 Stunden freischaltet. |
meta.used_horizon_hours | Der tatsächlich für die Antwort verwendete Horizont. | Erkennen, wenn eine Anfrage serverseitig gekürzt wurde. |
flat.is_cheapest_window_now | true, wenn das beste Preisfenster bereits läuft. | Saubere Automationsbedingung statt nur auf eine Startzeit zu warten. |
flat.cheapest_window_remaining_minutes | Restlaufzeit des aktuell besten Preisfensters. | Geräte nur so lange laufen lassen, wie das Fenster noch aktiv ist. |
price.best_window | Bestes Preisfenster im Horizont, auch wenn es schon aktiv ist. | Hauptquelle für Automation. |
price.next_full_window | Nächstes vollständiges Preisfenster, das erst in der Zukunft beginnt. | Planung und Visualisierung. |
meta.rate_limit_daily | Tageslimit für diesen Zugriff. | Sauberes Monitoring pro Integration oder Kunde. |
meta.used_calls_today | Wie viele Requests der Key heute schon verbraucht hat. | Support und Limits verständlich machen. |
meta.features | Welche 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.