Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] Verzögert ausschalten "Timeout" dauert zu lange

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst] Verzögert ausschalten "Timeout" dauert zu lange

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

      @Mr. Burns:

      Der Bewegungsmelder soll das Licht einschalten. Wenn das Licht aber schon über den Taster eingeschaltet wurde, `
      Nach dieser Aussage erwarte ich einen Bewegungsmelder (zum Testen die Taste einer FB) und einen Taster zu Schalten des Lichts.

      1 Reply Last reply Reply Quote 0
      • Mr. Burns
        Mr. Burns last edited by

        sollte der Lichtschalter (bzw. die Lichtschalter) in das Script?

        Hab das Licht zum testen über die CCU direkt geschaltet (bzw. über die app).

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

          @Mr. Burns:

          Hab das Licht zum testen über die CCU direkt geschaltet (bzw. über die app). `
          Dann muss man den Aktor auswerten.
          @Mr. Burns:

          sollte der Lichtschalter (bzw. die Lichtschalter) in das Script? `
          Nicht unbedingt. Handelt es sich um eine (mehrere) Direktverknüpfung(en) ?

          Vielleicht geht es so:

          var idSensor = "hm-rpc.0.FEQ00XXXXX.1.PRESS_SHORT";
          var idAktor = "hm-rpc.1.JEQ04XXXXX.16.STATE"/*Licht Deckenbeleuchtung Wohnzimmer.STATE*/;
          
          var stateSensor = false;
          var stateAktor = getState(idAktor).val;
          var timer = null;
          
          // Aufruf der Funktion bei Bewegung
          on({id: idSensor, val: true, ack: true}, function() {
              if (!stateAktor || stateSensor) {   // Licht ist aus oder wurde durch BWM eingeschaltet
                  stateSensor = true;
                  if(!stateAktor) setState(idAktor, true); // Schalte Licht sofort ein, wenn getriggert wurde
                  if(timer) clearTimeout(timer);
                  timer = setTimeout(function() {
                      timer = null;
                      setState(idAktor, false); // Schalte Licht verzögert aus
                  }, 1 * 15 * 1000); // nach 5 * 60s * 1000ms, also 5 Minuten
              }
          });
          
          on({id: idAktor, ack: true}, function(dp) {
              stateAktor = dp.state.val;
              if(!stateAktor) {  // Licht aus
                  stateSensor = false;
                  if(timer) clearTimeout(timer);
                  timer = null;
              }        
          });
          
          1 Reply Last reply Reply Quote 0
          • Mr. Burns
            Mr. Burns last edited by

            Es funktioniert genauso wie es mir vorgestellt habe!

            Super! Vielen Dank.

            Ich bin noch dabei die Logik zu verstehen…:-D

            Gruß

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

              @Mr. Burns:

              Es funktioniert genauso wie es mir vorgestellt habe! `
              Das freut mich. Dann markiere bitte noch das Thema als gelöst (im ersten Beitrag).

              1 Reply Last reply Reply Quote 0
              • Mr. Burns
                Mr. Burns last edited by

                Klar. Für alle die sowas oder so ähnlich nachbauen:

                Das Licht (in der Küche) soll Abend (wenn es dämmert) einschalten wenn jemand den Raum betritt. Wurde das Licht bereits manuell eingeschaltet, soll es nicht über die Zeitverzögerung wieder ausgeschaltet werden:

                // Datenpunkt-ID
                var idSensor = "hm-rpc.0.FEQ00XXXXX.1.PRESS_SHORT";
                var idAktor = "hm-rpc.1.JEQ04XXXXX.16.STATE"/*Licht Deckenbeleuchtung Wohnzimmer.STATE*/;
                var idLux = "hm-rega.0.8681"/*homeduino_a_lux*/;
                
                var stateSensor = false;
                var stateAktor = getState(idAktor).val;
                var stateLux = getState(idLux).val;
                var timer = null;
                
                // Aufruf der Funktion bei Bewegung
                on({id: idSensor, val: true, ack: true}, function() {                    // Trigger 
                    if ((stateLux <= 500) && (!stateAktor || stateSensor)) {       // Licht aus oder Merker BWM
                        stateSensor = true;                                                        // Merker BWM
                        if(!stateAktor) setState(idAktor, true);                             // Schalte Licht sofort ein, wenn getriggert wurde
                        if(timer) clearTimeout(timer);
                        timer = setTimeout(function() {
                            timer = null;
                            setState(idAktor, false);                                                // Schalte Licht verzögert aus
                        }, 1 * 15 * 1000);                                                             // nach 5 * 60s * 1000ms, also 5 Minuten
                    }
                });
                
                on({id: idAktor, ack: true}, function(dp) {                                   // Trigger
                    stateAktor = dp.state.val;                                                    // Merker Aktor
                    if(!stateAktor) {                                                                    // Wenn Merker Aktor aus
                        stateSensor = false;                                                        // Setze Merker BWM aus
                        if(timer) clearTimeout(timer);                                          // ???
                        timer = null;                                                                   // ???
                    }        
                });
                
                1 Reply Last reply Reply Quote 0
                • paul53
                  paul53 last edited by

                          if(timer) clearTimeout(timer);        // Abbruch Timeout (Licht war per BWM ein und ist manuell aus)
                          timer = null;                         // für if(timer)
                  
                  
                  1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 last edited by

                    @Mr. Burns:

                    Das Licht (in der Küche) soll Abend (wenn es dämmert) einschalten `
                    Es fehlt noch die Aktualisierung der Skriptvariable stateLux (wird jetzt nur bei Skriptstart gesetzt).

                    on(idLux, function(dp) {
                        stateLux = dp.state.val;
                    });
                    
                    1 Reply Last reply Reply Quote 0
                    • Mr. Burns
                      Mr. Burns last edited by

                      Du hast natürlich vollkommen recht. Zu meiner Verteidigung: Ich kann in Wirklichkeit gar nicht scripten…ich mach mehr in FUP Programmierung (S7/TIA)...Ich versteh auch nicht wie sich da "Normalos" zurecht finden. Den unteren Teil deines Scripts hab ich noch nicht richtig verstanden. Du setzt den Merker zurück wenn das Licht ausgeht
                      ` > if(!stateAktor) { // Wenn Merker Aktor aus

                      stateSensor = false; // Setze Merker BWM aus , aber eigentlich geht er ja nur in das Script bei einer positiven Flanke > on({id: idAktor, ack: true}, function(dp) { // Trigger `

                      Ich will nur Prüfen ob es schon Dunkel genug ist wenn der Bewegungsmelder ausgelöst wird…

                      Könnte doch so funktionieren:

                      // Datenpunkt-ID
                      var idSensor = "hm-rpc.0.FEQ00XXXXX.1.PRESS_SHORT";
                      var idAktor = "hm-rpc.1.JEQ04XXXXX.16.STATE"/*Licht Deckenbeleuchtung Wohnzimmer.STATE*/;
                      var idLux = "hm-rega.0.8681"/*homeduino_a_lux*/;
                      
                      var stateSensor = false;
                      var stateAktor = getState(idAktor).val;
                      var stateLux = getState(idLux).val;
                      var timer = null;
                      
                      // Aufruf der Funktion bei Bewegung
                      on({id: idSensor, val: true, ack: true}, function() {       // Trigger 
                      stateLux = getState(idLux).val;
                          if ((stateLux <= 500) && (!stateAktor || stateSensor)) { // Licht aus oder Merker BWM
                         // log (stateLux);
                              stateSensor = true;                                 // Merker BWM
                              if(!stateAktor) setState(idAktor, true);            // Schalte Licht sofort ein, wenn getriggert wurde
                              if(timer) clearTimeout(timer);
                              timer = setTimeout(function() {
                                  timer = null;
                                  setState(idAktor, false);                       // Schalte Licht verzögert aus
                              }, 1 * 15 * 1000);                                  // nach 5 * 60s * 1000ms, also 5 Minuten
                          }
                      });
                      
                      on({id: idAktor, ack: true}, function(dp) {                 // Trigger
                          stateAktor = dp.state.val;                              // Merker Aktor
                          if(!stateAktor) {                                       // Wenn Merker Aktor aus
                              stateSensor = false;                                // Setze Merker BWM aus
                              if(timer) clearTimeout(timer);                      // ???
                              timer = null;                                       // ???
                          }        
                      });
                      

                      Edit:

                      Hab gerade noch was rumprobiert. Bedeutet dies
                      > ack: true
                      gar nicht bei Aktualisierung Wert "True" also Positive Flanke? Er triggert die Funktion bei jedem Flankenwechsel. 😮

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

                        @Mr. Burns:

                        Bedeutet dies

                        ack: true

                        gar nicht bei Aktualisierung Wert "True" also Positive Flanke? Er triggert die Funktion bei jedem Flankenwechsel. `
                        Er triggert sogar bei jeder Änderung des Zeitstempels, unter der Bedingung, dass eine Bestätigung (Rückmeldung des Aktors über die Ausführung) erfolgt ist. Sollte nur bei Wert "true" getriggert werden, muss man schreiben val: true. Will man ganz sicher gehen, dass nur bei einer postiven Flanke getriggert wird, dann val: true, oldVal: false oder val: true, change: 'ne'.

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        904
                        Online

                        31.7k
                        Users

                        79.7k
                        Topics

                        1.3m
                        Posts

                        5
                        20
                        2361
                        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