Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. InfluxDB mehrere Task zu einem erfassen

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.1k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    929

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

InfluxDB mehrere Task zu einem erfassen

Scheduled Pinned Locked Moved Skripten / Logik
7 Posts 2 Posters 451 Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    Mico
    wrote on last edited by Mico
    #1

    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 BergM 1 Reply Last reply
    0
    • M 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 BergM Offline
      Marc BergM Offline
      Marc Berg
      Most Active
      wrote on last edited by Marc Berg
      #2

      @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

      NUC10I3+Ubuntu+Docker+ioBroker+influxDB2+Node Red+EMQX+Grafana

      Pi-hole, Traefik, Checkmk, Conbee II+Zigbee2MQTT, ESPSomfy-RTS, LoRaWAN, Arduino, KiCad

      Benutzt das Voting im Beitrag, wenn er euch geholfen hat.

      M 1 Reply Last reply
      0
      • Marc BergM 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 Offline
        M Offline
        Mico
        wrote on last edited by
        #3

        Vielen Dank,

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

        Gruß
        Mico

        M 1 Reply Last reply
        0
        • M Mico

          Vielen Dank,

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

          Gruß
          Mico

          M Offline
          M Offline
          Mico
          wrote on last edited by
          #4

          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 BergM 1 Reply Last reply
          0
          • M Mico

            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 BergM Offline
            Marc BergM Offline
            Marc Berg
            Most Active
            wrote on last edited by Marc Berg
            #5

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

            NUC10I3+Ubuntu+Docker+ioBroker+influxDB2+Node Red+EMQX+Grafana

            Pi-hole, Traefik, Checkmk, Conbee II+Zigbee2MQTT, ESPSomfy-RTS, LoRaWAN, Arduino, KiCad

            Benutzt das Voting im Beitrag, wenn er euch geholfen hat.

            M 1 Reply Last reply
            0
            • Marc BergM 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 Offline
              M Offline
              Mico
              wrote on last edited by
              #6

              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 BergM 1 Reply Last reply
              0
              • M Mico

                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 BergM Offline
                Marc BergM Offline
                Marc Berg
                Most Active
                wrote on last edited by
                #7

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

                NUC10I3+Ubuntu+Docker+ioBroker+influxDB2+Node Red+EMQX+Grafana

                Pi-hole, Traefik, Checkmk, Conbee II+Zigbee2MQTT, ESPSomfy-RTS, LoRaWAN, Arduino, KiCad

                Benutzt das Voting im Beitrag, wenn er euch geholfen hat.

                1 Reply Last reply
                1
                Reply
                • Reply as topic
                Log in to reply
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes


                Support us

                ioBroker
                Community Adapters
                Donate

                704

                Online

                32.6k

                Users

                82.2k

                Topics

                1.3m

                Posts
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                ioBroker Community 2014-2025
                logo
                • Login

                • Don't have an account? Register

                • Login or register to search.
                • First post
                  Last post
                0
                • Home
                • Recent
                • Tags
                • Unread 0
                • Categories
                • Unreplied
                • Popular
                • GitHub
                • Docu
                • Hilfe