Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Skript zur Steuerung Aussenlicht mit Bewegungsmelder und Tastern

    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

    Skript zur Steuerung Aussenlicht mit Bewegungsmelder und Tastern

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

      @paul53 sagte in Skript zur Steuerung Aussenlicht mit Bewegungsmelder und Tastern:

      Mir ist die Rolle von Helligkeit und Elevation noch nicht ganz klar: Soll damit nur die Lichtfunktion der BWM feigegeben werden, was schon im 1. Skript passiert, oder sollen damit noch weitere Freigaben erfolgen ?

      Sollen PRESS_SHORT und PRESS_LONG die gleiche Funktion auslösen ?

      Ich dachte eigentlich, dass ich Helligkeit und Elevation nur im ersten Programm brauchte, habe aber dann im 2. Programm den virtuellen Taster danach nochmal gesteuert.

      on(idTaster_virtu, function(obj){
          licht = getState(idLicht).val;
          helligkeit = getState(idHelligkeit).val;
          elevation = getState(idElevation).val;
          taster_virtu = obj.state.val;
          if (!taster_virtu) setState(idLicht, false);
          if ((helligkeit < helligkeit_grenze) || (elevation <= elevation_grenze)) {
              clearInterval(timer);
              timer = null;
              if ((!licht) && (taster_virtu))  setState(idLicht, true);
              if ((licht) && (taster_virtu)) {
                  setState(idLicht, true);
              }
          }
      });
      

      hatte das erst nicht, wollte nur vermeiden, dass mein weibliches Wesen es unwissend tagsüber aktiviert.

      Bei den Tastern haben SHORT und LONG die gleiche Funktion, wollte nur beide Fälle "abfangen"

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

        @mguenther sagte:

        Bei Betätigung eines Tasters soll nur das eine zugehörige Licht angehen.
        Bei Betätigung eines Tasters während das Licht aufgrund einer Bewegung (beide Lichter an) an ist, soll nur für das Licht der timer unterbrochen werden, zu dem der Taster gehört.

        Das kann man so machen (Beispiel für 1 Licht):

        var licht1 = getState(idLicht1).val;
        
        on(idLicht1, function(dp) {
           licht1 = dp.state.val;
        });
        
        on({id: [idTaster1_1, idTaster1_2]}, function() {
           if(timer1) { // Timer läuft --> Licht bleibt an
              clearTimeout(timer1);
              timer1 = null;
           } else setState(idLicht1, !licht1); // Toggle
        });
        
        1 Reply Last reply Reply Quote 0
        • paul53
          paul53 @mguenther last edited by

          @mguenther sagte:

          Bei Betätigung des virtuellen Tasters soll für beide Lichter das Licht geschaltet werden, falls timer aktiv aus Bewegungen sind, sind diese zu unterbrechen.

          Vorschlag:

          var taster_virtu = getState(isTaster_virtu).val;
          var helligkeit_grenze= getState(idGrenzwertHelligkeit).val;
          var elevation_grenze = getState(idGrenzwertElevation).val;
          
          on(idTaster_virtu, function(dp) {
             taster_virtu = dp.state.val;
             if(timer1) {
                clearTimeout(timer1);
                timer1 = null;
             }
             if(timer2) {
                clearTimeout(timer2);
                timer2 = null;
             }
             if(!taster_virtu) {
                if(licht1) setState(idLicht1, false);
                if(licht2) setState(idLicht2, false);
             } else {
                var helligkeit = getState(idHelligkeit).val;
                var elevation = getState(idElevation).val;
                if (helligkeit < helligkeit_grenze || elevation <= elevation_grenze) {
                   if(!licht1) setState(idLicht1, true);
                   if(!licht2) setState(idLicht2, true);
                }
             }
          });
          
          1 Reply Last reply Reply Quote 0
          • paul53
            paul53 @mguenther last edited by

            @mguenther sagte:

            Bei Erkennen von Bewegung eines der beiden Melder sollen beide Lichter angehen und für den Zeitraum von x Sekunden anbleiben.

            var timer1 = null;
            var timer2 = null;
            const dauer = 300; // in s
            
            on([idBewegung1, idBewegung2], function(dp) {
               if (!taster_virtu && dp,state.val) {
                  if(!licht1) setState(idLicht1, true);
                  if(!licht2) setState(idLicht2, true);
                  if(timer1) clearTimeout(timer1);
                  if(timer2) clearTimeout(timer2);
                  timer1 = setTimeout(unction() {
                     setState(idLicht1, false);
                     timer1 = null;
                  }, 1000 * dauer);
                  timer2 = setTimeout(function() {
                     setState(idLicht2, false);
                     timer2 = null;
                  }, 1000 * dauer);
               }
            });
            
            1 Reply Last reply Reply Quote 0
            • M
              mguenther last edited by

              danke dir - ich probiere es heute abend mal aus

              1 Reply Last reply Reply Quote 0
              • M
                mguenther last edited by

                funktioniert - hatte ein paar Kleinigkeiten noch korrigieren müssen (fehlernder Buchstabe oder "." statt ",", aber habs hinbekommen, was mir jetzt noch fehlt, ist der Wandtaster. Müsste ja vom Vorgehen her analog dem virtuellen Taster sein. Ich würde noch ne Variable beim Auslösen der Bewegung einfügen und entsprechend diese Zeile ändern:

                   if (!taster_virtu && dp,state.val) {
                

                in

                   if (!taster && !taster_virtu && dp,state.val) {
                

                es wird nur komplex für mich bei "wenn Taster1, dann Änderung bei Licht1" und "wenn Taster2, dann Änderung bei Licht2". Mal sehen, was ich hinbekomme... 🙂

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

                  @mguenther sagte:

                  was mir jetzt noch fehlt, ist der Wandtaster.

                  Passt mein Vorschlag für einen von beiden Tastern nicht ?
                  Das noch einmal mit licht2, idLicht2, idTaster2_1, idTaster2_2, timer2

                  1 Reply Last reply Reply Quote 0
                  • M
                    mguenther last edited by

                    probiere ich noch aus, noch nicht eingebunden

                    1 Reply Last reply Reply Quote 0
                    • M
                      mguenther last edited by

                      on(idLicht1) function(dp) {
                         licht1 = dp.state.val;
                      });
                      

                      das funktioniert nicht so ganz. ich würde es in Zeile 2 schreiben - probiere ich aber morgen aus.

                      on({id: [idTaster1_1, idTaster1_2]}, function() {
                      licht1 = getState....;
                         if(timer1) { // Timer läuft --> Licht bleibt an
                            clearTimeout(timer1);
                            timer1 = null;
                         } else setState(idLicht1, !licht1); // Toggle
                      });
                      

                      Danke

                      paul53 2 Replies Last reply Reply Quote 0
                      • paul53
                        paul53 @mguenther last edited by

                        @mguenther sagte

                        das funktioniert nicht so ganz

                        Sorry, Tippfehler. Die schließende Klammer hinter idLicht1 muss natürlich ein Komma sein.

                        1 Reply Last reply Reply Quote 0
                        • M
                          mguenther last edited by

                          hatte ich schon geändert, ich probiere es morgen nochmal aus - eben hats nicht geklappt...

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

                            @mguenther sagte in Skript zur Steuerung Aussenlicht mit Bewegungsmelder und Tastern:

                            licht1 = getState....;

                            Zeile 2 ist unnötig, da licht1 eine globale Variable ist, die durch den Trigger auf idLicht1 aktualisiert wird.

                            1 Reply Last reply Reply Quote 0
                            • M
                              mguenther last edited by

                              bekomme es nicht hin

                              //Lichtschaltung auf Westseite - Bedingung: Elevation <=Grenzwert oder Helligkeit <Grenzwert
                              //Möglichkeit 1: Bewegungsmelder 1 und/oder 2 für die Dauer von 5min
                              //Möglichkeit 2: virtueller Taster an/aus - hat Vorang gegenüber Bewegungsmelder
                              //Möglichkeit 3: Wandtaster an/aus - hat Vorang gegenüber Bewegungsmelder und virtueller Taster
                              const idBewegung1 = 'javascript.0.Bewegungsmelder.Bewegung_WestSued'/*Bewegung WestSued*/;
                              const idBewegung2 = 'javascript.0.Bewegungsmelder.Bewegung_WestNord'/*Bewegung WestNord*/;
                              const idLicht1 = 'hm-rpc.4.MEQ0064673.14.STATE'/*12 7 Rest:14 STATE*/;
                              const idLicht2 = 'hm-rpc.4.MEQ0064673.13.STATE'/*12 7 Rest:13 STATE*/;
                              const idTaster1_1 = 'hm-rpc.4.MEQ0064673.8.PRESS_LONG'/*12 7 Rest:08 PRESS LONG*/;
                              const idTaster1_2 = 'hm-rpc.4.MEQ0064673.8.PRESS_SHORT'/*12 7 Rest:08 PRESS SHORT*/;
                              const idTaster2_1 = 'hm-rpc.4.MEQ0064673.7.PRESS_LONG'/*12 7 Rest:07 PRESS LONG*/;
                              const idTaster2_2 = 'hm-rpc.4.MEQ0064673.7.PRESS_SHORT'/*12 7 Rest:07 PRESS SHORT*/;
                              const idTaster_virtu = 'javascript.0.Bewegungsmelder.Bewegung_West_virtu_Taster'/*Bewegung West virtu Taster*/;
                              const idHelligkeit = 'hm-rpc.0.NEQ1544423.1.BRIGHTNESS'/*Aussenlicht BW Nord:1 BRIGHTNESS*/;
                              const idElevation = 'javascript.0.Sonne.Elevation'/*Elevation*/;
                              const idGrenzwertHelligkeit = 'javascript.0.Bewegungsmelder.Grenzwert_Helligkeit'/*Grenzwert Helligkeit*/;
                              const idGrenzwertElevation = 'javascript.0.Bewegungsmelder.Grenzwert_Elevation'/*Grenzwert Elevation*/;
                              const idTasterWestSued = 'javascript.0.Bewegungsmelder.Bewegung_WestSued_Taster'/*Bewegung WestSued Taster*/;
                              const idTasterWestNord = 'javascript.0.Bewegungsmelder.Bewegung_WestNord_Taster'/*Bewegung WestNord Taster*/;
                              
                              var bewegung1 = getState(idBewegung1).val;
                              var bewegung2 = getState(idBewegung2).val;
                              var licht1 = getState(idLicht1).val;
                              var licht2 = getState(idLicht2).val;
                              var taster1_1 = getState(idTaster1_1).val;
                              var taster1_2 = getState(idTaster1_2).val;
                              var taster2_1 = getState(idTaster2_1).val;
                              var taster2_2 = getState(idTaster2_2).val;
                              var tasterWestSued= getState(idTasterWestSued).val;
                              var tasterWestNord= getState(idTasterWestNord).val;
                              var helligkeit = getState(idHelligkeit).val;
                              var elevation = getState(idElevation).val;
                              var timer1 = null;
                              var timer2 = null;
                              var dauer = 30; //5min in Sekunden
                              
                              var taster_virtu = getState(idTaster_virtu).val;
                              var helligkeit_grenze= getState(idGrenzwertHelligkeit).val;
                              var elevation_grenze = getState(idGrenzwertElevation).val;
                              
                              on(idLicht1, function(dp) {
                                 licht1 = dp.state.val;
                              });
                              on(idLicht2, function(dp) {
                                 licht2 = dp.state.val;
                              });
                              
                              //Licht durch Bewegungsmelder
                              on([idBewegung1, idBewegung2], function(dp) {
                                  if (!taster_virtu && dp.state.val) {
                                      if(!licht1) setState(idLicht1, true);
                                      if(!licht2) setState(idLicht2, true);
                                      if (!tasterWestSued) {     //Wandtaster
                                          if(timer1) clearTimeout(timer1);
                                          timer1 = setTimeout(function() {
                                              setState(idLicht1, false);
                                              timer1 = null;
                                          }, 1000 * dauer);
                                      }
                                      if (!tasterWestNord) {     //Wandtaster
                                          if(timer2) clearTimeout(timer2);
                                          timer2 = setTimeout(function() {
                                              setState(idLicht2, false);
                                              timer2 = null;
                                          }, 1000 * dauer);
                                      }
                                  }
                              });
                              
                              //Virtueller Taster an/aus
                              on(idTaster_virtu, function(dp) {
                                  taster_virtu = dp.state.val;
                                  if(timer1) {
                                      clearTimeout(timer1);
                                      timer1 = null;
                                  }
                                  if(timer2) {
                                      clearTimeout(timer2);
                                      timer2 = null;
                                  }
                                  if(!taster_virtu) {
                                      if(licht1) setState(idLicht1, false);
                                      if(licht2) setState(idLicht2, false);
                                  } else {
                                      var helligkeit = getState(idHelligkeit).val;
                                      var elevation = getState(idElevation).val;
                                      if (helligkeit < helligkeit_grenze || elevation <= elevation_grenze) {
                                          if(!licht1) setState(idLicht1, true);
                                          if(!licht2) setState(idLicht2, true);
                                      }
                                  }
                              });
                              
                              //Wandtaster WestSued
                              on({id: [idTaster1_1, idTaster1_2]}, function() {
                                  if (licht1) setState(idTasterWestSued, false);
                                  else setState(idTasterWestSued, true);
                                  if(timer1) { // Timer läuft --> Licht bleibt an
                                      clearTimeout(timer1);
                                      timer1 = null;
                                  } 
                                  else setState(idLicht1, !licht1); // Toggle
                              });
                              
                              //Wandtaster WestNord
                              on({id: [idTaster2_1, idTaster2_2]}, function() {
                                  if (licht2) setState(idTasterWestNord, false);
                                  else setState(idTasterWestNord, true);
                                  if(timer2) { // Timer läuft --> Licht bleibt an
                                      clearTimeout(timer2);
                                      timer2 = null;
                                  } 
                                  else setState(idLicht2, !licht2); // Toggle
                              });
                              

                              irgendwo hab ich nen Denkfehler drin. Wenn Bewegungsmelder ausgelöst hat und ich dann einen Wandtaster drücke, dann soll das Licht anbleiben und auch nicht nach der abgelaufenen Zeit aus dem Bewegungsmelder ausgehen. Das 2. Licht, wo der Taster nicht zugehört, soll entsprechend ausgehen.
                              2. Fall: wenn ein Licht über den Wandtaster an ist und der Bewegungsmelder löst aus, dann soll das eine Licht aber nicht ausgehen, wenn der Timer aus de Bewegungsmelder abläuft. macht er aber....

                              Asgothian 1 Reply Last reply Reply Quote 0
                              • Asgothian
                                Asgothian Developer @mguenther last edited by Asgothian

                                ... nix zu sehen - @paul53,s Feld

                                M 1 Reply Last reply Reply Quote 0
                                • M
                                  mguenther @Asgothian last edited by

                                  @Asgothian sagte in Skript zur Steuerung Aussenlicht mit Bewegungsmelder und Tastern:

                                  @mguenther Dumme Frage: kannst du die Taster betätigen ohne den BM auszulösen ? Wenn nein, dann setzt der BM den timer wieder nachdem du den Taster gedrückt hast.

                                  wenn das so ist, brauchst du:
                                  Pro Taster eine Variable “licht_mit_diesem_taster_eingeschaltet”
                                  Die setzt du auf wahr wenn man mit dem Schalter das Licht an macht, und auf false wenn das Licht aus geht (entweder per Event am Licht oder im Schalter-Event.
                                  Und im timer, bevor du das Licht ausschaltest fragst du sie ab.. bei true - nix tun.

                                  A.
                                  Ich bin gerade unterwegs und kann dir das nicht sauber in js en - ich hoffe der Hinweis reicht aber.

                                  hab ich ja.

                                  const idTasterWestSued = 'javascript.0.Bewegungsmelder.Bewegung_WestSued_Taster'/*Bewegung WestSued Taster*/;
                                  const idTasterWestNord = 'javascript.0.Bewegungsmelder.Bewegung_WestNord_Taster'/*Bewegung WestNord Taster*/;
                                  

                                  werden entsprechend auf true/false gesetzt. Ich habe aber irgendwo oben nen Denkfehler drin bei dem Vorschlag von Paul

                                  Asgothian 2 Replies Last reply Reply Quote 0
                                  • Asgothian
                                    Asgothian Developer @mguenther last edited by Asgothian

                                    ... nix zu sehen - @paul53,s Feld

                                    1 Reply Last reply Reply Quote 0
                                    • Asgothian
                                      Asgothian Developer @mguenther last edited by Asgothian

                                      ... nix zu sehen...

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

                                        Bitte nicht wild rumprobieren !

                                        M 1 Reply Last reply Reply Quote 0
                                        • M
                                          mguenther last edited by

                                          habs - danke an Asgothian

                                          //Licht durch Bewegungsmelder
                                          on([idBewegung1, idBewegung2], function(dp) {
                                              tasterWestNord=getState(idTasterWestNord).val;
                                              tasterWestSued=getState(idTasterWestSued).val;
                                              if (!taster_virtu && dp.state.val) {
                                                  if(!licht1) setState(idLicht1, true);
                                                  if(!licht2) setState(idLicht2, true);
                                                  if(timer1) clearTimeout(timer1);
                                                  timer1 = setTimeout(function() {
                                                      if (!tasterWestSued) setState(idLicht1, false);    //Wandtaster
                                                      timer1 = null;
                                                  }, 1000 * dauer);
                                                  if(timer2) clearTimeout(timer2);
                                                  timer2 = setTimeout(function() {
                                                      if (!tasterWestNord) setState(idLicht2, false);   //Wandtaster
                                                      timer2 = null;
                                                  }, 1000 * dauer);
                                              }
                                          });
                                          
                                          Asgothian 1 Reply Last reply Reply Quote 0
                                          • Asgothian
                                            Asgothian Developer @mguenther last edited by

                                            @mguenther
                                            Fein. Sorry für die gelöschten Posts, ich wollte Paul nicht auf ie Füße treten.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            993
                                            Online

                                            31.9k
                                            Users

                                            80.2k
                                            Topics

                                            1.3m
                                            Posts

                                            javascript
                                            3
                                            27
                                            1230
                                            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