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 Frauenhofer ISE energy-charts-api | day ahead price #13706

Merged
merged 14 commits into from
May 7, 2024

Conversation

mdkeil
Copy link
Contributor

@mdkeil mdkeil commented May 3, 2024

This PR adds:

  • energy-charts-api provided by Fraunhofer-Institut für Solare Energiesysteme ISE
  • generic tariff forcast

/cc @andig

This PR adds:
- energy-charts-api provided by Fraunhofer-Institut für Solare Energiesysteme ISE
- generic tariff forcast
@mdkeil mdkeil mentioned this pull request May 3, 2024
@andig
Copy link
Member

andig commented May 3, 2024

Wozu brauchts das denn? Ist das nicht Entso-E?

change description with use of validvalues-concept
@mdkeil
Copy link
Contributor Author

mdkeil commented May 3, 2024

Wozu brauchts das denn? Ist das nicht Entso-E?

#13485 (comment)

@andig andig added devices Specific device support enhancement New feature or request labels May 3, 2024
@mdkeil mdkeil changed the title Add Frauenhofer ISE energy-charts-api Add Frauenhofer ISE energy-charts-api | day ahead price May 3, 2024
@andig
Copy link
Member

andig commented May 4, 2024

Ich denke es bräuchte noch eine Erklärung was dieser "Tarif" tut. Fraunhofer ISE ist sicher nicht jedem geläufig?

@mdkeil
Copy link
Contributor Author

mdkeil commented May 4, 2024

So direkt ein Tarif ist es ja auch nicht.. für sich alleine ist das ja nur ein "generischer" day-ahead-forcast ohne jeglichen Bezug zu einem Stromanbieter.. so viele use-cases wird es da auch nicht geben.. vermutlich für die diejenigen Stromanbieter nutzbar, die noch kein eigenes/fertiges Backend haben um den Nutzern die stündlichen Preise zur Verfügung zu stellen, wie z.B. hier.
#13485 (comment)

@andig
Copy link
Member

andig commented May 4, 2024

Genau. Und das sollte man ja vielleicht erklären?

@mdkeil
Copy link
Contributor Author

mdkeil commented May 4, 2024

Ich überlege mir mal was sinnvolles.

@mdkeil
Copy link
Contributor Author

mdkeil commented May 4, 2024

Ich habe gerade gesehen, dass defaultmäßig nur die Preise für den aktuellen Tag geliefert werden. man kann aber ein End-Datum/TS angeben.. sprich ich müsste "tomorrow" angeben.. es reicht im Format "YYYY-MM-DD" ..Da ich nicht genau weiß, welche Funktionen im yaml-template verfügbar sind, einer kleiner Anstoß wie ich den date-string erzeuge.

@andig
Copy link
Member

andig commented May 5, 2024

@mdkeil schöne Idee. Das funktioniert aber noch nicht, oder? Dafür müsste ja die URI in evcc dynamisch evaluiert werden, nämlich bei jedem Aufruf. Im Moment könnte das ja maximal einmalig sein? Wäre aber ein Weg, wenn sich das dynamisieren liesse. Ich denke mal drüber nach wie.

@mdkeil
Copy link
Contributor Author

mdkeil commented May 5, 2024

Ja, das war die erste Überlegung.. aber zu einfach gedacht.. wie du bereits angemerkt hast, muss sich die uri ja mindestens bei jedem Aufruf (wahrscheinlich stündlich) aktualisieren.

@andig
Copy link
Member

andig commented May 5, 2024

Wir könnten überlegen, die URL im http Plugin dynamisch zu machen. Etwa so:

{{"{{"}} now {{"}}"}} 

Und dazu in http.go:

// request executes the configured request or returns the cached value
func (p *HTTP) request(url string, body ...string) ([]byte, error) {
	if time.Since(p.updated) >= p.cache {
		var b io.Reader
		if len(body) == 1 {
			b = strings.NewReader(body[0])
		}

		tmpl, err := template.New("url").Parse(url)
		if err != nil {
			return nil, err
		}

		builder := new(strings.Builder)
		if err := tmpl.Execute(builder, nil); err != nil {
			return nil, err
		}

		// empty method becomes GET
		req, err := request.New(strings.ToUpper(p.method), builder.String(), b, p.headers)
		if err != nil {
			return []byte{}, err
		}

		p.val, p.err = p.DoBody(req)
		p.updated = time.Now()
	}

	return p.val, p.err
}

@mdkeil
Copy link
Contributor Author

mdkeil commented May 5, 2024

Ich würde lügen, wenn es alles verstanden hätte.. wobei ich nicht ganz nachvollziehen kann, welcher Trigger dazu führt, dass nochmal die config eingelesen wird und nicht direkt aus dem Cache gelesen wird.. ich gehe davon aus, dass es zumindest in der uri das {{ now }} geben muss?.. was ich mir aber nicht vorstellen kann, da ja ggfs andere Teile unabhängig von einem date dynamisch sein könnten..

@andig
Copy link
Member

andig commented May 5, 2024

Das soll einfach die URL als Go Template interpretieren. Damit das nicht schon im Template passiert müssen die Klammern versteckt werden.

@mdkeil
Copy link
Contributor Author

mdkeil commented May 6, 2024

Ich schau mal, das ich mir ein build-environment baue, um evcc selbst zu compilieren.. dann werde ich das mal ausprobieren.

@mdkeil
Copy link
Contributor Author

mdkeil commented May 6, 2024

so.. ich habe mal evcc mit meinen Änderungen gebaut.. ohne &end bekomme ich auch die Daten sauber für den aktuellen Tag rein.. mit &end={{ now | dateModify "+24h" }} bekomme ich nur einen Unexpected Status: 400 (Bad Request) zurück-- Ich habe nun also deine Änderungen der http.go übernommen.. kompilieren läuft aber nicht durch.

provider/http.go:188:16: undefined: template
make: *** [Makefile:77: build] Fehler

https://github.com/mdkeil/evcc/blob/b51f5549d289d1cdf55ef2d94789251f3737b8bc/provider/http.go#L188

@andig
Copy link
Member

andig commented May 6, 2024

Bitte VScode mit Go Plugin benutzen- dann werden auch die fehlenden Imports ("text/template") automatisch ergänzt.

@mdkeil
Copy link
Contributor Author

mdkeil commented May 6, 2024

alles klar.. muss ich später von zu Hause machen. Das Go-Plugin ist für die VScode Web nicht nutzbar..

@mdkeil
Copy link
Contributor Author

mdkeil commented May 6, 2024

einen Schritt weiter.. Mit den Anpassungen der http.go läuft evcc tariff ohne &end problemlos durch..
mit &end={{ now | dateModify "+24h" }} kommt zumindest keine Fehlermeldung, aber evcc tariff hängt dauerhaft bei der grid: Ausgabe
mit &end={{"{{"}} now | dateModify "+24h" {{"}}"}} ebenso.. testweise nur mit &end={{"{{"}} now {{"}}"}} keinen Unterschied.

@andig
Copy link
Member

andig commented May 7, 2024

Einen Hänger sehe ich nicht, aber die Formatierung scheint noch nicht zu passen:

gor main.go tariff --log trace,db:error --log-headers -c demo.yaml planner
[main  ] INFO 2024/05/07 14:19:07 evcc 0.0.0
[main  ] INFO 2024/05/07 14:19:07 using config file: demo.yaml
[mqtt  ] INFO 2024/05/07 14:19:08 connecting evcc-205608174 at tcp://localhost:1883
[mqtt  ] DEBUG 2024/05/07 14:19:08 tcp://localhost:1883 connected
[http  ] TRACE 2024/05/07 14:19:08 GET https://api.energy-charts.info/price?bzn=DE-LU&end=2024-05-08 14:19:08.202234 +0200 CEST m=+86400.280553126
[http  ] TRACE 2024/05/07 14:19:08
GET /price?bzn=DE-LU&end=2024-05-08 14:19:08.202234 +0200 CEST m=+86400.280553126 HTTP/1.1
Host: api.energy-charts.info
User-Agent: Go-http-client/1.1
Accept-Encoding: gzip

HTTP/1.1 400 Bad request
Connection: close
Content-Length: 90
Cache-Control: no-cache
Content-Type: text/html

<html><body><h1>400 Bad request</h1>
Your browser sent an invalid request.
</body></html>
[tariff] ERROR 2024/05/07 14:19:08 unexpected status: 400 (Bad Request)
[main  ] FATAL 2024/05/07 14:19:08 cannot create tariff type 'template': cannot create tariff type 'custom': unexpected status: 400 (Bad Request)
exit status 1

@mdkeil
Copy link
Contributor Author

mdkeil commented May 7, 2024

schaue ich mir nachher zuhause mal an.. hast du es bei dir mit angepasstem http-plugin durchlaufen lassen?-- den bad request hatte ich ohne Anpassung ja auch.. da du Dir mehr debug-infos ausgeben lässt, ist zumindest der Grund klar.. ich denke nach dem datemodify muss noch ein | date "YYYY-MM-DD" folgen.

Wie sieht die uri denn bei Dir im template aus?

@andig
Copy link
Member

andig commented May 7, 2024

Es ist genau dieser PR, hab nich geändert

@mdkeil
Copy link
Contributor Author

mdkeil commented May 7, 2024

läuft nun.. aber noch nicht getestet, ob das "verstecken" der Klammern notwendig ist.

{{"{{"}} now {{"}}"}}

@andig
Copy link
Member

andig commented May 7, 2024

Doch, müssen sein- sonst würden die Funktionen direkt beim Template einlesen ausgeführt anstatt erst zur Laufzeit der Abfrage. Läuft bei mir auch- sehr schön 👍🏻

@andig andig merged commit 81ba7dc into evcc-io:master May 7, 2024
5 of 7 checks passed
@mdkeil mdkeil deleted the patch-3 branch May 7, 2024 17:50
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.

@andig / @naltatis -- please revert this change. See also broken nightlies.

@@ -12,10 +12,10 @@ import (
)

var (
//go:embed dist
// go:embed dist
Copy link
Collaborator

Choose a reason for hiding this comment

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

This breaks the system. evcc now panics on startup as the embed does not happen and internal Filesystems are empty.

Copy link
Contributor Author

@mdkeil mdkeil May 8, 2024

Choose a reason for hiding this comment

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

das hat bei mir irgendwie vscode mit eingebracht.. habe es ohne nachdenken gepushed.. sorry xD - Kleine Änderung, große Wirkung!

Copy link
Member

Choose a reason for hiding this comment

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

Hab ich übersehen- aber VScode macht das egtl. nicht

Copy link
Contributor Author

@mdkeil mdkeil May 8, 2024

Choose a reason for hiding this comment

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

Konnte es bei mir nun nachvollziehen.. in vscode wurde mir da ein Fehler angezeigt pattern dist: no matching files found ..hatte es dann wohl manuell geändert. Komischerweise sind bei mir lokal keine negativen Seiteneffekte aufgetreten,

Copy link
Member

@andig andig May 8, 2024

Choose a reason for hiding this comment

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

Ja, bei go run nutzen wir das live Filesystem statt des embeddeten.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
devices Specific device support enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants