Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Aus influxDB 2 lesen und schreiben JS oder node.js

    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

    Aus influxDB 2 lesen und schreiben JS oder node.js

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

      Liebe Freunde,

      ich habe jetzt sehr viele Stunden damit verbracht, im Netz nach Hinweisen zu suchen und gebe offiziell zu, auch ChatGPT zu bemühen - aber es geht nicht.

      Folgendes ist das Ziel:
      Seit Anfang 2020 hat der ioBroker brav Werte meiner Wetterstation erhoben und dokumentiert vom Wetter-WLAN-Skript in meine influxDB 2.x geloggt und geschrieben. Das sehe ich mit Grafana.
      Längere Zeit darauf nicht geschaut habe ich jetzt festgestellt, dass vier Werte (DPs) teilweise unplausibel geloggt wurden. Möglicherweise, weil die Batterie der Wetterstation leer war. Beispielsweise steht im vom Skript erzeugten Wert Tiefsttemperatur_Spitzenwert -5572,xx°C. Und leider betrifft das noch drei andere DPs, in denen unplausible Werte sind.
      Meine Vorstellung war jetzt, ich lese die Werte DP: Temperatur, filtere sie, dass wenn der value größer als -50 und kleiner als 50 sind in einen anderen DP: Temperatur_clean schreibe. Dann lösche ich den Inhalt von DP: Temperatur, lese alle Werte aus DP: Temperatur_clean ein und schreibe sie zurück in DP: Temperatur. Für alle vier Werte muss ich das hoffentlich nur einmal machen. Und dann habe ich nur noch plausible Werte. Und eine neue Wetterstation, die mir früh genug zeigt, wenn die Batterie zur Neige geht.

      Aber alles, was ich versucht habe (Blockly geht wohl gar nicht, weil man keine großen Datenmengen schreiben kann, JavaScript aus ioBroker ging nicht, JavaScript über node.js mit einem Script), nichts hat tausende Werte in einen neuen DP schreiben wollen. Meine Kenntnisse in JavaScript sind auch so beschränkt, dass ich mir von Chat GPT habe Vorschläge unterbreiten lassen müssen, wie das gehen könnte.
      Dabei waren auch Beispiele, die von fünf definitiv in einem array vorgegebenen Zahlen zwei wegfiltern und drei in den DP schreiben sollten. Aufgetaucht ist aber immer nur der letzte Wert und der Wert ader aktuellen Zeit der Auslösung des Skriptes mit einem value von 0.

      Und da die Fragen kommen werden: ja, das logging des neuen DP: Temperatur_clean ist eingeschaltet und der Typ steht auf Zahl. Die Scripte zeigen auch immer, wie beim letzten z.B. dass drei Werte geschrieben wurden. Die finden sich aber nicht im DP.

      Kann mir bitte jemand einen Hinweis geben, warum das nicht funktioniert? An influxDB scheint es ja nicht zu liegen, denn ich sehe tausende geloggte Werte in verschiedenen DPs, aber nicht in dem, der von mir beschrieben werden soll.

      Gibt es dafür vielleicht von jemandem ein Skript, das dieser als sicher funktionierend mal zeigen könnte?

      Ich bin Euch sehr dankbar.

      Jo

      haus-automatisierung arteck 2 Replies Last reply Reply Quote 0
      • haus-automatisierung
        haus-automatisierung Developer Most Active @XxJooO last edited by

        @xxjooo Das kannst Du doch direkt mit Flux machen

        XxJooO 1 Reply Last reply Reply Quote 1
        • arteck
          arteck Developer Most Active @XxJooO last edited by arteck

          @xxjooo zeig doch mal den Query

          1 Reply Last reply Reply Quote 0
          • XxJooO
            XxJooO @haus-automatisierung last edited by

            @haus-automatisierung ,

            soweit ich gelesen habe, kann man mit der Flux-Sprache von InfluxDB Daten lesen, filtern und transformieren – aber nicht direkt in andere Datenpunkte schreiben.

            Ich kann leider erst am Nachmittag eines meiner Beispiele einstellen.

            haus-automatisierung 1 Reply Last reply Reply Quote 0
            • haus-automatisierung
              haus-automatisierung Developer Most Active @XxJooO last edited by haus-automatisierung

              @xxjooo Klar kannst Du das. Mit > to(). Macht man doch z.B. mit Tasks genauso. Kann man natürlich auch nur einmalig manuell ausführen, um einen bestehenden Datenbestand einzuschränken und das Ergebnis wieder zu speichern.

              https://docs.influxdata.com/flux/v0/stdlib/influxdata/influxdb/to/

              XxJooO 1 Reply Last reply Reply Quote 0
              • XxJooO
                XxJooO @haus-automatisierung last edited by

                @haus-automatisierung ,

                also hier ein JavaScript aus ioBroker:

                const rangeStart = '2024-06-19T00:00:00.000Z';
                const rangeStop = '2025-06-19T00:00:00.000Z';
                
                function loeschen() {
                    sendTo('influxdb.0', 'deleteAll', [
                        { id: '0_userdata.0.Wetterstation.Aussenfeuchtigkeit_clean' }
                    ], result => console.log('deleted'));
                }
                
                function holen() {
                    sendTo('influxdb.0', 'getHistory', {
                        id: '0_userdata.0.Wetterstation.Aussenfeuchtigkeit',
                        options: {
                            start: new Date(rangeStart).getTime(), 
                            end: new Date(rangeStop).getTime(),
                            aggregate: 'onchange',
                            addId: true
                        }
                    }, function (result) {
                        if (!result || !result.result || !Array.isArray(result.result)) {
                            console.error('Fehlerhafte Rückgabe:', JSON.stringify(result));
                            return;
                        }
                
                        for (let i = 0; i < result.result.length; i++) {
                            const entry = result.result[i];
                            const val = entry.val;
                
                            if (val >= 30 && val <= 60) {
                                setState('0_userdata.0.Wetterstation.Aussenfeuchtigkeit_clean', {
                                    val: val,
                                    ts: entry.ts,
                                    ack: true,
                                    q: entry.q || 0,
                                    from: entry.from || 'system.adapter.javascript.0'
                                }, true);
                            }
                        }
                    });
                }
                
                //loeschen(); // optional
                holen();      // Daten abrufen
                

                In 0_userdata.0.Wetterstation.Aussenfeuchtigkeit sind für den Zeitraum tausende an Daten. Angekommen ist das:

                aecbf77c-29c6-43e6-ab2f-cf2fdd15b890-image.png

                haus-automatisierung 1 Reply Last reply Reply Quote 0
                • haus-automatisierung
                  haus-automatisierung Developer Most Active @XxJooO last edited by

                  @xxjooo Oha, Du rufst also extrem oft setState auf, und hoffst auf die Logik dahinter? Wenn Du es schon so extrem umständlich mit einem Script machen möchtest (statt mit Flux-Funktionen direkt in der Datenbank), dann schau wenigstens die sendTo Funktion storeState für die Datenbank an:

                  https://github.com/ioBroker/ioBroker.influxdb?tab=readme-ov-file#storestate

                  XxJooO 1 Reply Last reply Reply Quote 0
                  • XxJooO
                    XxJooO @haus-automatisierung last edited by

                    @haus-automatisierung ,

                    also mit dem Script:

                    const rangeStart = '2024-06-19T00:00:00.000Z';
                    const rangeStop = '2025-06-19T00:00:00.000Z';
                    
                    function loeschen() {
                        sendTo('influxdb.0', 'deleteAll', [
                            { id: '0_userdata.0.Wetterstation.Aussenfeuchtigkeit_clean' }
                        ], result => console.log('deleted'));
                    }
                    
                    function holen() {
                        sendTo('influxdb.0', 'getHistory', {
                            id: '0_userdata.0.Wetterstation.Aussenfeuchtigkeit',
                            options: {
                                start: new Date(rangeStart).getTime(),
                                end: new Date(rangeStop).getTime(),
                                aggregate: 'onchange',
                                addId: true
                            }
                        }, function (result) {
                            if (!result || !result.result || !Array.isArray(result.result)) {
                                console.error('Fehlerhafte Rückgabe:', JSON.stringify(result));
                                return;
                            }
                    
                            for (let i = 0; i < result.result.length; i++) {
                                const entry = result.result[i];
                                const val = entry.val;
                    
                                if (val >= 30 && val <= 60) {
                                    sendTo('influxdb.0', 'storeState', {
                                        id: '0_userdata.0.Wetterstation.Aussenfeuchtigkeit_clean',
                                        state: {
                                            val: val,
                                            ts: entry.ts,
                                            ack: true,
                                            q: entry.q || 0,
                                            from: entry.from || 'system.adapter.javascript.0'
                                        }
                                    });
                                }
                            }
                        });
                    }
                    //loeschen(); // optional
                    holen();      // Daten abrufen
                    

                    ergibt sich leider exakt das gleiche Ergebnis, nur zwei Werte...

                    Dann muss ich mich doch mit der Flux-Sprache beschäftigen. Interessanterweise hatte ich vor der Umstellung auf influxDB 2.x mit influxDB 1.8x schon mal so ein Problem und konnte aber mit einem JavaScript alle Daten in einen anderen DP schreiben...

                    Gut, dann schau ich mal auf Flux...

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

                      @xxjooo sagte in Aus influxDB 2 lesen und schreiben JS oder node.js:

                      Gut, dann schau ich mal auf Flux...

                      from(bucket: "dein_bucket")
                        |> range(start: -10y)
                        |> filter(fn: (r) => 
                            r._measurement == "0_userdata.0.Wetterstation.Aussenfeuchtigkeit" and
                            r._field == "value"
                        )
                        |> filter(fn: (r) => r._value >= 30.0 and r._value <= 60.0)
                        |> set(key: "_measurement", value: "0_userdata.0.Wetterstation.Aussenfeuchtigkeit_clean")
                        |> to(bucket: "dein_bucket")
                      
                      

                      EDIT: indem du die letzte Zeile (mit "to") erstmal weglässt, kannst du sehen, ob das Ergebnis das gewünschte ist.

                      XxJooO 2 Replies Last reply Reply Quote 2
                      • XxJooO
                        XxJooO @Marc Berg last edited by

                        @marc-berg ,

                        vielen Dank, sieht sehr einfach aus. Mal sehen.

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

                          @marc-berg, @arteck und @haus-automatisierung

                          Ok, ich bestätige: Der Weg funktioniert auf Anhieb. Sogar so, dass in einen anderen bucket geschrieben werden kann, der den DP noch gar nicht kannte. Vielen Dank dafür!

                          Dann möchte ich das jetzt gerne noch etwas weiter spinnen:

                          Ich bin ja grundsätzlich skeptisch, dass das nicht noch mal passiert. Jetzt habe ich ja inzwischen unter den Einstellungen der DPs Grenzen gesetzt, damit nur reale Werte durchkommen. Sollte das aber aus irgendeinem Grund noch mal passieren, dann würde ich gerne einfach diese Flux-Abfrage automatisiert ausführen lassen.

                          Da muss ich aber mal noch ein wenig drüber nachdenken, denn nach dem Lesen der readme des influx Adapters auf github kommt mir noch eine andere Idee: es müsste doch möglich sein, eine Abfrage mit JavaScript im ioBroker zu programmieren, unter den tausenden Werten die weniger als 10 zu finden, die weg müssen und diese mit dem delete state Befehl des Adapters einfach zu löschen.

                          Ich könnte dann den ersten Weg einmalig mit Zurückschreiben der Werte komplett durchgehen und dann, wenn letzteres funktionieren würde, das in das Wetter Skript von @SBorg integrieren oder zeitlich davor starten lassen.

                          Haltet Ihr das grundsätzlich für möglich? Ich setze es mal noch nicht auf gelöst, da ich sicher noch Fragen dazu habe.

                          Besten Dank Euch!

                          Jo

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

                            @xxjooo sagte in Aus influxDB 2 lesen und schreiben JS oder node.js:

                            Da muss ich aber mal noch ein wenig drüber nachdenken, denn nach dem Lesen der readme des influx Adapters auf github kommt mir noch eine andere Idee: es müsste doch möglich sein, eine Abfrage mit JavaScript im ioBroker zu programmieren, unter den tausenden Werten die weniger als 10 zu finden, die weg müssen und diese mit dem delete state Befehl des Adapters einfach zu löschen.
                            Ich könnte dann den ersten Weg einmalig mit Zurückschreiben der Werte komplett durchgehen und dann, wenn letzteres funktionieren würde, das in das Wetter Skript von @SBorg integrieren oder zeitlich davor starten lassen.
                            Haltet Ihr das grundsätzlich für möglich? Ich setze es mal noch nicht auf gelöst, da ich sicher noch Fragen dazu habe.

                            Möglich, aber warum nicht an der Wurzel packen und die Werte vor dem Schreiben plausibilisieren und filtern?

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

                              @marc-berg,

                              ja, sehr gut, das habe ich beim ersten Mal auch gedacht, als mir das Problem unplausibler Werte aufgefallen ist. Das Problem, mit dem ich nicht umgehen konnte, war, dass die Werte von der Wetterstation über das Skript und den Adapter Simple RESTful API Adapter von der Station geholt und direkt in die DPs geschrieben und damit auch geloggt werden. Das bedeutete für mich, dass eine Überprüfung auf Plausibilität für mich nicht möglich war, denn ich konnte nicht herausfinden, wie ich mit dem Simple RESTful API Adapter einen Wert filtern kann, bevor er einem DP zugeordnet und geloggt wird.

                              Siehst Du da eine Möglichkeit?

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

                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              553
                              Online

                              31.8k
                              Users

                              79.9k
                              Topics

                              1.3m
                              Posts

                              blockly javascript
                              4
                              13
                              61
                              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