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. hilfe - javascript- axios, await - pause bei abruf von daten

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.6k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.1k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    2.8k

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

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascript
6 Beiträge 2 Kommentatoren 517 Aufrufe 2 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.
  • liv-in-skyL Offline
    liv-in-skyL Offline
    liv-in-sky
    schrieb am zuletzt editiert von
    #1

    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

    nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

    AlCalzoneA 1 Antwort Letzte Antwort
    0
    • liv-in-skyL liv-in-sky

      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

      AlCalzoneA Offline
      AlCalzoneA Offline
      AlCalzone
      Developer
      schrieb am zuletzt editiert von AlCalzone
      #2

      @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).

      Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

      liv-in-skyL 2 Antworten Letzte Antwort
      0
      • AlCalzoneA 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-skyL Offline
        liv-in-skyL Offline
        liv-in-sky
        schrieb am zuletzt editiert von
        #3

        @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 :-(

        nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

        AlCalzoneA 1 Antwort Letzte Antwort
        0
        • liv-in-skyL liv-in-sky

          @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 :-(

          AlCalzoneA Offline
          AlCalzoneA Offline
          AlCalzone
          Developer
          schrieb am zuletzt editiert von
          #4

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

          Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

          1 Antwort Letzte Antwort
          0
          • AlCalzoneA 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-skyL Offline
            liv-in-skyL Offline
            liv-in-sky
            schrieb am zuletzt editiert von
            #5

            @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

            nach einem gelösten Thread wäre es sinnvoll dies in der Überschrift des ersten Posts einzutragen [gelöst]-... Bitte benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat. Forum-Tools: PicPick https://picpick.app/en/download/ und ScreenToGif https://www.screentogif.com/downloads.html

            AlCalzoneA 1 Antwort Letzte Antwort
            0
            • liv-in-skyL liv-in-sky

              @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

              AlCalzoneA Offline
              AlCalzoneA Offline
              AlCalzone
              Developer
              schrieb am zuletzt editiert von AlCalzone
              #6

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

              Warum `sudo` böse ist: https://forum.iobroker.net/post/17109

              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

              552

              Online

              32.4k

              Benutzer

              81.5k

              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