Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] Funktionsrückgabe undefined

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst] Funktionsrückgabe undefined

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

      Hallo Zusammen,

      irgendwie verstehe ich wohl nicht wo und wie mit async, await und/oder promises gearbeitet werden muss und hoffe auf hilfe

      Habe folgende Funktion

      function tibberprice_holen(t){
          
          var tibberprice = 0;
          console.log(t);
          
          // Aktuellen Tibber Preis holen innerhalb der Callback-Funktion: 
      
          let search_Std = t.toString().substring(0, 18);
          console.log(search_Std);
          try{  
              id_SrcTibberpreise.each(async function(id) {                      // im Verzeichnis der Tibberpreise suchen im gültig ab Zeitdatenpunkt 
                 
              if(getState(id).val.substring(0, 18) == search_Std) {
              tibberprice = getState(id.replace('startTime', 'Total_Preis')).val;
              console.log(tibberprice);
              return  ;
              }});
          }
          catch(error) {} // wegen fehlender Werte für den Folgetag in der Zeit von 00 - 14 Uhr    
      
      }
      
      console.log('Fertig : ' +tibberprice_holen(new Date()));
      
      

      wenn das Programm läuft zeigt es durch die Logs innerhalb der Funktion den richtigen Wert
      nur ausserhalb im Log kommt undefined😞

      ? paul53 2 Replies Last reply Reply Quote 0
      • ?
        A Former User @ostseeskipper last edited by A Former User

        @ostseeskipper auf den ersten Blick würde ich sagen das du bei return noch angeben musst welchen Wert er denn zurück geben soll. Woher soll er das sonst wissen? Also „return tibberprice“

        Und wenn du eine Funktion mit async deklarierst solltest du innerhalb dieser auch async Funktionen nutzen. Also await getStateAsync(id.replace('startTime', 'Total_Preis')).val; Ist hier nun nicht schlimm und wenn nicht kannst auch das async weg lassen. Aber bei mehreren Werten die man holen möchte macht das dann schon Sinn damit ggf. nicht übersprungen wird.

        O 1 Reply Last reply Reply Quote 0
        • O
          ostseeskipper @Guest last edited by

          @ciddi89
          Hatte ich bereits probiert genau zu sagen "return tibberprice"
          auch await hilft nicht

          
          function tibberprice_holen(t){          // wenn Funktion geht und wert zurück liefert
              
              var tibberprice = 0;
              console.log(t);
              
              // Aktuellen Tibber Preis holen innerhalb der Callback-Funktion: 
          
              let search_Std = t.toString().substring(0, 18);
              console.log(search_Std);
              try{  
                  id_SrcTibberpreise.each(async function(id) {                      // im Verzeichnis der Tibberpreise suchen im gültig ab Zeitdatenpunkt 
                     
                  if(getState(id).val.substring(0, 18) == search_Std) {
                  tibberprice = await Math.round(getState(id.replace('startTime', 'Total_Preis')).val*100)/10000;
                  console.log(tibberprice);
                  return tibberprice ;
                  }});
              }
              catch(error) {} // wegen fehlender Werte für den Folgetag in der Zeit von 00 - 14 Uhr    
          
          }
          console.log('Fertig : ' +tibberprice_holen(new Date()));
          
          

          ergibt

          19:26:37.080	info	javascript.0 (18691) script.js.Z_Test.Test_Zaehlerstaende: Sun Apr 23 2023 19:26:37 GMT+0200 (Mitteleuropäische Sommerzeit)
          19:26:37.080	info	javascript.0 (18691) script.js.Z_Test.Test_Zaehlerstaende: Sun Apr 23 2023 19
          19:26:37.080	info	javascript.0 (18691) script.js.Z_Test.Test_Zaehlerstaende: Fertig : undefined
          

          und wenn funktion mit async definiert wird kommt

          19:27:41.412	info	javascript.0 (18691) script.js.Z_Test.Test_Zaehlerstaende: Sun Apr 23 2023 19:27:41 GMT+0200 (Mitteleuropäische Sommerzeit)
          19:27:41.412	info	javascript.0 (18691) script.js.Z_Test.Test_Zaehlerstaende: Sun Apr 23 2023 19
          19:27:41.412	info	javascript.0 (18691) script.js.Z_Test.Test_Zaehlerstaende: Fertig : [object Promise]
          

          Daher wird es irgendwas sein was ich noch nicht verstanden habe und hoffe auf das Wissen hier im Forum

          ? 1 Reply Last reply Reply Quote 0
          • ?
            A Former User @ostseeskipper last edited by A Former User

            @ostseeskipper erstmal das await for Math.round hat keinen Effekt. Du musst wenn schon await vor das getState setzen. dann heisst es aber await getStateAsync

            Aber woher holt er zb. den Wert? id_SrcTibberpreise Ist da noch mehr im script? Deswegen gibt er wahrscheinlich nichts zurück weil er mit der id nichts anfangen kann und somit aus der Funktion springt.

            Hier aber erstmal wie es mit den await aussehen sollte/könnte:

             
            function tibberprice_holen(t){          // wenn Funktion geht und wert zurück liefert
                
                let tibberprice = 0;
                console.log(t);
                
                // Aktuellen Tibber Preis holen innerhalb der Callback-Funktion: 
             
                let search_Std = t.toString().substring(0, 18);
                console.log(search_Std);
                try{  
                    id_SrcTibberpreise.each(async function(id) {                      // im Verzeichnis der Tibberpreise suchen im gültig ab Zeitdatenpunkt 
                       
                    if(getState(id).val.substring(0, 18) == search_Std) {
                    tibberprice = Math.round((await getStateAsync(id.replace('startTime','Total_Preis'))).val*100)/10000;
                    console.log(tibberprice);
                    return tibberprice;
                    }});
                }
                catch(error) {
                    console.warn(error.message)
                } // wegen fehlender Werte für den Folgetag in der Zeit von 00 - 14 Uhr    
             
            }
            const actualTibberprice = tibberprice_holen(new Date());
            console.log('Fertig : ' + actualTibberprice);
            
            

            // EDIT: wird einem auch gesagt wenn du im error fall eine log ausgabe gibt. Hab das Script damit auch noch angepasst.

            19:51:28.618	warn	javascript.0 (539) script.js.Vorlagen.212: id_SrcTibberpreise is not defined
            
            1 Reply Last reply Reply Quote 0
            • paul53
              paul53 @ostseeskipper last edited by

              @ostseeskipper sagte: ausserhalb im Log kommt undefined

              Man muss den Rückgabewert in der äußeren Funktion mitgeben:

              function tibberprice_holen(t){
                  var tibberprice = 0;
                  console.log(t);
                  // Aktuellen Tibber Preis holen innerhalb der Callback-Funktion: 
                  let search_Std = t.toString().substring(0, 18);
                  console.log(search_Std);
                  try {  
                      id_SrcTibberpreise.each(function(id) {  // im Verzeichnis der Tibberpreise suchen im gültig ab Zeitdatenpunkt 
                          if(getState(id).val.substring(0, 18) == search_Std) {
                              tibberprice = getState(id.replace('startTime', 'Total_Preis')).val;
                              console.log(tibberprice);
                              return;
                          }
                      });
                      return tibberprice;
                  }
                  catch(error) {} // wegen fehlender Werte für den Folgetag in der Zeit von 00 - 14 Uhr    
              }
               
              console.log('Fertig : ' +tibberprice_holen(new Date()));
              
              O 1 Reply Last reply Reply Quote 1
              • O
                ostseeskipper @paul53 last edited by

                @paul53 wie immer besten Dank👍
                echt klasse wie du hier mit deinem Wissen hilfst und unterstützt.
                Hast du ne Kaffeekasse?🍵

                1 Reply Last reply Reply Quote 0
                • First post
                  Last post

                Support us

                ioBroker
                Community Adapters
                Donate

                903
                Online

                31.7k
                Users

                79.8k
                Topics

                1.3m
                Posts

                3
                6
                261
                Loading More Posts
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes
                Reply
                • Reply as topic
                Log in to reply
                Community
                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                The ioBroker Community 2014-2023
                logo