Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Off Topic
    4. Grafana
    5. Einsparung durch PV-Anlage mit Fall-Unterscheidung

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Einsparung durch PV-Anlage mit Fall-Unterscheidung

    This topic has been deleted. Only users with topic management privileges can see it.
    • Homoran
      Homoran Global Moderator Administrators @musicnrw last edited by

      @musicnrw
      in Fall1 musst du die durch den Eigenverbrauch fehlende Einspeisevergütung noch gegerechnen.

      1 Reply Last reply Reply Quote 0
      • Marc Berg
        Marc Berg Most Active @musicnrw last edited by

        @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"

        M 1 Reply Last reply Reply Quote 0
        • C
          Chrunchy @musicnrw last edited by

          @musicnrw Schau dir das Video von @haus-automatisierung an.
          https://www.youtube.com/watch?v=rTLQ15Fy85U
          Da ist eigentlich alles drin.

          1 Reply Last reply Reply Quote 1
          • M
            musicnrw @Marc Berg last edited by

            @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?

            Marc Berg 1 Reply Last reply Reply Quote 0
            • Marc Berg
              Marc Berg Most Active @musicnrw last edited by

              @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.

              M 1 Reply Last reply Reply Quote 0
              • M
                musicnrw @Marc Berg last edited by

                @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"

                Marc Berg 1 Reply Last reply Reply Quote 0
                • Marc Berg
                  Marc Berg Most Active @musicnrw last edited by

                  @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?

                  M 1 Reply Last reply Reply Quote 0
                  • M
                    musicnrw @Marc Berg last edited by

                    @marc-berg, ich habe Deinen vorherigen Code genommen und natürlich das Bucket und die Measurement-Bezeichnungen sowie Feldnamen gemäß meiner Daten angepasst.

                    Marc Berg 1 Reply Last reply Reply Quote 0
                    • Marc Berg
                      Marc Berg Most Active @musicnrw last edited by

                      @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.

                      M 1 Reply Last reply Reply Quote 0
                      • M
                        musicnrw @Marc Berg last edited by

                        @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)
                          })
                        )
                        
                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        909
                        Online

                        31.7k
                        Users

                        79.7k
                        Topics

                        1.3m
                        Posts

                        4
                        11
                        275
                        Loading More Posts
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes
                        Reply
                        • Reply as topic
                        Log in to reply
                        Community
                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                        The ioBroker Community 2014-2023
                        logo