Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Connection to Ostrom #11148

Closed
umrath opened this issue Dec 19, 2023 · 55 comments
Closed

Connection to Ostrom #11148

umrath opened this issue Dec 19, 2023 · 55 comments

Comments

@umrath
Copy link

umrath commented Dec 19, 2023

Much like Tibber, Ostrom provides hourly tariffs with variable prices.
I would very much like to see this getting integrated into evcc, if possible.

Link to the API: https://docs.ostrom-api.io/reference/introduction

@andig
Copy link
Member

andig commented Dec 20, 2023

Das bräuchte Api Credentials.

@umrath
Copy link
Author

umrath commented Dec 20, 2023

Ist das ein Problem?
Als Entwickler kann man die relativ problemlos anfragen (der Ostrom-Support ist üblicherweise ziemlich responsiv). Und bei Tibber geht das ja ziemlich ähnlich.

Als Nutzer brauche ich für andere Dienste ja teilweise auch Zugangsdaten, die ich mir auch relativ problemlos über die App holen kann.

@andig
Copy link
Member

andig commented Dec 20, 2023

Kein Problem- muss nur jemand machen und zur Verfügung stellen.

@andig andig closed this as completed Dec 26, 2023
@habz0c
Copy link

habz0c commented Jan 29, 2024

Hi,
ich bin neu hier.
Hoffe es entspricht der Etiquette, wenn ich schreibe, dass auch ich mich freuen würde Ostrom integriert zu wissen im evcc.
In dem Blogbeitrag „Feature Highlights 10/2023“ hat der Michael beim Punkt -Smartes Netzladen- dazu aufgefordert ein issue zu eröffnen, sofern ein dynamischer Stromtarif noch nicht unterstützt ist, wenn dieser aber eine Schnittstelle bietet.
Wie eingangs erwähnt, ich bin neu hier und weiß nun nicht ob die von „umrath“ genannte API Doku jene Schnittstelle darstellt, welche das evcc-Team benötigt.
Bin aufjedenfall sehr dankbar für das starke evcc-Tool!!

@andig
Copy link
Member

andig commented Jan 29, 2024

Danke. Am letzen Zustand bzgl. Anforderungen hat sich allerdings nichts geändert, s.o.

@umrath
Copy link
Author

umrath commented Jan 29, 2024

Ich verstehe allerdings nicht ganz, was an den Voraussetzungen nicht erfüllt ist.
Eine offene Schnittstelle ist doch vorhanden.

@andig
Copy link
Member

andig commented Jan 29, 2024

#11148 (comment)

@umrath
Copy link
Author

umrath commented Jan 29, 2024

Genau das verstehe ich nicht.
Eine Mail an partner@ostrom.de sollte doch völlig genügen.

@andig
Copy link
Member

andig commented Jan 30, 2024

#11148 (comment)

@habz0c
Copy link

habz0c commented Jan 30, 2024

Alles klar. Habe da mal ganz freundlich eine Nachricht hinterlassen. Vielleicht melden die sich ja.
Sobald die es tun, gebe ich hier ein Zeichen.

@kallelix
Copy link

@habz0c haben sie es getan?

@habz0c
Copy link

habz0c commented Feb 15, 2024

Nein

@umrath
Copy link
Author

umrath commented Mar 1, 2024

Noch immer nicht?
Sonst würde ich mal nachhaken. Bisher war der Support immer sehr auf zack.

@habz0c
Copy link

habz0c commented Mar 1, 2024

Leider noch immer keine Antwort von denen.

@kallelix
Copy link

kallelix commented Mar 1, 2024

