Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
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
    15
    1
    885

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    1.9k

InfluxDB mehrere Task zu einem erfassen

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
7 Beiträge 2 Kommentatoren 450 Aufrufe 2 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • M Offline
    M Offline
    Mico
    schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
    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
      schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
      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
        schrieb am zuletzt editiert von
        #3

        Vielen Dank,

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

        Gruß
        Mico

        M 1 Antwort Letzte Antwort
        0
        • M Mico

          Vielen Dank,

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

          Gruß
          Mico

          M Offline
          M Offline
          Mico
          schrieb am zuletzt editiert von
          #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 Antwort Letzte Antwort
          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
            schrieb am zuletzt editiert von 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 Antwort Letzte Antwort
            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
              schrieb am zuletzt editiert von
              #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 Antwort Letzte Antwort
              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
                schrieb am zuletzt editiert von
                #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 Antwort Letzte Antwort
                1
                Antworten
                • In einem neuen Thema antworten
                Anmelden zum Antworten
                • Älteste zuerst
                • Neuste zuerst
                • Meiste Stimmen


                Support us

                ioBroker
                Community Adapters
                Donate

                499

                Online

                32.6k

                Benutzer

                82.0k

                Themen

                1.3m

                Beiträge
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                ioBroker Community 2014-2025
                logo
                • Anmelden

                • Du hast noch kein Konto? Registrieren

                • Anmelden oder registrieren, um zu suchen
                • Erster Beitrag
                  Letzter Beitrag
                0
                • Home
                • Aktuell
                • Tags
                • Ungelesen 0
                • Kategorien
                • Unreplied
                • Beliebt
                • GitHub
                • Docu
                • Hilfe