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. Warten auf Ergebnis Internetabfrage await/async

NEWS

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

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

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

Warten auf Ergebnis Internetabfrage await/async

Geplant Angeheftet Gesperrt Verschoben JavaScript
7 Beiträge 3 Kommentatoren 425 Aufrufe 5 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.
  • cashC Offline
    cashC Offline
    cash
    Most Active
    schrieb am zuletzt editiert von
    #1

    Ich habe ein Problem wenn das Internet nachts nicht verfügbar ist und dadurch die Heizung ggf falsch gestellt wird. Es gibt dazu auch ein Issue beim ical Adapter. Da der ical Adapter eher weniger weiterentwickelt wird will ich eine eigene Lösung bauen. Nur funktioniert sie nicht. Ich vermute das Script wartet nicht auf das Ergebnis von der Axios abfrage? Wie kann ich das ändern? Ping Adapter möchte ich nicht nutzen, da ich nicht alle x Sekunden eine Abfrage machen möchte sondern nur einmalig beim Scriptstart:

    /**************************
    * Prüft ob google erreichbar ist und damit ob eine Internetverbindung besteht
    * 
    * 18.05.21 V1.00    Erste Version
    
    **************************/
    const logging = true; 
    const debugging = false; 
    var Internet = false;
    // **************************** ab hier keine Änderung *********************************************************
    
    function func_check_Internet(){
        var Internet = false;
        const url = 'http://google.de';
        const axios = require('axios');
        axios({
            method: 'get',
            baseURL: url,
            timeout: 4500,
             responseType: 'json'
         })
         .then((response) => {
                               
            if(debugging){
                console.log('data:' +response.data);
                console.log('Status: ' +response.status);
                console.log('Header:' +response.headers);
            }
            if(response.status = 200){
    
                if(logging){
                    log('Internetverbindung scheint ok zu sein.')
                }
                Internet = true;
            }
            else{
                if(logging){
                    log('Internet derzeit nicht verfügbar: '+response.status,'warn')
                }
            } 
    
        
        })
        .catch(
            (error) => {
                // handle error
                log('Fehler bei der Abfrage der Internetverbindung: '+error,'warn');                    
            }
        );
        return(Internet)
    }
    
    function func_main(){
        Internet = func_check_Internet();
        log('Internet: '+Internet)
    }
    
    

    Im Log sieht man eigentlich das er bereits Internet als false meldet bevor der andere Log Eintrag zeigt das Internet verfügbar ist. Wie kann ich dem Script sagen das er erstmal die function func_check_Internet komplett ausfürhren soll? Ich hoffe await könnte helfen. Weiß aber nicht wie ich das einbaue?

    F 1 Antwort Letzte Antwort
    0
    • AlCalzoneA Offline
      AlCalzoneA Offline
      AlCalzone
      Developer
      schrieb am zuletzt editiert von
      #2

      Am besten liest du mal hier:
      https://gist.github.com/AlCalzone/d14b854b69ce5e8a03718336cc650a95#

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

      cashC 1 Antwort Letzte Antwort
      0
      • cashC cash

        Ich habe ein Problem wenn das Internet nachts nicht verfügbar ist und dadurch die Heizung ggf falsch gestellt wird. Es gibt dazu auch ein Issue beim ical Adapter. Da der ical Adapter eher weniger weiterentwickelt wird will ich eine eigene Lösung bauen. Nur funktioniert sie nicht. Ich vermute das Script wartet nicht auf das Ergebnis von der Axios abfrage? Wie kann ich das ändern? Ping Adapter möchte ich nicht nutzen, da ich nicht alle x Sekunden eine Abfrage machen möchte sondern nur einmalig beim Scriptstart:

        /**************************
        * Prüft ob google erreichbar ist und damit ob eine Internetverbindung besteht
        * 
        * 18.05.21 V1.00    Erste Version
        
        **************************/
        const logging = true; 
        const debugging = false; 
        var Internet = false;
        // **************************** ab hier keine Änderung *********************************************************
        
        function func_check_Internet(){
            var Internet = false;
            const url = 'http://google.de';
            const axios = require('axios');
            axios({
                method: 'get',
                baseURL: url,
                timeout: 4500,
                 responseType: 'json'
             })
             .then((response) => {
                                   
                if(debugging){
                    console.log('data:' +response.data);
                    console.log('Status: ' +response.status);
                    console.log('Header:' +response.headers);
                }
                if(response.status = 200){
        
                    if(logging){
                        log('Internetverbindung scheint ok zu sein.')
                    }
                    Internet = true;
                }
                else{
                    if(logging){
                        log('Internet derzeit nicht verfügbar: '+response.status,'warn')
                    }
                } 
        
            
            })
            .catch(
                (error) => {
                    // handle error
                    log('Fehler bei der Abfrage der Internetverbindung: '+error,'warn');                    
                }
            );
            return(Internet)
        }
        
        function func_main(){
            Internet = func_check_Internet();
            log('Internet: '+Internet)
        }
        
        

        Im Log sieht man eigentlich das er bereits Internet als false meldet bevor der andere Log Eintrag zeigt das Internet verfügbar ist. Wie kann ich dem Script sagen das er erstmal die function func_check_Internet komplett ausfürhren soll? Ich hoffe await könnte helfen. Weiß aber nicht wie ich das einbaue?

        F Offline
        F Offline
        fastfoot
        schrieb am zuletzt editiert von
        #3

        @cash probiere mal so

        const axios = require('axios').default;
        async function checkInet(){
            let res = await axios.get('https://google.de');
            return res.status === 200 ? 'Internet ist ok' : 'Internet nicht erreichbar';
        }
        async function doIt(){
            log('Inet: ' + await checkInet());
        }
        
        doIt();
        

        iobroker läuft unter Docker auf QNAP TS-451+
        SkriptRecovery: https://forum.iobroker.net/post/930558

        1 Antwort Letzte Antwort
        0
        • AlCalzoneA AlCalzone

          Am besten liest du mal hier:
          https://gist.github.com/AlCalzone/d14b854b69ce5e8a03718336cc650a95#

          cashC Offline
          cashC Offline
          cash
          Most Active
          schrieb am zuletzt editiert von
          #4

          @alcalzone Danke. Das hatte ich bei der recherche schon gefunden aber leider verstehe ich davon nur die Hälfte. Dazu bin ich einfach noch nicht fit genug.

          @fastfoot Danke für das Beispiel. Habe jetzt mein Script angepasst. Ich glaube so passt es. Mal schauen wie ich nun weiter mache um mein Problem mit dem ical Adapter zu lösen.

          Hier meine Version:

          
          /**************************
          * Prüft ob google erreichbar ist und damit ob eine Internetverbindung besteht
          * 
          * 18.05.21 V1.00    Erste Version
          
          **************************/
          const logging = true; 
          const debugging = false; 
          var Internet = false;
          // **************************** ab hier keine Änderung *********************************************************
          
          async function func_check_Internet(){
              var Internet = false;
              const url = 'http://google.de';
              const axios = require('axios');
              await axios({
                  method: 'get',
                  baseURL: url,
                  timeout: 4500,
                   responseType: 'json'
               })
               .then((response) => {
                                     
                  if(debugging){
                      console.log('data:' +response.data);
                      console.log('Status: ' +response.status);
                      console.log('Header:' +response.headers);
                  }
                  if(response.status = 200){
          
                      if(logging){
                          log('Internetverbindung scheint ok zu sein.')
                      }
                      Internet = true;
                      
                  }
                  else{
                      if(logging){
                          log('Internet derzeit nicht verfügbar: '+response.status,'warn')
                      }
                  } 
          
              
              })
              .catch(
                  (error) => {
                      // handle error
                      log('Fehler bei der Abfrage der Internetverbindung: '+error,'warn');                    
                  }
              );
              
              return(Internet);
          }
          
          async function func_main(){
              Internet = await func_check_Internet();
              log('Internet: '+Internet)
          }
          
          
          
          //beim Starten
          func_main();
          
          
          
          1 Antwort Letzte Antwort
          0
          • AlCalzoneA Offline
            AlCalzoneA Offline
            AlCalzone
            Developer
            schrieb am zuletzt editiert von
            #5

            @cash sagte in Warten auf Ergebnis Internetabfrage await/async:

            await axios(...).then(...).catch(...)

            ist ein anti-pattern. Das geht besser:
            https://gist.github.com/AlCalzone/d14b854b69ce5e8a03718336cc650a95#kapitel-6-ein-paar-anti-patterns

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

            cashC 1 Antwort Letzte Antwort
            0
            • AlCalzoneA AlCalzone

              @cash sagte in Warten auf Ergebnis Internetabfrage await/async:

              await axios(...).then(...).catch(...)

              ist ein anti-pattern. Das geht besser:
              https://gist.github.com/AlCalzone/d14b854b69ce5e8a03718336cc650a95#kapitel-6-ein-paar-anti-patterns

              cashC Offline
              cashC Offline
              cash
              Most Active
              schrieb am zuletzt editiert von
              #6

              @alcalzone wenn ich Javascript richtig verstehen würde... Danke auf jeden Fall das Du mal drüber geschaut hast.

              Ich habe das Script nun angepasst. Mein neuer Versuch (mehr oder weniger wie von @fastfoot nur mit Errorbehandlung:

              const axios = require('axios').default;
              //const url = 'http://google.de'; 
              const url = 'http://ardd.de'; //Liefert Fehler
              var debugging = true;
              async function func_check_Internet(){
                  try{
                      let res = await axios.get(url,
                          {timeout: 4500,
                          responseType: 'json'
                          }
                      )
                      if(debugging){
                          console.log('data:' +res.data);
                          console.log('Status: ' +res.status);
                          console.log('Header:' +res.headers);
                      }
                      return res.status === 200 ? true : false;
                  }
                  catch (e) {
                      
                      log('Fehler: '+e)
                      //var status;
                      //return status = false;
                  }
              }
              
              async function doIt(){
                  try{
                      var Internet = await func_check_Internet()
                      log('Ergebnis: '+Internet)
                  }
                  catch (e) {
                      
                      log('Fehler: '+e)
                         
                  }
              
                  if(!Internet){
                      log('Keine Internetverbindung vorhanden',"warn");
                  }
                  else{
                      log('Internetverbindung vorhanden')
                  }
              
              
                  
              }
               
              doIt();
              

              Ist es jetzt so besser? Wie sieht das denn mit dem catch(e) aus? Muss das bei beiden Sachen hin? Ich glaube nicht, da ich ja mit dem ersten catch schon den Fehler abfange und somit immer in der function doit etwas ankommt (im Fehlerfalle hat undefined).

              AlCalzoneA 1 Antwort Letzte Antwort
              0
              • cashC cash

                @alcalzone wenn ich Javascript richtig verstehen würde... Danke auf jeden Fall das Du mal drüber geschaut hast.

                Ich habe das Script nun angepasst. Mein neuer Versuch (mehr oder weniger wie von @fastfoot nur mit Errorbehandlung:

                const axios = require('axios').default;
                //const url = 'http://google.de'; 
                const url = 'http://ardd.de'; //Liefert Fehler
                var debugging = true;
                async function func_check_Internet(){
                    try{
                        let res = await axios.get(url,
                            {timeout: 4500,
                            responseType: 'json'
                            }
                        )
                        if(debugging){
                            console.log('data:' +res.data);
                            console.log('Status: ' +res.status);
                            console.log('Header:' +res.headers);
                        }
                        return res.status === 200 ? true : false;
                    }
                    catch (e) {
                        
                        log('Fehler: '+e)
                        //var status;
                        //return status = false;
                    }
                }
                
                async function doIt(){
                    try{
                        var Internet = await func_check_Internet()
                        log('Ergebnis: '+Internet)
                    }
                    catch (e) {
                        
                        log('Fehler: '+e)
                           
                    }
                
                    if(!Internet){
                        log('Keine Internetverbindung vorhanden',"warn");
                    }
                    else{
                        log('Internetverbindung vorhanden')
                    }
                
                
                    
                }
                 
                doIt();
                

                Ist es jetzt so besser? Wie sieht das denn mit dem catch(e) aus? Muss das bei beiden Sachen hin? Ich glaube nicht, da ich ja mit dem ersten catch schon den Fehler abfange und somit immer in der function doit etwas ankommt (im Fehlerfalle hat undefined).

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

                @cash Alles richtig, was du am Ende schreibst. Da du in func_check_Internet schon alle möglichen Fehler behandelst, ist das try-catch um den Aufruf nicht nötig.

                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

                850

                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