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. Asynchrone Funktionen innerhalb eine Subscribtion aufrufen

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.2k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    944

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

Asynchrone Funktionen innerhalb eine Subscribtion aufrufen

Geplant Angeheftet Gesperrt Verschoben JavaScript
22 Beiträge 2 Kommentatoren 661 Aufrufe 1 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.
  • Ben1983B Offline
    Ben1983B Offline
    Ben1983
    schrieb am zuletzt editiert von
    #1

    Hallo, ich bin gerade dabei etwas in meinen Scripts "aufzuräumen".
    Ein Thema ist die Funktionen aus dem global Ordner raus zu bekommen.
    Dazu sonnte dann "messageTo" genutzt werden.
    Bei den Funktionen, wo ich einen Rückgabewert erwarte, wollte ich "messageToAsync" nutzen.
    Soweit so gut.

    Nun stellt sich mir die Frage, wie ich eine "messageToAsync" innerhalb eines "normalen" synchronen skripts aufrufen kann,
    denn bspw.

    
    // 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});
        }
    });
    
    async function checkTime(){
        log((await messageToAsync("TimeBeforeOrEqualNow",{time:"8:33"},{timeout:5000})).result);
    }
    log("Start");
    checkTime();
    log("Ende");
    

    Ergibt ja den log:

    18:51:32.128	info	javascript.0 (21641) script.js.Messages.Messages: Ende
    18:51:32.129	info	javascript.0 (21641) script.js.Messages.Messages: registered 1 subscription, 0 schedules, 1 message, 0 logs and 0 file subscriptions
    18:51:32.200	info	javascript.0 (21641) script.js.Messages.Messages: true
    

    Da eben die Funktion checkTime() nicht mit await aufgerufen wird.
    Da es im Top level ist, würde ein await davor funktionieren (Auch, wenn es als Fehler dargestellt wird), aber die eigentliche Frage stellt sich mir bei diesem konkreten Beispiel:

    $(`state("functions"="bewegungsmelder")("rooms"="treppenhaus"`).on((obj)=>{ 
         if(await messageToAsync("TimeBeforeOrEqualNow",{time:"8:33"},{timeout:5000})).result == = true){
        ....
    }
    ....
    

    wäre sowas denn möglich?

    T 1 Antwort Letzte Antwort
    0
    • Ben1983B Ben1983

      Hallo, ich bin gerade dabei etwas in meinen Scripts "aufzuräumen".
      Ein Thema ist die Funktionen aus dem global Ordner raus zu bekommen.
      Dazu sonnte dann "messageTo" genutzt werden.
      Bei den Funktionen, wo ich einen Rückgabewert erwarte, wollte ich "messageToAsync" nutzen.
      Soweit so gut.

      Nun stellt sich mir die Frage, wie ich eine "messageToAsync" innerhalb eines "normalen" synchronen skripts aufrufen kann,
      denn bspw.

      
      // 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});
          }
      });
      
      async function checkTime(){
          log((await messageToAsync("TimeBeforeOrEqualNow",{time:"8:33"},{timeout:5000})).result);
      }
      log("Start");
      checkTime();
      log("Ende");
      

      Ergibt ja den log:

      18:51:32.128	info	javascript.0 (21641) script.js.Messages.Messages: Ende
      18:51:32.129	info	javascript.0 (21641) script.js.Messages.Messages: registered 1 subscription, 0 schedules, 1 message, 0 logs and 0 file subscriptions
      18:51:32.200	info	javascript.0 (21641) script.js.Messages.Messages: true
      

      Da eben die Funktion checkTime() nicht mit await aufgerufen wird.
      Da es im Top level ist, würde ein await davor funktionieren (Auch, wenn es als Fehler dargestellt wird), aber die eigentliche Frage stellt sich mir bei diesem konkreten Beispiel:

      $(`state("functions"="bewegungsmelder")("rooms"="treppenhaus"`).on((obj)=>{ 
           if(await messageToAsync("TimeBeforeOrEqualNow",{time:"8:33"},{timeout:5000})).result == = true){
          ....
      }
      ....
      

      wäre sowas denn möglich?

      T Offline
      T Offline
      ticaki
      schrieb am zuletzt editiert von
      #2

      @ben1983 sagte in Asynchrone Funktionen innerhalb eine Subscribtion aufrufen:

      Du kannst das ganze Skript einfach in einem Funktion kopieren, diese async machen und dann hast du eine sychrone Version.

      async function work() {
      
      // 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});
          }
      });
       
      async function checkTime(){
          log((await messageToAsync("TimeBeforeOrEqualNow",{time:"8:33"},{timeout:5000})).result);
      }
      log("Start");
      await checkTime();
      log("Ende");
      }
      work()
      

      mit async müsste das gehen:

      $(`state("functions"="bewegungsmelder")("rooms"="treppenhaus"`).on(async (obj)=>{ 
           if(await messageToAsync("TimeBeforeOrEqualNow",{time:"8:33"},{timeout:5000})).result == = true){
          ....
      }
      ....
      

      Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

      Spenden

      Ben1983B 1 Antwort Letzte Antwort
      0
      • T ticaki

        @ben1983 sagte in Asynchrone Funktionen innerhalb eine Subscribtion aufrufen:

        Du kannst das ganze Skript einfach in einem Funktion kopieren, diese async machen und dann hast du eine sychrone Version.

        async function work() {
        
        // 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});
            }
        });
         
        async function checkTime(){
            log((await messageToAsync("TimeBeforeOrEqualNow",{time:"8:33"},{timeout:5000})).result);
        }
        log("Start");
        await checkTime();
        log("Ende");
        }
        work()
        

        mit async müsste das gehen:

        $(`state("functions"="bewegungsmelder")("rooms"="treppenhaus"`).on(async (obj)=>{ 
             if(await messageToAsync("TimeBeforeOrEqualNow",{time:"8:33"},{timeout:5000})).result == = true){
            ....
        }
        ....
        
        Ben1983B Offline
        Ben1983B Offline
        Ben1983
        schrieb am zuletzt editiert von
        #3

        @ticaki Danke... das war mir eine "unschöne Lösung.
        Aber so gehts ja auch ... total sinple

        $(`state("functions"="bewegungsmelder")("rooms"="treppenhaus"`).on( async (obj)=>{ 
             if(await messageToAsync("TimeBeforeOrEqualNow",{time:"8:33"},{timeout:5000})).result == = true){
            ....
        }
        ....
        

        einfach die on funtion async gemacht, dann gehts

        Ben1983B 1 Antwort Letzte Antwort
        0
        • Ben1983B Ben1983

          @ticaki Danke... das war mir eine "unschöne Lösung.
          Aber so gehts ja auch ... total sinple

          $(`state("functions"="bewegungsmelder")("rooms"="treppenhaus"`).on( async (obj)=>{ 
               if(await messageToAsync("TimeBeforeOrEqualNow",{time:"8:33"},{timeout:5000})).result == = true){
              ....
          }
          ....
          

          einfach die on funtion async gemacht, dann gehts

          Ben1983B Offline
          Ben1983B Offline
          Ben1983
          schrieb am zuletzt editiert von Ben1983
          #4

          @ben1983 Hallo,

          ich habe noch ein "Problem" folgender Code:

          const automatikfreigabe = {
              beleuchtung: {
                  zeitAbendsWennKindeDa: getState(idAutomatikfreigabeBeleuchtungZeitAbendsWennKindeDa).val,
                  checkRelease: async function(kinderSindDa){
                      return kinderSindDa && (await messageToAsync("TimeBeforeOrEqualNow",{time:this.zeitAbendsWennKindeDa},{timeout:5000})).result;           
                  }
              }
          }
          

          dann:

          $(`state(${enumtypeFunctions}=${enumBewegungsmelder})(${enumtypeRooms}=${enumTreppenhaus})$`).on(async (obj)=>{   
                  const result = await automatikfreigabe.beleuchtung.checkRelease(true);
                  log(JSON.stringify(result));
          

          ich bekomme schon nichts als result zurück, also es wird nichts geloggt.
          Muss ich oben in dem Teil das dann anderes handhaben mit dem return?
          Muss ich das auch alles in Promisses umbauen?

          Habe esjetzt erst mal Synchron mit einer eigenen function im skript gelöst

          T 1 Antwort Letzte Antwort
          0
          • Ben1983B Ben1983

            @ben1983 Hallo,

            ich habe noch ein "Problem" folgender Code:

            const automatikfreigabe = {
                beleuchtung: {
                    zeitAbendsWennKindeDa: getState(idAutomatikfreigabeBeleuchtungZeitAbendsWennKindeDa).val,
                    checkRelease: async function(kinderSindDa){
                        return kinderSindDa && (await messageToAsync("TimeBeforeOrEqualNow",{time:this.zeitAbendsWennKindeDa},{timeout:5000})).result;           
                    }
                }
            }
            

            dann:

            $(`state(${enumtypeFunctions}=${enumBewegungsmelder})(${enumtypeRooms}=${enumTreppenhaus})$`).on(async (obj)=>{   
                    const result = await automatikfreigabe.beleuchtung.checkRelease(true);
                    log(JSON.stringify(result));
            

            ich bekomme schon nichts als result zurück, also es wird nichts geloggt.
            Muss ich oben in dem Teil das dann anderes handhaben mit dem return?
            Muss ich das auch alles in Promisses umbauen?

            Habe esjetzt erst mal Synchron mit einer eigenen function im skript gelöst

            T Offline
            T Offline
            ticaki
            schrieb am zuletzt editiert von ticaki
            #5

            @ben1983 sagte in Asynchrone Funktionen innerhalb eine Subscribtion aufrufen:

            Hab natürlich nicht deine States, jedoch das hier geht bei mir wie erwartet:

            async function work() {
            
                const automatikfreigabe={
                    beleuchtung: {
                        zeitAbendsWennKindeDa: "10:15:10",
                        checkRelease: async function (kinderSindDa) {
                            return kinderSindDa&&(await messageToAsync("TimeBeforeOrEqualNow",{ time: this.zeitAbendsWennKindeDa },{ timeout: 5000 })).result;
                        }
                    }
                }
            
                // 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()}T${messagedata.time}`);
                    log(inputTime);
                    if (inputTime) {
                        callback({ result: inputTime<=now });
                    }
                    else {
                        callback({ result: false });
                    }
                });
            
            
                log("Start");
                const result=await automatikfreigabe.beleuchtung.checkRelease(true);
                log(JSON.stringify(result));
                log("Ende");
            }
            work()
            

            Hab in der Inputzeit ein T eingefügt.

            Die könnte man noch so anpassen:

            // messagedata.time = 10:12
            const inputTime=new Date(`${now.getFullYear()}-${now.getMonth()+1}-${now.getDate()}T${messagedata.time}:00`);
            

            Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

            Spenden

            Ben1983B 1 Antwort Letzte Antwort
            0
            • T ticaki

              @ben1983 sagte in Asynchrone Funktionen innerhalb eine Subscribtion aufrufen:

              Hab natürlich nicht deine States, jedoch das hier geht bei mir wie erwartet:

              async function work() {
              
                  const automatikfreigabe={
                      beleuchtung: {
                          zeitAbendsWennKindeDa: "10:15:10",
                          checkRelease: async function (kinderSindDa) {
                              return kinderSindDa&&(await messageToAsync("TimeBeforeOrEqualNow",{ time: this.zeitAbendsWennKindeDa },{ timeout: 5000 })).result;
                          }
                      }
                  }
              
                  // 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()}T${messagedata.time}`);
                      log(inputTime);
                      if (inputTime) {
                          callback({ result: inputTime<=now });
                      }
                      else {
                          callback({ result: false });
                      }
                  });
              
              
                  log("Start");
                  const result=await automatikfreigabe.beleuchtung.checkRelease(true);
                  log(JSON.stringify(result));
                  log("Ende");
              }
              work()
              

              Hab in der Inputzeit ein T eingefügt.

              Die könnte man noch so anpassen:

              // messagedata.time = 10:12
              const inputTime=new Date(`${now.getFullYear()}-${now.getMonth()+1}-${now.getDate()}T${messagedata.time}:00`);
              
              Ben1983B Offline
              Ben1983B Offline
              Ben1983
              schrieb am zuletzt editiert von
              #6

              @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 Antwort Letzte Antwort
              0
              • Ben1983B Ben1983

                @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 Offline
                T Offline
                ticaki
                schrieb am zuletzt editiert von ticaki
                #7

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

                Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                Spenden

                Ben1983B 1 Antwort Letzte Antwort
                0
                • T 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)')
                  
                  Ben1983B Offline
                  Ben1983B Offline
                  Ben1983
                  schrieb am zuletzt editiert von Ben1983
                  #8

                  @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 Antworten Letzte Antwort
                  0
                  • Ben1983B 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 Offline
                    T Offline
                    ticaki
                    schrieb am zuletzt editiert von ticaki
                    #9

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

                    Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                    Spenden

                    1 Antwort Letzte Antwort
                    0
                    • Ben1983B 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 Offline
                      T Offline
                      ticaki
                      schrieb am zuletzt editiert von
                      #10

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

                      Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                      Spenden

                      Ben1983B 1 Antwort Letzte Antwort
                      0
                      • T ticaki

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

                        Ben1983B Offline
                        Ben1983B Offline
                        Ben1983
                        schrieb am zuletzt editiert von
                        #11

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

                        T 1 Antwort Letzte Antwort
                        0
                        • Ben1983B Ben1983

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

                          T Offline
                          T Offline
                          ticaki
                          schrieb am zuletzt editiert von ticaki
                          #12

                          @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
                          

                          Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                          Spenden

                          Ben1983B 1 Antwort Letzte Antwort
                          0
                          • T 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
                            
                            Ben1983B Offline
                            Ben1983B Offline
                            Ben1983
                            schrieb am zuletzt editiert von
                            #13

                            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 Antwort Letzte Antwort
                            0
                            • Ben1983B Ben1983

                              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 Offline
                              T Offline
                              ticaki
                              schrieb am zuletzt editiert von ticaki
                              #14

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

                              Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                              Spenden

                              Ben1983B 1 Antwort Letzte Antwort
                              0
                              • T ticaki

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

                                Ben1983B Offline
                                Ben1983B Offline
                                Ben1983
                                schrieb am zuletzt editiert von
                                #15

                                @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 Antwort Letzte Antwort
                                0
                                • Ben1983B Ben1983

                                  @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 Offline
                                  T Offline
                                  ticaki
                                  schrieb am zuletzt editiert von
                                  #16

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

                                  Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                                  Spenden

                                  Ben1983B 1 Antwort Letzte Antwort
                                  0
                                  • T ticaki

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

                                    Ben1983B Offline
                                    Ben1983B Offline
                                    Ben1983
                                    schrieb am zuletzt editiert von
                                    #17

                                    @ticaki ???? Wie meinst Du das?

                                    T 1 Antwort Letzte Antwort
                                    0
                                    • Ben1983B Ben1983

                                      @ticaki ???? Wie meinst Du das?

                                      T Offline
                                      T Offline
                                      ticaki
                                      schrieb am zuletzt editiert von ticaki
                                      #18

                                      @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"

                                      Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                                      Spenden

                                      Ben1983B 1 Antwort Letzte Antwort
                                      0
                                      • T 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"

                                        Ben1983B Offline
                                        Ben1983B Offline
                                        Ben1983
                                        schrieb am zuletzt editiert von
                                        #19

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

                                        T 1 Antwort Letzte Antwort
                                        0
                                        • Ben1983B Ben1983

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

                                          T Offline
                                          T Offline
                                          ticaki
                                          schrieb am zuletzt editiert von ticaki
                                          #20

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

                                          Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                                          Spenden

                                          Ben1983B 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

                                          373

                                          Online

                                          32.6k

                                          Benutzer

                                          82.2k

                                          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