Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Waschmaschine settimeout funktioniert nicht

    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

    Waschmaschine settimeout funktioniert nicht

    This topic has been deleted. Only users with topic management privileges can see it.
    • H
      hydro21 last edited by

      Hallo, ich hatte gedacht ich schreibe eine ganz einfaches Javascript Programm. Ziel war es das ich eine Nachricht bekomme wenn die Waschmaschine gestartet wird und eine weitere Nachricht wenn die Waschmaschine beendet ist.

      Das wollte ich so lösen das wenn die Leitsung größer als 60 ist wird die Funktion FUWMistan ausgeführt.
      Wenn die Leistung kleiner als 45 ist wird ein Timer gestartet von 300000 msec = 5 Minuten
      Wenn der Timer abgelaufen ist soll dann die Funktion FUWMistaus ausgeführt werden.
      Da die Waschmaschine immer wieder Phasen hat in dem sie wenig Strom verbraucht dann aber wieder viel Strom verbraucht, möchte ich den Timer wieder löschen wenn die Leistung größer 45 Watt ist.

      Aber es funktiniert nicht zuverlässig, obwohl der Timer eigentlich wieder gelöscht sein sollte bekomme ich trotzdem die Meldung das die Funktion FUWMistaus ausgeführt wurde. Was mache ich hier falsch?

      Für Hilfe wäre ich dankbar.
      Gruß Ralf

      var TimeWMan, WMistan;
      
      on({ id: [].concat(['shelly.1.SHPLG2-1#083A8DF43AE5#1.Relay0.Power']), change: 'ne' }, async (obj) => {
        let value = obj.state.val;
        let oldValue = obj.oldState.val;
        
        WMistan = getState('0_userdata.0.Zustand.Waschmaschine_ist_an').val
        
        if (value > 60 && WMistan == false ) {
            FUWMistan();
        }  
      
        if (value >= 45) {   
           if (TimeWMan) {
               clearTimeout(TimeWMan); 
               TimeWMan = null;
           };
        };
       
          if (value < 45) {
              TimeWMan = setTimeout(async () =>   { //Verzögerungszeit von 5 Minute
              TimeWMan = null;
                  FUWMistaus();
              },300000);
          }
      });
      
      function FUWMistan(){
          setState('0_userdata.0.Zustand.Waschmaschine_ist_an', true);
          console.log('WM### FUWMistan Waschmaschine ist gestartet');
      }
      
      function FUWMistaus(){
          setState('0_userdata.0.Zustand.Waschmaschine_ist_an', false);
          console.log('WM### FUWMistaus Waschmaschine wurde gestoppt')
      }
      
      
      
      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @hydro21 last edited by

        @hydro21
        Ändere mal Zeilen 18 bis 20 in

          } else if (oldValue >= 45) {
        
        H 1 Reply Last reply Reply Quote 0
        • H
          hydro21 @paul53 last edited by

          @paul53

          Meinst du so?

            if (value >= 45) {   
               if (TimeWMan) {
                   clearTimeout(TimeWMan); 
                   TimeWMan = null;
               };
            
            } else if (oldValue >= 45) { 
           };
          
          paul53 1 Reply Last reply Reply Quote 0
          • paul53
            paul53 @hydro21 last edited by paul53

            @hydro21 sagte: Meinst du so?

            Ja.

              if (value >= 45) {   
                 if (TimeWMan) {
                     clearTimeout(TimeWMan); 
                     TimeWMan = null;
                 }
              } else if (oldValue >= 45) { 
                 TimeWMan = setTimeout(FUWMistaus, 300000); //Verzögerungszeit von 5 Minuten
              }
            });
            
            1 Reply Last reply Reply Quote 0
            • H
              hydro21 last edited by

              @paul53 said in Waschmaschine settimeout funktioniert nicht:
              Ich habe es jetzt einmal so implementiert. Mal sehen ob es beim nächsten mal funktioniert. Was mir nicht klar ist warum du den oldvalue nimmst und nicht den value?

              Was ist da der Hintergrund?

              if (value >= 45) {
              if (TimeWMan) {
              clearTimeout(TimeWMan);
              TimeWMan = null;
              }
              } else if (oldValue >= 45) {
              TimeWMan = setTimeout(FUWMistaus, 300000); //Verzögerungszeit von 5 Minuten
              }
              });

              paul53 1 Reply Last reply Reply Quote 0
              • paul53
                paul53 @hydro21 last edited by paul53

                @hydro21 sagte: Was ist da der Hintergrund?

                Wenn man nur value prüft, werden Timeouts bei jedem Trigger mit Wert < 45 gestartet. Sie lassen sich dann nicht mehr stoppen.
                Mit der zusätzlichen Prüfung von oldValue wird nur ein Timeout beim erstmaligen Unterschreiten von 45 gestartet.

                H 1 Reply Last reply Reply Quote 0
                • H
                  hydro21 @paul53 last edited by

                  @paul53
                  Anscheinend funktioniert das.

                  Du hast geschrieben "Sie lassen sich dann nicht mehr stoppen" Warum ist das so?

                  Könnte man stattdessen auch in der If Abfrage einbauen das nur ein Timer gestartet wird wenn der Wert unter 45 ist und noch kein Timer gestartet ist? Also die Variable TimeWMan auf nicht null überprüfen?

                  Sollte das auch funktionieren, oder kann man die Variable nicht abfragen?

                  Gruß Ralf

                  Codierknecht paul53 2 Replies Last reply Reply Quote 0
                  • Codierknecht
                    Codierknecht Developer Most Active @hydro21 last edited by

                    @hydro21 sagte in Waschmaschine settimeout funktioniert nicht:

                    Warum ist das so?

                    Weil die alle in der gleichen Variablen gespeichert werden.
                    Die enthält dann nur den letzten. Den kann man stoppen - alle anderen nicht mehr.

                    1 Reply Last reply Reply Quote 0
                    • paul53
                      paul53 @hydro21 last edited by paul53

                      @hydro21 sagte: Variable TimeWMan auf nicht null überprüfen?

                      Das kann man auch.

                        if (value >= 45) {   
                           if (TimeWMan) {
                               clearTimeout(TimeWMan); 
                               TimeWMan = null;
                           }
                        } else if (!TimeWMan) { 
                           TimeWMan = setTimeout(FUWMistaus, 300000); //Verzögerungszeit von 5 Minuten
                        }
                      });
                      
                      1 Reply Last reply Reply Quote 0
                      • First post
                        Last post

                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      659
                      Online

                      31.8k
                      Users

                      80.0k
                      Topics

                      1.3m
                      Posts

                      3
                      9
                      215
                      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