Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
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.8k

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

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

[gelöst] SQL getHistory Abfrage

Scheduled Pinned Locked Moved Skripten / Logik
58 Posts 4 Posters 4.8k Views 4 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • 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
    wrote on last edited by
    #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 Reply Last reply
    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
      wrote on last edited by
      #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 Replies Last reply
      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
        wrote on last edited by
        #51

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

        1 Reply Last reply
        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
          wrote on last edited by
          #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 Replies Last reply
          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
            wrote on last edited by
            #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 Reply Last reply
            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
              wrote on last edited by
              #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 Reply Last reply
              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
                wrote on last edited by
                #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 Reply Last reply
                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
                  wrote on last edited by
                  #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 Reply Last reply
                  0
                  • O Offline
                    O Offline
                    ostseeskipper
                    wrote on last edited by
                    #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 Reply Last reply
                    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
                      wrote on last edited by
                      #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 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      731

                      Online

                      32.4k

                      Users

                      81.5k

                      Topics

                      1.3m

                      Posts
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2025
                      logo
                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Home
                      • Recent
                      • Tags
                      • Unread 0
                      • Categories
                      • Unreplied
                      • Popular
                      • GitHub
                      • Docu
                      • Hilfe