Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Off Topic
    4. InfluxDB
    5. Datenaufzeichnung Retention InfluxDB 2.0

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Datenaufzeichnung Retention InfluxDB 2.0

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

      @cainam
      Du kannst die Daten natürlich in das gleiche Bucket schreiben, das Problem (dass du ja offensichtlich schon gefunden hast) besteht im Löschen der Daten. Das geht meines Wissens aus einem Task heraus nicht, sondern nur per API oder CLI. Theoretisch könnte man das Löschen über einen Cronjob durchführen und die Aggregate Funktionen inkl. Schreiben über ein temporäres Bucket per Task und das Ganze zeitlich synchronisieren ... Schwierig ...

      Ich glaube, für diese Anforderung sind die Tasks raus. Stattdessen würde ich das ganze über ein Bash-Skript lösen.

      1 Reply Last reply Reply Quote 0
      • C
        cainam last edited by

        Bist du sicher geht das mit drop nicht?

        Es wäre even einfach die Daten so zu reduzieren anstatt alles neue buckets zu machen… auch vergessen Risiko ist massiv tiefer

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

          @cainam sagte in Datenaufzeichnung Retention InfluxDB 2.0:

          Bist du sicher geht das mit drop nicht?

          Ja.

          1 Reply Last reply Reply Quote 0
          • B
            bitwicht @mickym last edited by bitwicht

            @mickym

            Re: Datenaufzeichnung Retention InfluxDB 2.0

            Dazu hätte ich noch eine Frage.

            Das Bucket "iobroker" stelle ich auf 180 Tage.
            Das Bucket "iobroker-downsampling" stelle ich auf 5 Jahre.

            Ich schreibe jetzt monatlich den Wasserverbrauch weg.

            Wenn ich nun mit Grafana eine Auswertung über 3 Jahre machen, müsste ein Teil der Daten aus dem iobroker Bucket und der andere Teil aus dem iobroker-downsampling Bucket kommen.

            Wäre das so der richtige Aufbau?

            Würde ich das dann so umbauen müssen:

            from(bucket: "iobroker" & "iobroker-downsampling")
              |> range(start: -12mo)
              |> filter(fn: (r) => r["_measurement"] == "Wasserzaehler-CAM-Haus")
              |> filter(fn: (r) => r["_field"] == "value")
              |> difference()
              |> aggregateWindow(every: 1mo, fn: sum, createEmpty: false, timeSrc: "_start")
              |> keep(columns: ["_value", "_time"])
            
            Marc Berg 1 Reply Last reply Reply Quote 0
            • Marc Berg
              Marc Berg Most Active @bitwicht last edited by

              @bitwicht sagte in Datenaufzeichnung Retention InfluxDB 2.0:

              Würde ich das dann so umbauen müssen:

              So (mit "&") geht das nicht. Dafür sollte die union Funktion geeignet sein. Du machst zwei Abfragen auf jeweils ein Bucket und "klebst" die mit union sozusagen untereinander.

              https://docs.influxdata.com/flux/v0/stdlib/universe/union/

              1 Reply Last reply Reply Quote 0
              • B
                bitwicht last edited by

                @Marc-Berg

                Das macht natürlich alles viel komplexer.

                Die Idee von @SpacerX ein Bucker "forever" und ein Bucket 180 Tage finde ich ja viel scharmanter.
                Wäre dann aber nicht "best practice"

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

                  @bitwicht sagte in Datenaufzeichnung Retention InfluxDB 2.0:

                  Das macht natürlich alles viel komplexer.

                  Einfach kann jeder...

                  Wäre dann aber nicht "best practice"

                  Best practise gibt es hier m.E nicht. Dazu sind die Anforderungen, Daten(mengen) und das eigene Wissen einfach zu unterschiedlich. Man muss sich den Weg suchen, der einem passt und der einem nicht die Hälfte der Lebenszeit wegfrisst.

                  1 Reply Last reply Reply Quote 0
                  • B
                    bitwicht last edited by

                    @Marc-Berg

                    Wenn ich die Idee von SpacerX umsetzte.
                    2 Adapter mit je einem Bucket (unterschiedliche Aufbewahrungszeiten).

                    Siehst du da ein Problem in das ich laufen könnte ?

                    1 Reply Last reply Reply Quote 0
                    • mickym
                      mickym Most Active last edited by

                      Na ich würde es auch nicht zu kompliziert machen. Wenn man nur die Tageswerte wegspeichert, da kann man doch weit zurückgehen und mit einem bucket arbeiten.

                      Wenn beispielsweise alle 5 Minuten ein Wert in die Datenbank geschrieben wird, dann entspricht das 51.840 Werten, wenn man diese 180 Tage aufbewahrt. Wenn man nun nur die Tageswerte mit der gleichen Werteanzahl benötigt sind das bereits 142 Jahre. Die Frage ist doch nur, wie benötige ich die 5 Minutenwerte und interessiert mich diese Details wirklich noch 10 Jahre später.

                      Da ich selbst kein Datensammler bin, weiß ich aber nicht, ob man das via grafana in einer Abfrage oder Diagramm umsetzen kann.

                      1 Reply Last reply Reply Quote 0
                      • B
                        bitwicht last edited by

                        @mickym

                        War nur ein Beispiel.
                        Ich logge den aktuellen Energieverbrauch von ca. 40 Shellys die ja fast alle Sekunde einen Wert speichern.
                        Das brauche ich natürlich nicht 1, 2 Jahre zurück.

                        Ich glaube 2 Buckets würden mir reichen.

                        2 Buckets hätten für mich (Anfänger) gegenüber dem downsampling dein Vorteil, dass ich zB. bei Grafana Auswertungen nicht immer in beiden Buckets suchen muss.

                        1 Reply Last reply Reply Quote 0
                        • B
                          bitwicht last edited by

                          @spacerx said in Datenaufzeichnung Retention InfluxDB 2.0:

                          Der Vollständigkeit halber noch der Erfolg bringende Task.
                          import "timezone" option location = timezone.location(name: "Europe/Berlin") option task = {name: "Downsampling Vb_Stromzaehler", cron: "1 0 * * *"} data = from(bucket: "ioBroker") |> range(start: -task.every) |> filter(fn: (r) => r["_measurement"] == "Vb_Stromzaehler") |> filter(fn: (r) => r["from"] == "system.adapter.javascript.0") data |> aggregateWindow(every: 1d, fn: last, timeSrc: "_start") |> toInt() // in Wh ohne Komma |> set(key: "_measurement", value: "Hauptzaehler") // Use the to() function to validate that the results look correct. This is optional. |> to(bucket: "Stromverbrauch", org: "RBE")

                          Zu deinem downsampling Script noch ein paar Fragen ob ich das richtig verstehe.

                          • Die Werte im Quell-Bucket werden nicht gelöscht, sondern nur der letzte Wert eines Tages in ein anderes Bucket geschrieben oder ?
                          • In deinem Beispiel schreibst du in das neue Bucket Downsamling und in Measurement Vb_Stromzaehler - oder ?
                          • Den Job lege ich direkt in der Influx unter Tasks an ?
                          • Der Job läuft täglich um 00:01 Uhr (glaube 1 Minute, 0 Stunde). Wenn ich jetzt auf das Measuremnt eine Grafana Auswertung lege, würde der aktuelle Tag fehlen. Wenn ich den Job alle Stunde laufen lasse, müsste ich doch zumindest immer den nahezu aktuellen Tageswert haben oder habe ich da einen Denkfehler? Spricht was dagegen den Job jede Stunde laufen zu lassen ?
                          S 1 Reply Last reply Reply Quote 0
                          • S
                            SpacerX @bitwicht last edited by

                            @bitwicht genau so.

                            Wenn du dir in Grafana die Werte aus dem Downsampling anzeigst wird genau wie du sagst der Aktuelle Tag fehlen.
                            Ich mach das so, das ich mir die vergangenen Tage an im Diagramm anzeigen lasse und den aktuellen Tag aus der Quellaufzeichnung. Das kannst du im Diagramm Mischen. So brauche ich nur einmal am Tag Downsampeln.

                            Das Quellbucket hat bei mir nur eine eine Aufzeichnungsdauer von 3 Monaten. Alle älteren Daten liegen dann komprimiert in einem Bucket mit unbegrenzter Aufzeichnung

                            1 Reply Last reply Reply Quote 0
                            • B
                              bitwicht last edited by

                              @SpacerX

                              Wie sieht denn deine Abfrage im Grafana aus, dass du Historie und Tageswert angezeigt bekommst?

                              Arbeitest du da mit "union" wie es Marc beschrieben hat oder machst du einfach 2 Abfragen die halt in einem Querry sind?

                              S 1 Reply Last reply Reply Quote 0
                              • S
                                SpacerX @bitwicht last edited by SpacerX

                                @bitwicht spät aber bin jetzt erst wieder am Rechner.

                                Abfrage A:

                                import "date"
                                import "timezone" // import wegen der Berechnung um 02:00:00
                                option location = timezone.location(name: "Europe/Berlin")
                                  from(bucket: "Stromverbrauch")
                                  |> range(start: -1y, stop: date.truncate(t: now(), unit: 1mo))
                                  |> filter(fn: (r) => r["_measurement"] == "Stromzaehler")
                                  |> aggregateWindow(every: 1mo , fn: last,  timeSrc: "_start" ,createEmpty: true )
                                  |> difference()
                                

                                Abfrage B

                                import "timezone" // import wegen der Berechnung um 02:00:00
                                option location = timezone.location(name: "Europe/Berlin")
                                from(bucket: "ioBroker")
                                  |> range(start: -1mo, stop: now())
                                  |> filter(fn: (r) => r["_measurement"] == "Vb_Stromzaehler")
                                  |> filter(fn: (r) => r["from"] == "system.adapter.javascript.0")
                                  |> aggregateWindow(every: 1mo , fn: last,  timeSrc: "_start") // ,createEmpty: false )
                                  |> difference()
                                

                                Der Screenshot dazu:

                                Screenshot 2024-01-15 183758.png

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

                                Support us

                                ioBroker
                                Community Adapters
                                Donate

                                887
                                Online

                                31.6k
                                Users

                                79.6k
                                Topics

                                1.3m
                                Posts

                                8
                                31
                                4858
                                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