Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Letzter Wert aus SQL lesen

    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

    Letzter Wert aus SQL lesen

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

      @ttheoc said in Letzter Wert aus SQL lesen:

      Was hab ich falsch gemacht?

      Naja, der SQL-Ausdruck muss dann schon vollständig sein. Die Punkte "..." müssen natürlich mit einem SELECT-Statement ersetzt werden.
      TOP 1 steht vor dem eigentlichen SELECT Statement.
      Wenn du die Spalten VAL und TIME hast, wäre das Statement dann

      SLECT TOP 1 SELECT VAL FROM MyTable ORDER BY TIME DESC
      

      Oder anders formuliert: Hole mir die Werte aus der Tabele, sortiere nach Zeit absteigend und nehme davon den ersten Eintrag.

      HTH

      1 Reply Last reply Reply Quote 0
      • T
        ttheoc last edited by

        Also so richtig komm ich nicht damit klar. Sorry 😞

        Hab das Script mal etwas angepasst:

            sendTo('sql.0', 'query', 'SELECT TOP 1 SELECT VAL FROM iobroker.ts_number ORDER BY TS DESC INNER JOIN iobroker.datapoints ON iobroker.ts_number.id=iobroker.datapoints.id WHERE iobroker.datapoints.name like \'linkeddevices.0.Aussen.Temperatur Nord\';', function (result) {
            if (result.error) {
                console.error(result.error);
            } else {
                // show result
                 setState('0_userdata.0.TEST_STRING', result, true);
            }
            });
        

        Vielleicht hilft der Screenshot meiner SQL DB weiter

        2020-07-17 15_24_30-Window.png

        In ein Objekt bekomm ich das result auch irgendwie nicht...

        F 1 Reply Last reply Reply Quote 0
        • F
          fastfoot @ttheoc last edited by fastfoot

          @ttheoc sagte in Letzter Wert aus SQL lesen:

          Also so richtig komm ich nicht damit klar. Sorry 😞

          dein SQL statement ist der totale Murks, probier mal so, ungetestet da weder gleiche Datenbank noch DP. Etwas SQL Grundlagen musst du dir schon noch aneignen...

              let query = `
                  SELECT TOP 1 val 
                    FROM iobroker.ts_number a INNER JOIN iobroker.datapoints b ON a.id = b.id 
                   WHERE b.name LIKE "linkeddevices.0.Aussen.Temperatur Nord"
                   ORDER BY ts DESC;`
          
              sendTo('sql.0', 'query', query, function (result) {
              if (result.error) {
                  console.error(result.error);
              } else {
                   setState('0_userdata.0.TEST_STRING', result.result[0].val, true);    }
              });
          

          In Objekt bekomm ich das result auch irgendwie nicht...

          das Ergebnis ist ein Array, deshalb result.result[0].val

          1 Reply Last reply Reply Quote 0
          • T
            ttheoc last edited by

            SELECT TOP 1 und ich werden keine Freunde mehr...

            Hab das ganze mal mit SELECT MAX versucht, da bei meiner Anwendung als Betriebsstundenzähler der letzte Wert ja zugleich der höchste Wert ist. Das scheint schon mal besser zu funktionieren.

                let query = `
                     SELECT MAX(val) 
                     FROM iobroker.ts_number a INNER JOIN iobroker.datapoints b ON a.id = b.id 
                     WHERE b.name LIKE "linkeddevices.0.Aussen.Temperatur Nord"
                     ORDER BY ts DESC;
                     `
             
                sendTo('sql.0', 'query', query, function (result) {
                if (result.error) {
                    console.error(result.error);
                } else {
                     setState('0_userdata.0.TEST_STRING'/*Test string*/, result.result[0].val, true);
                         }
                })
            

            Nur das mit dem setState wil noch nicht so richtig.
            Bekomme folgenden Error:

            setForeignState: undefined is not a valid state value
            

            Mir ist aufgefallen, dass wenn ich "result.result" verwende "nur" noch eine Warnung bekomme:
            "javascript.0 (459) at Object.cb (script.js.Test:12:10)"
            Und der Zeitstempel vom meinem Objekt wird aktualisiert, allerdings kein brauchbaren Wert im Objekt.

            F 1 Reply Last reply Reply Quote 0
            • F
              fastfoot @ttheoc last edited by

              @ttheoc sagte in Letzter Wert aus SQL lesen:

              SELECT TOP 1 und ich werden keine Freunde mehr...

              Nur das mit dem setState wil noch nicht so richtig.
              Bekomme folgenden Error:

              setForeignState: undefined is not a valid state value
              

              Mir ist aufgefallen, dass wenn ich "result.result" verwende "nur" noch eine Warnung bekomme:

              Nein, es muss result.result[0].val heissen! Undefined bedeuted in diesem Fall, dass kein Ergebnis gefunden wurde. Du hast in der Benennung deines State ein Leerzeichen vor Nord, so etwas gibt es eigentlich nicht. Schau dir den DP nochmal genau an, evtl. reicht ein Unterstrich davor. Du kannst ihn dir auch im Objektbaum kopieren und zwischen die Anführungszeichen setzen. Dann klappt es auch mit dem TOP 1

              1 Reply Last reply Reply Quote 0
              • T
                ttheoc last edited by ttheoc

                Sorry, dass ich schon wieder, bzw. immer noch damit nerve. Komme irgendwie nicht weiter.
                Habe den State jetzt geändert, Unterstrich anstelle Leerzeichen.

                Mit

                log('Rows: ' + JSON.stringify(result.result));
                

                bekomme ich folgendes Ergebnis:

                08:08:58.984	info	javascript.0 (459) script.js.Test: Rows: [{"MAX(val)":13.7}]
                

                Also müsste doch der erste Teil vom Script passen. (Das war beim State mit Leerzeichen auch schon so)

                Mit

                setState('0_userdata.0.TEST_STRING'/*Test string*/, result.result[0].val, true);
                

                bekomme ich noch immer noch folgende Meldung:

                08:14:22.789	error	javascript.0 (459) script.js.Test: setForeignState: undefined is not a valid state value
                
                F 1 Reply Last reply Reply Quote 0
                • F
                  fastfoot @ttheoc last edited by

                  @ttheoc sagte in Letzter Wert aus SQL lesen:

                  [{"MAX(val)":13.7}]

                  Du bekommst jetzt ein Array zurück mit dem Namen MAX(val) und seinem Wert 13.7 darin. Ein log(result.result[0]["Max(val)"] müsste dir jetzt eigentlich die 13.7 anzeigen.

                  Das ist nicht richtig, es sollte eig. ["val":13.7] sein, jedoch kommst du so erst einmal auf den Wert.

                  Was ist wenn du TOP 1 val im Select Statement nimmst?

                  F 1 Reply Last reply Reply Quote 0
                  • F
                    fastfoot @fastfoot last edited by fastfoot

                    @fastfoot sagte in Letzter Wert aus SQL lesen:

                    Das ist nicht richtig, es sollte eig. ["val":13.7] sein, jedoch kommst du so erst einmal auf den Wert.

                    Das ist schon richtig! Meine SQL Kenntnisse sind wohl etwas eingerostet 😞
                    Du kannst das umgehen, indem du einen Alias verwendest, so wie schon bei den Tabellennamen gezeigt. Ersetze Max(val) durch Max(val) AS val

                    1 Reply Last reply Reply Quote 0
                    • T
                      ttheoc last edited by

                      Vielen Dank!

                      Mit MAX(val) AS val hat´s funktioniert.

                      TOP 1 will irgendwie nicht so, hier mein Script:

                          let query = `
                              SELECT TOP 1 val 
                                FROM iobroker.ts_number a INNER JOIN iobroker.datapoints b ON a.id = b.id 
                               WHERE b.name LIKE "linkeddevices.0.Aussen.Temperatur_Nord"
                               ORDER BY ts DESC;`
                       
                          sendTo('sql.0', 'query', query, function (result) {
                          if (result.error) {
                              console.error(result.error);
                          } else {
                               setState('0_userdata.0.TEST_STRING'/*Test string*/, result.result[0].val, true);
                                   }
                          })
                      

                      Die Lösung mit MAX(val) AS val ist aber für mich ausreichend.

                      F 1 Reply Last reply Reply Quote 0
                      • F
                        fastfoot @ttheoc last edited by

                        @ttheoc sagte in Letzter Wert aus SQL lesen:

                        Vielen Dank!
                        Mit MAX(val) AS val hat´s funktioniert.
                        TOP 1 will irgendwie nicht so, hier mein Script:

                        Hier wäre die Ausgabe des Ergebnisses interessant, leider kann ich ja TOP nicht testen, da SQLite hierfür LIMIT benutzt. Wäre nett wenn du mal log(result.result[0]) testen könntest, um zu sehen was dann im Array steht

                        1 Reply Last reply Reply Quote 0
                        • T
                          ttheoc last edited by

                          Hier das "Ergebnis" 🙂

                          18:55:19.174	error	javascript.0 (459) script.js.Test: Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1 val FROM iobroker.ts_number a INNER JOIN iobroker.datapoints b ON a' at line 1
                          
                          F 1 Reply Last reply Reply Quote 0
                          • F
                            fastfoot @ttheoc last edited by fastfoot

                            @ttheoc sagte in Letzter Wert aus SQL lesen:

                            check the manual that corresponds to your MariaDB server

                            Ahh, MariaDB unterstützt kein TOP, bzw. da heisst es LIMIT und kommt ans Ende des SQL Statements. So funktioniert es dann 🙂

                                let query = `
                                    SELECT val 
                                      FROM iobroker.ts_number a INNER JOIN iobroker.datapoints b ON a.id = b.id 
                                     WHERE b.name LIKE "linkeddevices.0.Aussen.Temperatur_Nord"
                                     ORDER BY ts DESC
                                     LIMIT 1;`
                             
                                sendTo('sql.0', 'query', query, function (result) {
                                if (result.error) {
                                    console.error(result.error);
                                } else {
                                     setState('0_userdata.0.TEST_STRING'/*Test string*/, result.result[0].val, true);
                                         }
                                })
                            
                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            621
                            Online

                            31.9k
                            Users

                            80.2k
                            Topics

                            1.3m
                            Posts

                            blockly
                            3
                            16
                            1009
                            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