Ich habe mir die API (https://docs.ostrom-api.io/reference/introduction) mal angeschaut.

Ich bin mir garnicht sicher, ob wir hier mit den "partner" api credentials richtig fahren. Die persönlichen credentials für jeden Nutzer wären ja richtiger, da ja jede evcc Instanz selbständig die Tarife abruft. Der partner Zugriff hat hier ja eher eine andere Zielgruppe.

Dazu kommt das die API bzgl. Tarife sehr wenig kann. Ich weiß nicht was die anderen Anbieter hier liefern, aber ostrom liefert hier scheinbar einfach nur die spot Preise, welche ja eher generisch sind. Zumindest mit einem call gegen die Sandbox https://sandbox.ostrom-api.io ist das so. Ich müsste mir mein persönliches Netzentgeld/Steuern etc. sowieso dazu addieren. In der Hinsicht macht es ja kaum Sinn x APIs von x Stromanbietern zu integrieren die alle nur die spot Preise liefern.

Ich kann leider noch nicht gegen die produktive API testen, da mein Lieferbeginn erst am 1.4. ist. Zur Zeit sagt die produktive Umgebung nur: "kein aktiver Vertrag"

Btw. könnte ich credentials für die sandbox zur Verfügung stellen.

@arboeh
Copy link

arboeh commented Mar 16, 2024

Ich bin auch sehr an einer Integration interessiert und werde mir die API auch mal ansehen. Ab Mai bin ich auch Kunde von Ostrom.
Wer an einem Referral Code interessiert ist, kann mich gerne über Telegram unter @arend_boehmer oder per Mail kontaktieren.

@kallelix
Copy link

Ich werde Anfang April, wenn mein Vertrag dann läuft, einen PR dafür machen können. Im Grunde ist das aktuell etwas sinnfrei, weil die API relativ exakt das liefert, was auch die awattar API liefert. Man könnte also auch einfach die awattar API für eine Strompreisindikation verwenden (die benötigt keinen Authentifizierung). Es sind eben einfach nur die EPEX SPOT Preise für MWh bzgl. Tageszeit gemittelt über alle Strombörsen in Europa.

Ich denke der Strommarkt muss sich aber hier weiter entwickeln und es müssen die Regionen wo der Strom erzeugt und abgenommen wird mit in den Preis einfließen. So könnten die APIs pro Stromanbieter irgendwann dann wieder Sinn machen.

Im Grunde muss hier aber evcc sagen wo die Reise hingehen soll. Es müssen in Deutschland ab 2025 alle Energieanbieter gesetzlich verpflichtend dynamische Stromtarife anbieten. Es ist unrealistisch für alle eine API zu implementieren.

@arend-boehmer
Copy link

Okay, Evtl. könnte man die verschiedenen dynamischen Tarife aus den Anbieter-APIs zukünftig als Plugins einbinden, aber das wird @andig besser beurteilen können.

@habz0c
Copy link

habz0c commented Apr 1, 2024

Nabend,
Wenn ich da so lese stellt sich mir die Frage ob es möglich ist die Werte von EPEX direkt abzurufen.

@kallelix
Copy link

kallelix commented Apr 1, 2024

Die APIs von netztransparenz.de könnte hier eine sinnvolle Anlaufstelle sein. Das scheint ein Projekt der Übertragungsnetzbetreiber zu sein.

@arboeh
Copy link

arboeh commented Apr 1, 2024

Nabend, Wenn ich da so lese stellt sich mir die Frage ob es möglich ist die Werte von EPEX direkt abzurufen.

Die Idee hatte ich auch schon. Es gibt für Home Assistant schon eine fertige Integration: https://github.com/mampfes/ha_epex_spot

Screenshot_20240401-223020

@andig
Copy link
Member

andig commented Apr 1, 2024

Ich verstehe die Diskusssion nicht. Reicht Entso-E nicht?

@kallelix
Copy link

kallelix commented Apr 1, 2024

Ich denke schon, dass das reicht. Leider war das für mich nicht offensichtlich und damit scheine ich ja nicht alleine zu sein.

@andig
Copy link
Member

andig commented Apr 1, 2024

Wir sind noch nicht gut darin, die verfügbaren Tarife zu vermarkten.

/cc @naltatis

@habz0c
Copy link

habz0c commented Apr 2, 2024

Dann ist ja vorerst alles geklärt. Danke euch. :)

@arboeh
Copy link

arboeh commented Apr 2, 2024

Ich denke schon, dass das reicht. Leider war das für mich nicht offensichtlich und damit scheine ich ja nicht alleine zu sein.

Ebenso... 😂

@andig
Copy link
Member

andig commented Jun 2, 2024

Zwischenzeitlich können „custom“ Tarife auch selbst per Template implementiert werden.

@AndyKausG
Copy link

Huhu Leute, ich bin auch Ostrom Kunde und baue eventuell selbst noch eine Integration für HASIO. Aber ich hab nun auch mal EVCC angeschaut und finde das recht nett. Vielleicht kann man ja auch hier eine Preisabfrage für Ostrom mit einbauen?
Die API ist recht einfach. Rest API mit Bearer Token und dann muss man die Preise abfragen. Dann muss man nicht zwei Werte aus dem Preisarray addieren. Und hat bereits den Endkundenpreis inkl. Netzgebühr.... hab das mit dem Ostrom Support validiert.

@andig
Copy link
Member

andig commented Jun 5, 2024

Ja, kann man 👍🏻

@naltatis
Copy link
Member

naltatis commented Jun 5, 2024

Ja, sollten wir nutzen. Die werden inzwischen ja auch automatisch in der Doku angezeigt. Das macht's für neue Nutzer viel einfacher. Und wir haben dann gleich die Grundlage für die UI.

https://docs.evcc.io/docs/devices/tariffs

@premultiply
Copy link
Member

Hab mal einen groben Entwurf erstellt: #14206

@Dici71
Copy link

Dici71 commented Jun 14, 2024

Zwischenzeitlich können „custom“ Tarife auch selbst per Template implementiert werden.

Ja, das funktioniert.

Statischer Tarif (monatlich):

