Weiter zum Inhalt
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • 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

  • Neuer ioBroker-Blog online: Monatsrückblick März/April 2026
    BluefoxB
    Bluefox
    8
    1
    487

  • Verwendung von KI bitte immer deutlich kennzeichnen
    HomoranH
    Homoran
    10
    1
    399

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    981

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

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascript
6 Beiträge 2 Kommentatoren 552 Aufrufe 2 Beobachtet
  • Ä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

              Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.

              Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.

              Mit deinem Input könnte dieser Beitrag noch besser werden 💗

              Registrieren Anmelden
              Antworten
              • In einem neuen Thema antworten
              Anmelden zum Antworten
              • Älteste zuerst
              • Neuste zuerst
              • Meiste Stimmen


              Support us

              ioBroker
              Community Adapters
              Donate

              382

              Online

              32.8k

              Benutzer

              82.8k

              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