Navigation

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

    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

    Licht vergessen funktioniert nicht mehr korrekt

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

      Hallo,
      ich habe mir ein Skript geschrieben, welches das Licht in den Zimmern ausschaltet wenn keine Bewegung mehr erkannt wird. Hat auch immer super funktioniert. Nun bin ich auf die neue Node JS 16 Version, nun schaltet das Licht auch aus, wenn noch Bewegung vorhanden ist. Erkennt ihr einen Fehler im Skript der mit der aktuellen Version erst auftritt?

      // Script zum automatischen Ausschalten wenn das Licht vergessen wurde.
      
      // Variablen
      var melder=       "knx.0.Bewegungsüberwachung.OG.Anwesend_K_Kind_1"/*Anwesend K Kind 2*/; // Melder der die Bewegung im Raum überwacht
      var raum=         "Kind 1"; // Bezeichung des Raumes für die Logausgaben
      var schalten=     "knx.0.Beleuchtungssteuerung_OG.Kind_1.Licht_Kind_1_Schalten"/*Licht Kind 1 Schalten*/; // Schaltobjekt des Lichtes
      var schaltenruck= "knx.0.Beleuchtungssteuerung_OG.Kind_1.Licht_Kind_1_Rück"/*Licht Kind 1 Rück*/; // Rückmeldeobjekt des Lichtes falls vorhanden sonst wie schalten
      var schalten2=     "knx.0.Beleuchtungssteuerung_OG.Kind_1.Licht_Kind_1_Wand_Schalten"/*Licht Kind 1 Wand Schalten*/; // Schaltobjekt des Lichtes
      var schaltenruck2= "knx.0.Beleuchtungssteuerung_OG.Kind_1.Licht_Kind_1_Wand_Rück"/*Licht Kind 1 Wand 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=10*60*1000; // 5min Verzögerung, nach der das Licht ausgeschaltet werden soll
      //var zeit=30*1000; // 30s zum Testen
      var loggen=false; // Logausgaben aktiveren
      var anwesend=false; // Variable die die Anwesenheit darstellt
      var timer=false;
      
      // Bewegung wurde im Raum erkannt, Ausschalttimer wird gelöscht
      on ({id: melder, val: true}, function () {
           if (loggen) {log("Bewegung wurde erkannt ("+raum+"), Ausschalttimer gelöscht")}
           anwesend=true;
           if (timer) {
               clearTimeout(timer);
               timer = false;
               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: false}, 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","warn");
           setState(schalten,false);
      } else {
               if (loggen) {log("Licht ("+raum+") war bereits aus")}
           }
      if ((anwesend==false) && (getState(schaltenruck2).val==true)) {
           log("Licht2 ("+raum+") wurde vergessen und ausgeschaltet","warn");
           setState(schalten2,false);
      } else {
               if (loggen) {log("Licht2 ("+raum+") war bereits aus")}
           }
      }
      
      T paul53 2 Replies Last reply Reply Quote 0
      • T
        TT-Tom @fuchs1978 last edited by TT-Tom

        @fuchs1978
        Bin zwar nicht der Profi, aber ich würde die Variable „timer“ nicht zweimal verwenden. Den Timer würde ich z.B. „Wartezeit“ nennen. Zeile 22 und 33

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

          @fuchs1978 sagte: Erkennt ihr einen Fehler im Skript

          Es muss auf Änderung getriggert werden, da sonst mehrere Timer gestartet werden können, die sich nicht mehr löschen lassen. Außerdem verwendet man nur einen Trigger pro Datenpunkt (Ressourcen).

          on (melder, function (dp) { // Trigger auf Wertänderung
              if (dp.state.val) {
                  // Aktionen bei Bewegung
              } else {
                  // Aktionen ohne Bewegung
              }
          });
          

          @tt-tom sagte in Licht vergessen funktioniert nicht mehr korrekt:

          Variable „timer“ nicht zweimal verwenden.

          Sie wird nur einmal verwendet: In einem Teil gesetzt und in einem anderen Teil gelöscht. Da Timer-Variablen spezielle Objekte sind, setzt man Timer-Variablen auf null anstatt auf false.

          T F 2 Replies Last reply Reply Quote 0
          • T
            TT-Tom @paul53 last edited by

            @paul53

            @tt-tom sagte in Licht vergessen funktioniert nicht mehr korrekt:

            Variable „timer“ nicht zweimal verwenden.

            Sie wird nur einmal verwendet: In einem Teil gesetzt und in einem anderen Teil gelöscht. Da Timer-Variablen spezielle Objekte sind, setzt man Timer-Variablen auf null anstatt auf false.

            Dann habe ich da noch eine Verständnisfrage: Zeile 21-23
            Das If bezieht sich doch auf die Variable timer, die in 23 auf false gesetzt wird. Um das Objekt timer in 22 zu löschen.

            Sollte nicht Objekt und Variable unterschiedliche Namen haben?

            paul53 1 Reply Last reply Reply Quote 0
            • paul53
              paul53 @TT-Tom last edited by

              @tt-tom sagte: Variable timer, die in 23 auf false gesetzt wird. Um das Objekt timer in 22 zu löschen.

              clearTimeout(timer) stoppt den Timer mit der Referenz timer, setzt aber nicht die Variable zurück. Damit man mit if(timer) die Variable abfragen kann, wird sie nach dem Stoppen auf false (besser null) gesetzt.

              T 1 Reply Last reply Reply Quote 0
              • T
                TT-Tom @paul53 last edited by

                @paul53

                Okay so weit verstanden. Müssen also beide den gleichen Namen timer haben, oder?

                paul53 1 Reply Last reply Reply Quote 0
                • paul53
                  paul53 @TT-Tom last edited by

                  @tt-tom sagte: Müssen also beide den gleichen Namen timer haben, oder?

                  Ja, es gibt nur ein setTimeout(), das die Variable timer setzt.

                  T 1 Reply Last reply Reply Quote 0
                  • T
                    TT-Tom @paul53 last edited by

                    @paul53

                    Danke, wieder etwas dazu gelernt. Schönes Wochenende

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

                      @paul53 said in Licht vergessen funktioniert nicht mehr korrekt:

                      @fuchs1978 sagte: Erkennt ihr einen Fehler im Skript

                      Es muss auf Änderung getriggert werden, da sonst mehrere Timer gestartet werden können, die sich nicht mehr löschen lassen. Außerdem verwendet man nur einen Trigger pro Datenpunkt (Ressourcen).

                      on (melder, function (dp) { // Trigger auf Wertänderung
                          if (dp.state.val) {
                              // Aktionen bei Bewegung
                          } else {
                              // Aktionen ohne Bewegung
                          }
                      });
                      

                      Mache ich das nicht? Ich habe ja die Trigger mit Val unterschieden. Wir würdest du den Rest aufbauen. Komisch nur, das es erst seit kurzem nicht mehr korrekt funktioniert. Ich meine Seite node 16

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

                        @fuchs1978 sagte: Mache ich das nicht? Ich habe ja die Trigger mit Val unterschieden.

                        Nein. Wenn ein zweiter Trigger mit val: false kommt ohne vorherige Wertänderung?

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

                          @paul53 said in Licht vergessen funktioniert nicht mehr korrekt:

                          @fuchs1978 sagte: Mache ich das nicht? Ich habe ja die Trigger mit Val unterschieden.

                          Nein. Wenn ein zweiter Trigger mit val: false kommt ohne vorherige Wertänderung?

                          Also dort noch eine Abfrage rein If Timer und damit nicht auf zwei reagieren

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          413
                          Online

                          31.8k
                          Users

                          80.0k
                          Topics

                          1.3m
                          Posts

                          3
                          11
                          446
                          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