tariffs:
  currency: EUR
  grid:
    type: custom
    price:
      source: http
      uri: https://api.ostrom.de/v1/tariffs/city-id?cityId=11111&usage=1000
      jq: .ostrom[0].workingPriceBrutto
      scale: 0.01

Dynamischer Tarif (stündlich):

tariffs:
  currency: EUR
  grid:
    type: custom
    forecast:
      source: http
      uri: https://api.ostrom.de/v1/spot-prices/ostrom-product-tariff?cityId=11111&postalCode=55555
      jq: '.day.prices[ ] | {start: .date, price: .priceWithTaxesAndLevies}'

Zwischenzeitlich können „custom“ Tarife auch selbst per Template implementiert werden.

Ja, das funktioniert.

Statischer Tarif (monatlich):

tariffs:
  currency: EUR
  grid:
    type: custom
    price:
      source: http
      uri: https://api.ostrom.de/v1/tariffs/city-id?cityId=11111&usage=1000
      jq: .ostrom[0].workingPriceBrutto
      scale: 0.01

Dynamischer Tarif (stündlich):

tariffs:
  currency: EUR
  grid:
    type: custom
    forecast:
      source: http
      uri: https://api.ostrom.de/v1/spot-prices/ostrom-product-tariff?cityId=11111&postalCode=55555
      jq: '.day.prices[ ] | {start: .date, price: .priceWithTaxesAndLevies}'

Bei mir will der Server mit den Anpassungen in der Config einfach nicht mehr starten

Error during startup. Check your configuration and restart.
cannot create tariff type 'custom': jq: query failed: cannot iterate over: null

@arboeh
Copy link

arboeh commented Jun 14, 2024

Es darf nur ein "type: custom" eingebunden werden. "forecast" ODER "price", also entweder "statischer Tarif" ODER "dynamischer Tarif". Die URL-Parameter "cityId" und "postalCode" müssen individuell angepasst werden.
Ich bekomme im Moment beim Abruf des dynamischen Tarifs aber auch einen Fehler:
cannot create tariff type 'custom': jq: too many results
Das müsste ich mir genauer angucken.

@Dici71
Copy link

Dici71 commented Jun 14, 2024

Es darf nur ein "type: custom" eingebunden werden. "forecast" ODER "price", also entweder "statischer Tarif" ODER "dynamischer Tarif". Die URL-Parameter "cityId" und "postalCode" müssen individuell angepasst werden. Ich bekomme im Moment beim Abruf des dynamischen Tarifs aber auch einen Fehler: cannot create tariff type 'custom': jq: too many results Das müsste ich mir genauer angucken.

Vielen Dank für dein Feedback.....

ich habe im Grunde nur die 2. Konfiguration genutzt, die sich auf den dynamischen Tarif bezieht...die Fehlermeldung bezieht sich auch auf diese Zeile:
jq: '.day.prices[ ] | {start: .date, price: .priceWithTaxesAndLevies}'

P.S. was ist mit CityID gemeint ?

Gruß

@arboeh
Copy link

arboeh commented Jun 14, 2024

Es darf nur ein "type: custom" eingebunden werden. "forecast" ODER "price", also entweder "statischer Tarif" ODER "dynamischer Tarif". Die URL-Parameter "cityId" und "postalCode" müssen individuell angepasst werden. Ich bekomme im Moment beim Abruf des dynamischen Tarifs aber auch einen Fehler: cannot create tariff type 'custom': jq: too many results Das müsste ich mir genauer angucken.

Vielen Dank für dein Feedback.....

ich habe im Grunde nur die 2. Konfiguration genutzt, die sich auf den dynamischen Tarif bezieht...die Fehlermeldung bezieht sich auch auf diese Zeile: jq: '.day.prices[ ] | {start: .date, price: .priceWithTaxesAndLevies}'

P.S. was ist mit CityID gemeint ?

Gruß

Guck mal auf https://www.ostrom.de/ und gib deine Daten für die Berechnung deines Tarifs ein. Wenn man dann auf "Tarif berechnen" klickt, wird man auf eine Seite weitergeleitet und in der Adresszeile steht dann etwas wie:
https://join.ostrom.de/tariff-plan?usage=1000&cityId=11111&postalCode=55555&cityName=Musterstadt&language=de_DE
Da siehst du dann deine cityId.

@Dici71
Copy link

Dici71 commented Jun 14, 2024

Es darf nur ein "type: custom" eingebunden werden. "forecast" ODER "price", also entweder "statischer Tarif" ODER "dynamischer Tarif". Die URL-Parameter "cityId" und "postalCode" müssen individuell angepasst werden. Ich bekomme im Moment beim Abruf des dynamischen Tarifs aber auch einen Fehler: cannot create tariff type 'custom': jq: too many results Das müsste ich mir genauer angucken.

Vielen Dank für dein Feedback.....
ich habe im Grunde nur die 2. Konfiguration genutzt, die sich auf den dynamischen Tarif bezieht...die Fehlermeldung bezieht sich auch auf diese Zeile: jq: '.day.prices[ ] | {start: .date, price: .priceWithTaxesAndLevies}'
P.S. was ist mit CityID gemeint ?
Gruß

