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.
    • Mr. Burns
      Mr. Burns last edited by

      Hallo zusammen,

      versuche noch einmal etwas zeit in meine Haussteuerung zu investieren und meine Programme von der CCU2 zu ioBroker zu portieren.

      Einfaches Einschalten der Beleuchtung und zeitverzögert aus:

      // Datenpunkt-ID
      var idSensor = "s7.0.DBs.DB20.Lichtschranke_Haustuere"/*Lichtschranke Eingangstür wurde unterbrochen*/;
      
      // Variablendeklaration und Initialisierung bei Scriptstart
      var idAktor = ("hm-rpc.1.JEQ04XXXXX.13.STATE"/*Aussenstrahler Haustuere.STATE*/);
      
      var timer = null;
      
      // Aufruf der Funktion bei Änderung
      on(idSensor, function(dp) {
          if (timer) {                       // wenn Timer läuft, wird er auf null gesetzt
            clearTimeout(timer);
            timer = null;
         }
      
         if (dp.newState.val) {              // Trigger
            setState(idAktor, true);       // Schalte Licht sofort ein, wenn getriggert wurde
         } else {                            // wenn nicht getriggert wird, starte Timer
            timer = setTimeout(function() {
               timer = null;
               setState(idAktor, false);    // Schalte Licht verzögert aus
              }, 0 * 15 * 1000);              // nach 5 * 60s * 1000ms, also 5 Minuten
         }
      });
      
      

      Das Problem:

      Die Zeit ist in etwa doppelt so lange…also anstelle 15s sind es 30s.

      Gibt es dafür einen Grund?

      Der ioBroker läuft auf einem raspberry Pi3.

      P.S. Das Script hab ich hier aus dem Forum geklaut und angepasst... 😄

      Gruß

      Thomas

      1 Reply Last reply Reply Quote 0
      • P
        pix last edited by

        Hallo,

        beim Skript sind mir zwei Dinge aufgefallen.

        schlecht:

        var idAktor = ("hm-rpc.1.JEQ04XXXXX.13.STATE"/*Aussenstrahler Haustuere.STATE*/);
        
        

        besser:

        var idAktor = "hm-rpc.1.JEQ04XXXXX.13.STATE"/*Aussenstrahler Haustuere.STATE*/;
        
        

        schlecht:

        }, 0 * 15 * 1000);              // nach 5 * 60s * 1000ms, also 5 Minuten
        

        besser:

        Produkt 0 vermeiden, also lieber

        }, 1 * 15 * 1000);              // nach 5 * 60s * 1000ms, also 5 Minuten
        

        Gruß

        Pix

        1 Reply Last reply Reply Quote 0
        • arteck
          arteck Developer Most Active last edited by

          }, 0 * 15 * 1000);              // nach 5 * 60s * 1000ms, also 5 Minuten
          

          das ergibt doch ehh ne 0

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

            Danke für die Hinweise ich teste es heute Nachmittag mal.

            Aber wenn der Zähler 0 ist sollte das Licht doch eigentlich direkt wieder ausschalten oder?

            Mit den Klammern am Ausgang hatte mich auch irretiert aber stand so im Original..und es hat ja funktioniert.

            Gruß

            Thomas

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

              Wie lang ist denn die "Haltezeit" der Lichtschranke?

              Du startest den Timer erst wenn der Sensor ein "false" meldet. Jetzt ist also die Frage wie genau der Sensor Signale meldet. Wenn der Sensor erst nach 30 Sekunden ein "false" meldet starte erst dann Dein Timer - der aktuell mit dem Null-produkt sofort aus schaltet.

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

                Ihr hattet alle Recht. 0*15 ist natürlich 0. Und ich hatte nen Timer in meiner SPS…hatte ich nicht mehr auf dem Schirm.

                Danke für eure Hinweise.

                Da hab ich gleich die nächste Frage. Wenn ich das Script für einen Bewegungsmelder einsetzen möchte.

                Der Bewegungsmelder soll das Licht einschalten. Wenn das Licht aber schon über den Taster eingeschaltet wurde, soll es aber nicht über den Timer ausgeschaltet werden. Das Script funktioniert auch, ABER: Wenn das Script ein weiteres mal ausgeführt wird, schaltet der Timer das Licht nicht mehr aus...der erste Timer läuft nicht durch.

                Wie habt ihr das gelöst?

                ` > var idSensor = "hm-rpc.0.FEQ00XXXXX.1.PRESS_SHORT";

                var idAktor = "hm-rpc.1.JEQ04XXXXX.16.STATE"/Licht Deckenbeleuchtung Wohnzimmer.STATE/;

                //var stateSensor = getState(idSensor).val;

                var stateAktor = getState(idAktor).val;

                var timer = null;

                // Aufruf der Funktion bei Änderung

                on({id: idSensor, val: true, ack: true}, function(dp) {

                stateSensor = dp.newState.val;

                stateAktor = getState(idAktor).val;

                if (timer) { // wenn Timer läuft, wird er auf null gesetzt

                clearTimeout(timer);

                timer = null;

                }

                if (stateSensor === true && stateAktor === false) { // Trigger

                setState(idAktor, true); // Schalte Licht sofort ein, wenn getriggert wurde

                timer = setTimeout(function() {

                timer = null;

                setState(idAktor, false); // Schalte Licht verzögert aus

                }, 1 * 15 * 1000); // nach 5 * 60s * 1000ms, also 5 Minuten

                }

                }); `

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

                  @Mr. Burns:

                  Der Bewegungsmelder soll das Licht einschalten. Wenn das Licht aber schon über den Taster eingeschaltet wurde, soll es aber nicht über den Timer ausgeschaltet werden. `
                  In dem Skript kann ich keinen Bewegungsmelder finden, sondern nur einen Taster und einen Aktor :?

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

                    Meine Bewegungsmelder sind alle Kabelgebunden über 12/7 Module. Aber in diesem Script ist es zum testen ein Taster auf einer Funkfernbedienung.

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

                      @Mr. Burns:

                      Aber in diesem Script ist es zum testen ein Taster `
                      O.k. Dann vermisse ich aber den Datenpunkt zu dem Taster @Mr. Burns:

                      Wenn das Licht aber schon über den Taster eingeschaltet wurde, `

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

                        Dachte das wäre mein Datenpunkt des Tasters:
                        > var idSensor = "hm-rpc.0.FEQ00XXXXX.1.PRESS_SHORT";

                        > on({id: idSensor, val: true, ack: true}, function(dp) {

                        zumindest geht das Licht an wenn ich die Taste drücke…und nach 15s wieder aus, insofern ich innerhalb der 15s nicht noch mal drücke.

                        1 Reply Last reply Reply Quote 0
                        • 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

                                            1.0k
                                            Online

                                            31.7k
                                            Users

                                            79.7k
                                            Topics

                                            1.3m
                                            Posts

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