Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [gelöst] setTimeout falsch aufgelöst?

    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

    [gelöst] setTimeout falsch aufgelöst?

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

      @bjoernb

      und wie lautet die Fehlermeldung?
      Bei mir wird das genau so angezeigt? Auch NodeJS.timeout
      Was funktioniert nicht mehr so wie früher?
      Der Scriptadapter fängt setTimeout eigentlich nur ab um zur Sicherheit das timeout-handle zu speichern, damit wenn du das Skript stoppst, aber selbst den timer nicht stoppst, macht das der skriptadapter für dich. sonst würden die timer immer weiterlaufen.

      bjoernb 1 Reply Last reply Reply Quote 0
      • bjoernb
        bjoernb @OliverIO last edited by

        @oliverio

        TypeScript compilation failed: this.timeoutId = setTimeout(dispenseWithDelay, this.delay); ^ ERROR: Type 'Timeout' is not assignable to type 'number'.

        OliverIO 1 Reply Last reply Reply Quote 0
        • OliverIO
          OliverIO @bjoernb last edited by OliverIO

          @bjoernb

          aber das ist ja wieder eine andere Funktionssignatur für setTimeout.
          Bist du sicher, das du nicht irgendwo selbst setTimeout nochmal überschrieben hast?

          bjoernb 1 Reply Last reply Reply Quote 0
          • bjoernb
            bjoernb @OliverIO last edited by

            @oliverio es wird in allen anderen Scripts noch 2 mal aufgerufen, aber nicht überschrieben. Bei den anderen beiden Aufrufen kommt es auf den Returnvalue nicht an, drum ist es dort einfach nur var.

            der ganze Block mit dem Fehler sieht so aus:

            // Define a recursive function to execute the 'dispense' method with a delay
            const dispenseWithDelay = () => {
                console.log('Food dispensed.');
            
                // trigger the actual Futterautomat
                setState('broadlink2.0.BroadlinkRM-Pro.L.Futterautomat Einmal', true);
            
                this.iterations++;
            
                // Increase the delay after every 5 iterations
                if (this.iterations % 5 === 0) {
                    this.delay += 60000; // increase the delay by 1 minute
                    // If the delay has reached 15 minutes, set it to 15 minutes
                    if (this.delay > 900000) {
                        this.delay = 900000;
                    }
                }
            
                // Use the setTimeout function to call the 'dispenseWithDelay' function again after the specified delay
                this.timeoutId = setTimeout(dispenseWithDelay, this.delay);
            };
            
            OliverIO 1 Reply Last reply Reply Quote 0
            • OliverIO
              OliverIO @bjoernb last edited by OliverIO

              @bjoernb
              ich habe mal versucht das nachzuvollziehen.
              Leider ist es ja nicht der komplette code.
              wenn du da auf this.delay und this.iterations dich beziehst, müsste
              es dann bei setTimeout nicht auch this.dispenseWithDelay heißen?

              noch eine Anmekrung zu der meldung mit dem auflösen.
              Das wird deswegen nur so angezeigt, weil sich niemand die Mühe gemacht hat, nochmal für den script-adapter eine eigene typedefinition für settimeout anzufertigen.
              aber ist eigentlich auch irrelevant, da es an der eigentlichen ur-funktion ja nix verändert.

              bjoernb 1 Reply Last reply Reply Quote 0
              • bjoernb
                bjoernb @OliverIO last edited by

                @oliverio ok, sorry für den Geiz, hier das ganze File, vielleicht ist es damit verständlicher:

                class Feeder {
                
                    private delay: number = 60000;
                    private iterations: number = 0;
                    private timeoutId: number = 0;
                
                    constructor() {
                        on('mqtt.0.dog.feeder', this.dispense.bind(this))
                    }
                
                    dispense(data: iobJS.ChangedStateObject<any, any>): void {
                        if (data.state.val === false) {
                            if (this.timeoutId != 0) {
                                clearTimeout(this.timeoutId);
                                this.timeoutId = 0;
                            }
                
                            this.delay = 60000;
                            this.iterations = 0;
                        }
                        else if (data.state.val === true) {
                            const dispenseWithDelay = () => {
                                console.log('Food dispensed.');
                
                                // trigger the actual Futterautomat
                                setState('broadlink2.0.BroadlinkRM-Pro.L.Futterautomat Einmal', true);
                
                                this.iterations++;
                
                                // Increase the delay after every 5 iterations
                                if (this.iterations % 5 === 0) {
                                    this.delay += 60000; // increase the delay by 1 minute
                                    // If the delay has reached 15 minutes, set it to 15 minutes
                                    if (this.delay > 900000) {
                                        this.delay = 900000;
                                    }
                                }
                
                                // Use the setTimeout function to call the 'dispenseWithDelay' function again after the specified delay
                                this.timeoutId = setTimeout(dispenseWithDelay, this.delay);
                            };
                
                            // Start the loop by calling the 'dispenseWithDelay' function
                            dispenseWithDelay();
                        }
                    }
                }
                
                const feeder = new Feeder();
                
                1 Reply Last reply Reply Quote 0
                • bjoernb
                  bjoernb last edited by

                  Wahrscheinlich habe ich geträumt. Selbst in der Doku vom js-controller steht die Methode würde Timeout als type zurückliefern. Keine Ahnung, wie das mal funktioniert hat...

                  OliverIO 1 Reply Last reply Reply Quote 0
                  • OliverIO
                    OliverIO @bjoernb last edited by OliverIO

                    @bjoernb

                    ich habe es mal anhand des folgenden skripts probiert.
                    allerdings musste ich auf javascript umschreiben, da ich mit ts ein wenig schwierigkeiten hatte.
                    die Zeiten habe ich ebenfalls stark verkürzt und ein paar Log-Zeilen hinzugefügt.

                    ja, korrekt, der syntax-checker zeigt weiterhin in Zeile 50 einen Fehler an.
                    Allerdings gibt es keinen Fehler bei der Abarbeitung.
                    Der syntax checker ist auch unabhängig davon was nachher die Ausführung macht.
                    Daher kommen Situationen vor, bei der er einen fehler anzeigt, das Skript aber dennoch läuft.
                    Diesen "Fehler" würde ich mal ignorieren.
                    Die Start-Methode habe ich so gestaltet, das sie in gleicher Weise wie on die Methode dispense aufruft.

                    class Feeder {
                     
                      delay = 6000;
                      iterations = 0;
                      timeoutId = 0;
                    
                      constructor() {
                          //on('mqtt.0.dog.feeder', this.dispense.bind(this))
                      }
                      start() {
                        setTimeout(this.dispense.bind(this),100);
                      }
                    
                      dispense(data) {
                        data={
                          state: {
                            val:true
                          }
                        }
                          if (data.state.val === false) {
                              if (this.timeoutId != 0) {
                                  clearTimeout(this.timeoutId);
                                  this.timeoutId = 0;
                              }
                    
                              this.delay = 6000;
                              this.iterations = 0;
                          }
                          else if (data.state.val === true) {
                              const dispenseWithDelay = () => {
                                  console.log('Food dispensed.');
                    
                                  // trigger the actual Futterautomat
                                  //setState('broadlink2.0.BroadlinkRM-Pro.L.Futterautomat Einmal', true);
                    
                                  this.iterations++;
                                  console.log('Iterations.'+this.iterations);
                    
                                  // Increase the delay after every 5 iterations
                                  if (this.iterations % 5 === 0) {
                                    console.log('Iterations mod 5');
                                    this.delay += 6000; // increase the delay by 1 minute
                                      // If the delay has reached 15 minutes, set it to 15 minutes
                                      if (this.delay > 9000) {
                                          this.delay = 9000;
                                      }
                                  }
                    
                                  // Use the setTimeout function to call the 'dispenseWithDelay' function again after the specified delay
                                  this.timeoutId = setTimeout(dispenseWithDelay, this.delay);
                              };
                    
                              // Start the loop by calling the 'dispenseWithDelay' function
                              dispenseWithDelay();
                          }
                      }
                    }
                    
                    let feeder = new Feeder();
                    feeder.start();
                    
                    
                    

                    Anmerkung als Ex-Hundebesitzer:
                    Du willst dem Hund alle 15 Minuten was in den Napf geben?
                    Da lauert er doch nur noch am Napf.

                    bjoernb 1 Reply Last reply Reply Quote 1
                    • bjoernb
                      bjoernb @OliverIO last edited by

                      @oliverio Aber wenn du es auf Javascript umbaust, dann gibt es ja eben nur noch den syntax checker, aber keinen compile check mehr. Der Typescript compile verhindert ja dann mit dem compile, dass das Script überhaupt gestartet wird.

                      Ich habe es jetzt umgebaut auf Timeout. Ich bin nicht sicher, woher ich die Information hatte, dass es eine number zurückliefern sollte, muss das geträumt haben.

                      Bzgl. der 15 Minuten, ja, das ist im Moment schon so Absicht, weil der Hund sich manchmal mit allein bleiben schwer tut und mit dem Futterautomat klappt es gut und da möchte ich jetzt gerne die Zeiten ausdehnen. 15 Minuten ist jetzt mal das Maximum, mal schauen, was er davon hält...

                      H 1 Reply Last reply Reply Quote 1
                      • H
                        homecineplexx @bjoernb last edited by

                        @bjoernb was ist das für ein Futterautomat, den man so verwenden kann?

                        bjoernb 1 Reply Last reply Reply Quote 0
                        • OliverIO
                          OliverIO last edited by

                          @bjoernb
                          setTimeout liefert ja auch ein number zurück.
                          Wahrscheinlich hat man das aber als Typ Timer dann definiert um das von einer reinen number zu differenzieren . Evtl. musst du die variable dann mit dem selben Typ deklarieren

                          Du weißt was compile bei typescript genau bedeutet?
                          Es ist der Prozess bei dem der typescript Text in JavaScript konvertiert und die entsprechenden sourcemaps erzeugt werden.
                          Typescript wird nicht nativ ausgeführt immer nur JavaScript

                          bjoernb 1 Reply Last reply Reply Quote 0
                          • bjoernb
                            bjoernb @homecineplexx last edited by

                            @homecineplexx @homecineplexx Sorry, hab die Notification nicht bekommen, dass noch eine Antwort kam. Das ist ein Treat & Train (https://intl.petsafe.net/de-ch/support/treat-train-remote-reward-dog-trainer). Hat eine Fernbedienung auf 433 MHz und das konnte ich mit einem Broadlink RM Pro auslesen und so besser automatisieren.

                            H 1 Reply Last reply Reply Quote 0
                            • bjoernb
                              bjoernb @OliverIO last edited by

                              @oliverio ja, das er nur transpiliert ist mir klar, aber trotzdem verhindert der Check im Editor, dass das Script gestartet wird.

                              1 Reply Last reply Reply Quote 0
                              • H
                                homecineplexx @bjoernb last edited by

                                @bjoernb das klingt ja voll super...muss ich mal mit meiner frau besprechen bezüglich unseres Wufzis...danke

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

                                Support us

                                ioBroker
                                Community Adapters
                                Donate

                                391
                                Online

                                31.8k
                                Users

                                80.0k
                                Topics

                                1.3m
                                Posts

                                3
                                15
                                594
                                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