Guck mal auf https://www.ostrom.de/ und gib deine Daten für die Berechnung deines Tarifs ein. Wenn man dann auf "Tarif berechnen" klickt, wird man auf eine Seite weitergeleitet und in der Adresszeile steht dann etwas wie: https://join.ostrom.de/tariff-plan?usage=1000&cityId=11111&postalCode=55555&cityName=Musterstadt&language=de_DE Da siehst du dann deine cityId.

Oh ja....da muss man erstmal drauf kommen ;-))

An der Fehlermeldung ändert sich allerdings dadurch nichts ;-(

@arboeh
Copy link

arboeh commented Jun 17, 2024

Es darf nur ein "type: custom" eingebunden werden. "forecast" ODER "price", also entweder "statischer Tarif" ODER "dynamischer Tarif". Die URL-Parameter "cityId" und "postalCode" müssen individuell angepasst werden. Ich bekomme im Moment beim Abruf des dynamischen Tarifs aber auch einen Fehler: cannot create tariff type 'custom': jq: too many results Das müsste ich mir genauer angucken.

Vielen Dank für dein Feedback.....
ich habe im Grunde nur die 2. Konfiguration genutzt, die sich auf den dynamischen Tarif bezieht...die Fehlermeldung bezieht sich auch auf diese Zeile: jq: '.day.prices[ ] | {start: .date, price: .priceWithTaxesAndLevies}'
P.S. was ist mit CityID gemeint ?
Gruß

Guck mal auf https://www.ostrom.de/ und gib deine Daten für die Berechnung deines Tarifs ein. Wenn man dann auf "Tarif berechnen" klickt, wird man auf eine Seite weitergeleitet und in der Adresszeile steht dann etwas wie: https://join.ostrom.de/tariff-plan?usage=1000&cityId=11111&postalCode=55555&cityName=Musterstadt&language=de_DE Da siehst du dann deine cityId.

Oh ja....da muss man erstmal drauf kommen ;-))

An der Fehlermeldung ändert sich allerdings dadurch nichts ;-(

I tried it in https://jqkungfu.com/ and it works. Error using this in evcc is
jq: too many results
Resultset is an array with 24 entries, but "too many" is relative :-)

@andig
Copy link
Member

andig commented Jun 17, 2024

Sounds like a peoblem with the query, not the amount of data.

@arboeh
Copy link

arboeh commented Jun 17, 2024

This gives back valid data format in online jq tester, but doesn't work in evcc:
'[.day.prices[ ] | {start: .date, price: .priceWithTaxesAndLevies}]' -> invalid character 'm' looking for beginning of value

@andig
Copy link
Member

andig commented Jun 17, 2024

Thats a different error? What's the data? As usual, log files are king.

@arboeh
Copy link

arboeh commented Jun 17, 2024

Data is:

