Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Script Licht vergessen / Bewegungsmelder

    NEWS

    • Neues Video über Aliase, virtuelle Geräte und Kategorien

    • Wir empfehlen: Node.js 22.x

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    Script Licht vergessen / Bewegungsmelder

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

      Hallo,

      da die Kinder häufig das Licht vergessen, habe ich ein kleines Script geschrieben und genau dies zu tun. Getriggert wird dieses durch den Bewegungmelder der beim verlassen des Raumes eine 0 sendet.

      Solange ich die Zeit auf 30Sekunden, also 30000 habe läuft es auch. Nun wollte ich es aber auf 15Minuten stellen, und dann geht es nicht mehr. Ich kann auch so keinen Fehler erkennen. Wäre toll wenn ihr mal einen Blick auf das Script werft und mir eine Rückmeldung gebt.

      // Script zum automatischen Ausschalten wenn das Licht vergessen wurde.
      
      // Variablen
      var melder=       "knx.0.Bewegungsüberwachung.EG.Anwesend_K_WC"/*Anwesend K WC*/; // Melder der die Bewegung im Raum überwacht
      var raum=         "WC"; // Bezeichung des Raumes für die Logausgaben
      var schalten=     "knx.0.Beleuchtungssteuerung_EG.WC.Licht_WC_Schalten"/*Licht WC Schalten*/; // Schaltobjekt des Lichtes
      var schaltenruck= "knx.0.Beleuchtungssteuerung_EG.WC.Licht_WC_Rück"/*Licht WC Rück*/; // Rückmeldeobjekt des Lichtes falls vorhanden sonst wie schalten
      //var zeit=60*60*1000; // 1h Verzögerung, nach der das Licht ausgeschaltet werden soll
      var zeit=5*60*1000; // 5min Verzögerung, nach der das Licht ausgeschaltet werden soll
      //var zeit=30*1000; // 30s zum Testen
      var loggen=true; // Logausgaben aktiveren
      var anwesend=false; // Variable die die Anwesenheit darstellt
      
      // Bewegung wurde im Raum erkannt, Ausschalttimer wird gelöscht
      on ({id: melder, val: 1}, function () {
           if (loggen) {log("Bewegung wurde erkannt ("+raum+"), Ausschalttimer gelöscht")}
           anwesend=true;
           if (timer) {
               clearTimeout(timer);
               if (loggen) {log("Erneute Bewegung erkannt Ausschalttimer gelöscht")}
           } else {
               if (loggen) {log("Bewegung erkannt Timer war nicht vorhanden")}
           }
      });
      
      // Keine Bewegung im Raum erkannt, Ausschalttimer wird gestartet
      on ({id: melder, val: 0}, function () {
           if (loggen) {log("Keine Bewegung ("+raum+") mehr erkannt, starte Ausschalttimer " + zeit)}
           timer = setTimeout(function () {
               timer = false;
               if (loggen) {log("Ausschalttimer abgelaufen ("+raum+")")}
               anwesend=false;
               licht();
           }, zeit);
      });
      licht();
      
      // Licht wird ausgeschaltet
      function licht(){
      if (loggen) {log("Wert Anwesend: "+anwesend)}
      if (loggen) {log("Wert Rückmeldung: "+(getState(schaltenruck).val==true))}
      if ((anwesend==false) && (getState(schaltenruck).val==true)) {
           log("Licht ("+raum+") wurde vergessen und ausgeschaltet");
           setState(schalten,false);
      } else {
               if (loggen) {log("Licht ("+raum+") war bereits aus")}
           }
      }
      
      1 Reply Last reply Reply Quote 0
      • BuZZy
        BuZZy last edited by

        Was funktioniert denn nicht?

        Licht wird ausgeschaltet obwohl Bewegung im Raum ist?

        Licht wird gar nicht ausgeschaltet?

        Gruß

        1 Reply Last reply Reply Quote 0
        • F
          fuchs1978 last edited by

          @BuZZy:

          Was funktioniert denn nicht?

          Licht wird ausgeschaltet obwohl Bewegung im Raum ist?

          Licht wird gar nicht ausgeschaltet?

          Gruß `

          ich müsste nach Ablauf der Zeit ja eine Log Rückmeldung der Funktion Licht bekommen. Und falls vergessen müsste das Licht ausgehen. Ich bekomme aber weder einen Log Eintrag noch geht das Licht aus. So als ob die Funktion Licht nicht ausgeführt wird. Bei 30 sekunden klappt alles wie es soll

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

            Bekommst du denn die Logmeldung "Ausschattimer abgelaufen in raum …."??

            Ich kann da eigentlich keine großartigen Fehler feststellen..

            Variablen die in mehreren Funktionen verwendet würden, sollten aber immer global deklariert werden.. Wenn man eine Variable gegen true oder false checkt verwendet man besser === statt == ..

            Desweiteren würde ich "timer" in der Funktion Licht auf false setzen, und nicht in der Timeout Funktion selber..

            Ungefähr so:

            // Script zum automatischen Ausschalten wenn das Licht vergessen wurde.
            
            // Variablen
            var melder=       "knx.0.Bewegungsüberwachung.EG.Anwesend_K_WC"/*Anwesend K WC*/; // Melder der die Bewegung im Raum überwacht
            var raum=         "WC"; // Bezeichung des Raumes für die Logausgaben
            var schalten=     "knx.0.Beleuchtungssteuerung_EG.WC.Licht_WC_Schalten"/*Licht WC Schalten*/; // Schaltobjekt des Lichtes
            var schaltenruck= "knx.0.Beleuchtungssteuerung_EG.WC.Licht_WC_Rück"/*Licht WC Rück*/; // Rückmeldeobjekt des Lichtes falls vorhanden sonst wie schalten
            //var zeit=60*60*1000; // 1h Verzögerung, nach der das Licht ausgeschaltet werden soll
            var zeit=5*60*1000; // 5min Verzögerung, nach der das Licht ausgeschaltet werden soll
            //var zeit=30*1000; // 30s zum Testen
            var loggen=true; // Logausgaben aktiveren
            var anwesend=false; // Variable die die Anwesenheit darstellt
            var timer=null;		// Timer Variable wird global deklariert
            
            // Bewegung wurde im Raum erkannt, Ausschalttimer wird gelöscht
            on ({id: melder, val: 1}, function () {
                if (loggen) {
            		log("Bewegung wurde erkannt ("+raum+"), Ausschalttimer gelöscht");
            	}
                anwesend=true;
                if (timer) {
                    clearTimeout(timer);
                    if (loggen) {
            			log("Erneute Bewegung erkannt Ausschalttimer gelöscht");
            		}
                } else {
                    if (loggen) {
            			log("Bewegung erkannt Timer war nicht vorhanden");
            		}
                }
            });
            
            // Keine Bewegung im Raum erkannt, Ausschalttimer wird gestartet
            on ({id: melder, val: 0}, function () {
                if (loggen) {
            		log("Keine Bewegung ("+raum+") mehr erkannt, starte Ausschalttimer " + zeit);
            	}
                timer = setTimeout(function () {
                    if (loggen) {
            			 log("Ausschalttimer abgelaufen ("+raum+")");
            		}
                    anwesend=false;
                    licht();
            	}, zeit);
            });
            licht();
            
            // Licht wird ausgeschaltet
            function licht(){
            	timer=false;
            	if (loggen) {
            		log("Funktion Licht ANFANG!");
            		log("Wert Anwesend: "+anwesend);
            		log("Wert Rückmeldung: "+getState(schaltenruck).val);
            	}
            	if ((anwesend===false) && (getState(schaltenruck).val===true)) {
            		log("Licht ("+raum+") wurde vergessen und ausgeschaltet");
            		setState(schalten,false);
            	} else {
                    if (loggen) {
            			log("Licht ("+raum+") war bereits aus.");
            		}
                }
            	if (loggen) {
            		log("Funktion Licht ENDE!");
            	}
            }
            

            Gruß

            1 Reply Last reply Reply Quote 0
            • F
              fuchs1978 last edited by

              Es kam gar nichts, so als ob das timeout vergessen wurde. Habe es nun auf 5 Minuten, also 5601000 und es geht wieder

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

                Hast du es mal mit dem Script versucht das ich gepostet habe?

                Habe nicht viel verändert außer if boolean abfragen mit === auszustatten, die timer Variable als global deklariert und ein paar fehlende ; hinzugefügt.

                Gruß

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

                Support us

                ioBroker
                Community Adapters
                Donate

                742
                Online

                32.1k
                Users

                80.6k
                Topics

                1.3m
                Posts

                2
                6
                842
                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