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. [gelöst] SQL getHistory Abfrage

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.7k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.2k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.1k

[gelöst] SQL getHistory Abfrage

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
58 Beiträge 4 Kommentatoren 4.8k Aufrufe 4 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.
  • O ostseeskipper

    @fastfoot said in SQL getHistory Abfrage:

    nein, in meinem Beispiel mit now = 09:43 setzt dir der Befehl die Zeit auf 23:43 des Vortages.
    Abhilfe auch hier: now.setHours(now.getHours() - 1), apollon hat da noch einen typo drin.

    Bis Ende der Woche gibt es aktuelle Beispiele auch mit Erklärungen zu den Optionen, wobei das hier ja JS Grundkenntnisse betrifft und dort dann nicht näher behandelt wird. Ist aber alles kein Problem, dafür gibt es ja hier das Forum :-)

    Jetzt bin ich völlig erschlagen.

            now.setHours(-1);
    

    steht auch in dem SQL Adapter Beispiel drin
    hatte echt gedacht und mich gefreut das es so einfach ist die Zeit von jetzt abzüglich einer Stunde zu definieren.
    @fastfoot Danke:+1:
    Ich werd es einfach probieren.

    O Offline
    O Offline
    ostseeskipper
    schrieb am zuletzt editiert von ostseeskipper
    #39

    Jetzt muss ich doch noch mal fragen.

    Das Scrpit sieht nun so aus.

    var pvwert=0;
    
    log("PV wert1: " + pvwert ,"info");
    
    sendTo('sql.0', 'query', 'SELECT id FROM iobroker.datapoints WHERE name="smartmeter.0.1-0:16_7_0__255.value"', function (result) {
        if (result.error) {
            console.error(result.error);
        } else {
            var now = new Date();
            now.setMinutes(now.getMinutes() - 3);
            sendTo('sql.0', 'query', 'SELECT AVG(val) AS Wert FROM iobroker.ts_number WHERE ts >= ' + now.getTime() + ' AND id=' + result.result[0].id, function (result) {
                let pvwert_1 = result.result[0].Wert
                pvwert = result.result[0].Wert  // ?? Wirkungslos ??  Warum
                log("PV wert2: " + pvwert_1 ,"info")
            });
        }
    });
    log("PV wert3: " + pvwert ,"info");
    

    Habe am Anfang des JS Script pvwert definiert und will das in Zeile 13 übergeben, da ich den Wert im weiteren Scriptverlauf noch brauche.
    Scheinbar lässt es nichts aus der sendto raus.
    und wenn ich pvwert_1 ausserhalb der sendto aufrufe gibts ne Fehlermeldung.

    Edit: Was ich auch nicht verstehe warum wird die letzte Befehlszeile vor dem sendto ausgeführt

    20:21:12.047	info	javascript.0 (149) script.js.Logik.GleitDurchschnitt: PV wert1: 0
    20:21:12.048	info	javascript.0 (149) script.js.Logik.GleitDurchschnitt: PV wert3: 0
    20:21:12.048	info	javascript.0 (149) script.js.Logik.GleitDurchschnitt: registered 0 subscriptions and 0 schedules
    20:21:12.080	info	javascript.0 (149) script.js.Logik.GleitDurchschnitt: PV wert2: 3.5454545454545454
    
    F 1 Antwort Letzte Antwort
    0
    • O ostseeskipper

      @fastfoot said in SQL getHistory Abfrage:

      nein, in meinem Beispiel mit now = 09:43 setzt dir der Befehl die Zeit auf 23:43 des Vortages.
      Abhilfe auch hier: now.setHours(now.getHours() - 1), apollon hat da noch einen typo drin.

      Bis Ende der Woche gibt es aktuelle Beispiele auch mit Erklärungen zu den Optionen, wobei das hier ja JS Grundkenntnisse betrifft und dort dann nicht näher behandelt wird. Ist aber alles kein Problem, dafür gibt es ja hier das Forum :-)

      Jetzt bin ich völlig erschlagen.

              now.setHours(-1);
      

      steht auch in dem SQL Adapter Beispiel drin
      hatte echt gedacht und mich gefreut das es so einfach ist die Zeit von jetzt abzüglich einer Stunde zu definieren.
      @fastfoot Danke:+1:
      Ich werd es einfach probieren.

      F Offline
      F Offline
      fastfoot
      schrieb am zuletzt editiert von
      #40

      @ostseeskipper sagte in SQL getHistory Abfrage:

      steht auch in dem SQL Adapter Beispiel drin

      da wird aber nicht behauptet, dass der Zeitraum 1 Std. sei :-) Aber ja, man unterstellt es. Wie gesagt überarbeite ich das gerade, es dauert aber noch etwas, da ich auch noch etwas zu den Optionen schreiben möchte und die Beispiele für alle dort genannten Datenbanken laufen sollen

      iobroker läuft unter Docker auf QNAP TS-451+
      SkriptRecovery: https://forum.iobroker.net/post/930558

      1 Antwort Letzte Antwort
      0
      • O ostseeskipper

        Jetzt muss ich doch noch mal fragen.

        Das Scrpit sieht nun so aus.

        var pvwert=0;
        
        log("PV wert1: " + pvwert ,"info");
        
        sendTo('sql.0', 'query', 'SELECT id FROM iobroker.datapoints WHERE name="smartmeter.0.1-0:16_7_0__255.value"', function (result) {
            if (result.error) {
                console.error(result.error);
            } else {
                var now = new Date();
                now.setMinutes(now.getMinutes() - 3);
                sendTo('sql.0', 'query', 'SELECT AVG(val) AS Wert FROM iobroker.ts_number WHERE ts >= ' + now.getTime() + ' AND id=' + result.result[0].id, function (result) {
                    let pvwert_1 = result.result[0].Wert
                    pvwert = result.result[0].Wert  // ?? Wirkungslos ??  Warum
                    log("PV wert2: " + pvwert_1 ,"info")
                });
            }
        });
        log("PV wert3: " + pvwert ,"info");
        

        Habe am Anfang des JS Script pvwert definiert und will das in Zeile 13 übergeben, da ich den Wert im weiteren Scriptverlauf noch brauche.
        Scheinbar lässt es nichts aus der sendto raus.
        und wenn ich pvwert_1 ausserhalb der sendto aufrufe gibts ne Fehlermeldung.

        Edit: Was ich auch nicht verstehe warum wird die letzte Befehlszeile vor dem sendto ausgeführt

        20:21:12.047	info	javascript.0 (149) script.js.Logik.GleitDurchschnitt: PV wert1: 0
        20:21:12.048	info	javascript.0 (149) script.js.Logik.GleitDurchschnitt: PV wert3: 0
        20:21:12.048	info	javascript.0 (149) script.js.Logik.GleitDurchschnitt: registered 0 subscriptions and 0 schedules
        20:21:12.080	info	javascript.0 (149) script.js.Logik.GleitDurchschnitt: PV wert2: 3.5454545454545454
        
        F Offline
        F Offline
        fastfoot
        schrieb am zuletzt editiert von fastfoot
        #41

        @ostseeskipper sendTo() arbeitet asynchron, d.h. dass die Werte iiiiirgendwann geliefert werden. Derweil wird aber bereits Zeile 18 abgearbeitet, welche aber den aktualisierten Wet aus Zeile 13 noch nicht kennt.

        Abhilfe schafft eine Vezögerung in Zeile 18: setTimeout(()=>{log('PV Wert'+ pvwert)}, 100), in diesem Fall 100ms.

        Man könnte das auch mit Promises lösen aber dann raucht dem geneigten Beginner noch mehr der Kopf, da hilft halt nur lesen, lesen, lesen...

        iobroker läuft unter Docker auf QNAP TS-451+
        SkriptRecovery: https://forum.iobroker.net/post/930558

        apollon77A 1 Antwort Letzte Antwort
        0
        • F fastfoot

          @ostseeskipper sendTo() arbeitet asynchron, d.h. dass die Werte iiiiirgendwann geliefert werden. Derweil wird aber bereits Zeile 18 abgearbeitet, welche aber den aktualisierten Wet aus Zeile 13 noch nicht kennt.

          Abhilfe schafft eine Vezögerung in Zeile 18: setTimeout(()=>{log('PV Wert'+ pvwert)}, 100), in diesem Fall 100ms.

          Man könnte das auch mit Promises lösen aber dann raucht dem geneigten Beginner noch mehr der Kopf, da hilft halt nur lesen, lesen, lesen...

          apollon77A Offline
          apollon77A Offline
          apollon77
          schrieb am zuletzt editiert von
          #42

          @fastfoot sagte in SQL getHistory Abfrage:

          Abhilfe schafft eine Vezögerung in Zeile 18: setTimeout(()=>{log('PV Wert'+ pvwert)}, 100), in diesem Fall 100ms.

          Ääähhmm ... neeee weil auch 100ms nicht sichchergestellt sind ... entweder "await sendToAsync" oder weitere Logik einfach im Callback des SendTo

          Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

          • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
          • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
          F 1 Antwort Letzte Antwort
          0
          • apollon77A apollon77

            @fastfoot sagte in SQL getHistory Abfrage:

            Abhilfe schafft eine Vezögerung in Zeile 18: setTimeout(()=>{log('PV Wert'+ pvwert)}, 100), in diesem Fall 100ms.

            Ääähhmm ... neeee weil auch 100ms nicht sichchergestellt sind ... entweder "await sendToAsync" oder weitere Logik einfach im Callback des SendTo

            F Offline
            F Offline
            fastfoot
            schrieb am zuletzt editiert von
            #43

            @apollon77 sagte in SQL getHistory Abfrage:

            "await sendToAsync"

            damit bist Du deiner Zeit weit voraus :-) Aber hast völlig Recht, man sollte das nicht so propagieren da es letztlich zu Fehlern führen kann. Andererseits, packe ich das in eine Funktion mit Promise dann nimmt der TE Reissaus

            iobroker läuft unter Docker auf QNAP TS-451+
            SkriptRecovery: https://forum.iobroker.net/post/930558

            apollon77A 1 Antwort Letzte Antwort
            0
            • F fastfoot

              @apollon77 sagte in SQL getHistory Abfrage:

              "await sendToAsync"

              damit bist Du deiner Zeit weit voraus :-) Aber hast völlig Recht, man sollte das nicht so propagieren da es letztlich zu Fehlern führen kann. Andererseits, packe ich das in eine Funktion mit Promise dann nimmt der TE Reissaus

              apollon77A Offline
              apollon77A Offline
              apollon77
              schrieb am zuletzt editiert von
              #44

              @fastfoot Jupp. Daher einfach die Logik in den callback der query-sendTo rein und Ende ;-)

              Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

              • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
              • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
              O 1 Antwort Letzte Antwort
              0
              • apollon77A apollon77

                @fastfoot Jupp. Daher einfach die Logik in den callback der query-sendTo rein und Ende ;-)

                O Offline
                O Offline
                ostseeskipper
                schrieb am zuletzt editiert von
                #45

                @apollon77 und @fastfoot
                Euer wissen und können in allen Ehren, Hut ab und gar nicht gegen euch gemeint.
                Eigentlich wollte ich nur nen Durchschnittswert der letzten x Minuten in eine Variable lesen mit der ich weiterarbeiten kann.

                Das es nur so kompliziert geht und immer noch eine Hürde dazu kommt, sagt mir innerlich das am Grundprinzip etwas verbesserungsfähig ist. Es gibt viele dieser und ähnlicher Fragen und unterschiedliche Lösungsvorschläge im Forum.
                ioBroker hätte echt das Zeug zu mehr wenn's Bausteine zu den meisten Frage gäbe. Bei SQL mit gethistory schon sehr Nahe,
                aber haut doch bitte Euer Wissen um diese Anfängerfallstricke (asyncron, callback, promise) eines einfachen zuweisens zu einer Variable mit in die Funktion oder in ein Beispiel rein.
                Nicht das ich zu faul bin mir das anzueignen, aber wieviel Zeit würdet Ihr und andere in Zukunft für die Beantwortung solcher Fragen sparen ;-):innocent:

                @fastfoot von daher freue ich mich auf die neuen Beispiele:+1: ich probiere sie auch gern aus :flushed:

                O apollon77A 2 Antworten Letzte Antwort
                0
                • O ostseeskipper

                  @apollon77 und @fastfoot
                  Euer wissen und können in allen Ehren, Hut ab und gar nicht gegen euch gemeint.
                  Eigentlich wollte ich nur nen Durchschnittswert der letzten x Minuten in eine Variable lesen mit der ich weiterarbeiten kann.

                  Das es nur so kompliziert geht und immer noch eine Hürde dazu kommt, sagt mir innerlich das am Grundprinzip etwas verbesserungsfähig ist. Es gibt viele dieser und ähnlicher Fragen und unterschiedliche Lösungsvorschläge im Forum.
                  ioBroker hätte echt das Zeug zu mehr wenn's Bausteine zu den meisten Frage gäbe. Bei SQL mit gethistory schon sehr Nahe,
                  aber haut doch bitte Euer Wissen um diese Anfängerfallstricke (asyncron, callback, promise) eines einfachen zuweisens zu einer Variable mit in die Funktion oder in ein Beispiel rein.
                  Nicht das ich zu faul bin mir das anzueignen, aber wieviel Zeit würdet Ihr und andere in Zukunft für die Beantwortung solcher Fragen sparen ;-):innocent:

                  @fastfoot von daher freue ich mich auf die neuen Beispiele:+1: ich probiere sie auch gern aus :flushed:

                  O Offline
                  O Offline
                  ostseeskipper
                  schrieb am zuletzt editiert von
                  #46

                  Also ich geb's jetzt auf das Ergebnis der Abfrage in eine Variable zu bekommen mit der ich im weiteren Scriptverlauf und ausserhalb von setTimeout Funktionen arbeiten kann.:face_with_head_bandage:

                  F 1 Antwort Letzte Antwort
                  0
                  • O ostseeskipper

                    Also ich geb's jetzt auf das Ergebnis der Abfrage in eine Variable zu bekommen mit der ich im weiteren Scriptverlauf und ausserhalb von setTimeout Funktionen arbeiten kann.:face_with_head_bandage:

                    F Offline
                    F Offline
                    fastfoot
                    schrieb am zuletzt editiert von
                    #47

                    @ostseeskipper warum packst du deine Logik denn nicht einfach in den Callback(Zeile 13)?

                    iobroker läuft unter Docker auf QNAP TS-451+
                    SkriptRecovery: https://forum.iobroker.net/post/930558

                    1 Antwort Letzte Antwort
                    0
                    • O ostseeskipper

                      @apollon77 und @fastfoot
                      Euer wissen und können in allen Ehren, Hut ab und gar nicht gegen euch gemeint.
                      Eigentlich wollte ich nur nen Durchschnittswert der letzten x Minuten in eine Variable lesen mit der ich weiterarbeiten kann.

                      Das es nur so kompliziert geht und immer noch eine Hürde dazu kommt, sagt mir innerlich das am Grundprinzip etwas verbesserungsfähig ist. Es gibt viele dieser und ähnlicher Fragen und unterschiedliche Lösungsvorschläge im Forum.
                      ioBroker hätte echt das Zeug zu mehr wenn's Bausteine zu den meisten Frage gäbe. Bei SQL mit gethistory schon sehr Nahe,
                      aber haut doch bitte Euer Wissen um diese Anfängerfallstricke (asyncron, callback, promise) eines einfachen zuweisens zu einer Variable mit in die Funktion oder in ein Beispiel rein.
                      Nicht das ich zu faul bin mir das anzueignen, aber wieviel Zeit würdet Ihr und andere in Zukunft für die Beantwortung solcher Fragen sparen ;-):innocent:

                      @fastfoot von daher freue ich mich auf die neuen Beispiele:+1: ich probiere sie auch gern aus :flushed:

                      apollon77A Offline
                      apollon77A Offline
                      apollon77
                      schrieb am zuletzt editiert von
                      #48

                      @ostseeskipper sagte in SQL getHistory Abfrage:

                      Eigentlich wollte ich nur nen Durchschnittswert der letzten x Minuten in eine Variable lesen mit der ich weiterarbeiten kann.

                      Hast Du dir mal Adapter wie "statistics" angeschaut? Vllt gibt es ja da eine Möglichkeit einfach einen Adapter deinen gewünschten Wert berechnen zu lassen ...

                      Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

                      • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
                      • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
                      O 1 Antwort Letzte Antwort
                      0
                      • apollon77A apollon77

                        @ostseeskipper sagte in SQL getHistory Abfrage:

                        Eigentlich wollte ich nur nen Durchschnittswert der letzten x Minuten in eine Variable lesen mit der ich weiterarbeiten kann.

                        Hast Du dir mal Adapter wie "statistics" angeschaut? Vllt gibt es ja da eine Möglichkeit einfach einen Adapter deinen gewünschten Wert berechnen zu lassen ...

                        O Offline
                        O Offline
                        ostseeskipper
                        schrieb am zuletzt editiert von
                        #49

                        @apollon77
                        statistic hab ich mir angeschaut, der zählt nur und ich habe nicht erkannt wir ich da kontinierlich den Durchschnitt der letzten x Minuten abholen kann.
                        und SQL Queries liefert mir ja was ich brauche nur eben nicht in eine Variable mit der ich ausserhalb von Callback weiterarbeiten kann.

                        @fastfoot weil ich den Inhalt der Variable(Durchschnitt der letzten x Minuten) oft brauche, es noch mehr solcher Datenpunkte gibt die ich abfragen will und damit gerechnet werden soll. Möchte eine modular erweiterbare PV Überschußverwendung aufbauen. Daher will ich den Wert in einer "normal" verwendbaren Variable. Von mir aus warte ich auch auf das Ergebnis und mach dann weiter wenn es da ist, sofern ich wüsste wie das geht. Hab mit asyncron bisher nie was zu tun gehabt. :ghost: eher hexenwerk für mich:grin:
                        Alternativ schreib ich den wert in einen Datenpunkt und lese den ein, was ja eigentlich quatsch wäre, da die Info ja da ist.

                        F 1 Antwort Letzte Antwort
                        0
                        • O ostseeskipper

                          @apollon77
                          statistic hab ich mir angeschaut, der zählt nur und ich habe nicht erkannt wir ich da kontinierlich den Durchschnitt der letzten x Minuten abholen kann.
                          und SQL Queries liefert mir ja was ich brauche nur eben nicht in eine Variable mit der ich ausserhalb von Callback weiterarbeiten kann.

                          @fastfoot weil ich den Inhalt der Variable(Durchschnitt der letzten x Minuten) oft brauche, es noch mehr solcher Datenpunkte gibt die ich abfragen will und damit gerechnet werden soll. Möchte eine modular erweiterbare PV Überschußverwendung aufbauen. Daher will ich den Wert in einer "normal" verwendbaren Variable. Von mir aus warte ich auch auf das Ergebnis und mach dann weiter wenn es da ist, sofern ich wüsste wie das geht. Hab mit asyncron bisher nie was zu tun gehabt. :ghost: eher hexenwerk für mich:grin:
                          Alternativ schreib ich den wert in einen Datenpunkt und lese den ein, was ja eigentlich quatsch wäre, da die Info ja da ist.

                          F Offline
                          F Offline
                          fastfoot
                          schrieb am zuletzt editiert von
                          #50

                          @ostseeskipper ja, das asynchrone ist Hexenwerk, aber so langsam gewöhne ich mich daran. Im folgenden Beispiel kannst du das Ergebnis einer Variablen zuordnen, allerdings musst du auch da deine Logik in eine Funktion packen, denn ohne ist kein Warten auf das Ergebnis möglich.

                          /**
                           * Zweck:   Abfrage der History eines DP mit SQL Adapter und MySql-DB
                           * Autor:   @fastfoot
                           * Datum:   05.04.2022
                           * Forum:   https://forum.iobroker.net/post/787442
                           */
                          let dpId = "smartmeter.0.1-0:16_7_0__255.value";
                          const Minutes = 3;
                          let startTime = new Date();
                          startTime.setMinutes(startTime.getMinutes() - Minutes);
                          let queryString =
                              "SELECT AVG(n.val) AS wert " +
                              "FROM iobroker.ts_number n " +
                              "JOIN iobroker.datapoints d ON n.id = d.id AND d.name = '" + dpId + "' " +
                              "WHERE n.ts >= " + startTime.getTime();
                          
                          function sendToAsync() {
                              return new Promise((resolve, reject) => {
                                  sendTo("sql.0", "query", queryString, result => {
                                      log(result)
                                      if (result.error)
                                          log(result.error, 'error');
                                      else
                                          resolve(result.result[0]);
                                  });
                              })
                          }
                          
                          async function main() {
                              let Ergebnis = (await sendToAsync()).wert;
                              if (Ergebnis) log("PV Wert: " + Ergebnis.toFixed(3));
                              //hier weitere Logik
                          }
                          
                          main();
                          
                          

                          iobroker läuft unter Docker auf QNAP TS-451+
                          SkriptRecovery: https://forum.iobroker.net/post/930558

                          O 2 Antworten Letzte Antwort
                          1
                          • F fastfoot

                            @ostseeskipper ja, das asynchrone ist Hexenwerk, aber so langsam gewöhne ich mich daran. Im folgenden Beispiel kannst du das Ergebnis einer Variablen zuordnen, allerdings musst du auch da deine Logik in eine Funktion packen, denn ohne ist kein Warten auf das Ergebnis möglich.

                            /**
                             * Zweck:   Abfrage der History eines DP mit SQL Adapter und MySql-DB
                             * Autor:   @fastfoot
                             * Datum:   05.04.2022
                             * Forum:   https://forum.iobroker.net/post/787442
                             */
                            let dpId = "smartmeter.0.1-0:16_7_0__255.value";
                            const Minutes = 3;
                            let startTime = new Date();
                            startTime.setMinutes(startTime.getMinutes() - Minutes);
                            let queryString =
                                "SELECT AVG(n.val) AS wert " +
                                "FROM iobroker.ts_number n " +
                                "JOIN iobroker.datapoints d ON n.id = d.id AND d.name = '" + dpId + "' " +
                                "WHERE n.ts >= " + startTime.getTime();
                            
                            function sendToAsync() {
                                return new Promise((resolve, reject) => {
                                    sendTo("sql.0", "query", queryString, result => {
                                        log(result)
                                        if (result.error)
                                            log(result.error, 'error');
                                        else
                                            resolve(result.result[0]);
                                    });
                                })
                            }
                            
                            async function main() {
                                let Ergebnis = (await sendToAsync()).wert;
                                if (Ergebnis) log("PV Wert: " + Ergebnis.toFixed(3));
                                //hier weitere Logik
                            }
                            
                            main();
                            
                            
                            O Offline
                            O Offline
                            ostseeskipper
                            schrieb am zuletzt editiert von
                            #51

                            @fastfoot
                            vielen lieben Dank:+1:
                            werde ich gleich mal ausprobieren.

                            1 Antwort Letzte Antwort
                            0
                            • F fastfoot

                              @ostseeskipper ja, das asynchrone ist Hexenwerk, aber so langsam gewöhne ich mich daran. Im folgenden Beispiel kannst du das Ergebnis einer Variablen zuordnen, allerdings musst du auch da deine Logik in eine Funktion packen, denn ohne ist kein Warten auf das Ergebnis möglich.

                              /**
                               * Zweck:   Abfrage der History eines DP mit SQL Adapter und MySql-DB
                               * Autor:   @fastfoot
                               * Datum:   05.04.2022
                               * Forum:   https://forum.iobroker.net/post/787442
                               */
                              let dpId = "smartmeter.0.1-0:16_7_0__255.value";
                              const Minutes = 3;
                              let startTime = new Date();
                              startTime.setMinutes(startTime.getMinutes() - Minutes);
                              let queryString =
                                  "SELECT AVG(n.val) AS wert " +
                                  "FROM iobroker.ts_number n " +
                                  "JOIN iobroker.datapoints d ON n.id = d.id AND d.name = '" + dpId + "' " +
                                  "WHERE n.ts >= " + startTime.getTime();
                              
                              function sendToAsync() {
                                  return new Promise((resolve, reject) => {
                                      sendTo("sql.0", "query", queryString, result => {
                                          log(result)
                                          if (result.error)
                                              log(result.error, 'error');
                                          else
                                              resolve(result.result[0]);
                                      });
                                  })
                              }
                              
                              async function main() {
                                  let Ergebnis = (await sendToAsync()).wert;
                                  if (Ergebnis) log("PV Wert: " + Ergebnis.toFixed(3));
                                  //hier weitere Logik
                              }
                              
                              main();
                              
                              
                              O Offline
                              O Offline
                              ostseeskipper
                              schrieb am zuletzt editiert von
                              #52

                              @fastfoot

                              Toll :slightly_smiling_face: soweit läuft es. Prinzip asyncron verstanden ist was anderes.
                              Den Abfragestring selbst hast in eine Variable gebracht und dann genialerweise mit JOIN die eigentlich erste Abfrage nach der ID gleich mit erschlagen:+1: :flushed:

                              Würden nun nur noch kurz wissen bevor ich anfange umzubauen?:
                              Wenn ich nun noch weitere Datenpunkte mit Durchschnittswerten der letzten x Minuten einbinden möchte, um mit denen zu rechnen, würde ich eine Schleife in async function main() einbauen und über

                                  let Ergebnis = (await sendToAsync()).wert;
                              

                              mehrfach sendToAsync ausführen.
                              Nun ist der querystring mit Datenpunkt aber fest in sendToAsync() drin
                              Die Funktion sendToAsync() kann man theoretisch auch ändern nur den gewünschten Datenpunkt/Query dpId zu übergeben oder lassen das die 'async' nicht zu?

                              O F 2 Antworten Letzte Antwort
                              0
                              • O ostseeskipper

                                @fastfoot

                                Toll :slightly_smiling_face: soweit läuft es. Prinzip asyncron verstanden ist was anderes.
                                Den Abfragestring selbst hast in eine Variable gebracht und dann genialerweise mit JOIN die eigentlich erste Abfrage nach der ID gleich mit erschlagen:+1: :flushed:

                                Würden nun nur noch kurz wissen bevor ich anfange umzubauen?:
                                Wenn ich nun noch weitere Datenpunkte mit Durchschnittswerten der letzten x Minuten einbinden möchte, um mit denen zu rechnen, würde ich eine Schleife in async function main() einbauen und über

                                    let Ergebnis = (await sendToAsync()).wert;
                                

                                mehrfach sendToAsync ausführen.
                                Nun ist der querystring mit Datenpunkt aber fest in sendToAsync() drin
                                Die Funktion sendToAsync() kann man theoretisch auch ändern nur den gewünschten Datenpunkt/Query dpId zu übergeben oder lassen das die 'async' nicht zu?

                                O Offline
                                O Offline
                                ostseeskipper
                                schrieb am zuletzt editiert von
                                #53

                                Und noch eine Frage. Wenn ich den 3 Minuten Durchschnitt für andere Funktionen triggern will wäre es sicher besser den doch in einen Datenpunkt zu schreiben, oder?

                                F 1 Antwort Letzte Antwort
                                0
                                • O ostseeskipper

                                  @fastfoot

                                  Toll :slightly_smiling_face: soweit läuft es. Prinzip asyncron verstanden ist was anderes.
                                  Den Abfragestring selbst hast in eine Variable gebracht und dann genialerweise mit JOIN die eigentlich erste Abfrage nach der ID gleich mit erschlagen:+1: :flushed:

                                  Würden nun nur noch kurz wissen bevor ich anfange umzubauen?:
                                  Wenn ich nun noch weitere Datenpunkte mit Durchschnittswerten der letzten x Minuten einbinden möchte, um mit denen zu rechnen, würde ich eine Schleife in async function main() einbauen und über

                                      let Ergebnis = (await sendToAsync()).wert;
                                  

                                  mehrfach sendToAsync ausführen.
                                  Nun ist der querystring mit Datenpunkt aber fest in sendToAsync() drin
                                  Die Funktion sendToAsync() kann man theoretisch auch ändern nur den gewünschten Datenpunkt/Query dpId zu übergeben oder lassen das die 'async' nicht zu?

                                  F Offline
                                  F Offline
                                  fastfoot
                                  schrieb am zuletzt editiert von
                                  #54

                                  @ostseeskipper das würde ich dann zB so machen:

                                  /**
                                   * Zweck:   Abfrage der History eines DP mit SQL Adapter und MySql-DB
                                   * Autor:   @fastfoot
                                   * Datum:   06.04.2022
                                   * Forum:   https://forum.iobroker.net/post/787442
                                   */
                                  
                                  function sendToAsync(queryString) {
                                      return new Promise((resolve, reject) => {
                                          sendTo("sql.0", "query", queryString, result => {
                                              //log(result)
                                              if (result.error)
                                                  log(result.error, 'error');
                                              else
                                                  resolve(result.result[0]);
                                          });
                                      })
                                  }
                                  
                                  async function main() {
                                      let dpId = '';
                                  
                                      dpId = "smartmeter.0.1-0:16_7_0__255.value";
                                      let Ergebnis1 = (await sendToAsync(buildQueryString(dpId))).wert;
                                      if (Ergebnis1) log("PV Wert: " + Ergebnis1.toFixed(3));
                                  
                                      dpId = "smartmeter.0.2-0:16_7_0__255.value";
                                      let Ergebnis2 = (await sendToAsync(buildQueryString(dpId, 5))).wert;
                                      if (Ergebnis2) log("PV Wert2: " + Ergebnis2.toFixed(3));
                                  
                                      setStateAsync('your_dp1', Ergebnis1);
                                      setStateAsync('your_dp2', Ergebnis2);
                                      //hier weitere Logik
                                  }
                                  
                                  function buildQueryString(dpId, Minutes = 3) {
                                      let startTime = new Date();
                                      startTime.setMinutes(startTime.getMinutes() - Minutes);
                                      let queryString =
                                          "SELECT AVG(n.val) AS wert " +
                                          "FROM iobroker.ts_number n " +
                                          "JOIN iobroker.datapoints d ON n.id = d.id AND d.name = '" + dpId + "' " +
                                          "WHERE n.ts >= " + startTime.getTime();
                                      return queryString;
                                  }
                                  
                                  main();
                                  
                                  

                                  und das ist dann auch schon die Antwort auf dein Statement

                                  aber haut doch bitte Euer Wissen um diese Anfängerfallstricke (asyncron, callback, promise) eines einfachen zuweisens zu einer Variable mit in die Funktion oder in ein Beispiel rein.

                                  das war ein einfaches Beispiel und dennoch war es nicht 'genug', will heissen es gibt da einfach keine universellen Lösungen, schon gar nicht welche die dann alle Benutzer zufrieden stellen :-) q.e.d.

                                  iobroker läuft unter Docker auf QNAP TS-451+
                                  SkriptRecovery: https://forum.iobroker.net/post/930558

                                  O 1 Antwort Letzte Antwort
                                  1
                                  • O ostseeskipper

                                    Und noch eine Frage. Wenn ich den 3 Minuten Durchschnitt für andere Funktionen triggern will wäre es sicher besser den doch in einen Datenpunkt zu schreiben, oder?

                                    F Offline
                                    F Offline
                                    fastfoot
                                    schrieb am zuletzt editiert von
                                    #55

                                    @ostseeskipper sagte in SQL getHistory Abfrage:

                                    Und noch eine Frage. Wenn ich den 3 Minuten Durchschnitt für andere Funktionen triggern will wäre es sicher besser den doch in einen Datenpunkt zu schreiben, oder?

                                    ja, da man nur auf Datenpunkte triggern kann, nicht auf Variablen. Siehe das neue erweiterte Beispiel...

                                    iobroker läuft unter Docker auf QNAP TS-451+
                                    SkriptRecovery: https://forum.iobroker.net/post/930558

                                    1 Antwort Letzte Antwort
                                    0
                                    • F fastfoot

                                      @ostseeskipper das würde ich dann zB so machen:

                                      /**
                                       * Zweck:   Abfrage der History eines DP mit SQL Adapter und MySql-DB
                                       * Autor:   @fastfoot
                                       * Datum:   06.04.2022
                                       * Forum:   https://forum.iobroker.net/post/787442
                                       */
                                      
                                      function sendToAsync(queryString) {
                                          return new Promise((resolve, reject) => {
                                              sendTo("sql.0", "query", queryString, result => {
                                                  //log(result)
                                                  if (result.error)
                                                      log(result.error, 'error');
                                                  else
                                                      resolve(result.result[0]);
                                              });
                                          })
                                      }
                                      
                                      async function main() {
                                          let dpId = '';
                                      
                                          dpId = "smartmeter.0.1-0:16_7_0__255.value";
                                          let Ergebnis1 = (await sendToAsync(buildQueryString(dpId))).wert;
                                          if (Ergebnis1) log("PV Wert: " + Ergebnis1.toFixed(3));
                                      
                                          dpId = "smartmeter.0.2-0:16_7_0__255.value";
                                          let Ergebnis2 = (await sendToAsync(buildQueryString(dpId, 5))).wert;
                                          if (Ergebnis2) log("PV Wert2: " + Ergebnis2.toFixed(3));
                                      
                                          setStateAsync('your_dp1', Ergebnis1);
                                          setStateAsync('your_dp2', Ergebnis2);
                                          //hier weitere Logik
                                      }
                                      
                                      function buildQueryString(dpId, Minutes = 3) {
                                          let startTime = new Date();
                                          startTime.setMinutes(startTime.getMinutes() - Minutes);
                                          let queryString =
                                              "SELECT AVG(n.val) AS wert " +
                                              "FROM iobroker.ts_number n " +
                                              "JOIN iobroker.datapoints d ON n.id = d.id AND d.name = '" + dpId + "' " +
                                              "WHERE n.ts >= " + startTime.getTime();
                                          return queryString;
                                      }
                                      
                                      main();
                                      
                                      

                                      und das ist dann auch schon die Antwort auf dein Statement

                                      aber haut doch bitte Euer Wissen um diese Anfängerfallstricke (asyncron, callback, promise) eines einfachen zuweisens zu einer Variable mit in die Funktion oder in ein Beispiel rein.

                                      das war ein einfaches Beispiel und dennoch war es nicht 'genug', will heissen es gibt da einfach keine universellen Lösungen, schon gar nicht welche die dann alle Benutzer zufrieden stellen :-) q.e.d.

                                      O Offline
                                      O Offline
                                      ostseeskipper
                                      schrieb am zuletzt editiert von
                                      #56

                                      @fastfoot said in SQL getHistory Abfrage:

                                      und das ist dann auch schon die Antwort auf dein Statement

                                      aber haut doch bitte Euer Wissen um diese Anfängerfallstricke (asyncron, callback, promise) eines einfachen zuweisens zu einer Variable mit in die Funktion oder in ein Beispiel rein.

                                      das war ein einfaches Beispiel und dennoch war es nicht 'genug', will heissen es gibt da einfach keine universellen Lösungen, schon gar nicht welche die dann alle Benutzer zufrieden stellen :-) q.e.d.

                                      Das erste Beispiel von vorgestern wäre ein "super Beispiel" in der Adapterbeschreibung um das "Hexenwerk" asyncron, callback und promise etwas zu verstehen und daran etwas zu lernen. Das 2te mit buildQueryString ist schon etwas für Fortgeschrittenere ;-)

                                      Top und super vielen Dank:+1:

                                      1 Antwort Letzte Antwort
                                      0
                                      • O Offline
                                        O Offline
                                        ostseeskipper
                                        schrieb am zuletzt editiert von
                                        #57

                                        @fastfoot
                                        :grinning:
                                        musste erst mal schauen was das setStateAsync ist, Cool super mitgedacht,:clap: das wäre meine nächste Baustelle geworden.
                                        Du hast dich da echt gut reingearbeitet wie ich einem Thread aus 2020 entnehmen konnte. Da war allerdings noch await vor dem setStateAsync
                                        Egal, ich denk ich komm nun klar und setzt den Thread auf gelöst.

                                        Danke @apollon77 @paul53 und dir @fastfoot für die tolle Hilfe:innocent: :+1:

                                        apollon77A 1 Antwort Letzte Antwort
                                        1
                                        • O ostseeskipper

                                          @fastfoot
                                          :grinning:
                                          musste erst mal schauen was das setStateAsync ist, Cool super mitgedacht,:clap: das wäre meine nächste Baustelle geworden.
                                          Du hast dich da echt gut reingearbeitet wie ich einem Thread aus 2020 entnehmen konnte. Da war allerdings noch await vor dem setStateAsync
                                          Egal, ich denk ich komm nun klar und setzt den Thread auf gelöst.

                                          Danke @apollon77 @paul53 und dir @fastfoot für die tolle Hilfe:innocent: :+1:

                                          apollon77A Offline
                                          apollon77A Offline
                                          apollon77
                                          schrieb am zuletzt editiert von
                                          #58

                                          @ostseeskipper bei wenigen setState kann man das await weglassen. Ist ok

                                          Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

                                          • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
                                          • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
                                          1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          996

                                          Online

                                          32.4k

                                          Benutzer

                                          81.5k

                                          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