{
  "day": {
    "averagePrice": 30.38,
    "prices": [
      {
        "date": "2024-06-17T00:00:00.000Z",
        "dateUTC": "2024-06-16T22:00:00.000Z",
        "price": 7.67,
        "grossKwhPrice": 9.12,
        "mWhPriceInEuros": 76.62,
        "hour": "00",
        "taxesAndLevies": 20.59,
        "priceWithTaxesAndLevies": 28.26
      },
      {
        "date": "2024-06-17T01:00:00.000Z",
        "dateUTC": "2024-06-16T23:00:00.000Z",
        "price": 6.68,
        "grossKwhPrice": 7.95,
        "mWhPriceInEuros": 66.73,
        "hour": "01",
        "taxesAndLevies": 20.41,
        "priceWithTaxesAndLevies": 27.09
      },
      {
        "date": "2024-06-17T02:00:00.000Z",
        "dateUTC": "2024-06-17T00:00:00.000Z",
        "price": 6.89,
        "grossKwhPrice": 8.19,
        "mWhPriceInEuros": 68.81,
        "hour": "02",
        "taxesAndLevies": 20.45,
        "priceWithTaxesAndLevies": 27.34
      },
      {
        "date": "2024-06-17T03:00:00.000Z",
        "dateUTC": "2024-06-17T01:00:00.000Z",
        "price": 7.19,
        "grossKwhPrice": 8.55,
        "mWhPriceInEuros": 71.81,
        "hour": "03",
        "taxesAndLevies": 20.5,
        "priceWithTaxesAndLevies": 27.69
      },
      {
        "date": "2024-06-17T04:00:00.000Z",
        "dateUTC": "2024-06-17T02:00:00.000Z",
        "price": 7.36,
        "grossKwhPrice": 8.76,
        "mWhPriceInEuros": 73.56,
        "hour": "04",
        "taxesAndLevies": 20.54,
        "priceWithTaxesAndLevies": 27.9
      },
      {
        "date": "2024-06-17T05:00:00.000Z",
        "dateUTC": "2024-06-17T03:00:00.000Z",
        "price": 9.01,
        "grossKwhPrice": 10.72,
        "mWhPriceInEuros": 90.02,
        "hour": "05",
        "taxesAndLevies": 20.85,
        "priceWithTaxesAndLevies": 29.86
      },
      {
        "date": "2024-06-17T06:00:00.000Z",
        "dateUTC": "2024-06-17T04:00:00.000Z",
        "price": 11.92,
        "grossKwhPrice": 14.18,
        "mWhPriceInEuros": 119.13,
        "hour": "06",
        "taxesAndLevies": 21.4,
        "priceWithTaxesAndLevies": 33.32
      },
      {
        "date": "2024-06-17T07:00:00.000Z",
        "dateUTC": "2024-06-17T05:00:00.000Z",
        "price": 13.27,
        "grossKwhPrice": 15.79,
        "mWhPriceInEuros": 132.68,
        "hour": "07",
        "taxesAndLevies": 21.66,
        "priceWithTaxesAndLevies": 34.93
      },
      {
        "date": "2024-06-17T08:00:00.000Z",
        "dateUTC": "2024-06-17T06:00:00.000Z",
        "price": 11.63,
        "grossKwhPrice": 13.84,
        "mWhPriceInEuros": 116.23,
        "hour": "08",
        "taxesAndLevies": 21.35,
        "priceWithTaxesAndLevies": 32.98
      },
      {
        "date": "2024-06-17T09:00:00.000Z",
        "dateUTC": "2024-06-17T07:00:00.000Z",
        "price": 8.48,
        "grossKwhPrice": 10.09,
        "mWhPriceInEuros": 84.73,
        "hour": "09",
        "taxesAndLevies": 20.75,
        "priceWithTaxesAndLevies": 29.23
      },
      {
        "date": "2024-06-17T10:00:00.000Z",
        "dateUTC": "2024-06-17T08:00:00.000Z",
        "price": 6.22,
        "grossKwhPrice": 7.4,
        "mWhPriceInEuros": 62.11,
        "hour": "10",
        "taxesAndLevies": 20.32,
        "priceWithTaxesAndLevies": 26.54
      },
      {
        "date": "2024-06-17T11:00:00.000Z",
        "dateUTC": "2024-06-17T09:00:00.000Z",
        "price": 5.51,
        "grossKwhPrice": 6.55,
        "mWhPriceInEuros": 55.01,
        "hour": "11",
        "taxesAndLevies": 20.18,
        "priceWithTaxesAndLevies": 25.69
      },
      {
        "date": "2024-06-17T12:00:00.000Z",
        "dateUTC": "2024-06-17T10:00:00.000Z",
        "price": 4.19,
        "grossKwhPrice": 4.99,
        "mWhPriceInEuros": 41.86,
        "hour": "12",
        "taxesAndLevies": 19.93,
        "priceWithTaxesAndLevies": 24.12
      },
      {
        "date": "2024-06-17T13:00:00.000Z",
        "dateUTC": "2024-06-17T11:00:00.000Z",
        "price": 3.95,
        "grossKwhPrice": 4.7,
        "mWhPriceInEuros": 39.45,
        "hour": "13",
        "taxesAndLevies": 19.89,
        "priceWithTaxesAndLevies": 23.84
      },
      {
        "date": "2024-06-17T14:00:00.000Z",
        "dateUTC": "2024-06-17T12:00:00.000Z",
        "price": 4.67,
        "grossKwhPrice": 5.55,
        "mWhPriceInEuros": 46.62,
        "hour": "14",
        "taxesAndLevies": 20.02,
        "priceWithTaxesAndLevies": 24.69
      },
      {
        "date": "2024-06-17T15:00:00.000Z",
        "dateUTC": "2024-06-17T13:00:00.000Z",
        "price": 5.46,
        "grossKwhPrice": 6.5,
        "mWhPriceInEuros": 54.54,
        "hour": "15",
        "taxesAndLevies": 20.18,
        "priceWithTaxesAndLevies": 25.64
      },
      {
        "date": "2024-06-17T16:00:00.000Z",
        "dateUTC": "2024-06-17T14:00:00.000Z",
        "price": 6.43,
        "grossKwhPrice": 7.65,
        "mWhPriceInEuros": 64.21,
        "hour": "16",
        "taxesAndLevies": 20.36,
        "priceWithTaxesAndLevies": 26.79
      },
      {
        "date": "2024-06-17T17:00:00.000Z",
        "dateUTC": "2024-06-17T15:00:00.000Z",
        "price": 8.86,
        "grossKwhPrice": 10.55,
        "mWhPriceInEuros": 88.58,
        "hour": "17",
        "taxesAndLevies": 20.82,
        "priceWithTaxesAndLevies": 29.68
      },
      {
        "date": "2024-06-17T18:00:00.000Z",
        "dateUTC": "2024-06-17T16:00:00.000Z",
        "price": 11.42,
        "grossKwhPrice": 13.59,
        "mWhPriceInEuros": 114.16,
        "hour": "18",
        "taxesAndLevies": 21.31,
        "priceWithTaxesAndLevies": 32.73
      },
      {
        "date": "2024-06-17T19:00:00.000Z",
        "dateUTC": "2024-06-17T17:00:00.000Z",
        "price": 15.74,
        "grossKwhPrice": 18.73,
        "mWhPriceInEuros": 157.37,
        "hour": "19",
        "taxesAndLevies": 22.13,
        "priceWithTaxesAndLevies": 37.87
      },
      {
        "date": "2024-06-17T20:00:00.000Z",
        "dateUTC": "2024-06-17T18:00:00.000Z",
        "price": 21.02,
        "grossKwhPrice": 25.01,
        "mWhPriceInEuros": 210.16,
        "hour": "20",
        "taxesAndLevies": 23.13,
        "priceWithTaxesAndLevies": 44.15
      },
      {
        "date": "2024-06-17T21:00:00.000Z",
        "dateUTC": "2024-06-17T19:00:00.000Z",
        "price": 20.01,
        "grossKwhPrice": 23.81,
        "mWhPriceInEuros": 200.01,
        "hour": "21",
        "taxesAndLevies": 22.94,
        "priceWithTaxesAndLevies": 42.95
      },
      {
        "date": "2024-06-17T22:00:00.000Z",
        "dateUTC": "2024-06-17T20:00:00.000Z",
        "price": 12.82,
        "grossKwhPrice": 15.25,
        "mWhPriceInEuros": 128.15,
        "hour": "22",
        "taxesAndLevies": 21.57,
        "priceWithTaxesAndLevies": 34.39
      },
      {
        "date": "2024-06-17T23:00:00.000Z",
        "dateUTC": "2024-06-17T21:00:00.000Z",
        "price": 10.16,
        "grossKwhPrice": 12.09,
        "mWhPriceInEuros": 101.55,
        "hour": "23",
        "taxesAndLevies": 21.07,
        "priceWithTaxesAndLevies": 31.23
      }
    ]
  },
  "year": {
    "averagePrice": 28.53,
    "prices": [
      {
        "price": 5.62,
        "month": "2024-05",
        "taxesAndLevies": 20.21,
        "priceWithTaxesAndLevies": 25.83
      },
      {
        "price": 6.24,
        "month": "2024-04",
        "taxesAndLevies": 20.32,
        "priceWithTaxesAndLevies": 26.56
      },
      {
        "price": 6.46,
        "month": "2024-03",
        "taxesAndLevies": 20.37,
        "priceWithTaxesAndLevies": 26.83
      },
      {
        "price": 6.13,
        "month": "2024-02",
        "taxesAndLevies": 20.3,
        "priceWithTaxesAndLevies": 26.43
      },
      {
        "price": 7.66,
        "month": "2024-01",
        "taxesAndLevies": 20.59,
        "priceWithTaxesAndLevies": 28.25
      },
      {
        "price": 6.85,
        "month": "2023-12",
        "taxesAndLevies": 20.44,
        "priceWithTaxesAndLevies": 27.29
      },
      {
        "price": 9.11,
        "month": "2023-11",
        "taxesAndLevies": 20.87,
        "priceWithTaxesAndLevies": 29.98
      },
      {
        "price": 8.75,
        "month": "2023-10",
        "taxesAndLevies": 20.8,
        "priceWithTaxesAndLevies": 29.55
      },
      {
        "price": 10.07,
        "month": "2023-09",
        "taxesAndLevies": 21.05,
        "priceWithTaxesAndLevies": 31.12
      },
      {
        "price": 9.43,
        "month": "2023-08",
        "taxesAndLevies": 20.93,
        "priceWithTaxesAndLevies": 30.36
      },
      {
        "price": 7.76,
        "month": "2023-07",
        "taxesAndLevies": 20.61,
        "priceWithTaxesAndLevies": 28.37
      },
      {
        "price": 10.63,
        "month": "2023-06",
        "taxesAndLevies": 21.16,
        "priceWithTaxesAndLevies": 31.79
      }
    ]
  }
}

