Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. hilfe - javascript- axios, await - pause bei abruf von daten

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    hilfe - javascript- axios, await - pause bei abruf von daten

    This topic has been deleted. Only users with topic management privileges can see it.
    • liv-in-sky
      liv-in-sky last edited by

      ich habe eine schleife mit einem selektor:

      $('sonoff.0.*.INFO.IPAddress').each(function(id, i) {          
               var ida = id.split('.');
               myPower="na";
               myPower1="na";
               myPower2="na";
      
        if(getState("sonoff.0."+ida[2]+".alive").val && parseInt(getState("sonoff.0."+ida[2]+".INFO.Version").val.replace(/^(.).+/,"$1")) >=5) {
               if (existsState("sonoff.0."+ida[2]+".POWER")) myPower=getState("sonoff.0."+ida[2]+".POWER").val.toString()
               if (existsState("sonoff.0."+ida[2]+".POWER1")) myPower1=getState("sonoff.0."+ida[2]+".POWER1").val.toString()
               if (existsState("sonoff.0."+ida[2]+".POWER2")) myPower2=getState("sonoff.0."+ida[2]+".POWER2").val.toString()      
          for (let ii=1;ii<=anzahlTimer;ii++){
      
              let myhttp=`http://${getState(id).val}/cm?cmnd=timer${ii}`
      
             let helpi=getState("sonoff.0."+ida[2]+".INFO.Hostname").val;
      
             
         //  resolveAfter2Seconds();log("!!!!!!")
             for(let i=0;i<filterArray.length;i++){
                    if (filterArray[i]==helpi) { getData(myhttp,id,helpi,myPower,myPower1,myPower2);
                                                 if(myPowerOld!=helpi){
                                                      if (myPower!="na")  arrTrigger.push("sonoff.0."+ida[2]+".POWER");
                                                      if (myPower1!="na") arrTrigger.push("sonoff.0."+ida[2]+".POWER1");
                                                      if (myPower2!="na") arrTrigger.push("sonoff.0."+ida[2]+".POWER2");
                                                      myPowerOld=helpi}}
             }
      
           }}
      
         }); 
      

      darin wird die funktion getData aufgerufen (über axios werden bei den sonoffs bestimmte werte abgerufen):

             async function getData(url,id,hostname,power,power1,power2) {
                
        try {
          const response = await axios.get(url)
           if(JSON.stringify(response.data).includes("Timer")) { if(JSON.stringify(response.data).includes(`Arm":1,`) ) myArr.push([JSON.stringify(response.data),id,hostname,power,power1,power2]) }
        
        } catch (error) {
           let myError="Verbindungsproblem - Sonoff Timer script - Script neustarten evtl. Sonoff vom Strom nehmen" //'{"Timerx":{"Arm":1,"Mode":0,"Time":"error","Window":0,"Days":"0000000","Repeat":1,"Output":1,"Action":2}}'
           // myArr.push([myError,dpRefresh,"error"]);log(myArr.toString())
             console.log(myError + " - " + hostname);
        }
      }
      

      meine frage dazu - wie schaffe ich es , da bei dem abruf über axios immer eine kleine zeitliche pause ist - die sonoffs brauchen wohl eine kleine "verschnaufpause" - das script funktioniert eigentlich, aber manchmal steigen sonoffs aus und kommen nicht mehr mit

      AlCalzone 1 Reply Last reply Reply Quote 0
      • AlCalzone
        AlCalzone Developer @liv-in-sky last edited by AlCalzone

        @liv-in-sky In Zeile 20 rufst du getData (eine async-Funktion) ohne await davor auf. Das bewirkt, dass du einen Haufen Requests nahezu parallel abfeuerst, ohne zu warten, dass diese auch fertig sind.

        Lösung:
        Zeile 1: aus function ein async function machen.
        Zeile 20: vor getData ein await packen.


        Falls es dann immer noch notwendig sein sollte zu warten, kannst du dir wie folgt behelfen:

        function wait(ms) {
            return new Promise((resolve) => {
                setTimeout(resolve, ms);
            });
        }
        

        und dann am Ende der obigen Schleife vor Zeile 28 (glaube ich, das ist furchtbar formatiert) ein await wait(10) packen. (oder eine sinnvolle Anzahl von Millisekunden).

        liv-in-sky 2 Replies Last reply Reply Quote 0
        • liv-in-sky
          liv-in-sky @AlCalzone last edited by

          @AlCalzone erstmal danke - habe diese selektor abfrage in einer function und habe die , die ganze zeit mit async definiert - im selektor bekam ich immer ein await ist nicht erlaubt - ist schon mal ein guter schritt
          habe immer async function writeHTML() .. geschrieben 😞

          aber leider bekomme ich einen kringel, wenn ich es hier machen - muss ich das anders aufrufen:

          Image 4.png

          ich weiß nicht, wie viele videos zu diesem thema ich schon angeschaut habe - aber in der praxis, bei eigenen scripts - stell ich mich immer wieder an 😞

          AlCalzone 1 Reply Last reply Reply Quote 0
          • AlCalzone
            AlCalzone Developer @liv-in-sky last edited by

            @liv-in-sky Was ist denn der Fehler, wenn du mit der Maus über den Kringel gehst?

            1 Reply Last reply Reply Quote 0
            • liv-in-sky
              liv-in-sky @AlCalzone last edited by

              @AlCalzone

              es funktioniert aber trotz des kringels - mit der await wait... function wird das gut ausgebremmst -

              Image 5.png
              Image 6.png

              vielleicht fällt dir noch was zum kringel ein - der fehler sagt

              smart79.gif

              AlCalzone 1 Reply Last reply Reply Quote 0
              • AlCalzone
                AlCalzone Developer @liv-in-sky last edited by AlCalzone

                @liv-in-sky Ah, ok das lässt sich ändern. Müsste aber so funktionieren.

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

                Support us

                ioBroker
                Community Adapters
                Donate

                769
                Online

                31.8k
                Users

                80.0k
                Topics

                1.3m
                Posts

                javascript
                2
                6
                466
                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