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

Add Ostrom #16354

Open
wants to merge 28 commits into
base: master
Choose a base branch
from
Open

Add Ostrom #16354

wants to merge 28 commits into from

Conversation

kscholty
Copy link
Contributor

@kscholty kscholty commented Sep 26, 2024

In discussion #15512 and closed issue #11148 people are asking for Ostrom support.
Since they have a public API and I had some spare time I implemented a tariff for EVCC.

The implementation supports both the SIMPLY_FAIR (fixed price for at least a month) and the SIMPLY_DYNAMIC (hourly rates) tariff, which would make it worth having a native implementation.
The prices for both tariffs are queried on a regular basis.

Client credentials can be created under https://developer.ostrom-api.io/

Looking forward to your comments

@andig andig marked this pull request as draft September 27, 2024 16:19
@kscholty
Copy link
Contributor Author

@andig Warum draft? Nach meiner Ansicht ist das fertig so, oder hast du Änderungsvorschläge?

@softcat
Copy link
Contributor

softcat commented Sep 28, 2024

Bezüglich des Preises für den SIMPLY_FAIR Tarif:

Ich nutze aktuell schlicht einen Query für die generische tariff Integration (ohne Authentifizierung)

https://api.ostrom.de/v1/tariffs/city-id?cityId=11111&usage=1000

Allerdings muss man sich dafür die cityId über die Homepage händisch raussuchen. Funktioniert dann aber gut.

Gibt die API ggf. bzgl. der cityId etwas her? Ich kann es leider aktuell nicht testen.

Ich wechsle in ein paar Wochen in den SIMPLE_DYNAMIC Tarif, dann ist deine Integration perfekt.

@kscholty
Copy link
Contributor Author

Guter Hinweis. In der dokumentierten API gibt es nichts, um die CityId zu erfragen. Aber etwas suchen im Quelltext der Webseite ergab:
https://api.ostrom.de/v1/addresses/cities?zip=${zip}
Damit bekommt man die CityId zu einer Postleitzahl.
Ich habe den Code jetzt so angepasst, dass er das automatisch alles aus dem Contract ermittelt und abfragt.
Sollte sich der Simply Fair Preis also ändern, merkt evcc das spätestens an dem Tag, an dem es passiert. In die Zukunft abfragen geht leider nicht (bzw. weiß ich nicht genau, ab wann die API den neuen Preis liefert)

@kscholty kscholty marked this pull request as ready for review September 28, 2024 11:52
@github-actions github-actions bot added stale Outdated and ready to close and removed stale Outdated and ready to close labels Oct 6, 2024
@kscholty
Copy link
Contributor Author

kscholty commented Oct 8, 2024

Fehlt hier noch was?

Aus meiner Sicht ist das so fertig. Hab's in der Sandbox mit beiden Varianten getestet und es funktioniert.

@github-actions github-actions bot added the stale Outdated and ready to close label Oct 15, 2024
@github-actions github-actions bot closed this Oct 20, 2024
@GrimmiMeloni
Copy link
Collaborator

Der Bot schließt nach 14 Tagen Inaktivität automatisch.

@GrimmiMeloni GrimmiMeloni reopened this Oct 21, 2024
@github-actions github-actions bot removed the stale Outdated and ready to close label Oct 21, 2024
@userwithoutpassword
Copy link

Fehlt hier noch was?

Aus meiner Sicht ist das so fertig. Hab's in der Sandbox mit beiden Varianten getestet und es funktioniert.

Kannst du nochmal drüber schauen woran es hakt?

@kscholty
Copy link
Contributor Author

Da gibt's einen Test, der versucht einen Ostrom Tarif anzulegen und scheitert mit "unauthorized", was ich für korrekt halte. Keine Ahnung, wo der Test her kommt. Als ich das zuletzt eingecheckt habe, war alles grün.
Kann mich frühestens nächste Woche darum kümmern, bin im Urlaub.

@andig andig added the tariffs Specific tariff support label Oct 23, 2024
@kscholty
Copy link
Contributor Author

kscholty commented Nov 4, 2024

Kapier nicht so ganz wieso es hier nun 3mal "gemerged" wurde aber immer noch nicht unter "Comparing changes" auftaucht.

Ich kann nur den aktuellen head in den branch mergen, was ich eben gemacht habe. Anders herum muss einer der maintainer machen. Es fehlt nichts mehr, aber ich glaube @andig möchte das nicht wirklich im Produkt haben, da er es für unnötig hält.