Log:

[tariff] ERROR 2024/06/17 16:42:50 invalid character 'm' looking for beginning of value
[main  ] FATAL 2024/06/17 16:42:50 cannot create tariff type 'custom': invalid character 'm' looking for beginning of value
[main  ] FATAL 2024/06/17 16:42:50 will attempt restart in: 15m0s

@andig
Copy link
Member

andig commented Jun 17, 2024

Please provide full log, showing data.

@arboeh
Copy link

arboeh commented Jun 18, 2024

Please provide full log, showing data.

Log file attached.
log.txt

@andig
Copy link
Member

andig commented Jun 18, 2024

Seems this needs the debugger. Can I test this in any way? Which config/credentials?

@arboeh
Copy link

arboeh commented Jun 26, 2024

Seems this needs the debugger. Can I test this in any way? Which config/credentials?

What do you need to debug it? I could send you my "cleaned" config (home assistant addon) without IPs, user names and passwords.

@andig
Copy link
Member

andig commented Jun 30, 2024

Alle Parameter um den Aufruf zu machen. Ich kann nicht hellsehen :)

@xerion3800
Copy link
Contributor

xerion3800 commented Jul 9, 2024

Zwischenzeitlich können „custom“ Tarife auch selbst per Template implementiert werden.

Ja, das funktioniert.
Statischer Tarif (monatlich):

tariffs:
  currency: EUR
  grid:
    type: custom
    price:
      source: http
      uri: https://api.ostrom.de/v1/tariffs/city-id?cityId=11111&usage=1000
      jq: .ostrom[0].workingPriceBrutto
      scale: 0.01

Dynamischer Tarif (stündlich):

tariffs:
  currency: EUR
  grid:
    type: custom
    forecast:
      source: http
      uri: https://api.ostrom.de/v1/spot-prices/ostrom-product-tariff?cityId=11111&postalCode=55555
      jq: '.day.prices[ ] | {start: .date, price: .priceWithTaxesAndLevies}'

Zwischenzeitlich können „custom“ Tarife auch selbst per Template implementiert werden.

Ja, das funktioniert.
Statischer Tarif (monatlich):

tariffs:
  currency: EUR
  grid:
    type: custom
    price:
      source: http
      uri: https://api.ostrom.de/v1/tariffs/city-id?cityId=11111&usage=1000
      jq: .ostrom[0].workingPriceBrutto
      scale: 0.01

Dynamischer Tarif (stündlich):

tariffs:
  currency: EUR
  grid:
    type: custom
    forecast:
      source: http
      uri: https://api.ostrom.de/v1/spot-prices/ostrom-product-tariff?cityId=11111&postalCode=55555
      jq: '.day.prices[ ] | {start: .date, price: .priceWithTaxesAndLevies}'

Bei mir will der Server mit den Anpassungen in der Config einfach nicht mehr starten

Error during startup. Check your configuration and restart. cannot create tariff type 'custom': jq: query failed: cannot iterate over: null

Ich habe eine Frage zu den Daten. ich nutze aktuell Tibber und schaue mit gerade ostrom an. Bei Tibber habe ich ja über die API eine Vorschau bis morgen. So wie ich das in dieser Abfrage sehe, ist das ja immer nur der aktuelle Tag und nicht bis morgen. Wie läuft das mit dem Ladeplanung ab wenn man nicht genügend Vorschau hat. Hast du da schon Erfahrungen? Oder bekommt man als Kunde eine andere API Schnittstelle mit mehr Informationen?

@kofferjunge
Copy link

Bitte seid nachsichtig mit mir, da ich noch komplett unerfahren mit dem Thema bin.
Ich bin ebenfalls Ostrom-Kunde und habe versucht, den Strompreis in evcc anzeigen zu lassen.
Ich bekomme den gleichen Fehler, wie arboeh „jq: too many results“.
Ich habe einfach mal versucht, weiterzukommen, dabei ist mir aber aufgefallen, dass das Datumsformat in den Daten von Ostrom nicht mit der gewünschten Form von evcc übereinstimmt:

