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

                      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:

                        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?

                        Eine einfäche Möglichkeit wäre, dies über einen Alias zu lösen, aber leider kann man mit einem Write Converter nicht "nichts" schreiben.

                        Also bleibt wohl nur die Variante, die Daten in einen weiteren DP zu schreiben und auf diesen DP ein Script/Blockly/Node RED zu triggern, um zu filtern und in den eigentlichen DP zu schreiben.

                        1 Reply Last reply Reply Quote 0
                        • SBorg
                          SBorg Forum Testing Most Active last edited by

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

                          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

                          [OT]: du kannst auch einfach den Fix per wetterstation.conf aktivieren 😉

                          #Fix aktivieren bei fehlerhafter Außentemperatur [true/false] / default: false
                          #Bei unplausiblem Messwert wird kein Datenpaket an den ioB geschickt
                          FIX_AUSSENTEMP=false

                          Einige Stationen senden gelegentlich einen "NULL"-Wert. Durch die Umrechnung von Fahrenheit in Celsius kommt dann die -5572°C zu stande. Durch setzen auf "true" werden diese unplausiblen Datenpakete schon direkt nach dem Empfang verworfen.
                          Die alten Daten in der InfluxDB musst du dann aber doch noch säubern.

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          727
                          Online

                          31.8k
                          Users

                          79.9k
                          Topics

                          1.3m
                          Posts

                          blockly javascript
                          5
                          15
                          83
                          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