Navigation

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

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Bewegungsmelder & Zeitsteuerung

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

      Hallo zusammen,

      ich versuche mich schon länger an einem Script, welches meine Bewegungsmelder mit Hue verbindet, dies aber zeitgesteuert. Das ist mein bisheriger Stand…

      var stunde = datum.getHours();
      log ('stunde');
      
      //Tagsüber 6-22 Uhr
      if (stunde > 6 && stunde < 22);
      on('hm-rpc.1.000C17099A04A9.1.PRESENCE_DETECTION_STATE', function (dp) {
         if(dp.state.val) log('Bewegung im Bad EG erkannt');
         setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).on', dp.state.val);
      });
      
      //Nachts
      else if (stunde > 22  && stunde < 6);
      on('hm-rpc.1.000C17099A04A9.1.PRESENCE_DETECTION_STATE', function (dp1) {
         if(dp1.state.val) log('Bewegung im Bad EG erkannt');
         setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).on', dp1.state.val);
         setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).level', 50);
      });
      
      

      Wenn ich unten nur "else" verwende, kommt eine Fehlermeldung. Obwohl ich dies, meines Erachtens, so wie in den Tutorials umgesetzt habe. 😞

      Weiß jemand, woran das liegt? Funktioniert das überhaupt, dass ich den Status des Bewegungsmelder auf die Hue übertrage und dann noch die Level-Variable setze?

      Dank euch um Voraus und viele Grüße

      Tobi

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

        auf die klammersetzung kommt es an und semikol

        ; schliesst immer eine Zeile ab kommt aber nicht am ende des If

        if (was weiss ich ) {
        
        } else {
        
        }
        
        
        //Tagsüber 6-22 Uhr
        if (stunde > 6 && stunde < 22) {
          on('hm-rpc.1.000C17099A04A9.1.PRESENCE_DETECTION_STATE', function (dp) {
             if(dp.state.val) log('Bewegung im Bad EG erkannt');
             setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).on', dp.state.val);
          });
        }
        
        // Nachts
        if (stunde > 22  && stunde < 6) {
          on('hm-rpc.1.000C17099A04A9.1.PRESENCE_DETECTION_STATE', function (dp1) {
             if(dp1.state.val) log('Bewegung im Bad EG erkannt');
             setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).on', dp1.state.val);
             setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).level', 50);
          });
        }
        

        wobei ich würde garnicht hier mit else arbeiten..Fragst eh die Uhrzeit nochmal ab

        1 Reply Last reply Reply Quote 0
        • AlCalzone
          AlCalzone Developer last edited by

          Wenn ich das richtig verstehe, willst du bei Auslösen des Bewegungsmelders in Abhängigkeit der Uhrzeit verschiedene Aktionen ausführen.

          Dann sollte die Struktur des Skripts das auch wiedergeben:

          Auslöser => Uhrzeit prüfen => Aktionen ausführen
          

          Etwa so (ungetestet):

          on('hm-rpc.1.000C17099A04A9.1.PRESENCE_DETECTION_STATE', function (dp) {
          
              var stunde = (new Date()).getHours();
          
              // es wird immer geschaltet, entweder an oder aus, je nach Bewegung
              setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).on', dp.state.val);
          
              if (dp.state.val) { // Bewegungsmelder hat was gesehen
                  log('Bewegung im Bad EG erkannt');
                  // Abhängig von Uhrzeit die Helligkeit anpassen
                  if (stunde > 6 && stunde < 22) {
                      // tagsüber hell
                      setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).level', 100);
                  } else {
                      // nachts dunkler
                      setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).level', 50);
                  }
              } else {  // länger keine Bewegung
                  log('Keine Bewegung mehr im Bad EG');
              }
          
          });
          

          P.S.: Deine If-ElseIf-Bedingung hatte eine Lücke, von 6:00 bis 6:59 und 22:00 bis 22:59 würde es gar nichts tun. Entweder if-else oder if-elseif mit < und >=

          1 Reply Last reply Reply Quote 0
          • S
            Seehofweg last edited by

            Super…vielen vielen Dank!!! Irgendwie war dieses Thema für mich der Script-Durchbruch, bei dem sich der Knoten gelöst hat. 😄 Die Steuerung läuft und ich habe zusätzlich noch eine Überprüfung der Helligkeit eingebaut. Und jetzt ist meine Frau sogar zufrieden mit der Automatisierung.

            Danke!

            1 Reply Last reply Reply Quote 0
            • S
              Seehofweg last edited by

              Ich muss das Thema nochmal aufmachen. Ich hatte seit Nutzung der Skripte immer mal wieder das Problem, dass sich die Bewegungsmelder nicht zurückgesetzt haben bzw. teilweise auch die korrekte Statusänderung zwar in iobroker erfasst (Objekte), aber im Programm nicht sauber ausgewertet wurde.

              Deshalb würde ich gerne das Zurücksetzen bzw. die Zeitsteuerung im Skript machen. Das ist mein aktueller Stand:

              on ('hm-rpc.1.000C17099A04A9.1.PRESENCE_DETECTION_STATE', function () {
              
              //Definitionen
                  var zeit1 = 4; //6 Uhr, da +2 Stunden
                  var zeit2 = 18; //20 Uhr, da +2 Stunden
                  var illu_ziel = 150;
              
              //Zeit auslesen
                  var stunde = (new Date()).getHours();
                  log('Zeit: ' + stunde);
              
              //Helligkeit auslesen
                  var illu = getState('javascript.0.helligkeiten.illu_eg_bad').val;
                  log('Helligkeit: ' + illu);
              
              //Lampen schalten
                  if (illu >= illu_ziel) { 
                          log('Bewegung erkannt, aber zu hell, keine Aktion'); 
              
                  } else {
              
                      setState ('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).on', true);
              
                              if (stunde > zeit1 && stunde < zeit2) {
                                  // tagsüber hell und weiß
                                  setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).level', 100);
                                  setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).ct', 350);
                                  log('Tag');
                              } else  {
                                  // nachts dunkler und warmweiß
                                  setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).level', 40);
                                  setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).ct', 500);
                                  log('Nacht');
                              }
                  }
              
              //Lampen werden nach 120s wieder ausgeschalten
              setTimeout(function(){ setState ('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).on', false) }, 120000);
              
              });
              

              Hier habe ich zwei Fragen und hoffe, jemand kann mir helfen…

              1. weshalb wird die Zeit mit -2 Stunden ausgegeben?

              2. wenn das Licht bereits an ist, gehen die Lampen nicht erneut an. Da die Helligkeit ja in diesem Moment noch ausreichend ist. Ich wollte eine Abfrage einbauen, dass wenn eine Bewegung erkannt wird, geprüft wird, ob die Lichter bereits an sind und wenn ja, der Timer wieder zurückgesetzt wird. Aber ich bekomme das nicht hin.

              1 Reply Last reply Reply Quote 0
              • AlCalzone
                AlCalzone Developer last edited by

                @Seehofweg:

                1. weshalb wird die Zeit mit -2 Stunden ausgegeben? `
                Läuft dein Skript auf einem Raspberry Pi? Wenn ja, ist die richtige Zeitzone eingestellt?

                1 Reply Last reply Reply Quote 0
                • T
                  tempestas last edited by

                  Hallo Seehofweg,

                  schau mal hier zum Thema clearTimeout;

                  https://www.w3schools.com/jsref/met_win … imeout.asp

                  das müsste es sein, was du für Frage 2 brauchst.

                  1 Reply Last reply Reply Quote 0
                  • S
                    Seehofweg last edited by

                    Servus,

                    ich bräuchte wohl genau das Gegenteil…ich würde das Timeout bei einer erneuten Bewegung gerne auf den ursprünglichen Anfangswert zurück setzen. 🙂

                    Ahhh...die Zeit wird auf der Raspberry ausgelesen. Werd ich gleich mal checken. Dank!

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

                      Hallo,

                      habs mal so gebaut:

                      ! ````
                      //Lampen werden nach 120s wieder ausgeschalten
                      var idStatusHue = 'hue.1.Bridge_-EG_2.a.Badezimmer(Decke).on';
                      var timer = null; // Timer leer
                      ! //Definitionen
                      var zeit1 = 4; //6 Uhr, da +2 Stunden
                      var zeit2 = 18; //20 Uhr, da +2 Stunden
                      var illu_ziel = 150;
                      ! on ('hm-rpc.1.000C17099A04A9.1.PRESENCE_DETECTION_STATE', function () {
                      ! //Zeit auslesen
                      var stunde = (new Date()).getHours();
                      log('Zeit: ' + stunde);

                      //Helligkeit auslesen
                      var illu = getState('javascript.0.helligkeiten.illu_eg_bad').val;
                      log('Helligkeit: ' + illu);

                      //Lampen schalten
                      if (illu >= illu_ziel) {
                      log('Bewegung erkannt, aber zu hell, keine Aktion');

                      } else if (illu < illu_ziel || getState(idStatusHue).val === true ) { // Helligkeit niedriger als Grenzwert oder Lampe bereits an
                      
                          setState (idStatusHue, true);
                      

                      ! if (stunde > zeit1 && stunde < zeit2) {
                      // tagsüber hell und weiß
                      setState('hue.1.Bridge_-EG_2.a.Badezimmer(Decke).level', 100);
                      setState('hue.1.Bridge_-EG_2.a.Badezimmer(Decke).ct', 350);
                      log('Tag');
                      } else {
                      // nachts dunkler und warmweiß
                      setState('hue.1.Bridge_-EG_2.a.Badezimmer(Decke).level', 40);
                      setState('hue.1.Bridge_-EG_2.a.Badezimmer(Decke).ct', 500);
                      log('Nacht');
                      }
                      }

                      //Lampen werden nach 120s wieder ausgeschaltet
                      if (timer) clearTimeout(timer); // wenn aktuell Timer läuft (weil letzte Bewegung vor weniger als 120s, dann Timer löschen
                      timer = setTimeout(function() { // sofort neuen Timer starten
                      timer = null; // zuerst nach Ablauf Timer wieder auf null
                      if (getState(idStatusHue).val) setState (idStatusHue, false); // nach Ablauf Licht aus, wenn vorher an
                      }, 1000 * 120); // 120s

                      });

                      Wenn Bewegung und Helligkeit ist größer als Grenzwert, dann keine Aktion (außer Timer).
                      
                      Wenn Bewegung und Helligkeit ist niedriger als Grenzwert oder Wenn Bewegung und Lampe schon an, dann nochmal Licht an (mit neuen Farbwerten).
                      
                      Timer wird nach Ablauf gelöscht und bei Bewegung neu gestartet.
                      
                      Gruß
                      
                      Pix
                      1 Reply Last reply Reply Quote 0
                      • AlCalzone
                        AlCalzone Developer last edited by

                        @Seehofweg:

                        ich würde das Timeout bei einer erneuten Bewegung gerne auf den ursprünglichen Anfangswert zurück setzen. `
                        Schematisch geht das so:

                        var timer;
                        // ursprünglicher Timeout
                        timer = setTimeout(...)
                        
                        [...]
                        // "Reset" des Timers:
                        if (timer != null) clearTimeout(timer);
                        timer = setTimeout(...)
                        
                        
                        1 Reply Last reply Reply Quote 0
                        • S
                          Seehofweg last edited by

                          Hey…ich danke euch! Und natürlich ganz besonders pix! 😄 Das Skript funktioniert super. Da ich mir gesagt habe, dass ich kein Skript einbaue, welches ich nicht verstehe, bin ich inzwischen auch damit durch. Ja, schön gelöst.

                          Euch noch einen schönen Abend!

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          505
                          Online

                          31.7k
                          Users

                          79.8k
                          Topics

                          1.3m
                          Posts

                          5
                          11
                          2389
                          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