Ich glaube allerdings, dass es sowohl im Marketing hilft, als auch dem Normal-User, der nicht versteht, wie er einen der anderen Tarife nutzen könnte.

tariff/ostrom.go Outdated Show resolved Hide resolved
tariff/ostrom.go Outdated Show resolved Hide resolved
tariff/ostrom.go Outdated Show resolved Hide resolved
tariff/ostrom.go Outdated Show resolved Hide resolved
tariff/ostrom.go Show resolved Hide resolved
tariff/ostrom.go Show resolved Hide resolved
tariff/ostrom.go Outdated Show resolved Hide resolved
tariff/ostrom.go Outdated Show resolved Hide resolved
util/element.go Outdated Show resolved Hide resolved
@kscholty
Copy link
Contributor Author

kscholty commented Nov 7, 2024

Es hat ein Review gegeben mit ein paar Änderungswünschen. Habe es noch nicht geschafft, mir das anzuschauen. Mache ich in den nächsten Tagen. Hoffentlich geht es dann durch.

@kscholty
Copy link
Contributor Author

kscholty commented Nov 8, 2024

So, habe alle Änderungswünsche bis auf einen umgesetzt.

Copy link
Collaborator

@GrimmiMeloni GrimmiMeloni left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking good to me.

@andig would you mind giving this a final glance and then merge?

tariff/ostrom.go Outdated Show resolved Hide resolved
tariff/ostrom.go Outdated Show resolved Hide resolved
tariff/ostrom.go Show resolved Hide resolved
util/element.go Outdated Show resolved Hide resolved
tariff/ostrom.go Outdated
case ostrom.PRODUCT_FAIR, ostrom.PRODUCT_FAIR_CAP:
return api.TariffTypePriceStatic
default:
t.log.ERROR.Printf("Unknown tariff type %s\n", t.contractType)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Das reicht einmalig beim init

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, ich verstehe nicht, was der Änderungswunsch ist. Den Wert einmalig berechnen und dann hier nur das gespeicherte Resultat zurückgeben?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Das Errorlogging. Der Tarif kann sich ja später nicht ändern.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verstehe, Derzeit kann der default aber auch nicht erreicht werden. War mehr als Hinweis gedacht, falls die da mal was erweitern. Dafür halte ich eine Kopie des codes im init für overkill. Hab die Meldung daher ganz entfernt.

tariff/ostrom.go Outdated Show resolved Hide resolved
tariff/ostrom.go Outdated Show resolved Hide resolved
tariff/ostrom.go Outdated Show resolved Hide resolved
tariff/ostrom.go Show resolved Hide resolved
@andig andig changed the title Added ostrom tariff Add Ostrom Nov 9, 2024
tariff/ostrom.go Show resolved Hide resolved
tariff/ostrom.go Outdated Show resolved Hide resolved
tariff/ostrom.go Outdated Show resolved Hide resolved
tariff/ostrom.go Outdated Show resolved Hide resolved
}
mergeRates(t.data, data)
} else {
t.log.ERROR.Println(err)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Das sieht falsch aus. Fehler zurück geben?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Das würde die Run Funktion ja beenden. Mein Gedanke war, dass es diesmal einen Fehler gegeben haben kann, dass aber den nächste Aufruf vielleicht funktioniert.


tick := time.NewTicker(time.Hour)
for ; true; <-tick.C {
val.Marketprice, err = t.getFixedPrice()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wozu braucht es val.Marketprice?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Der Gesamtpreis ergibt sich als "Marketprice+AdditionalCost", siehe rate(). Da steht also der Preis drin. Ich wollte so weit es geht dieselben Datenstrukturen und Funktionen für statische und dynamische Preise verwenden, daher wird hier auch für statische Preise ein ostrom.ForcastInfo verwendet, um so rate() nutzen zu können.

tariff/ostrom.go Show resolved Hide resolved
data := make(api.Rates, 0, 48)
for i := 0; i < 48; i++ {
data = append(data, rate(val))
val.StartTimestamp = val.StartTimestamp.Add(time.Hour)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wozu braucht es val.StartTimestamp? Das sollte eine lokale Variable sein.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Das wird in rate() zur Berechnung von start-und Endzeit verwendet. Ansonsten, siehe mein Kommentar zu "Marketprice"

tariff/ostrom.go Outdated Show resolved Hide resolved
tariff/ostrom.go Outdated Show resolved Hide resolved
Tested in Snadbox with both types of contracts
and in production with static tariff
tariff/ostrom.go Outdated Show resolved Hide resolved
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
tariffs Specific tariff support
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants