NEWS
Einsparung durch PV-Anlage mit Fall-Unterscheidung
-
@musicnrw
in Fall1 musst du die durch den Eigenverbrauch fehlende Einspeisevergütung noch gegerechnen. -
@musicnrw sagte in Einsparung durch PV-Anlage mit Fall-Unterscheidung:
gerade weniger Strom erzeugt als ich Verbrauche
In der "map" Funktion kann man auch mit "if ...then" Bedingungen arbeiten.
Unter den Annahme, dass sowohl Hausverbrauch als auch Solarertrag in einem Measurement "Energie" zu finden sind und unter Berücksichtigung vom @Homoran s Einwand, kann man das prinzipiell so machen:
strompreis = 0.28 // Beispielwert €/kWh einspeiseverguetung = 0.08 // Beispielwert €/kWh from(bucket: "deinBucket") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "Energie") |> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value") |> map(fn: (r) => ({ _time: r._time, _measurement: r._measurement, PV_Leistung: r.PV_Leistung, Hausverbrauch: r.Hausverbrauch, einsparung: if r.PV_Leistung <= r.Hausverbrauch then r.PV_Leistung * strompreis else (r.Hausverbrauch * strompreis) + ((r.PV_Leistung - r.Hausverbrauch) * einspeiseverguetung) }) )
... ergänzt um ein sinnvolles "aggregateWindow"
-
@musicnrw Schau dir das Video von @haus-automatisierung an.
https://www.youtube.com/watch?v=rTLQ15Fy85U
Da ist eigentlich alles drin. -
@marc-berg , vielen Dank für Deine Unterstützung. Hab ich soweit verstanden, nu habe ich die Werte für Hausverbrauch und Ertrag eben nicht in einem Measurement vorhanden sondern getrennt. Wie sieht das dann aus?
-
@musicnrw sagte in Einsparung durch PV-Anlage mit Fall-Unterscheidung:
Wie sieht das dann aus?
Dann musst du dir die Daten aus zwei Abfragen zusammenbauen. So ähnlich vom Prinzip (ungetestet):
strompreis = 0.28 // €/kWh einspeiseverguetung = 0.08 // €/kWh // PV-Leistungsdaten abfragen pv = from(bucket: "deinBucket") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "PV_Measurement") |> filter(fn: (r) => r["_field"] == "Einspeisung") |> aggregateWindow(every: 5m, fn: mean, createEmpty: false) |> rename(columns: {_value: "PV_Einspeisung"}) // Hausverbrauchsdaten abfragen verbrauch = from(bucket: "deinBucket") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "Verbrauch_Measurement") |> filter(fn: (r) => r["_field"] == "Leistung") |> aggregateWindow(every: 5m, fn: mean, createEmpty: false) |> rename(columns: {_value: "Hausverbrauch"}) // Daten zusammenführen join( tables: {pv: pv, verbrauch: verbrauch}, on: ["_time"] ) |> map(fn: (r) => ({ _time: r._time, PV_Einspeisung: r.PV_Einspeisung, Hausverbrauch: r.Hausverbrauch, einsparung: if r.PV_Einspeisung <= r.Hausverbrauch then r.PV_Einspeisung * strompreis else (r.Hausverbrauch * strompreis) + ((r.PV_Einspeisung - r.Hausverbrauch) * einspeiseverguetung) }) )
Das "PV_Leistung" oben war falsch, es sollte "Einspeisung" lauten. Das sollte aber selbsterklärend sein.
-
@marc-berg, das "pv=...." macht anscheinend Probleme. Der Query-Editor bringt die Meldung "invalid: error in query specification while starting program: this Flux script returns no streaming data. Consider adding a "yield" or invoking streaming functions directly, without performing an assignment"
-
@musicnrw sagte in Einsparung durch PV-Anlage mit Fall-Unterscheidung:
das "pv=...." macht anscheinend Probleme.
Ich kenne weder deine angepasste Query noch die zugrunde liegenden Daten. Wie soll man da helfen?
-
@marc-berg, ich habe Deinen vorherigen Code genommen und natürlich das Bucket und die Measurement-Bezeichnungen sowie Feldnamen gemäß meiner Daten angepasst.
-
@musicnrw sagte in Einsparung durch PV-Anlage mit Fall-Unterscheidung:
ich habe Deinen vorherigen Code genommen und natürlich das Bucket und die Measurement-Bezeichnungen sowie Feldnamen gemäß meiner Daten angepasst.
Dann zeig doch bitte mal die konkrete Query (als Text in Code Tags) sowie einen Screenshot vom Query Editor.
-
@marc-berg, sorry, dass ich mich erst jetzt wieder melde, aber ich war beruflich unterwegs. Das ist meine Query, wie gesagt, genau Dein Vorschlag, nur mit meinen Influx-spezifischen Namen:
strompreis = 0.32 // €/kWh einspeiseverguetung = 0.08 // €/kWh // PV-Leistungsdaten abfragen pv = from(bucket: "iobroker") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "senec.0.ENERGY.GUI_INVERTER_POWER") |> filter(fn: (r) => r["_field"] == "value") |> aggregateWindow(every: 5m, fn: mean, createEmpty: false) |> rename(columns: {_value: "PV_Einspeisung"}) // Hausverbrauchsdaten abfragen verbrauch = from(bucket: "iobroker") |> range(start: v.timeRangeStart, stop: v.timeRangeStop) |> filter(fn: (r) => r["_measurement"] == "senec.0.ENERGY.GUI_HOUSE_POW") |> filter(fn: (r) => r["_field"] == "value") |> aggregateWindow(every: 5m, fn: mean, createEmpty: false) |> rename(columns: {_value: "Hausverbrauch"}) // Daten zusammenführen join( tables: {pv: pv, verbrauch: verbrauch}, on: ["_time"] ) |> map(fn: (r) => ({ _time: r._time, PV_Einspeisung: r.PV_Einspeisung, Hausverbrauch: r.Hausverbrauch, einsparung: if r.PV_Einspeisung <= r.Hausverbrauch then r.PV_Einspeisung * strompreis else (r.Hausverbrauch * strompreis) + ((r.PV_Einspeisung - r.Hausverbrauch) * einspeiseverguetung) }) )