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. Blockly
  5. Letzter Wert aus SQL lesen

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    3.4k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.1k

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.5k

Letzter Wert aus SQL lesen

Geplant Angeheftet Gesperrt Verschoben Blockly
blockly
16 Beiträge 3 Kommentatoren 1.5k Aufrufe 3 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.
  • T Offline
    T Offline
    ttheoc
    schrieb am zuletzt editiert von
    #1

    Hallo!

    Ich möchte mir gerne einen Betriebsstundenzähler mit SQL-Anbindung basteln.
    Mit einem Objekt funktioniert das schon ganz gut.
    Beispiel:
    Licht ein, Zeit in erste Variable, Licht aus, Zeit in zweite Variable, Zeitdifferenz + Wert aus dritter Variable in dritte Variable schreiben.
    Die dritte Variable/Objekt wird über SQL geloggt.

    Da ich es schon ein paar mal geschafft habe, die Werte in meinen Variablen zu verlieren, möchte ich bei Licht ein den letzten Wert aus der SQL-Datenbank laden und in die dritte Variable/Objekt schreiben.

    Hat jemand dazu eine Idee? Danke für die Hilfe schon mal!

    1 Antwort Letzte Antwort
    0
    • H Offline
      H Offline
      hans_999
      Gesperrt
      schrieb am zuletzt editiert von
      #2

      Eine Möglichkeit wäre

      SELECT TOP 1 ... ORDER BY [Zeitstempel] DESC
      

      Das setzt voraus, dass in der DB auch schön brav ein [Zeitstempel] mitgeschrieben wird.

      1 Antwort Letzte Antwort
      0
      • T Offline
        T Offline
        ttheoc
        schrieb am zuletzt editiert von
        #3

        Danke, werde ich demnächst mal ausprobieren.

        1 Antwort Letzte Antwort
        0
        • T Offline
          T Offline
          ttheoc
          schrieb am zuletzt editiert von
          #4

          Habe jetzt folgendes Script als Vorlage verwendet:

              sendTo('sql.0', 'query', 'SELECT MAX(iobroker.ts_number.val) FROM iobroker.ts_number 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
                   log('Rows: ' + JSON.stringify(result.result));
              }
              });
          
          

          Das funktioniert ganz gut, halt mit dem MAX Wert. Um den letzten Wert zu erhalten habe ich jetzt das Script folgendermaßen geändert:

              sendTo('sql.0', 'query', 'SELECT TOP 1 ... ORDER BY (iobroker.ts_number.ts) DESC FROM iobroker.ts_number 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
                   log('Rows: ' + JSON.stringify(result.result));
              }
              });
          

          Damit bekomme ich im Log folgende Meldung:

          javascript.0 (455) 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 ... ORDER BY (iobroker.ts_number.ts) DESC FROM iobroker.ts_number INNER JOIN i' at line 1
          

          Was hab ich falsch gemacht?

          Wie kann ich die ausgabe log so ändern, damit ich eine Zahl zurück bekomme, die ich dann in ein Objekt schreiben kann?

          Dankeschön schon mal!

          1 Antwort Letzte Antwort
          0
          • H Offline
            H Offline
            hans_999
            Gesperrt
            schrieb am zuletzt editiert von
            #5

            @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 Antwort Letzte Antwort
            0
            • T Offline
              T Offline
              ttheoc
              schrieb am zuletzt editiert von
              #6

              Also so richtig komm ich nicht damit klar. Sorry :disappointed:

              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 Antwort Letzte Antwort
              0
              • T ttheoc

                Also so richtig komm ich nicht damit klar. Sorry :disappointed:

                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 Offline
                F Offline
                fastfoot
                schrieb am zuletzt editiert von fastfoot
                #7

                @ttheoc sagte in Letzter Wert aus SQL lesen:

                Also so richtig komm ich nicht damit klar. Sorry :disappointed:

                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

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

                1 Antwort Letzte Antwort
                0
                • T Offline
                  T Offline
                  ttheoc
                  schrieb am zuletzt editiert von
                  #8

                  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 Antwort Letzte Antwort
                  0
                  • T ttheoc

                    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 Offline
                    F Offline
                    fastfoot
                    schrieb am zuletzt editiert von
                    #9

                    @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

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

                    1 Antwort Letzte Antwort
                    0
                    • T Offline
                      T Offline
                      ttheoc
                      schrieb am zuletzt editiert von ttheoc
                      #10

                      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 Antwort Letzte Antwort
                      0
                      • T 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 Offline
                        F Offline
                        fastfoot
                        schrieb am zuletzt editiert von
                        #11

                        @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?

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

                        F 1 Antwort Letzte Antwort
                        0
                        • F fastfoot

                          @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 Offline
                          F Offline
                          fastfoot
                          schrieb am zuletzt editiert von fastfoot
                          #12

                          @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

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

                          1 Antwort Letzte Antwort
                          0
                          • T Offline
                            T Offline
                            ttheoc
                            schrieb am zuletzt editiert von
                            #13

                            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 Antwort Letzte Antwort
                            0
                            • T ttheoc

                              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 Offline
                              F Offline
                              fastfoot
                              schrieb am zuletzt editiert von
                              #14

                              @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

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

                              1 Antwort Letzte Antwort
                              0
                              • T Offline
                                T Offline
                                ttheoc
                                schrieb am zuletzt editiert von
                                #15

                                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 Antwort Letzte Antwort
                                0
                                • T ttheoc

                                  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 Offline
                                  F Offline
                                  fastfoot
                                  schrieb am zuletzt editiert von fastfoot
                                  #16

                                  @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);
                                               }
                                      })
                                  

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

                                  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

                                  518

                                  Online

                                  32.7k

                                  Benutzer

                                  82.4k

                                  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