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

  1. ioBroker Community Home
  2. Deutsch
  3. Entwicklung
  4. Wiedermal das leidige Thema mit Async

NEWS

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

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

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

Wiedermal das leidige Thema mit Async

Geplant Angeheftet Gesperrt Verschoben Entwicklung
adapterasyncsentto
13 Beiträge 5 Kommentatoren 576 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.
  • PeoplesP Peoples

    Hallo miteinander,

    ich bräuchte Unterstützung bei dem "Umschreiben" einer Funktion in eine Async Funktion.

    Ich verwende in meiner AdminOberfläche die sendTo-Funktion um Daten aus meiner main.js bei Adapterstart abzufragen, doch leider wird beim erstmaligen Adapterstart nach der Installation das Ergebnis zu spät zurückgemeldet und das Dropdown-Feld im Admin ist schon erstellt (ohne Inhalt).

    Da ich nun wie schon öfter beschrieben leider nicht der Javascript - Profi bin bräuchte ich Hilfe beim Umschreiben folgender schon in der main.js vorhandenen Funktion:

    message: (obj) => {
                 if (typeof obj === 'object' && obj.message) {
                     if (obj.command === 'send') {
                         // e.g. send email or pushover or whatever
                         adapter.log.info('send command');
                         
                         const visData = new Object();
                         visData.projectList = readProjects();
                         visData.viewList = readViews(adapter.config.visProject);
                         
                         // Send response in callback if required
                         if (obj.callback) adapter.sendTo(obj.from, obj.command, visData, obj.callback);
                     }
                 }
             }
    

    Ich habe das Ganze auch schon einige Male versucht, habe aber jedesmal irgendwo im Syntax einen Fehler. Es wäre toll wenn sich einer der Profis hier mal 10 Sekunden ;-) Zeit nehmen könnte um mir hier zu Helfen.

    UncleSamU Offline
    UncleSamU Offline
    UncleSam
    Developer
    schrieb am zuletzt editiert von UncleSam
    #2

    @Peoples sagte in Wiedermal das leidige Thema mit Async:

    doch leider wird beim erstmaligen Adapterstart nach der Installation das Ergebnis zu spät zurückgemeldet und das Dropdown-Feld im Admin ist schon erstellt (ohne Inhalt).

    Das Problem wird dir async/await auch nicht lösen. Es ist nur eine schönere Darstellung des (beinahe) gleichen Codes. Du musst also im index_m.html damit umgehen können, dass die Antwort auf dein sendTo() verzögert kommt.

    Wenn du das Problem lösen willst, bleibt dir nur, im index_m.html dein GUI erst zu erstellen, wenn dein sendTo-Callback aufgerufen wird.

    P.S.: ich wüsste nicht, wie man deine Funktion async machen könnte, da sie gar keine Callbacks hat.

    Bitte bei Problemen mit meinen Adaptern, Issue auf GitHub erfassen: Loxone | I2C | Luxtronik2
    ♡-lichen Dank an meine Sponsoren

    PeoplesP 1 Antwort Letzte Antwort
    0
    • UncleSamU UncleSam

      @Peoples sagte in Wiedermal das leidige Thema mit Async:

      doch leider wird beim erstmaligen Adapterstart nach der Installation das Ergebnis zu spät zurückgemeldet und das Dropdown-Feld im Admin ist schon erstellt (ohne Inhalt).

      Das Problem wird dir async/await auch nicht lösen. Es ist nur eine schönere Darstellung des (beinahe) gleichen Codes. Du musst also im index_m.html damit umgehen können, dass die Antwort auf dein sendTo() verzögert kommt.

      Wenn du das Problem lösen willst, bleibt dir nur, im index_m.html dein GUI erst zu erstellen, wenn dein sendTo-Callback aufgerufen wird.

      P.S.: ich wüsste nicht, wie man deine Funktion async machen könnte, da sie gar keine Callbacks hat.

      PeoplesP Offline
      PeoplesP Offline
      Peoples
      schrieb am zuletzt editiert von Peoples
      #3

      @UncleSam

      Aktuel mache ich das so:

      async function getVisContent() {
                      return new Promise(function (resolve, reject) {
                          const mObj = new Object();
                                mObj.command = 'send';
                                mObj.message = 'getVisData';
      
                         sendTo('viewswitch.0', 'send', mObj, (visData) => {
                              if(visData.error) {
                                  reject('Error: ' + visData.error);
                              } else {
                                  resolve(visData);
                              }
                          });
                      });
                  }
      
      
      async function genProjectSelect() {
                      try{
                          let id;
                          let $sel = $('#visProject');
                          let result = '';
                          const visData = await getVisContent();
                          const visDataProjects = visData.projectList;
                          let arr = [];
                          if(visData.projectList ==''){
                              arr.push['main'];
                          } else {
                             arr = visData.projectList;
                          }
                          if(!settings['visProject'] || settings['visProject'] == ''){
                              $sel.html('<option value="allProjects">' + _('Select first') + '</option>');
                          } else {
                              $sel.html();
                              id = settings['visProject'];
                          }
                          arr.sort();
                          arr.forEach(function(val) {
                                   //$('#counties').append('<option value="' + val[0] + '"' + (id === val[0] ? ' selected' : '') + '>' + val[1] + '</option>');
                              $('#visProject').append('<option value="' + val + '"' + (id === val ? ' selected' : '') + '>'+val+' </option>');
                          });
                          $sel.select();
                          
                      }catch(e) {
                          console.log(e); // 30
                      }
                      
                  } 
      
                  genProjectSelect();
      
      
      
      

      aber das bringt eben leider nicht immer den gewünschten Effekt

      Ich beantworte keine Fragen zu Themen via PN

      UncleSamU 1 Antwort Letzte Antwort
      0
      • PeoplesP Peoples

        @UncleSam

        Aktuel mache ich das so:

        async function getVisContent() {
                        return new Promise(function (resolve, reject) {
                            const mObj = new Object();
                                  mObj.command = 'send';
                                  mObj.message = 'getVisData';
        
                           sendTo('viewswitch.0', 'send', mObj, (visData) => {
                                if(visData.error) {
                                    reject('Error: ' + visData.error);
                                } else {
                                    resolve(visData);
                                }
                            });
                        });
                    }
        
        
        async function genProjectSelect() {
                        try{
                            let id;
                            let $sel = $('#visProject');
                            let result = '';
                            const visData = await getVisContent();
                            const visDataProjects = visData.projectList;
                            let arr = [];
                            if(visData.projectList ==''){
                                arr.push['main'];
                            } else {
                               arr = visData.projectList;
                            }
                            if(!settings['visProject'] || settings['visProject'] == ''){
                                $sel.html('<option value="allProjects">' + _('Select first') + '</option>');
                            } else {
                                $sel.html();
                                id = settings['visProject'];
                            }
                            arr.sort();
                            arr.forEach(function(val) {
                                     //$('#counties').append('<option value="' + val[0] + '"' + (id === val[0] ? ' selected' : '') + '>' + val[1] + '</option>');
                                $('#visProject').append('<option value="' + val + '"' + (id === val ? ' selected' : '') + '>'+val+' </option>');
                            });
                            $sel.select();
                            
                        }catch(e) {
                            console.log(e); // 30
                        }
                        
                    } 
        
                    genProjectSelect();
        
        
        
        

        aber das bringt eben leider nicht immer den gewünschten Effekt

        UncleSamU Offline
        UncleSamU Offline
        UncleSam
        Developer
        schrieb am zuletzt editiert von
        #4

        @Peoples Ich sehe gerade auch nicht, was hier schief gehen könnte. Wie verhält es sich denn, wenn's nicht geht?

        Bitte bei Problemen mit meinen Adaptern, Issue auf GitHub erfassen: Loxone | I2C | Luxtronik2
        ♡-lichen Dank an meine Sponsoren

        PeoplesP 1 Antwort Letzte Antwort
        0
        • UncleSamU UncleSam

          @Peoples Ich sehe gerade auch nicht, was hier schief gehen könnte. Wie verhält es sich denn, wenn's nicht geht?

          PeoplesP Offline
          PeoplesP Offline
          Peoples
          schrieb am zuletzt editiert von
          #5

          @UncleSam
          Das erstellte Dropdown ist ohne Inhalt. Verlasse ich die Admin Oberfläche und öffne Sie wieder ist der Inhalt da.

          Ich habe auch schon mal ein "PopUp" das bestätigt werden muss eingebaut dann geht es auch.

          Ich beantworte keine Fragen zu Themen via PN

          simatecS 1 Antwort Letzte Antwort
          0
          • PeoplesP Peoples

            @UncleSam
            Das erstellte Dropdown ist ohne Inhalt. Verlasse ich die Admin Oberfläche und öffne Sie wieder ist der Inhalt da.

            Ich habe auch schon mal ein "PopUp" das bestätigt werden muss eingebaut dann geht es auch.

            simatecS Offline
            simatecS Offline
            simatec
            Developer Most Active
            schrieb am zuletzt editiert von
            #6

            @Peoples
            Ich hatte in dem Adapter schoolfree das gleich Problem und habe es aus diesem Grund mit fetch in der index gelöst.

            sendTo ist beim ersten Adapterstart halt nicht so gut. Oder du baust in der index ein timeout ein, falls die Daten noch nicht vorhanden sind.

            Falls die Daten bereits vorhanden sind, kannst du ja den timeout umgehen.

            Als Wartezeit bei dem Timeout kannst du ja ein Info Popup einblenden

            • Besuche meine Github Seite
            • Beitrag hat geholfen oder willst du mich unterstützen
            • HowTo Restore ioBroker
            PeoplesP 1 Antwort Letzte Antwort
            0
            • simatecS simatec

              @Peoples
              Ich hatte in dem Adapter schoolfree das gleich Problem und habe es aus diesem Grund mit fetch in der index gelöst.

              sendTo ist beim ersten Adapterstart halt nicht so gut. Oder du baust in der index ein timeout ein, falls die Daten noch nicht vorhanden sind.

              Falls die Daten bereits vorhanden sind, kannst du ja den timeout umgehen.

              Als Wartezeit bei dem Timeout kannst du ja ein Info Popup einblenden

              PeoplesP Offline
              PeoplesP Offline
              Peoples
              schrieb am zuletzt editiert von
              #7

              @simatec
              Aber wie mache ich das mit dem fetch wenn ich eigentlich keine URL habe da ich ja die Daten aus der main.js - Funktion abgreifen will

              Ich beantworte keine Fragen zu Themen via PN

              simatecS 1 Antwort Letzte Antwort
              0
              • PeoplesP Peoples

                @simatec
                Aber wie mache ich das mit dem fetch wenn ich eigentlich keine URL habe da ich ja die Daten aus der main.js - Funktion abgreifen will

                simatecS Offline
                simatecS Offline
                simatec
                Developer Most Active
                schrieb am zuletzt editiert von
                #8

                @Peoples
                Ich löse das alles in der index.
                Aus der main hole ich nix ab.

                Meine Daten stehen alle in einer json, die ich mir mit fetch auslese.

                Ich konnte leider auch keine bessere Lösung finden, aber so funktioniert das einlesen beim schoolfree Adapter recht ordentlich

                • Besuche meine Github Seite
                • Beitrag hat geholfen oder willst du mich unterstützen
                • HowTo Restore ioBroker
                1 Antwort Letzte Antwort
                0
                • PeoplesP Peoples

                  Hallo miteinander,

                  ich bräuchte Unterstützung bei dem "Umschreiben" einer Funktion in eine Async Funktion.

                  Ich verwende in meiner AdminOberfläche die sendTo-Funktion um Daten aus meiner main.js bei Adapterstart abzufragen, doch leider wird beim erstmaligen Adapterstart nach der Installation das Ergebnis zu spät zurückgemeldet und das Dropdown-Feld im Admin ist schon erstellt (ohne Inhalt).

                  Da ich nun wie schon öfter beschrieben leider nicht der Javascript - Profi bin bräuchte ich Hilfe beim Umschreiben folgender schon in der main.js vorhandenen Funktion:

                  message: (obj) => {
                               if (typeof obj === 'object' && obj.message) {
                                   if (obj.command === 'send') {
                                       // e.g. send email or pushover or whatever
                                       adapter.log.info('send command');
                                       
                                       const visData = new Object();
                                       visData.projectList = readProjects();
                                       visData.viewList = readViews(adapter.config.visProject);
                                       
                                       // Send response in callback if required
                                       if (obj.callback) adapter.sendTo(obj.from, obj.command, visData, obj.callback);
                                   }
                               }
                           }
                  

                  Ich habe das Ganze auch schon einige Male versucht, habe aber jedesmal irgendwo im Syntax einen Fehler. Es wäre toll wenn sich einer der Profis hier mal 10 Sekunden ;-) Zeit nehmen könnte um mir hier zu Helfen.

                  OliverIOO Offline
                  OliverIOO Offline
                  OliverIO
                  schrieb am zuletzt editiert von OliverIO
                  #9

                  @Peoples
                  https://github.com/oweitman/ioBroker.mytime/blob/080b20cc33e1a21eb726b199cf3f07feff75590a/admin/index_m.html#L206

                  Hier kannst du schauen wie das Zusammenspiel zwischen Admin Oberfläche und Adapter mittels sendto funktioniert.
                  Allerdings verwende ich kein promise sondern einen stinknormalen callback.

                  Beim link musst du ein wenig aufpassen, da dieser auf eine ältere Version des repos verweist. Mittlerweile habe ich den Adapter auf react überarbeitet und es etwas anders gelöst.

                  Da du keinen Einfluss auf die Zeit zur Rückmeldung der Daten hast, wirst du im html dein Dropdown erst einmal leer definieren und dann wenn die Daten ankommen dieses html Element dynamisch befüllen. Dabei hilft die jquery, welches von Iobroker automatisch schon geladen wird.
                  https://stackoverflow.com/questions/815103/jquery-best-practice-to-populate-drop-down

                  Meine Adapter und Widgets
                  TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                  Links im Profil

                  PeoplesP 1 Antwort Letzte Antwort
                  0
                  • PeoplesP Peoples

                    Hallo miteinander,

                    ich bräuchte Unterstützung bei dem "Umschreiben" einer Funktion in eine Async Funktion.

                    Ich verwende in meiner AdminOberfläche die sendTo-Funktion um Daten aus meiner main.js bei Adapterstart abzufragen, doch leider wird beim erstmaligen Adapterstart nach der Installation das Ergebnis zu spät zurückgemeldet und das Dropdown-Feld im Admin ist schon erstellt (ohne Inhalt).

                    Da ich nun wie schon öfter beschrieben leider nicht der Javascript - Profi bin bräuchte ich Hilfe beim Umschreiben folgender schon in der main.js vorhandenen Funktion:

                    message: (obj) => {
                                 if (typeof obj === 'object' && obj.message) {
                                     if (obj.command === 'send') {
                                         // e.g. send email or pushover or whatever
                                         adapter.log.info('send command');
                                         
                                         const visData = new Object();
                                         visData.projectList = readProjects();
                                         visData.viewList = readViews(adapter.config.visProject);
                                         
                                         // Send response in callback if required
                                         if (obj.callback) adapter.sendTo(obj.from, obj.command, visData, obj.callback);
                                     }
                                 }
                             }
                    

                    Ich habe das Ganze auch schon einige Male versucht, habe aber jedesmal irgendwo im Syntax einen Fehler. Es wäre toll wenn sich einer der Profis hier mal 10 Sekunden ;-) Zeit nehmen könnte um mir hier zu Helfen.

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

                    @Peoples sagte in Wiedermal das leidige Thema mit Async:

                    erstmaligen Adapterstart nach der Installation das Ergebnis zu spät zurückgemeldet und das Dropdown-Feld im Admin ist schon erstellt

                    In Zwave2 mache ich das so, dass ich den State system.adapter.zwave2.0.alive abfrage und subscribe und erst wenn dieser true ist, die Abfragen mache, die von der Instanz beantwortet werden müssen.

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

                    1 Antwort Letzte Antwort
                    1
                    • OliverIOO OliverIO

                      @Peoples
                      https://github.com/oweitman/ioBroker.mytime/blob/080b20cc33e1a21eb726b199cf3f07feff75590a/admin/index_m.html#L206

                      Hier kannst du schauen wie das Zusammenspiel zwischen Admin Oberfläche und Adapter mittels sendto funktioniert.
                      Allerdings verwende ich kein promise sondern einen stinknormalen callback.

                      Beim link musst du ein wenig aufpassen, da dieser auf eine ältere Version des repos verweist. Mittlerweile habe ich den Adapter auf react überarbeitet und es etwas anders gelöst.

                      Da du keinen Einfluss auf die Zeit zur Rückmeldung der Daten hast, wirst du im html dein Dropdown erst einmal leer definieren und dann wenn die Daten ankommen dieses html Element dynamisch befüllen. Dabei hilft die jquery, welches von Iobroker automatisch schon geladen wird.
                      https://stackoverflow.com/questions/815103/jquery-best-practice-to-populate-drop-down

                      PeoplesP Offline
                      PeoplesP Offline
                      Peoples
                      schrieb am zuletzt editiert von
                      #11

                      @OliverIO
                      Bei dir klingt das immer so einfach aber aus meiner Sicht ist es, als würde ein Professor mit einem Grundschüler reden :-)

                      Ich beantworte keine Fragen zu Themen via PN

                      OliverIOO 2 Antworten Letzte Antwort
                      0
                      • PeoplesP Peoples

                        @OliverIO
                        Bei dir klingt das immer so einfach aber aus meiner Sicht ist es, als würde ein Professor mit einem Grundschüler reden :-)

                        OliverIOO Offline
                        OliverIOO Offline
                        OliverIO
                        schrieb am zuletzt editiert von OliverIO
                        #12

                        @Peoples

                        Oh, ich hab auch viel rumprobiert
                        Schau dir die codestellen an und wenn du fragen hast frag.
                        Manchmal muss man sich durch beißen.
                        Auch hilft es, in anderen Adaptern mal zu schauen wie da bereits etwas gelöst wurde

                        Meine Adapter und Widgets
                        TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                        Links im Profil

                        1 Antwort Letzte Antwort
                        0
                        • PeoplesP Peoples

                          @OliverIO
                          Bei dir klingt das immer so einfach aber aus meiner Sicht ist es, als würde ein Professor mit einem Grundschüler reden :-)

                          OliverIOO Offline
                          OliverIOO Offline
                          OliverIO
                          schrieb am zuletzt editiert von OliverIO
                          #13

                          @Peoples

                          so ich hab mir deinen code nochmal angeschaut und folgendes gefunden:

                          admin/client:
                          1)

                          async function getVisContent() {
                          

                          das async kann da weg, gemäß mdn dokumentation ist async nur in einer funktion notwendig, in der mit await aufgerufen wird.
                          2)

                          sendTo('viewswitch.0', 'send', mObj, (visData) => {
                          

                          scheint korrekt zu sein.
                          wenn du hier im Forum fragen stellst, sind diese Fehlermeldungen wichtig. bitte nicht einfach schreiben "irgendwo im Syntax einen Fehler".
                          Bitte konkret benennen mit Zeile und exakte Fehlermeldung, wie sie in der debugger console ausgegeben wird.
                          Der sendTo-Aufruf im client sieht bei mir wie folgt aus. Ich verwende hierden socketefehldirekt.:

                          function getCountdownInfo(callback) {
                                                  this.socket.emit('sendTo', [adapter,instance].join('.'), 'getCountdownInfo', {},function (data) {
                                                      callback(data);
                                                  });        
                                              }
                          

                          Server

                          hier sieht es für mich erst einmal ok aus.

                          Meine Adapter und Widgets
                          TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                          Links im Profil

                          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

                          697

                          Online

                          32.4k

                          Benutzer

                          81.4k

                          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