Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Asynchrone Funktionen innerhalb eine Subscribtion aufrufen

    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

    Asynchrone Funktionen innerhalb eine Subscribtion aufrufen

    This topic has been deleted. Only users with topic management privileges can see it.
    • Ben1983
      Ben1983 @ticaki last edited by

      @ticaki Also bei mir kommt da nur der log:

      Start
      Ende
      

      raus. den result logt er gar nicht.
      Als wäre er nicht da.

      T 1 Reply Last reply Reply Quote 0
      • T
        ticaki Developer @Ben1983 last edited by ticaki

        @ben1983

        Hast du meinen Code genommen und diesen ausprobiert oder ist das mit deinem Code gewesen?

        10:17:59.554	info	javascript.0 (9472) Start javascript script.js.Test.Skript_122
        10:17:59.557	info	javascript.0 (9472) script.js.Test.Skript_122: Start
        10:17:59.557	info	javascript.0 (9472) script.js.Test.Skript_122: registered 0 subscriptions, 0 schedules, 1 message, 0 logs and 0 file subscriptions
        10:17:59.561	info	javascript.0 (9472) script.js.Test.Skript_122: Fri Nov 10 2023 10:15:10 GMT+0100 (Mitteleuropäische Normalzeit)
        10:17:59.562	info	javascript.0 (9472) script.js.Test.Skript_122: true
        10:17:59.562	info	javascript.0 (9472) script.js.Test.Skript_122: Ende
        

        EDIT: Ich vermute da das Problem eher in dem

        $(`state(${enumtypeFunctions}=${enumBewegungsmelder})(${enumtypeRooms}=${enumTreppenhaus})$`).on
        

        EDIT2: wofür ist das $ am Ende - kenne ich so nicht.

        $('state(functions=sensor)(functions=window)')
        
        Ben1983 1 Reply Last reply Reply Quote 0
        • Ben1983
          Ben1983 @ticaki last edited by Ben1983

          @ticaki ALso ich denke es liegt irgendwie hier:

          const automatikfreigabe = {
              beleuchtung: {
                  aktiv: getState(idAutomatikfreigabeBeleuchtungAktiv).val,
                  bypass: getState(idAutomatikfreigabeBeleuchtungBypass).val,
                  zustand: getState(idAutomatikfreigabeBeleuchtungZustand).val,
                  kinderSindDa : getState(idAutomatikfreigabeBeleuchtungKidnerSindDa).val,
                  zeitAbendsWennKinderDa: getState(idAutomatikfreigabeBeleuchtungZeitAbendsWennKinderDaSind).val,
                  checkRelease: async function(kinderSindDa){
                      // Es muss die Automatikfreigabe aktiv sein
                      return this.aktiv &&
                      // Entweder der Bypass ist gesetzt
                              (this.bypass ||
                      // Oder der Zustand wurde schon gesetzt
                              (this.zustand &&
                              (!kinderSindDa || (await messageToAsync("TimeAfterOrEqualNow",{time:"21:30"},{timeout:5000})).result)));           
                  },
                  functionstest: async function(){
                      return (await messageToAsync("TimeAfterOrEqualNow",{time:"21:30"},{timeout:5000})).result;
                  }
          

          denn ein einfacher Test

          async function test(){
              log("start")
              if(await automatikfreigabe.beleuchtung.checkRelease(true)){
                  log("Mitte")
              }
              log("Ende");
          };
          
          test();
          

          funktioniert nicht, jedoch mit der Testfunktion schon

          async function test(){
              log("start")
              if(await automatikfreigabe.beleuchtung.testfunktion()){
                  log("Mitte")
              }
              log("Ende");
          };
          
          test();
          

          Selbst mit der Änderung

          checkRelease: async function(kinderSindDa){
                      //Zeit in Bereich zuweisen
                      const timeOK = await messageToAsync("TimeAfterOrEqualNow",{time:this.zeitAbendsWennKinderDa},{timeout:5000});
                      // Es muss die Automatikfreigabe aktiv sein
                      return this.aktiv &&
                      // Entweder der Bypass ist gesetzt
                              (this.bypass ||
                      // Oder der Zustand wurde schon gesetzt
                              (this.zustand &&
                              (!kinderSindDa || timeOK.result)));          
                  }
          

          gehts bei mir nicht


          Ich muss erst mal weg.... versuche später nochmal ein einfaches beispiel zu generieren, wie es geht und wie nicht.
          Habe irhendwie das Gefühl, sobald Abfrage im Script sind, gehts nicht.

          denn ein

                  checkRelease: async function(kinderSindDa){
                      return (await messageToAsync("TimeAfterOrEqualNow",{time:this.zeitAbendsWennKinderDa},{timeout:5000})).result;  
                  }
          

          funktioniert

          T 2 Replies Last reply Reply Quote 0
          • T
            ticaki Developer @Ben1983 last edited by ticaki

            @ben1983

            Dein Code haut mir regelmässig die Javascript Instanz kaputt. Mache mal in Zukunft um jeden await einen try{}catch(e){log(e.message)}. Eine Error Promise sollte zwar nur die Instanz abstürzen lassen, jedoch hauts bei mir mehr kaputtt. Wieso auch immer.

            Edit: Backup eingespielt geht wieder alles.

            1 Reply Last reply Reply Quote 0
            • T
              ticaki Developer @Ben1983 last edited by

              @ben1983

              Du mußt in jeder asynchronen Funktion die ein await benutzt ein try{}catch(){} drum rum machen. Auch wenn die Auswirkungen bei mir jetzt ungewöhnlich sind, werden Error in asynchronen Funktionen nicht abgefangen und werden immer den Javascript-Adapter anhalten.

              Wenn der timeout z.B. abläuft kommt ein Error und den mußt du behandeln.

              Ben1983 1 Reply Last reply Reply Quote 0
              • Ben1983
                Ben1983 @ticaki last edited by

                @ticaki ok. Verstehe trotzdem nicht, warum es nicht geht.

                T 1 Reply Last reply Reply Quote 0
                • T
                  ticaki Developer @Ben1983 last edited by ticaki

                  @ben1983
                  Mach deine Bespiele bitte einfacher 🙂

                  const test = {
                      status: 'das geht',
                      neee: () => this.status
                  }
                  log(test.neee())
                  
                  class test2  {
                      status = 'das geht'
                      neee = () => this.status
                  
                      constructor() {};
                  }
                  const testc = new test2();
                  log(testc.neee())
                  

                  Ich bin mit scope jetzt nicht so firm, aber ein Json hat doch kein this oder? EDIT: ok this hat es das scheint aber nur bei Konstanten zu funktionieren.

                  13:28:20.430	info	javascript.0 (651) Start javascript script.js.Test.Skript_122
                  13:28:20.433	info	javascript.0 (651) script.js.Test.Skript_122: undefined
                  13:28:20.433	info	javascript.0 (651) script.js.Test.Skript_122: das geht
                  
                  Ben1983 1 Reply Last reply Reply Quote 0
                  • Ben1983
                    Ben1983 @ticaki last edited by

                    Ich scheine es gefunden zu haben.
                    Es war wieder mal, dass ich true oder false zurückgegeben habe, kein Objekt. 😞

                    so geht es (Haben ein Objekt mit result zurückgegeben)

                    const automatikfreigabe = {
                        beleuchtung: {
                            aktiv: false,
                            bypass: false,
                            checkRelease: async function(kinderSindDa){
                                try{
                                    //Zeit in Bereich zuweisen
                                    const timeOK = await messageToAsync("TimeAfterOrEqualNow",{time:this.zeitAbendsWennKinderDa},{timeout:5000});
                                    return {result:(this.aktiv &&
                                    // Entweder der Bypass ist gesetzt
                                            (this.bypass ||
                                    // Oder der Zustand wurde schon gesetzt
                                            (this.zustand &&
                                            (!kinderSindDa || timeOK.result))))};  
                                }
                                catch(error){
                                    log(error);
                                }
                            },
                        }
                    }
                    
                    async function test(){
                        log("start")
                        try{
                            if(await automatikfreigabe.beleuchtung.checkRelease(true)){
                                log("Mitte")
                            }
                        }
                        catch(error){
                            log(error);
                        }
                        log("Ende");
                    };
                    
                    test();
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    T 1 Reply Last reply Reply Quote 0
                    • T
                      ticaki Developer @Ben1983 last edited by ticaki

                      @ben1983
                      Ich vermute viel eher das das ergebnis vorher undefinied war und damit false, jetzt ist es ein Object und damit true.

                      Ben1983 1 Reply Last reply Reply Quote 0
                      • Ben1983
                        Ben1983 @ticaki last edited by

                        @ticaki ok. Verstehe trotzdem nicht, warum es nicht geht.
                        Nein, denn ein direkter log der Ergebnisses nach dem Aufruf führte zu nichts.
                        Naja jetzt geht es jedefalls

                        T 1 Reply Last reply Reply Quote 0
                        • T
                          ticaki Developer @Ben1983 last edited by

                          @ben1983
                          Naja wenns geht gut, ich hätte es mit Klassen für Funktionen und Json für Konstanten gelöst 🙂

                          Ben1983 1 Reply Last reply Reply Quote 0
                          • Ben1983
                            Ben1983 @ticaki last edited by

                            @ticaki ???? Wie meinst Du das?

                            T 1 Reply Last reply Reply Quote 0
                            • T
                              ticaki Developer @Ben1983 last edited by ticaki

                              @ben1983
                              Ist schlecht ein Beispiel zu erstellen, da der Vorteil ja erst bei Gemeinsamkeiten zum Tragen kommt aber sowas z.B.:

                              // Prüfen,ob die angegebenen Zeit vor oder gleich der aktuellen ist
                              onMessage("TimeBeforeOrEqualNow",(messagedata,callback) => {
                                  const now=new Date();
                                  const inputTime=new Date(`${now.getFullYear()}-${now.getMonth()+1}-${now.getDate()}-${messagedata.time}`);
                                  if (inputTime) {
                                      callback({ result: inputTime<=now });
                                  }
                                  else {
                                      callback({ result: false });
                                  }
                              });
                              
                              const automatikfreigabe={
                                  beleuchtung: {
                                      aktiv: idAutomatikfreigabeBeleuchtungAktiv,
                                      bypass: idAutomatikfreigabeBeleuchtungBypass,
                                      zustand: idAutomatikfreigabeBeleuchtungZustand,
                                      kinderSindDa: idAutomatikfreigabeBeleuchtungKidnerSindDa,
                                      zeitAbendsWennKinderDa: gidAutomatikfreigabeBeleuchtungZeitAbendsWennKinderDaSind,
                              
                                  },
                              }
                              
                              var beleuchtung=null;
                              class Beleuchtung {
                                  options={};
                                  dpOptions = {};
                                  // kein async für constructor möglich
                                  constructor(options) {
                                      for (const a in options) {
                                          if (options[a]) this.dpOptions[a]=options[a];
                                      }
                                  }
                                  async updateDp() {
                                      for (const a in this.dpOptions[a]) {
                                          this.options[a]=getState(this.dpOptions[a]).val;
                                      }
                                  }
                                  async checkRelease(kinderSindDa) {
                                      // Es muss die Automatikfreigabe aktiv sein
                                      try {
                                          const result=this.options.aktiv&&
                                              // Entweder der Bypass ist gesetzt
                                              (this.options.bypass||
                                                  // Oder der Zustand wurde schon gesetzt
                                                  (this.options.zustand&&
                                                      (!kinderSindDa||(await messageToAsync("TimeAfterOrEqualNow",{ time: "21:30" },{ timeout: 5000 })).result)));
                                      } catch (e) {
                                          log(e)
                                          result={};
                                      }
                                      return result;
                                  }
                              }
                              
                              async function main() {
                                  beleuchtung=new Beleuchtung(automatikfreigabe.beleuchtung);
                                  await beleuchtung.updateDp()
                                  log(JSON.stringify(await beleuchtung.checkRelease(true)));
                              }
                              

                              habs auch nicht getestet, ist mehr ein "Muster"

                              Ben1983 1 Reply Last reply Reply Quote 0
                              • Ben1983
                                Ben1983 @ticaki last edited by

                                @ticaki ok.
                                Erkenne jetzt nicht grad ein Vorteil, aber ok

                                T 1 Reply Last reply Reply Quote 0
                                • T
                                  ticaki Developer @Ben1983 last edited by ticaki

                                  @ben1983
                                  Glaube nicht das json oder klassen pauschal einen Vorteil haben. Hängt von den Umständen ab und persönlichen Vorlieben.

                                  Ben1983 1 Reply Last reply Reply Quote 0
                                  • Ben1983
                                    Ben1983 @ticaki last edited by

                                    @ticaki ok. Aber ist das Objekt bei mir kein JSON? Ist doch das gleiche, oder übersehe ich was? Ist halt nur noch die Funktion direkt drin.

                                    T 1 Reply Last reply Reply Quote 0
                                    • T
                                      ticaki Developer @Ben1983 last edited by

                                      @ben1983
                                      Du benutzt ein Json. Ich wollte damit sagen das weder deine Art, noch meine Art nicht pauschal besser sind.

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

                                      Support us

                                      ioBroker
                                      Community Adapters
                                      Donate

                                      930
                                      Online

                                      31.9k
                                      Users

                                      80.1k
                                      Topics

                                      1.3m
                                      Posts

                                      2
                                      22
                                      634
                                      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