„Das Plugin muss eine JSON-Struktur zurückgeben, welches eine Liste von Zeiträumen und Preisen enthält. Die Datumsfelder müssen in der Form YYYY-MM-DDTHH:MM:SSZ und der Preis in der korrekten Währungseinheit (bspw. EUR) angegeben werden.“ (https://docs.evcc.io/docs/devices/tariffs)

@WiskyViking
Copy link

für tagesaktuelle Preise (bis 0200 des nöchsten Tages) funktioniert es bei mir mit:

tariffs:
grid:
type: custom
forecast:
source: http
uri: https://api.ostrom.de/v1/spot-prices/ostrom-product-tariff?cityId=5867&postalCode=24939
jq: '[ .day .prices ] | transpose | map({ start: ( .[0] | .date [:19] | strptime("%Y-%m-%dT%H:%M:%S") | strftime("%Y-%m-%dT%H:%M:%SZ") ), end: ( .[0] | .date [:19] | strptime("%Y-%m-%dT%H:%M:%S") | mktime + 3600 | strftime("%Y-%m-%dT%H:%M:%SZ") ), price: ( .[0] | .priceWithTaxesAndLevies / 100 ) }) | tostring'

@WiskyViking
Copy link

für den Folgetag muss man als registrierter User einen Authentikation Token erstellen. Dazu benutzt man (in der Sandbox) einen POST Aufruf über folgenden Server:

https://auth.sandbox.ostrom-api.io/oauth2/token

und erhält einen JSON im folgenden Format:

{
"access_token": "XYZ",
"token_type": "Bearer",
"expires_in": 3599
}

diesen Access token benötigt man dann um die Preise abzurufen über (in der Sandbox) einen GET Aufruf über folgenden Server:

https://sandbox.ostrom-api.io/spot-prices

und erhält einen JSON im folgenden Format:

{
"data": [
{
"date": "2024-08-10T00:00:00.000Z",
"netMwhPrice": 87.28,
"netKwhPrice": 8.73,
"grossKwhPrice": 10.39,
"netKwhTaxAndLevies": 19.1,
"grossKwhTaxAndLevies": 22.73,
"netMonthlyOstromBaseFee": 5.05,
"grossMonthlyOstromBaseFee": 6,
"netMonthlyGridFees": 8.6,
"grossMonthlyGridFees": 10.24
},

stündlich bis:

{
  "date": "2024-08-10T21:00:00.000Z",
  "netMwhPrice": 106.64,
  "netKwhPrice": 10.67,
  "grossKwhPrice": 12.7,
  "netKwhTaxAndLevies": 19.1,
  "grossKwhTaxAndLevies": 22.73,
  "netMonthlyOstromBaseFee": 5.05,
  "grossMonthlyOstromBaseFee": 6,
  "netMonthlyGridFees": 8.6,
  "grossMonthlyGridFees": 10.24
}

]
}

testen kann man das unter:

Obtain OAuth2 Access Token
https://docs.ostrom-api.io/reference/createoauth2token

und

Retrieve day-ahead spot price information
https://docs.ostrom-api.io/reference/getspotprices

Leider bin ich noch nicht dahinter gekommen wie man das in EVCC realisieren kann.

Hat jemand eine Idee?

@WiskyViking
Copy link

Hier die JQ Abfrage korrigiert für UTC Zeit:

jq: '[ .day .prices ] | transpose | map({ start: ( .[0] | .dateUTC [:19] | strptime("%Y-%m-%dT%H:%M:%S") | strftime("%Y-%m-%dT%H:%M:%SZ") ), end: ( .[0] | .dateUTC [:19] | strptime("%Y-%m-%dT%H:%M:%S") | mktime - 14400 | strftime("%Y-%m-%dT%H:%M:%SZ") ), price: ( .[0] | .priceWithTaxesAndLevies / 100 ) }) | tostring'

Da es nur die Preise des aktuellen Tages und der EVCC Planer default mäßig des Folgetag betrifft gibt wirft EVCC einen Error aus: 'planner: no matching rate'.

This was referenced Sep 7, 2024
This was referenced Sep 26, 2024
@Schlotze83
Copy link

Schlotze83 commented Oct 22, 2024

"priceWithTaxesAndLevies": 25.69

Sehe ich das richtig, dass ich 25,69 cent pro kWh zahlen muss, wenn ich den dynamischen Tarif von Ostrom nutze?
Habe immer die Preise der Börse verfolgt, die ja deutlich niedriger sind.
Wenn ich das nun mit den aktuellen Preisen vergleiche, die Ostrom liefert, bin ich zu jeder Stunde über den 30 Cent, die ich zur Zeit für meinen "normalen" Tarif zahle...

(Dieses Beispiel von 25,69 Cent ist ca ein halbes Jahr alt. Zur Zeit habe ich 33-36 cent/kWh)

@nilaq
Copy link

nilaq commented Nov 3, 2024

Hi zusammen (@umrath, @habz0c, @kallelix, @arboeh, @Schlotze83, @WiskyViking, @kofferjunge, @xerion3800) ,

ich bin einer der Mitgründer von Nomos - wir sind ein API-first Stromanbieter und arbeiten hauptsächlich mit Installateuren von Energiesystemen zusammenarbeitet um dynamische Tarife "white-label" mit den richtigen Integrationen anzubieten. (PV Magazin Artikel). Für Testzwecke bieten wir Developern aber auch direkt unter unseren eigenen Marke einen Stromtarif an. Eine große Differenzierung bei uns sind vernünftige APIs, die Basis für mögliche Optimierungen auf Stromseite abdecken.

Jeder unserer Stromkunden hat Zugang zu einem API Endpunkt, der die Zeitreihen der variablen Preise (incl. EPEX; Netzentgelte und Steuern und Abgaben) übersichtlich zur Verfügung stellt. Mit der Struktur können wir auch die zeitvariablen Netzentgelte supporten, sobald diese verfügbar sind.

Falls jemand hier noch bestehende Probleme mit der Ostrom (oder einer anderen) Integration hat, könnt ihr mir sehr gerne eine kurze Email an nils@nomos.energy schicken. Da wir noch relativ jung sind als Unternehmen, bieten wir euch auch sehr gerne einen Discount für den Stromvertrag im Gegenzug für Feedback auf unsere API Integrationen an.

Ich freu mich von euch zu hören, falls das für jemand hier relevant sein sollte.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.