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

                          543
                          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