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. JavaScript
  5. Test SQL-Abfrage

NEWS

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

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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

Test SQL-Abfrage

Geplant Angeheftet Gesperrt Verschoben JavaScript
20 Beiträge 4 Kommentatoren 450 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.
  • R Offline
    R Offline
    ROGA
    schrieb am zuletzt editiert von ROGA
    #1

    Hallo,
    ich versuche gerade meine ersten Gehversuche in Javascript. Erfahrungen im scripten habe ich bis anhin nur in vbs und vba. Was mich bei Javascript sehr verwirrt, sind "asynchrone Funktionsaufrufe" und "Callbacks". Konnte mich noch nicht so wirklich über das Internet darüber schlau machen. Aber jetzt zu meiner eigentlichen Frage:

    Ich habe mir unten stehende Test (lern)- Funktion AvarageTimeInterval() für die Abfrage meiner SQL-Datenbank zusammengebastelt. Die Abfrage funktioniert auch, nur bekomme ich als Rückgabewert meiner Funktion den Initial-Wert -1 der Variable RETVAL zurück. Lass ich mir aber den Wert der Variable innerhalb der Funktion AvarageTimeInterval() auf die Konsole ausgeben, wird mir der korrekte Wert angezeigt.

    Kann mir das vielleicht jemand erklären, wieso das so ist und wie ich es im Javascript richtig gebacken kriege?

    function AvarageTimeInterval() {
            
            let RETVAL                  = -1,
                SQL_QUERY               = "",
                ID                      = 47,
                MESS_TIME_INTERVAL      = 5,
                ITEM;
        
    
            SQL_QUERY = 'SELECT DAY(from_unixtime(ts/1000)) as Zeit, AVG(val) as Wert ' +
                        'FROM iobroker.ts_number WHERE id=' + ID + ' AND val is NOT NULL ' +
                        'AND from_unixtime(ts/1000) >= now() - interval ' + MESS_TIME_INTERVAL + 
                        ' minute GROUP BY Zeit';
        
            sendTo("sql.0", "query", SQL_QUERY, function (result) {
        
                if (result.error) {
                    console.error(result.error);
                } else {
                    
                    //console.log('Rows: ' + JSON.stringify(result.result));
                    //console.log(JSON.stringify(result.result[0]["Wert"]));
            
                    if (result.result.length != 0) {
                        
                        for (ITEM in result.result) {
    	                    RETVAL = parseFloat(JSON.stringify(result.result[ITEM].Wert));
                                console.log("SQL-Wert zurückbekommen : " + RETVAL);   // hier stimmt der Wert der SQL-Abfrage
                        };
                    };
                };
             });
             
             return RETVAL;    
        };
    
       
        
        
    console.log(AvarageTimeInterval());   // hier bekomme ich -1 als Rückgabewert
    

    Ausser dem würde es mich Interessieren, wo man gute Literatur über Javascript im speziell für ioBroker findet. Die Seite auf Github kenne ich schon, aber mir sind dort die Beschreibungen für die Funktionen etwas zu rar.

    Ich hoffe, jemand findet etwas Zeit für mich und kann mir meine Fragen beantworten.
    Ich Danke schon mal vorab.

    LG Roli

    haus-automatisierungH T 2 Antworten Letzte Antwort
    0
    • R ROGA

      Hallo,
      ich versuche gerade meine ersten Gehversuche in Javascript. Erfahrungen im scripten habe ich bis anhin nur in vbs und vba. Was mich bei Javascript sehr verwirrt, sind "asynchrone Funktionsaufrufe" und "Callbacks". Konnte mich noch nicht so wirklich über das Internet darüber schlau machen. Aber jetzt zu meiner eigentlichen Frage:

      Ich habe mir unten stehende Test (lern)- Funktion AvarageTimeInterval() für die Abfrage meiner SQL-Datenbank zusammengebastelt. Die Abfrage funktioniert auch, nur bekomme ich als Rückgabewert meiner Funktion den Initial-Wert -1 der Variable RETVAL zurück. Lass ich mir aber den Wert der Variable innerhalb der Funktion AvarageTimeInterval() auf die Konsole ausgeben, wird mir der korrekte Wert angezeigt.

      Kann mir das vielleicht jemand erklären, wieso das so ist und wie ich es im Javascript richtig gebacken kriege?

      function AvarageTimeInterval() {
              
              let RETVAL                  = -1,
                  SQL_QUERY               = "",
                  ID                      = 47,
                  MESS_TIME_INTERVAL      = 5,
                  ITEM;
          
      
              SQL_QUERY = 'SELECT DAY(from_unixtime(ts/1000)) as Zeit, AVG(val) as Wert ' +
                          'FROM iobroker.ts_number WHERE id=' + ID + ' AND val is NOT NULL ' +
                          'AND from_unixtime(ts/1000) >= now() - interval ' + MESS_TIME_INTERVAL + 
                          ' minute GROUP BY Zeit';
          
              sendTo("sql.0", "query", SQL_QUERY, function (result) {
          
                  if (result.error) {
                      console.error(result.error);
                  } else {
                      
                      //console.log('Rows: ' + JSON.stringify(result.result));
                      //console.log(JSON.stringify(result.result[0]["Wert"]));
              
                      if (result.result.length != 0) {
                          
                          for (ITEM in result.result) {
      	                    RETVAL = parseFloat(JSON.stringify(result.result[ITEM].Wert));
                                  console.log("SQL-Wert zurückbekommen : " + RETVAL);   // hier stimmt der Wert der SQL-Abfrage
                          };
                      };
                  };
               });
               
               return RETVAL;    
          };
      
         
          
          
      console.log(AvarageTimeInterval());   // hier bekomme ich -1 als Rückgabewert
      

      Ausser dem würde es mich Interessieren, wo man gute Literatur über Javascript im speziell für ioBroker findet. Die Seite auf Github kenne ich schon, aber mir sind dort die Beschreibungen für die Funktionen etwas zu rar.

      Ich hoffe, jemand findet etwas Zeit für mich und kann mir meine Fragen beantworten.
      Ich Danke schon mal vorab.

      haus-automatisierungH Offline
      haus-automatisierungH Offline
      haus-automatisierung
      Developer Most Active
      schrieb am zuletzt editiert von haus-automatisierung
      #2

      @roga sagte in Test SQL-Abfrage:

      nur bekomme ich als Rückgabewert meiner Funktion den Initial-Wert -1 der Variable RETVAL zurück.

      Logisch, das läuft ja auch asynchron ab. Du übergibst eine callback-Funktion als Parameter. Diese wird dann aufgerufen, wenn das Ergebnis irgendwann vorliegt. Aber in der Zwischenzeit wurde return RETVAL längst ausgeführt.

      Am einfachsten ist es mit Promises zu arbeiten. Von sendTo gibt es auch eine Funktion, welche ein Promise zurückliefert: sendToAsync. Darauf kann man dann mit dem Schlüsselwort await warten um genau dieses Verhalten zu vermeiden.

      Das sind Grundlagen von JavaScript und hat mit dem ioBroker erstmal nichts zu tun. Also wirst Du dazu viele Infos im Netz finden. Stichworte für Google:

      • Callback-Functions vs Promises
      • async / await
      • Promises
        • then / error
        • resolve / reject
      • try / catch

      Die Frage wäre aber auch, warum Du überhaupt das Ergebnis an die übergeordnete Funktion geben willst. Du könntest auch in der Callback-Funktion alles tun, was Du möchtest. Also das Ergebnis in einen Datenpunkt schreiben o.ä.

      🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
      🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
      📚 Meine inoffizielle ioBroker Dokumentation

      R 1 Antwort Letzte Antwort
      0
      • R ROGA

        Hallo,
        ich versuche gerade meine ersten Gehversuche in Javascript. Erfahrungen im scripten habe ich bis anhin nur in vbs und vba. Was mich bei Javascript sehr verwirrt, sind "asynchrone Funktionsaufrufe" und "Callbacks". Konnte mich noch nicht so wirklich über das Internet darüber schlau machen. Aber jetzt zu meiner eigentlichen Frage:

        Ich habe mir unten stehende Test (lern)- Funktion AvarageTimeInterval() für die Abfrage meiner SQL-Datenbank zusammengebastelt. Die Abfrage funktioniert auch, nur bekomme ich als Rückgabewert meiner Funktion den Initial-Wert -1 der Variable RETVAL zurück. Lass ich mir aber den Wert der Variable innerhalb der Funktion AvarageTimeInterval() auf die Konsole ausgeben, wird mir der korrekte Wert angezeigt.

        Kann mir das vielleicht jemand erklären, wieso das so ist und wie ich es im Javascript richtig gebacken kriege?

        function AvarageTimeInterval() {
                
                let RETVAL                  = -1,
                    SQL_QUERY               = "",
                    ID                      = 47,
                    MESS_TIME_INTERVAL      = 5,
                    ITEM;
            
        
                SQL_QUERY = 'SELECT DAY(from_unixtime(ts/1000)) as Zeit, AVG(val) as Wert ' +
                            'FROM iobroker.ts_number WHERE id=' + ID + ' AND val is NOT NULL ' +
                            'AND from_unixtime(ts/1000) >= now() - interval ' + MESS_TIME_INTERVAL + 
                            ' minute GROUP BY Zeit';
            
                sendTo("sql.0", "query", SQL_QUERY, function (result) {
            
                    if (result.error) {
                        console.error(result.error);
                    } else {
                        
                        //console.log('Rows: ' + JSON.stringify(result.result));
                        //console.log(JSON.stringify(result.result[0]["Wert"]));
                
                        if (result.result.length != 0) {
                            
                            for (ITEM in result.result) {
        	                    RETVAL = parseFloat(JSON.stringify(result.result[ITEM].Wert));
                                    console.log("SQL-Wert zurückbekommen : " + RETVAL);   // hier stimmt der Wert der SQL-Abfrage
                            };
                        };
                    };
                 });
                 
                 return RETVAL;    
            };
        
           
            
            
        console.log(AvarageTimeInterval());   // hier bekomme ich -1 als Rückgabewert
        

        Ausser dem würde es mich Interessieren, wo man gute Literatur über Javascript im speziell für ioBroker findet. Die Seite auf Github kenne ich schon, aber mir sind dort die Beschreibungen für die Funktionen etwas zu rar.

        Ich hoffe, jemand findet etwas Zeit für mich und kann mir meine Fragen beantworten.
        Ich Danke schon mal vorab.

        T Offline
        T Offline
        ticaki
        schrieb am zuletzt editiert von ticaki
        #3

        @roga

        ergänzend zum Beitrag von haus

        Auszug aus einem meiner Skripts, bin aber kein sql held :) Bei influx hätte ich mehr zu bieten. Brauche ne DB mit Räumen und Geräten für Grafana.

                try {
                    for (let f = 0; f < func.length;f++) {
                        let fu = func[f]
                        colenums[fu] = 1
                        if (rooms.length == 0) {
                            result = await sendToAsync('sql.0', 'query', 'SELECT id  FROM iobroker.idmetadata WHERE id = "' + pid + '" AND "' + fu +'";')        
                            if (result.result.length == 0) result = await sendToAsync('sql.0', 'query', 'INSERT INTO iobroker.idmetadata (id, room, function) VALUES ("' + pid + '", "'+ null +'", "'+ fu +'");')
                        }
                        else for (let r = 0; r < rooms.length;r++) {
                            colrooms[rooms[r]] = 1
                            result = await sendToAsync('sql.0', 'query', 'SELECT id FROM iobroker.idmetadata WHERE id = "' + pid + '" AND "' + fu +'" AND "'+rooms[r]+'";')        
                            if (result.result.length == 0) result = await sendToAsync('sql.0', 'query', 'INSERT INTO iobroker.idmetadata (id, room, function) VALUES ("' + pid + '", "'+ rooms[r] +'", "'+ fu +'");')
                        }
                    }
                } catch(e) {log(e)}
        
        

        Die Seite ist das nachschlage werk : https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#best-practice

        und das hier ist ne art Definitionsdatei für den Javascriptadapter ab Zeile 1222?!

        https://github.com/ioBroker/ioBroker.javascript/blob/master/lib/javascript.d.ts

        Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

        Spenden

        1 Antwort Letzte Antwort
        0
        • haus-automatisierungH haus-automatisierung

          @roga sagte in Test SQL-Abfrage:

          nur bekomme ich als Rückgabewert meiner Funktion den Initial-Wert -1 der Variable RETVAL zurück.

          Logisch, das läuft ja auch asynchron ab. Du übergibst eine callback-Funktion als Parameter. Diese wird dann aufgerufen, wenn das Ergebnis irgendwann vorliegt. Aber in der Zwischenzeit wurde return RETVAL längst ausgeführt.

          Am einfachsten ist es mit Promises zu arbeiten. Von sendTo gibt es auch eine Funktion, welche ein Promise zurückliefert: sendToAsync. Darauf kann man dann mit dem Schlüsselwort await warten um genau dieses Verhalten zu vermeiden.

          Das sind Grundlagen von JavaScript und hat mit dem ioBroker erstmal nichts zu tun. Also wirst Du dazu viele Infos im Netz finden. Stichworte für Google:

          • Callback-Functions vs Promises
          • async / await
          • Promises
            • then / error
            • resolve / reject
          • try / catch

          Die Frage wäre aber auch, warum Du überhaupt das Ergebnis an die übergeordnete Funktion geben willst. Du könntest auch in der Callback-Funktion alles tun, was Du möchtest. Also das Ergebnis in einen Datenpunkt schreiben o.ä.

          R Offline
          R Offline
          ROGA
          schrieb am zuletzt editiert von
          #4

          @haus-automatisierung

          ich habe versucht, mich etwas in das Thema Async und Await einzuarbeiten, aber so richtig verstanden habe ich es immer noch nicht. Habe meinen Code dahingehend angepasst, dass ich jetzt statt sendTo die Funktion sendToAsync verwende, doch leider ist das Ergebnis immer (fast) noch dasselbe. Ich sehe nicht den Fehler, kann mir jemand erklären, was ich falsch mache?

          async function AvarageTimeInterval() {
                  
                  let RETVAL                  = -1,
                      SQL_QUERY               = "",
                      ID                      = 47,
                      MESS_TIME_INTERVAL      = 5,
                      ITEM,
                      RESULT,
                      OBJ;
          
                  SQL_QUERY = 'SELECT DAY(from_unixtime(ts/1000)) as Zeit, AVG(val) as Wert ' +
                              'FROM iobroker.ts_number WHERE id=' + ID + ' AND val is NOT NULL ' +
                              'AND from_unixtime(ts/1000) >= now() - interval ' + MESS_TIME_INTERVAL + 
                              ' minute GROUP BY Zeit';
              
                  try {
                      RESULT = JSON.stringify(await sendToAsync('sql.0', 'query', SQL_QUERY));
                  } 
                  catch (error) {
                      console.error(error);
                  }
                  
                  OBJ = JSON.parse(RESULT);
                  
                  //console.log(OBJ.result.length);
          
                  
                  if (OBJ.result.length != 0) {
                              
                      for (ITEM in OBJ.result) {
          	            RETVAL = parseFloat(JSON.stringify(OBJ.result[ITEM].Wert));
                      };
                  };
                   
                   console.log("SQL-Wert zurückbekommen : " + RETVAL);  // Wert wird korrekt ausgegeben
                   return RETVAL;    
              };
          
             
              
          console.log('Rückgabewert der Funktion=', AvarageTimeInterval());   // hier ist die Rückgabe diesmal nicht -1 sondern nix
          

          Console Log:

          12:46:31.923	info	javascript.0 (31327) Stop script script.js._DEVEL.Uebung_1
          12:46:31.966	info	javascript.0 (31327) Start javascript script.js._DEVEL.Uebung_1
          12:46:31.968	info	javascript.0 (31327) script.js._DEVEL.Uebung_1: Rückgabewert der Funktion=
          12:46:31.968	info	javascript.0 (31327) script.js._DEVEL.Uebung_1: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
          12:46:32.002	info	javascript.0 (31327) script.js._DEVEL.Uebung_1: SQL-Wert zurückbekommen : 20.8375
          

          LG Roli

          haus-automatisierungH T 2 Antworten Letzte Antwort
          0
          • R ROGA

            @haus-automatisierung

            ich habe versucht, mich etwas in das Thema Async und Await einzuarbeiten, aber so richtig verstanden habe ich es immer noch nicht. Habe meinen Code dahingehend angepasst, dass ich jetzt statt sendTo die Funktion sendToAsync verwende, doch leider ist das Ergebnis immer (fast) noch dasselbe. Ich sehe nicht den Fehler, kann mir jemand erklären, was ich falsch mache?

            async function AvarageTimeInterval() {
                    
                    let RETVAL                  = -1,
                        SQL_QUERY               = "",
                        ID                      = 47,
                        MESS_TIME_INTERVAL      = 5,
                        ITEM,
                        RESULT,
                        OBJ;
            
                    SQL_QUERY = 'SELECT DAY(from_unixtime(ts/1000)) as Zeit, AVG(val) as Wert ' +
                                'FROM iobroker.ts_number WHERE id=' + ID + ' AND val is NOT NULL ' +
                                'AND from_unixtime(ts/1000) >= now() - interval ' + MESS_TIME_INTERVAL + 
                                ' minute GROUP BY Zeit';
                
                    try {
                        RESULT = JSON.stringify(await sendToAsync('sql.0', 'query', SQL_QUERY));
                    } 
                    catch (error) {
                        console.error(error);
                    }
                    
                    OBJ = JSON.parse(RESULT);
                    
                    //console.log(OBJ.result.length);
            
                    
                    if (OBJ.result.length != 0) {
                                
                        for (ITEM in OBJ.result) {
            	            RETVAL = parseFloat(JSON.stringify(OBJ.result[ITEM].Wert));
                        };
                    };
                     
                     console.log("SQL-Wert zurückbekommen : " + RETVAL);  // Wert wird korrekt ausgegeben
                     return RETVAL;    
                };
            
               
                
            console.log('Rückgabewert der Funktion=', AvarageTimeInterval());   // hier ist die Rückgabe diesmal nicht -1 sondern nix
            

            Console Log:

            12:46:31.923	info	javascript.0 (31327) Stop script script.js._DEVEL.Uebung_1
            12:46:31.966	info	javascript.0 (31327) Start javascript script.js._DEVEL.Uebung_1
            12:46:31.968	info	javascript.0 (31327) script.js._DEVEL.Uebung_1: Rückgabewert der Funktion=
            12:46:31.968	info	javascript.0 (31327) script.js._DEVEL.Uebung_1: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
            12:46:32.002	info	javascript.0 (31327) script.js._DEVEL.Uebung_1: SQL-Wert zurückbekommen : 20.8375
            
            haus-automatisierungH Offline
            haus-automatisierungH Offline
            haus-automatisierung
            Developer Most Active
            schrieb am zuletzt editiert von haus-automatisierung
            #5

            @roga sagte in Test SQL-Abfrage:

            Ich sehe nicht den Fehler

            Naja, deine Funktion AvarageTimeInterval gibt jetzt auch immer ein Promise zurück, muss also mit .then() oder ebenfalls mit await genutzt werden.

            Letzte Zeile also z.B. so:

            AvarageTimeInterval()
                .then(val => console.log('Rückgabewert der Funktion=' + val));
            

            PS: Was soll denn das ganze JSON.stringify und mit .parse() wieder zurück bewirken? Kann alles weg...

            🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
            🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
            📚 Meine inoffizielle ioBroker Dokumentation

            R 1 Antwort Letzte Antwort
            0
            • R ROGA

              @haus-automatisierung

              ich habe versucht, mich etwas in das Thema Async und Await einzuarbeiten, aber so richtig verstanden habe ich es immer noch nicht. Habe meinen Code dahingehend angepasst, dass ich jetzt statt sendTo die Funktion sendToAsync verwende, doch leider ist das Ergebnis immer (fast) noch dasselbe. Ich sehe nicht den Fehler, kann mir jemand erklären, was ich falsch mache?

              async function AvarageTimeInterval() {
                      
                      let RETVAL                  = -1,
                          SQL_QUERY               = "",
                          ID                      = 47,
                          MESS_TIME_INTERVAL      = 5,
                          ITEM,
                          RESULT,
                          OBJ;
              
                      SQL_QUERY = 'SELECT DAY(from_unixtime(ts/1000)) as Zeit, AVG(val) as Wert ' +
                                  'FROM iobroker.ts_number WHERE id=' + ID + ' AND val is NOT NULL ' +
                                  'AND from_unixtime(ts/1000) >= now() - interval ' + MESS_TIME_INTERVAL + 
                                  ' minute GROUP BY Zeit';
                  
                      try {
                          RESULT = JSON.stringify(await sendToAsync('sql.0', 'query', SQL_QUERY));
                      } 
                      catch (error) {
                          console.error(error);
                      }
                      
                      OBJ = JSON.parse(RESULT);
                      
                      //console.log(OBJ.result.length);
              
                      
                      if (OBJ.result.length != 0) {
                                  
                          for (ITEM in OBJ.result) {
              	            RETVAL = parseFloat(JSON.stringify(OBJ.result[ITEM].Wert));
                          };
                      };
                       
                       console.log("SQL-Wert zurückbekommen : " + RETVAL);  // Wert wird korrekt ausgegeben
                       return RETVAL;    
                  };
              
                 
                  
              console.log('Rückgabewert der Funktion=', AvarageTimeInterval());   // hier ist die Rückgabe diesmal nicht -1 sondern nix
              

              Console Log:

              12:46:31.923	info	javascript.0 (31327) Stop script script.js._DEVEL.Uebung_1
              12:46:31.966	info	javascript.0 (31327) Start javascript script.js._DEVEL.Uebung_1
              12:46:31.968	info	javascript.0 (31327) script.js._DEVEL.Uebung_1: Rückgabewert der Funktion=
              12:46:31.968	info	javascript.0 (31327) script.js._DEVEL.Uebung_1: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
              12:46:32.002	info	javascript.0 (31327) script.js._DEVEL.Uebung_1: SQL-Wert zurückbekommen : 20.8375
              
              T Offline
              T Offline
              ticaki
              schrieb am zuletzt editiert von ticaki
              #6

              @roga
              Funktioniert doch alles wie es soll :)

              Wenn du eine async funktion ohne await aufrufst ist der rückgabewert nichts.

              console.log('Rückgabewert der Funktion=', AvarageTimeInterval());
              console.log('Rückgabewert der Funktion=' + AvarageTimeInterval());
              
              async function getValue() {
                console.log('Rückgabewert der Funktion=' + await AvarageTimeInterval());
              }
              getValue()
              

              Ich mache das nur nicht so, daher keine Ahnung ob es geht, ich gehe so vor:

              async function getValue() {
                let result = await AvarageTimeInterval()
                log('Rückgabewert der Funktion=' + result);
              }
              

              Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

              Spenden

              haus-automatisierungH R 2 Antworten Letzte Antwort
              0
              • T ticaki

                @roga
                Funktioniert doch alles wie es soll :)

                Wenn du eine async funktion ohne await aufrufst ist der rückgabewert nichts.

                console.log('Rückgabewert der Funktion=', AvarageTimeInterval());
                console.log('Rückgabewert der Funktion=' + AvarageTimeInterval());
                
                async function getValue() {
                  console.log('Rückgabewert der Funktion=' + await AvarageTimeInterval());
                }
                getValue()
                

                Ich mache das nur nicht so, daher keine Ahnung ob es geht, ich gehe so vor:

                async function getValue() {
                  let result = await AvarageTimeInterval()
                  log('Rückgabewert der Funktion=' + result);
                }
                
                haus-automatisierungH Offline
                haus-automatisierungH Offline
                haus-automatisierung
                Developer Most Active
                schrieb am zuletzt editiert von haus-automatisierung
                #7

                @ticaki sagte in Test SQL-Abfrage:

                Wenn du eine async funktion ohne await aufrufst ist der rückgabewert nichts.

                Stimmt nicht so ganz, es wird ein Promise zurückgegeben.

                🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
                🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
                📚 Meine inoffizielle ioBroker Dokumentation

                T 1 Antwort Letzte Antwort
                0
                • haus-automatisierungH haus-automatisierung

                  @ticaki sagte in Test SQL-Abfrage:

                  Wenn du eine async funktion ohne await aufrufst ist der rückgabewert nichts.

                  Stimmt nicht so ganz, es wird ein Promise zurückgegeben.

                  T Offline
                  T Offline
                  ticaki
                  schrieb am zuletzt editiert von ticaki
                  #8

                  @haus-automatisierung
                  Merci, meinte mehr das log(async) immer '' ins log schreibt. Oder liege ich damit falsch? Jap lag falsch

                  Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                  Spenden

                  1 Antwort Letzte Antwort
                  0
                  • haus-automatisierungH haus-automatisierung

                    @roga sagte in Test SQL-Abfrage:

                    Ich sehe nicht den Fehler

                    Naja, deine Funktion AvarageTimeInterval gibt jetzt auch immer ein Promise zurück, muss also mit .then() oder ebenfalls mit await genutzt werden.

                    Letzte Zeile also z.B. so:

                    AvarageTimeInterval()
                        .then(val => console.log('Rückgabewert der Funktion=' + val));
                    

                    PS: Was soll denn das ganze JSON.stringify und mit .parse() wieder zurück bewirken? Kann alles weg...

                    R Offline
                    R Offline
                    ROGA
                    schrieb am zuletzt editiert von ROGA
                    #9

                    @haus-automatisierung sagte in Test SQL-Abfrage:

                    Naja, deine Funktion AvarageTimeInterval gibt jetzt auch immer ein Promise zurück, muss also mit .then() oder ebenfalls mit await genutzt werden.

                    Ok, werde ich mir versuchen zu merken. Wie sieht denn die Verwendung mit 'await' aus?

                    Letzte Zeile also z.B. so:

                    AvarageTimeInterval()
                        .then(val => console.log('Rückgabewert der Funktion=' + val));
                    

                    Habe das soeben erfolgreich umsetzen können. Genau das, was ich wollte, vielen Dank!!! :+1: :+1: :+1:

                    Hatte deine Lösung etwas anders geschrieben und dabei kam dann zuerst nix zurück. Der Fehler war, dass ich statt ein "+" ein "," gesetzt habe, im Glauben, dass dies keine Rolle spielen sollte. Zumindest habe ich das von einem anderen Tutorial so "gelernt", ist aber wohl doch falsch???!

                    AvarageTimeInterval().then(val => console.log('Rückgabewert der Funktion=', val));
                    

                    Frage: Was macht oder bewirkt dieser Pfeil "=>"?

                    PS: Was soll denn das ganze JSON.stringify und mit .parse() wieder zurück bewirken? Kann alles weg...

                    Gute Frage :-) Ich habe es ohne die Konvertierung versucht, dass hat dann aber leider nicht geklappt. Wenn ich jedoch ein JSON-Objekt baue, dann kann ich auch die .length sowie die .wert Eigenschaft nutzen um an meinen Wert zu kommen, ohne das JSON-Objekt scheint das wohl nicht zu gehen, oder mache ich da wieder etwas falsch?

                    Die Frage wäre aber auch, warum Du überhaupt das Ergebnis an die übergeordnete Funktion geben willst. Du könntest auch in der Callback-Funktion alles tun, was Du möchtest. Also das Ergebnis in einen Datenpunkt schreiben o.ä.

                    Naja, ich möchte gerne eine wieder verwendbare Funktion haben, bei der ich dann nur noch die gewünschte Objekt-ID mitgeben kann um so dann vom SQL-Server den gewünschten Wert zu erhalten. Ich weiss (noch) nicht, ob man das in der Callback-Funktion dann auch so machen könnte.

                    Nochmals vielen Dank für die wertvolle Lehre.:ok_hand:

                    LG Roli

                    haus-automatisierungH 1 Antwort Letzte Antwort
                    0
                    • T ticaki

                      @roga
                      Funktioniert doch alles wie es soll :)

                      Wenn du eine async funktion ohne await aufrufst ist der rückgabewert nichts.

                      console.log('Rückgabewert der Funktion=', AvarageTimeInterval());
                      console.log('Rückgabewert der Funktion=' + AvarageTimeInterval());
                      
                      async function getValue() {
                        console.log('Rückgabewert der Funktion=' + await AvarageTimeInterval());
                      }
                      getValue()
                      

                      Ich mache das nur nicht so, daher keine Ahnung ob es geht, ich gehe so vor:

                      async function getValue() {
                        let result = await AvarageTimeInterval()
                        log('Rückgabewert der Funktion=' + result);
                      }
                      
                      R Offline
                      R Offline
                      ROGA
                      schrieb am zuletzt editiert von
                      #10

                      @ticaki sagte in Test SQL-Abfrage:

                      @roga
                      Funktioniert doch alles wie es soll :)

                      Wenn du eine async funktion ohne await aufrufst ist der rückgabewert nichts.

                      console.log('Rückgabewert der Funktion=', AvarageTimeInterval());
                      console.log('Rückgabewert der Funktion=' + AvarageTimeInterval());
                      

                      Danke für diesen Hinweis mit dem "," bzw. "+". Mit Verwendung des "+" anstelle des "," erhalten ich wenigsten eine brauchbare Rückmeldung, nämlich dass es sich um ein "object Promise" handelt, so wie es haus-automatisierung auch geschrieben hatte.

                      15:04:15.096	info	javascript.0 (31327) script.js._DEVEL.Uebung_1: Rückgabewert der Funktion=[object Promise]
                      

                      Deine beiden Lösungen haben bei mir auch sehr gut funktioniert, vielen Dank dafür.

                      async function getValue() {
                        console.log('Rückgabewert der Funktion=' + await AvarageTimeInterval());
                      }
                      getValue()
                      

                      Ich mache das nur nicht so, daher keine Ahnung ob es geht, ich gehe so vor:

                      async function getValue() {
                        let result = await AvarageTimeInterval()
                        log('Rückgabewert der Funktion=' + result);
                      }
                      

                      Was mir jedoch daran nicht gefällt ist, dass dafür nochmals eine async Function getValue() erstellt werden muss, was ich persönlich etwas umständlicher finde. Ich möchte den Wert im Hauptprogramm direkt zurückerhalten, ohne nochmals eine andere Funktion aufrufen zu müssen. Funktioniert hat es aber einwandfrei.:+1:

                      LG Roli

                      T 1 Antwort Letzte Antwort
                      0
                      • R ROGA

                        @ticaki sagte in Test SQL-Abfrage:

                        @roga
                        Funktioniert doch alles wie es soll :)

                        Wenn du eine async funktion ohne await aufrufst ist der rückgabewert nichts.

                        console.log('Rückgabewert der Funktion=', AvarageTimeInterval());
                        console.log('Rückgabewert der Funktion=' + AvarageTimeInterval());
                        

                        Danke für diesen Hinweis mit dem "," bzw. "+". Mit Verwendung des "+" anstelle des "," erhalten ich wenigsten eine brauchbare Rückmeldung, nämlich dass es sich um ein "object Promise" handelt, so wie es haus-automatisierung auch geschrieben hatte.

                        15:04:15.096	info	javascript.0 (31327) script.js._DEVEL.Uebung_1: Rückgabewert der Funktion=[object Promise]
                        

                        Deine beiden Lösungen haben bei mir auch sehr gut funktioniert, vielen Dank dafür.

                        async function getValue() {
                          console.log('Rückgabewert der Funktion=' + await AvarageTimeInterval());
                        }
                        getValue()
                        

                        Ich mache das nur nicht so, daher keine Ahnung ob es geht, ich gehe so vor:

                        async function getValue() {
                          let result = await AvarageTimeInterval()
                          log('Rückgabewert der Funktion=' + result);
                        }
                        

                        Was mir jedoch daran nicht gefällt ist, dass dafür nochmals eine async Function getValue() erstellt werden muss, was ich persönlich etwas umständlicher finde. Ich möchte den Wert im Hauptprogramm direkt zurückerhalten, ohne nochmals eine andere Funktion aufrufen zu müssen. Funktioniert hat es aber einwandfrei.:+1:

                        T Offline
                        T Offline
                        ticaki
                        schrieb am zuletzt editiert von ticaki
                        #11

                        @roga

                        Ich baue alle aufwendigeren Skript so auf

                        const bla
                        const mehrbla
                        var blabla
                        var mehrblabla
                        
                        async function main() {
                        // code
                        } 
                        
                        // letzte Zeile im Skript
                        main()
                        

                        EDIT: Der main() Aufruf am ende ist wichtig, kanns zwar nicht das wieso erklären, aber wenn das Skript nicht ganz eingelesen ist, kommt es vor, das Funktionen und Variablen die später als der Aufruf definiert werden, Fehler erzeugen.

                        Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                        Spenden

                        haus-automatisierungH paul53P 2 Antworten Letzte Antwort
                        0
                        • R ROGA

                          @haus-automatisierung sagte in Test SQL-Abfrage:

                          Naja, deine Funktion AvarageTimeInterval gibt jetzt auch immer ein Promise zurück, muss also mit .then() oder ebenfalls mit await genutzt werden.

                          Ok, werde ich mir versuchen zu merken. Wie sieht denn die Verwendung mit 'await' aus?

                          Letzte Zeile also z.B. so:

                          AvarageTimeInterval()
                              .then(val => console.log('Rückgabewert der Funktion=' + val));
                          

                          Habe das soeben erfolgreich umsetzen können. Genau das, was ich wollte, vielen Dank!!! :+1: :+1: :+1:

                          Hatte deine Lösung etwas anders geschrieben und dabei kam dann zuerst nix zurück. Der Fehler war, dass ich statt ein "+" ein "," gesetzt habe, im Glauben, dass dies keine Rolle spielen sollte. Zumindest habe ich das von einem anderen Tutorial so "gelernt", ist aber wohl doch falsch???!

                          AvarageTimeInterval().then(val => console.log('Rückgabewert der Funktion=', val));
                          

                          Frage: Was macht oder bewirkt dieser Pfeil "=>"?

                          PS: Was soll denn das ganze JSON.stringify und mit .parse() wieder zurück bewirken? Kann alles weg...

                          Gute Frage :-) Ich habe es ohne die Konvertierung versucht, dass hat dann aber leider nicht geklappt. Wenn ich jedoch ein JSON-Objekt baue, dann kann ich auch die .length sowie die .wert Eigenschaft nutzen um an meinen Wert zu kommen, ohne das JSON-Objekt scheint das wohl nicht zu gehen, oder mache ich da wieder etwas falsch?

                          Die Frage wäre aber auch, warum Du überhaupt das Ergebnis an die übergeordnete Funktion geben willst. Du könntest auch in der Callback-Funktion alles tun, was Du möchtest. Also das Ergebnis in einen Datenpunkt schreiben o.ä.

                          Naja, ich möchte gerne eine wieder verwendbare Funktion haben, bei der ich dann nur noch die gewünschte Objekt-ID mitgeben kann um so dann vom SQL-Server den gewünschten Wert zu erhalten. Ich weiss (noch) nicht, ob man das in der Callback-Funktion dann auch so machen könnte.

                          Nochmals vielen Dank für die wertvolle Lehre.:ok_hand:

                          haus-automatisierungH Offline
                          haus-automatisierungH Offline
                          haus-automatisierung
                          Developer Most Active
                          schrieb am zuletzt editiert von
                          #12

                          @roga sagte in Test SQL-Abfrage:

                          Frage: Was macht oder bewirkt dieser Pfeil "=>"?

                          Das ist eine arrow function. Eine etwas andere Definition einer anonymen Funktion, welche sich etwas anders verhält als mit dem Schlüsselwort function. Macht in diesem Beispiel aber keinen Unterschied.

                          Du übergibst eine Funktion als Parameter.

                          Das ist praktisch das gleiche wie

                          AvarageTimeInterval().then(function (val) {
                              console.log('Rückgabewert der Funktion=' + val);
                          });
                          

                          @roga sagte in Test SQL-Abfrage:

                          Was mir jedoch daran nicht gefällt ist, dass dafür nochmals eine async Function getValue() erstellt werden muss

                          Hast Du mit meinem Beispiel auch getan - nur dass diese Funktion anonym ist (also keinen Namen hat).

                          🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
                          🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
                          📚 Meine inoffizielle ioBroker Dokumentation

                          R 1 Antwort Letzte Antwort
                          0
                          • T ticaki

                            @roga

                            Ich baue alle aufwendigeren Skript so auf

                            const bla
                            const mehrbla
                            var blabla
                            var mehrblabla
                            
                            async function main() {
                            // code
                            } 
                            
                            // letzte Zeile im Skript
                            main()
                            

                            EDIT: Der main() Aufruf am ende ist wichtig, kanns zwar nicht das wieso erklären, aber wenn das Skript nicht ganz eingelesen ist, kommt es vor, das Funktionen und Variablen die später als der Aufruf definiert werden, Fehler erzeugen.

                            haus-automatisierungH Offline
                            haus-automatisierungH Offline
                            haus-automatisierung
                            Developer Most Active
                            schrieb am zuletzt editiert von
                            #13

                            @ticaki sagte in Test SQL-Abfrage:

                            aber wenn das Skript nicht ganz eingelesen ist, kommt es vor, das Funktionen und Variablen die später als der Aufruf definiert werden, Fehler erzeugen.

                            Eigentlich nicht - siehe "hoisting"

                            🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
                            🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
                            📚 Meine inoffizielle ioBroker Dokumentation

                            1 Antwort Letzte Antwort
                            0
                            • T ticaki

                              @roga

                              Ich baue alle aufwendigeren Skript so auf

                              const bla
                              const mehrbla
                              var blabla
                              var mehrblabla
                              
                              async function main() {
                              // code
                              } 
                              
                              // letzte Zeile im Skript
                              main()
                              

                              EDIT: Der main() Aufruf am ende ist wichtig, kanns zwar nicht das wieso erklären, aber wenn das Skript nicht ganz eingelesen ist, kommt es vor, das Funktionen und Variablen die später als der Aufruf definiert werden, Fehler erzeugen.

                              paul53P Offline
                              paul53P Offline
                              paul53
                              schrieb am zuletzt editiert von
                              #14

                              @ticaki sagte: Funktionen und Variablen die später als der Aufruf definiert werden, Fehler erzeugen.

                              Nur Deklarationen mit const und let müssen vor ihrer Verwendung erfolgen.
                              Um zusätzlichen Compiler-Durchlauf zu vermeiden, sollten alle Deklarationen vor ihrer Verwendung erfolgen.

                              Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                              Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                              T 1 Antwort Letzte Antwort
                              1
                              • paul53P paul53

                                @ticaki sagte: Funktionen und Variablen die später als der Aufruf definiert werden, Fehler erzeugen.

                                Nur Deklarationen mit const und let müssen vor ihrer Verwendung erfolgen.
                                Um zusätzlichen Compiler-Durchlauf zu vermeiden, sollten alle Deklarationen vor ihrer Verwendung erfolgen.

                                T Offline
                                T Offline
                                ticaki
                                schrieb am zuletzt editiert von ticaki
                                #15

                                @paul53

                                2023-07-26 23:38:23.346  - error: javascript.0 (29336) script.js.Messages.Sensorüberwachung: ReferenceError: Cannot access 'stateDef' before initialization
                                2023-07-26 23:38:23.347  - error: javascript.0 (29336)     at readDP (script.js.Messages.Sensorüberwachung:116:23)
                                2023-07-26 23:38:23.347  - error: javascript.0 (29336)     at work (script.js.Messages.Sensorüberwachung:36:21)
                                2023-07-26 23:38:23.347  - error: javascript.0 (29336)     at init (script.js.Messages.Sensorüberwachung:19:5)
                                2023-07-26 23:38:23.347  - error: javascript.0 (29336)     at script.js.Messages.Sensorüberwachung:107:1
                                2023-07-26 23:38:23.347  - error: javascript.0 (29336)     at script.js.Messages.Sensorüberwachung:167:3
                                2023-07-26 23:38:23.347  - error: javascript.0 (29336)     at Script.runInContext (node:vm:135:12)
                                

                                Das stand gestern im log, dann hab ich init() ans ende geschoben und alles war gut.

                                falls es relevant ist:

                                async function init() {
                                    if (!existsState(path)) await createFolderAsync(path, 'Geräteüberwachung')
                                    work()
                                    return Promise.resolve(true);
                                }
                                
                                const stateDef = {
                                    "id": {"type": "string", "def":"", "desc": "diese Id"},
                                    "dp": {"type": "string", "def":"", "desc": "ursprüngliche ID"},
                                    "art": {"type": "string", "def":"ts", "desc": "ts, lc, true, false Worauf geprüft werden soll"},
                                

                                Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                                Spenden

                                haus-automatisierungH 1 Antwort Letzte Antwort
                                0
                                • T ticaki

                                  @paul53

                                  2023-07-26 23:38:23.346  - error: javascript.0 (29336) script.js.Messages.Sensorüberwachung: ReferenceError: Cannot access 'stateDef' before initialization
                                  2023-07-26 23:38:23.347  - error: javascript.0 (29336)     at readDP (script.js.Messages.Sensorüberwachung:116:23)
                                  2023-07-26 23:38:23.347  - error: javascript.0 (29336)     at work (script.js.Messages.Sensorüberwachung:36:21)
                                  2023-07-26 23:38:23.347  - error: javascript.0 (29336)     at init (script.js.Messages.Sensorüberwachung:19:5)
                                  2023-07-26 23:38:23.347  - error: javascript.0 (29336)     at script.js.Messages.Sensorüberwachung:107:1
                                  2023-07-26 23:38:23.347  - error: javascript.0 (29336)     at script.js.Messages.Sensorüberwachung:167:3
                                  2023-07-26 23:38:23.347  - error: javascript.0 (29336)     at Script.runInContext (node:vm:135:12)
                                  

                                  Das stand gestern im log, dann hab ich init() ans ende geschoben und alles war gut.

                                  falls es relevant ist:

                                  async function init() {
                                      if (!existsState(path)) await createFolderAsync(path, 'Geräteüberwachung')
                                      work()
                                      return Promise.resolve(true);
                                  }
                                  
                                  const stateDef = {
                                      "id": {"type": "string", "def":"", "desc": "diese Id"},
                                      "dp": {"type": "string", "def":"", "desc": "ursprüngliche ID"},
                                      "art": {"type": "string", "def":"ts", "desc": "ts, lc, true, false Worauf geprüft werden soll"},
                                  
                                  haus-automatisierungH Offline
                                  haus-automatisierungH Offline
                                  haus-automatisierung
                                  Developer Most Active
                                  schrieb am zuletzt editiert von haus-automatisierung
                                  #16

                                  @ticaki sagte in Test SQL-Abfrage:

                                  Das stand gestern im log, dann hab ich init() ans ende geschoben und alles war gut.

                                  Achso, ich dachte es geht um eine Funktions-Deklaration. Daher der Hinweis auf Hoisting.

                                  Da ist natürlich der Hinweis von @paul53 korrekt, dass Du die Variablen mit const und let vor der Verwendung deklarieren musst. Das ist hier ja nicht passiert (falls Du weiter oben darauf zugreifst - das ist ja sicher nicht das komplette Script?)

                                  🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
                                  🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
                                  📚 Meine inoffizielle ioBroker Dokumentation

                                  T 1 Antwort Letzte Antwort
                                  1
                                  • haus-automatisierungH haus-automatisierung

                                    @ticaki sagte in Test SQL-Abfrage:

                                    Das stand gestern im log, dann hab ich init() ans ende geschoben und alles war gut.

                                    Achso, ich dachte es geht um eine Funktions-Deklaration. Daher der Hinweis auf Hoisting.

                                    Da ist natürlich der Hinweis von @paul53 korrekt, dass Du die Variablen mit const und let vor der Verwendung deklarieren musst. Das ist hier ja nicht passiert (falls Du weiter oben darauf zugreifst - das ist ja sicher nicht das komplette Script?)

                                    T Offline
                                    T Offline
                                    ticaki
                                    schrieb am zuletzt editiert von
                                    #17

                                    @haus-automatisierung
                                    @paul53

                                    Was gelernt, das müssen hab ich überlesen, fett war es besser zu sehen, jetzt kann ichs genau erklären. Danke

                                    Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                                    Spenden

                                    1 Antwort Letzte Antwort
                                    0
                                    • haus-automatisierungH haus-automatisierung

                                      @roga sagte in Test SQL-Abfrage:

                                      Frage: Was macht oder bewirkt dieser Pfeil "=>"?

                                      Das ist eine arrow function. Eine etwas andere Definition einer anonymen Funktion, welche sich etwas anders verhält als mit dem Schlüsselwort function. Macht in diesem Beispiel aber keinen Unterschied.

                                      Du übergibst eine Funktion als Parameter.

                                      Das ist praktisch das gleiche wie

                                      AvarageTimeInterval().then(function (val) {
                                          console.log('Rückgabewert der Funktion=' + val);
                                      });
                                      

                                      @roga sagte in Test SQL-Abfrage:

                                      Was mir jedoch daran nicht gefällt ist, dass dafür nochmals eine async Function getValue() erstellt werden muss

                                      Hast Du mit meinem Beispiel auch getan - nur dass diese Funktion anonym ist (also keinen Namen hat).

                                      R Offline
                                      R Offline
                                      ROGA
                                      schrieb am zuletzt editiert von
                                      #18

                                      @haus-automatisierung sagte in Test SQL-Abfrage:

                                      @roga sagte in Test SQL-Abfrage:

                                      Was mir jedoch daran nicht gefällt ist, dass dafür nochmals eine async Function getValue() erstellt werden muss

                                      Hast Du mit meinem Beispiel auch getan - nur dass diese Funktion anonym ist (also keinen Namen hat).

                                      Oh weh!! Habe ich nicht geschnallt :-( Aber ja, jetzt wo du es mir erklärt hast, sehe ich das auch.

                                      Ich bin an ein weiteres Problem gestossen, das mir wieder Kopfzerbrechen macht. Ich wollte eigentlich im Hauptprogramm eine globale Variable haben, die den Rückgabewert meiner Funktion enthält und mit der ich überall arbeiten kann. Ich habe mir das sinngemäss zuerst so vorgestellt:

                                      Temperatur = AvarageTimeInterval()
                                      

                                      So kannte ich das eigentlich von VBS, das ging dann aber hier leider nicht. Danach habe ich versucht, das neu gelernte anzuwenden:

                                      AvarageTimeInerval().then(function(val) {
                                         Temperatur = val;
                                      };
                                      
                                      Console.log("Temperatur=" + Temperatur);
                                      

                                      Ich dachte nun, das muss ja jetzt klappen, aber weit gefehlt :-( Wieder gab es keinen Wert in der Variable Temperatur und ich fange langsam an, zu verzweifeln. Irgendwo habe ich einen ganz dicken Knoten der nicht aufgehen möchte ....

                                      Kann mir das nochmal jemand vereinfacht erklären was jetzt wieder falsch gelaufen ist, oder muss ich hier die Flinte ins Korn werfen und mir eine andere Beschäftigung suchen????

                                      LG Roli

                                      T haus-automatisierungH 2 Antworten Letzte Antwort
                                      0
                                      • R ROGA

                                        @haus-automatisierung sagte in Test SQL-Abfrage:

                                        @roga sagte in Test SQL-Abfrage:

                                        Was mir jedoch daran nicht gefällt ist, dass dafür nochmals eine async Function getValue() erstellt werden muss

                                        Hast Du mit meinem Beispiel auch getan - nur dass diese Funktion anonym ist (also keinen Namen hat).

                                        Oh weh!! Habe ich nicht geschnallt :-( Aber ja, jetzt wo du es mir erklärt hast, sehe ich das auch.

                                        Ich bin an ein weiteres Problem gestossen, das mir wieder Kopfzerbrechen macht. Ich wollte eigentlich im Hauptprogramm eine globale Variable haben, die den Rückgabewert meiner Funktion enthält und mit der ich überall arbeiten kann. Ich habe mir das sinngemäss zuerst so vorgestellt:

                                        Temperatur = AvarageTimeInterval()
                                        

                                        So kannte ich das eigentlich von VBS, das ging dann aber hier leider nicht. Danach habe ich versucht, das neu gelernte anzuwenden:

                                        AvarageTimeInerval().then(function(val) {
                                           Temperatur = val;
                                        };
                                        
                                        Console.log("Temperatur=" + Temperatur);
                                        

                                        Ich dachte nun, das muss ja jetzt klappen, aber weit gefehlt :-( Wieder gab es keinen Wert in der Variable Temperatur und ich fange langsam an, zu verzweifeln. Irgendwo habe ich einen ganz dicken Knoten der nicht aufgehen möchte ....

                                        Kann mir das nochmal jemand vereinfacht erklären was jetzt wieder falsch gelaufen ist, oder muss ich hier die Flinte ins Korn werfen und mir eine andere Beschäftigung suchen????

                                        T Offline
                                        T Offline
                                        ticaki
                                        schrieb am zuletzt editiert von ticaki
                                        #19

                                        @roga

                                        Die Ausführungsreihenfolge in deinem Skript ist so:

                                        1: AvarageTimeInerval().then(function(val) {
                                           3: Temperatur = val;
                                        };
                                        
                                        2: Console.log("Temperatur=" + Temperatur);
                                        

                                        Wenn du eine Ablaufreihenfolge haben möchtest die jeweils wartet dann am besten imho:

                                        async function main() {
                                          Temperatur = await AvarageTimeInerval()
                                         
                                          Console.log("Temperatur=" + Temperatur);
                                        }
                                        main()
                                        

                                        sehe das nicht als zusätzliche Funktion sondern setzte einfach dein ganzes Skript in die main() funktion, sollte eigentlich problem los funktionieren, solange du sie nicht wiederholt aufrufst.

                                        Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                                        Spenden

                                        1 Antwort Letzte Antwort
                                        0
                                        • R ROGA

                                          @haus-automatisierung sagte in Test SQL-Abfrage:

                                          @roga sagte in Test SQL-Abfrage:

                                          Was mir jedoch daran nicht gefällt ist, dass dafür nochmals eine async Function getValue() erstellt werden muss

                                          Hast Du mit meinem Beispiel auch getan - nur dass diese Funktion anonym ist (also keinen Namen hat).

                                          Oh weh!! Habe ich nicht geschnallt :-( Aber ja, jetzt wo du es mir erklärt hast, sehe ich das auch.

                                          Ich bin an ein weiteres Problem gestossen, das mir wieder Kopfzerbrechen macht. Ich wollte eigentlich im Hauptprogramm eine globale Variable haben, die den Rückgabewert meiner Funktion enthält und mit der ich überall arbeiten kann. Ich habe mir das sinngemäss zuerst so vorgestellt:

                                          Temperatur = AvarageTimeInterval()
                                          

                                          So kannte ich das eigentlich von VBS, das ging dann aber hier leider nicht. Danach habe ich versucht, das neu gelernte anzuwenden:

                                          AvarageTimeInerval().then(function(val) {
                                             Temperatur = val;
                                          };
                                          
                                          Console.log("Temperatur=" + Temperatur);
                                          

                                          Ich dachte nun, das muss ja jetzt klappen, aber weit gefehlt :-( Wieder gab es keinen Wert in der Variable Temperatur und ich fange langsam an, zu verzweifeln. Irgendwo habe ich einen ganz dicken Knoten der nicht aufgehen möchte ....

                                          Kann mir das nochmal jemand vereinfacht erklären was jetzt wieder falsch gelaufen ist, oder muss ich hier die Flinte ins Korn werfen und mir eine andere Beschäftigung suchen????

                                          haus-automatisierungH Offline
                                          haus-automatisierungH Offline
                                          haus-automatisierung
                                          Developer Most Active
                                          schrieb am zuletzt editiert von haus-automatisierung
                                          #20

                                          @roga sagte in Test SQL-Abfrage:

                                          und ich fange langsam an, zu verzweifeln. Irgendwo habe ich einen ganz dicken Knoten der nicht aufgehen möchte ....

                                          Der Code in der Callback-Funktion wird später ausgeführt. das läuft asynchron ab! das ist ja der Sinn von Promises. Du musst den Code also umbauen. Nur INNERHALB der Funktion kannst Du das Ergebnis wirklich sicher verwenden. Bitte nochmal mit asynchronem Code beschäftigen. Das restliche Programm läuft weiter, während deine SQL-Abfrage auf ein Ergebnis wartet. Das ist ja der Sinn des Ganzen.

                                          Du sagst quasi nur "hier liebe Funktion, mach mal. Und gib mir mit einem Aufruf in dieser Funktion bescheid, wenn Du fertig bist".

                                          @ticaki hat das ja gut veranschaulicht.

                                          🧑‍🎓 Autor des beliebten ioBroker-Master-Kurses
                                          🎥 Tutorials rund um das Thema DIY-Smart-Home: https://haus-automatisierung.com/
                                          📚 Meine inoffizielle ioBroker Dokumentation

                                          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

                                          315

                                          Online

                                          32.6k

                                          Benutzer

                                          82.2k

                                          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