Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. InfluxDB mehrere Task zu einem erfassen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    InfluxDB mehrere Task zu einem erfassen

    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      Mico last edited by Mico

      Hallo,

      Eine Frage noch zur besseren Ordnung der Taskbefehle.

      Zur Zeit habe ich für die Erfassung der Temperatur und der Luftfeuchte jeden Raum separat mit einer Task Run für 0:00 gespeichert. Wäre es auch möglich die Räume in einem einzigen Task zu speichern ?

      Ich habe mal das Script für 2 Räume also 2 Task so wie es im Moment bei mir ist. Wie müsste ich diese umarbeiten damit
      daraus nur noch ein Script entsteht?

      option task = {name: "arbeitszimmerwerte", cron: "0 0 * * *"}
      
      from(bucket: "iobroker")
          |> range(start: -24h)
          |> filter(
              fn: (r) =>
                  r["_measurement"] == "zigbee.0.00124b002fabe53f.humidity" or r["_measurement"]
                      ==
                      "zigbee.0.00124b002fabe53f.temperature",
          )
          |> filter(fn: (r) => r["_field"] == "value")
          |> aggregateWindow(every: 60m, fn: mean, createEmpty: false)
          |> pivot(rowKey: ["_time"], columnKey: ["_measurement"], valueColumn: "_value")
          |> map(
              fn: (r) =>
                  ({
                      _time: r._time,
                      _field: "value",
                      _measurement: "raumwerte",
                      temperatur: r["zigbee.0.00124b002fabe53f.temperature"],
                      humidity: r["zigbee.0.00124b002fabe53f.humidity"],
                      zimmer: "arbeitszimmer",
                  }),
          )
          |> to(
              bucket: "raumwerte",
              tagColumns: ["zimmer"],
              fieldFn: (r) => ({temperatur: r.temperatur, humidity: r.humidity}),
          )
      
      option task = {name: "kuechenwerte", cron: "0 0 * * *"}
      
      from(bucket: "iobroker")
          |> range(start: -24h)
          |> filter(
              fn: (r) =>
                  r["_measurement"] == "zigbee.0.00124b002fabe538.humidity" or r["_measurement"]
                      ==
                      "zigbee.0.00124b002fabe538.temperature",
          )
          |> filter(fn: (r) => r["_field"] == "value")
          |> aggregateWindow(every: 60m, fn: mean, createEmpty: false)
          |> pivot(rowKey: ["_time"], columnKey: ["_measurement"], valueColumn: "_value")
          |> map(
              fn: (r) =>
                  ({
                      _time: r._time,
                      _field: "value",
                      _measurement: "raumwerte",
                      temperatur: r["zigbee.0.00124b002fabe538.temperature"],
                      humidity: r["zigbee.0.00124b002fabe538.humidity"],
                      zimmer: "kueche",
                  }),
          )
          |> to(
              bucket: "raumwerte",
              tagColumns: ["zimmer"],
              fieldFn: (r) => ({temperatur: r.temperatur, humidity: r.humidity}),
          )
      
      

      Gruß
      Mico

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

        @mico

        Ziemlich tricky, da man in der Map-Funktion nicht überall mit Variablen arbeiten darf, ich nicht stumpf die Queries duplizieren wollte und es in Flux nicht sowas wie Schleifen gibt (glaube ich).

        Das hier müsste es tun (Achtung, die Spalte heißt jetzt temperature) :

        getData = (sensorId, zimmer) =>
            from(bucket: "iobroker")
                |> range(start: -24h)
                |> filter(
                    fn: (r) =>
                        r["_measurement"] == "zigbee.0." + sensorId + ".temperature" or
                        r["_measurement"] == "zigbee.0." + sensorId + ".humidity"
                )
                |> filter(fn: (r) => r["_field"] == "value")
                |> aggregateWindow(every: 60m, fn: mean, createEmpty: false)
                |> pivot(
                    rowKey: ["_time"],
                    columnKey: ["_measurement"],
                    valueColumn: "_value"
                )
                |> rename(fn: (column) =>
                    if column =~ /temperature/ then "temperature"
                    else if column =~ /humidity/ then "humidity"
                    else column
                )
                |> map(
                    fn: (r) => ({
                        _time: r._time,
                        _field: "value",
                        _measurement: "raumwerte",
                        temperature: r["temperature"],
                        humidity: r["humidity"],
                        zimmer: zimmer,
                    })
                )
        
        // hier ergänzen
        kuecheData = getData(sensorId: "00124b002fabe538", zimmer: "kueche")
        arbeitszimmerData = getData(sensorId: "00124b002fabe53f", zimmer: "arbeitszimmer")
        
        // und hier ergänzen
        union(tables: [kuecheData, arbeitszimmerData])
        
            |> to(
                bucket: "raumwerte",
                tagColumns: ["zimmer"],
                fieldFn: (r) => ({temperature: r.temperature, humidity: r.humidity})
            )
        
        

        EDIT: Formatierung

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

          Vielen Dank,

          Ich versuche dieses heute Abend bzw. morgen früh umzusetzen.

          Gruß
          Mico

          M 1 Reply Last reply Reply Quote 0
          • M
            Mico @Mico last edited by

            das hat alles geklappt.

            2 verständnisfragen:

            bei dem punkt: rename

            if column =~ /temperature/ then "temperature"
                        else if column =~ /humidity/ then "humidity"
            

            wird das wirklich umbenannt und würde das wenn ich dann, das so schreibe

            if column =~ /temperature/ then "donald"
                        else if column =~ /humidity/ then "mickey"
            

            in dem neuen bucket statt temperatur donald heißen.

            und was würde passieren wenn ich statt:

            |> map(
                        fn: (r) => ({
                            _time: r._time,
                            _field: "value",
                            _measurement: "raumwerte",
                            temperature: r["temperature"],
                            humidity: r["humidity"],
                            zimmer: zimmer,
            

            einfach das zimmer vor die temperatur und der luftfeuchtigkeit schreibe.

            |> map(
                        fn: (r) => ({
                            _time: r._time,
                            _field: "value",
                            _measurement: "raumwerte",
                            zimmer: zimmer,
                            temperature: r["temperature"],
                            humidity: r["humidity"],
            

            Gruß
            Mico

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

              @mico sagte in InfluxDB mehrere Task zu einem erfassen:

              bei dem punkt: rename
              wird das wirklich umbenannt und würde das wenn ich dann, das so schreibe

              if column =~ /temperature/ then "donald"
                          else if column =~ /humidity/ then "mickey"
              

              in dem neuen bucket statt temperatur donald heißen.

              An dieser Stelle erfolgt die Umbenennung lediglich, um einen einheitlichen Spalten-Namen für die map() Funktion zu haben. Wenn du die Spalten im Ziel-Measurement anders benennen möchtest, dann in to():

                  |> to(
                      bucket: "raumwerte",
                      tagColumns: ["zimmer"],
                      fieldFn: (r) => ({donald: r.temperature, mickey: r.humidity})
                  )
              

              und was würde passieren wenn ich statt:

              |> map(
                          fn: (r) => ({
                              _time: r._time,
                              _field: "value",
                              _measurement: "raumwerte",
                              temperature: r["temperature"],
                              humidity: r["humidity"],
                              zimmer: zimmer,
              

              einfach das zimmer vor die temperatur und der luftfeuchtigkeit schreibe.

              Die Reihenfolge ist völlig schnuppe, kannst du machen. Was willst du erreichen?

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

                ich möchte nur irgendwann verstehen, wie ich das alles aufbauen muss damit ich ein gewünschtes ergebnis erzielen kann.
                damit ich mein wissensstand mal erhöhen kann.

                bei dem zweiten Hauptgruppe = raumwert der teilt zich in die gruppen = temperatur und luftfeuchtigkeit = und die erhalten die gruppe zimmer nit den räumen

                wenn ich zimmer jetzt nach oben setzte habe ich
                Hauptgruppe = raumwert der hat die untergruppe zimmer mit den räumen und diese die temperatur bzw luftfeuchte richtig gedacht?

                Gruß
                mico

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

                  @mico sagte in InfluxDB mehrere Task zu einem erfassen:

                  richtig gedacht?

                  "Hauptgruppe" und "Untergruppe" sind ja von dir eingeführte Begriffe, da kann man wohl nicht von richtig oder falsch reden.

                  Ich halte mich da eher an die technischen Gegebenheiten. So ein Measurement besteht aus einer recht einfachen Tabelle, die Spalten mit Unterstrich sind die Muss-Spalten, die von InfluxDB mindestens benötigt werden. "_field" enthält den Namen des Messwertes, "_value" den Messwert selbst (ohne Einheit).

                  Dazu kommen beliebig viele Tags, die sind zur Kategorisierung von Messungen und zur Unterstützung bei der Suche und Filterung gedacht. "zimmer" ist hier ein Tag, was du einfach immer mitgibst, um später zu wissen, aus welchem Raum der Messwert stammt. Vorteil der Tags: sie sind indexiert, d.h. Filter darüber sind sehr schnell. Deshalb aber auf keinen Fall Messwerte in Tags speichern, sonst sprengt es dir die Datenbank.

                  Die Zusammenführung der einzelnen Messwerte zu einer gemeinsamen Messung erfolgt über die exakt gleiche Zeit. (zum Beispiel die erste und zweite Zeile)

                  _measurement _field _value _time zimmer
                  raumwerte humidity 55 2024-11-01T12:12:12.012Z Arbeitszimmer
                  raumwerte temperature 23 2024-11-01T12:12:12.012Z Arbeitszimmer
                  raumwerte humidity 60 2024-11-01T13:12:12.012Z Kueche
                  raumwerte temperature 19.5 2024-11-01T13:12:12.012Z Kueche
                  raumwerte humidity 54 2024-11-02T12:12:12.012Z Arbeitszimmer
                  raumwerte temperature 23 2024-11-02T12:12:12.012Z Arbeitszimmer
                  raumwerte humidity 61 2024-11-02T13:12:12.012Z Kueche
                  raumwerte temperature 19.4 2024-11-02T13:12:12.012Z Kueche

                  Jetzt, wo ich darüber erzähle: @haus-automatisierung hat über die Grundlagen auch ein Video gemacht, das ist vielleicht hilfreicher.

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

                  Support us

                  ioBroker
                  Community Adapters
                  Donate

                  856
                  Online

                  31.9k
                  Users

                  80.2k
                  Topics

                  1.3m
                  Posts

                  2
                  7
                  313
                  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