Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Off Topic
    4. InfluxDB
    5. Grünlandtemperatursumme und Flux

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Grünlandtemperatursumme und Flux

    This topic has been deleted. Only users with topic management privileges can see it.
    • Marc Berg
      Marc Berg Most Active last edited by Marc Berg

      Da ich mir ab und zu praktische Beispiele suche, um meine Flux Kenntnisse ein wenig zu pimpen, hier mal eine Query, um die sogenannte "Grünlandtemperatursumme" zu ermitteln. Mit dieser Summe kann man vorhersagen, wann die Vegetationsperiode beginnt (200°) oder wann die Wälder grün werden (600°). Summiert werden dabei die Tagesmitteltemperaturen mit einer geringeren Gewichtung für Januar (* 0,5) und Februar (* 0,75).

      Ist eine Spielerei, die man nicht wirklich braucht, aber wenn ihr das verwenden wollt, ihr benötigt als Input nur ein DP/Measurement mit der Außentemperatur.

      import "date"
      import "timezone"
      option location = timezone.location(name: "Europe/Berlin")
      
      from(bucket: "iobroker")
        |> range(start:date.truncate(t:now(), unit:1y))
        |> filter(fn: (r) => r["_measurement"] == "mqtt.0.Lora.esp03.temperature")
        |> filter(fn: (r) => r["_field"] == "value")
        |> aggregateWindow(every: 1d,fn:mean,timeSrc: "_stop",createEmpty:false)
        |> reduce(
        identity: {sum: 0.0},
          fn: (r, accumulator) => ({
              sum: if date.month(t: r._time) == 1 then r._value * 0.5 + accumulator.sum
              else if date.month(t: r._time) == 2 then r._value * 0.75 + accumulator.sum
              else r._value + accumulator.sum
            })
      )
        |> keep(columns: ["sum"])
        |> rename(columns: {sum: "Grünlandtemperatursumme"})
      

      EDIT: hier was noch ein Fehler drin. Korrektur: https://forum.iobroker.net/post/1120681

      Homoran 1 Reply Last reply Reply Quote 0
      • Homoran
        Homoran Global Moderator Administrators @Marc Berg last edited by

        @marc-berg du bist nicht der erste

        https://forum.iobroker.net/post/762283

        allerdings rechnest du selber 🙂

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

          @homoran sagte in Grünlandtemperatursumme und Flux:

          @marc-berg du bist nicht der erste

          Oh, das hätte ich jetzt nicht erwartet, dass das noch andere interessiert. 🙂

          A 1 Reply Last reply Reply Quote 0
          • A
            andreasploetz @Marc Berg last edited by

            @marc-berg Hallo Marc, kurze Rückfrage zu deinem obigen Code, ziehst du dort nur die positiven Tagesmitteltemperaturen oder auch die negativen, was falsch wäre und startest du jährlich zum 1.1. neu?

            Leider sind meine Flux Kenntnisse aktuell noch sehr rudimentär 😉

            Marc Berg 2 Replies Last reply Reply Quote 0
            • Marc Berg
              Marc Berg Most Active @andreasploetz last edited by

              @andreasploetz sagte in Grünlandtemperatursumme und Flux:

              kurze Rückfrage zu deinem obigen Code, ziehst du dort nur die positiven Tagesmitteltemperaturen

              Ich hätte wetten können, das das drin war, aber du hast natürlich Recht, hier die korrigierte Abfrage, in welcher Tagesmitteltemperaturen unter 0°C gefiltert werden.

              import "date"
              import "timezone"
              option location = timezone.location(name: "Europe/Berlin")
               
              from(bucket: "iobroker")
                |> range(start:date.truncate(t:now(), unit:1y))
                |> filter(fn: (r) => r["_measurement"] == "mqtt.0.Lora.esp03.temperature")
                |> filter(fn: (r) => r["_field"] == "value")
                |> aggregateWindow(every: 1d,fn:mean,timeSrc: "_stop",createEmpty:false)
                |> filter(fn: (r) => r["_value"] > 0)
                |> reduce(
                identity: {sum: 0.0},
                  fn: (r, accumulator) => ({
                      sum: if date.month(t: r._time) == 1 then r._value * 0.5 + accumulator.sum
                      else if date.month(t: r._time) == 2 then r._value * 0.75 + accumulator.sum
                      else r._value + accumulator.sum
                    })
              )
                |> keep(columns: ["sum"])
                |> rename(columns: {sum: "Grünlandtemperatursumme"})
              

              und startest du jährlich zum 1.1. neu?

              Ja das war und ist mit drin, es wird immer das aktuelle Jahr berechnet:

                |> range(start:date.truncate(t:now(), unit:1y))
              
              L 1 Reply Last reply Reply Quote 1
              • Marc Berg
                Marc Berg Most Active @andreasploetz last edited by Marc Berg

                @andreasploetz

                Und hier noch die Darstellung in Jahresverlauf:

                import "date"
                import "timezone"
                option location = timezone.location(name: "Europe/Berlin")
                
                from(bucket: "iobroker")
                  |> range(start:date.truncate(t:now(), unit:1y))
                  |> filter(fn: (r) => r["_measurement"] == "mqtt.0.Lora.esp03.temperature")
                  |> filter(fn: (r) => r["_field"] == "value")
                  |> aggregateWindow(every: 1d,fn:mean,timeSrc: "_start",createEmpty:true)
                  |> filter(fn: (r) => r["_value"] > 0)
                  |> map(fn: (r) => ({
                        _time: r._time,
                        sum: if date.month(t: r._time) == 1 then r._value * 0.5
                        else if date.month(t: r._time) == 2 then r._value * 0.75
                        else r._value
                      }))
                  |> cumulativeSum(columns: ["sum"])
                  |> rename(columns: {sum: "Grünlandtemperatursumme"})
                

                In Abhängigkeit von dieser Zeile und ob man "_start" bzw. "_stop" einträgt

                |> aggregateWindow(every: 1d,fn:mean,timeSrc: "_start",createEmpty:true)
                

                wird die Summe entweder für den aktuellen oder den Folgetag dargestellt. Da bin ich mir unsicher, was fachlich korrekter ist.

                A 1 Reply Last reply Reply Quote 0
                • A
                  andreasploetz @Marc Berg last edited by andreasploetz

                  In Abhängigkeit von dieser Zeile und ob man "_start" bzw. "_stop" einträgt

                  |> aggregateWindow(every: 1d,fn:mean,timeSrc: "_start",createEmpty:true)
                  

                  wird die Summe entweder für den aktuellen oder den Folgetag dargestellt. Da bin ich mir unsicher, was fachlich korrekter ist.

                  Fachlich korrekt ist der aktuelle Tag, da an diesem ja der Wert faktisch auch vor bzw. bis 0 Uhr erreicht wurde.

                  Was noch schön wäre, wenn die Tage mit negativen Temperaturmittelwerten auch dargestellt werden bzw. dann mit den letzten zu verwendenden positiven Werten unverändert zu sehen sind - dann wäre das ganze einfacher zu "lesen" 🙂

                  Ansonsten top Arbeit!

                  d516ae8b-c82f-4058-9901-d57eb1b4793a-image.png

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

                    @andreasploetz sagte in Grünlandtemperatursumme und Flux:

                    Was noch schön wäre, wenn die Tage mit negativen Temperaturmittelwerten auch dargestellt werden bzw. dann mit den letzten zu verwendenden positiven Werten unverändert zu sehen sind - dann wäre das ganze einfacher zu "lesen

                    probier' mal:

                    import "date"
                    import "timezone"
                    option location = timezone.location(name: "Europe/Berlin")
                    
                    from(bucket: "iobroker")
                      |> range(start:date.truncate(t:now(), unit:1y))
                      |> filter(fn: (r) => r["_measurement"] == "mqtt.0.Lora.esp03.temperature")
                      |> filter(fn: (r) => r["_field"] == "value")
                      |> aggregateWindow(every: 1d,fn:mean,timeSrc: "_start",createEmpty:false)
                      |> filter(fn: (r) => r["_value"] > 0 )
                      |> aggregateWindow(every: 1d,fn:last,timeSrc: "_start",createEmpty:true)
                      |> fill(column: "_value", value:0.0)
                      |> map(fn: (r) => ({
                            _time: r._time,
                            sum: if date.month(t: r._time) == 1 then r._value * 0.5
                            else if date.month(t: r._time) == 2 then r._value * 0.75
                            else r._value
                          }))
                      |> cumulativeSum(columns: ["sum"])
                      |> rename(columns: {sum: "Grünlandtemperatursumme"})
                    
                    A 1 Reply Last reply Reply Quote 1
                    • A
                      andreasploetz @Marc Berg last edited by

                      @marc-berg said in Grünlandtemperatursumme und Flux:

                      @andreasploetz sagte in Grünlandtemperatursumme und Flux:

                      Was noch schön wäre, wenn die Tage mit negativen Temperaturmittelwerten auch dargestellt werden bzw. dann mit den letzten zu verwendenden positiven Werten unverändert zu sehen sind - dann wäre das ganze einfacher zu "lesen

                      probier' mal:

                      import "date"
                      import "timezone"
                      option location = timezone.location(name: "Europe/Berlin")
                      
                      from(bucket: "iobroker")
                        |> range(start:date.truncate(t:now(), unit:1y))
                        |> filter(fn: (r) => r["_measurement"] == "mqtt.0.Lora.esp03.temperature")
                        |> filter(fn: (r) => r["_field"] == "value")
                        |> aggregateWindow(every: 1d,fn:mean,timeSrc: "_start",createEmpty:false)
                        |> filter(fn: (r) => r["_value"] > 0 )
                        |> aggregateWindow(every: 1d,fn:last,timeSrc: "_start",createEmpty:true)
                        |> fill(column: "_value", value:0.0)
                        |> map(fn: (r) => ({
                              _time: r._time,
                              sum: if date.month(t: r._time) == 1 then r._value * 0.5
                              else if date.month(t: r._time) == 2 then r._value * 0.75
                              else r._value
                            }))
                        |> cumulativeSum(columns: ["sum"])
                        |> rename(columns: {sum: "Grünlandtemperatursumme"})
                      

                      Perfekt - passt! Vielen Dank.

                      1 Reply Last reply Reply Quote 0
                      • L
                        lansester @Marc Berg last edited by lansester

                        @marc-berg
                        Sehr genial, ich war auf der Suche nach einer Lösung um im IoBroker mit den in der InfluxDB gespeicherten Daten die Grünlandtemp zu berechnen.
                        Aber mal eine womöglich etwas blöde Frage:
                        Ist das Javascript, so dass ich es direkt als Skript verwenden kann und muss nur den Datenpunkt meines Außentemp-Sensors angeben?
                        Ich hab mir den Code angesehen und sehe nicht, wo der kummulierte Wert als Ergebnis zurück gegeben wird oder (noch besser) direkt in einen Datenpunkt geschrieben wird.

                        Mein Ziel:
                        Einmal pro Tag ein Skript laufen lassen (Blockly oder Javascript), welches aus den vorhandenen Daten in der InfluxDB (Datenpunkt des Temp-Sensors) die aktuelle Gründlandtemperatur berechnet und in einem Objekt/Datenpunkt ablegt.
                        Das Objekt würde ich dann wiederum mit loggen und zur Darstellung nutzen.

                        VIELEN DANK! 👍
                        Schön zu sehen, dass auch andere Interesse an sowas haben. 😁

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

                          @lansester sagte in Grünlandtemperatursumme und Flux:

                          Ist das Javascript, so dass ich es direkt als Skript verwenden kann und muss nur den Datenpunkt meines Außentemp-Sensors angeben?

                          Nein, das ist kein Javascript, sondern Flux, also die Standard-Abfragesprache der InfluxDB 2.x

                          Mein Ziel:
                          Einmal pro Tag ein Skript laufen lassen (Blockly oder Javascript), welches aus den vorhandenen Daten in der InfluxDB (Datenpunkt des Temp-Sensors) die aktuelle Gründlandtemperatur berechnet und in einem Objekt/Datenpunkt ablegt.
                          Das Objekt würde ich dann wiederum mit loggen und zur Darstellung nutzen.

                          Genau diesem Umweg benötigst du mit meiner Abfrage eben nicht. Die Abfrage setzt einen Datenpunkt mit Außentemperaturen voraus, der mindestens stündlich in die InfluxDB loggen sollte. Diese Abfrage kannst du 1:1 z.B. in Grafana einfügen (Datenpunkt natürlich anpassen) und bist damit fertig.

                          255fc85e-f7ad-4326-aa30-258f099f4f7e-grafik.png

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          686
                          Online

                          31.7k
                          Users

                          79.7k
                          Topics

                          1.3m
                          Posts

                          dingediedieweltnichtbraucht flux influxdb
                          4
                          11
                          659
                          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