Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] 3 BWMs ein Timer

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst] 3 BWMs ein Timer

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

      Ich habe 3 BWMs auf drei Etagen Eg, OG, DG

      Alle zusammen sollen eine Licht quelle Schalten ( Indirektes Licht im Treppenhaus )

      /**
       * Einschalten der Indirekten Beleuchtung im Treppenhaus
       * Regeln:
       * - Brenndauer 15min
       * - Melder werden überstimmt durch Hauptlicht in der jeweiligen Etage *  
       **/
      
       var interval = 15;
      
       var motionDetector_DG = "hm-rpc.1.NEQ0509829.6.SENSOR"/*BWM_FLUR_DG:6.SENSOR*/,
           motionDetector_OG = "hm-rpc.1.NEQ0509829.3.SENSOR"/*BWM_Indirektes_Licht_Flur_OG:3.SENSOR*/,
           motionDetector_EG = "hm-rpc.1.NEQ0509829.1.SENSOR"/*BWM_Hauptlicht_Flur_EG:1.SENSOR*/;
      
       var light_DG = "hm-rpc.1.MEQ0279026.13.STATE"/*Flur_DG_Licht:13.STATE*/,
           light_OG = "hm-rpc.1.NEQ0891202.19.STATE"/*Flur_OG_Licht:19.STATE*/,
           light_EG = "hm-rpc.1.NEQ0891532.15.STATE"/*Flur_EG_Licht:15.STATE*/;
      
       var indirectLight = "hm-rpc.1.NEQ0891532.16.STATE"/*EG_OG_DG_Indirekts_Licht:16.STATE*/;
      
       var counter = 900; // Counter in Sekunden angeben 
      
       var timer = false;
      
       // liefert Minuten in ms zurück
        function getMS(){
           var ms = interval * 60 * 1000;
           return ms;
       }
      
      function sleep (time) {
          // Wenn schon ein Timer existiert diesen löschen!
          if(timer !== false){
              timer = false;    
          }
          // bei jedem Aufruf einen neuen erstellen. Zeit resetten
          timer = new Promise((resolve) => setTimeout(resolve, time));
          return timer;
      }
      
      function triggerIndirectLight(){
          if(!getState(indirectLight).val){
              setState(indirectLight, true);
              log('Licht an');
          }
          sleep(getMS()).then(() => {
              setState(indirectLight, false);
              log('Licht aus');
          });
      }
      
      // DG
      on({id: motionDetector_DG}, function (obj) {
          if (!obj.state.val) {
              // NUr wenn das Hauptlicht aus ist, darf das Licht eingeschaltet werden.
              if(!getState(light_DG).val){
                  log('BWM Flur DG reagiert!');
                  triggerIndirectLight();
              }
          }
      });
      
      // OG
      on({id: motionDetector_OG}, function (obj) {
          if (!obj.state.val) {
              // NUr wenn das Hauptlicht aus ist, darf das Licht eingeschaltet werden.
              if(!getState(light_OG).val){
                  log('BWM Flur OG reagiert!');
                  triggerIndirectLight();
              }
          }
      });
      
      // EG
      on({id: motionDetector_EG}, function (obj) {
          if (!obj.state.val) {
              // NUr wenn das Hauptlicht aus ist, darf das Licht eingeschaltet werden.
              if(!getState(light_EG).val){
                  log('BWM Flur EG reagiert!');
                  triggerIndirectLight();
              }
          }
      });
      
      

      Mein Problem ist, dass die einzelnen Melder sich nicht den selben Timer zu teilen scheinen.

      Im Grunde möchte ich nur, dass jede Bewegung der 3 Melder den Timer zurücksetzt.

      An welcher stelle habe ich Pech beim denken? :oops:

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

        Könnte sein, dass deine Promise-Logik nicht ganz stimmt. Was du probieren kannst (halb JS, halb Pseudocode):

        var timer = null;
        
        bei Trigger:
            lichtAn();
            // Timer löschen, damit Licht an bleibt
            if (timer) clearTimeout(timer);
            // Timer neu setzen ab jetzt
            timer = setTimeout(dauerLichtAn, function() {
                timer = null; // Timer abgelaufen, jetzt löschen
                lichtAus(); // und Licht ausschalten
            });
        
        
        1 Reply Last reply Reply Quote 0
        • C
          Creator last edited by

          Danke für die Hilfe.

          Ich habe es jetzt hinbekommen.

          /**
           * Einschalten der Indirekten Beleuchtung im Treppenhaus
           * Regeln:
           * - Brenndauer 5min
           * - Melder werden überstimmt durch Hauptlicht in der jeweiligen Etage *  
           **/
          
           var interval = 5;
          
           var motionDetector_DG = "hm-rpc.1.NEQ0509829.6.SENSOR"/*BWM_FLUR_DG:6.SENSOR*/,
               motionDetector_OG = "hm-rpc.1.NEQ0509829.3.SENSOR"/*BWM_Indirektes_Licht_Flur_OG:3.SENSOR*/,
               motionDetector_EG = "hm-rpc.1.NEQ0509829.1.SENSOR"/*BWM_Hauptlicht_Flur_EG:1.SENSOR*/;
          
           var light_DG = "hm-rpc.1.MEQ0279026.13.STATE"/*Flur_DG_Licht:13.STATE*/,
               light_OG = "hm-rpc.1.NEQ0891202.19.STATE"/*Flur_OG_Licht:19.STATE*/,
               light_EG = "hm-rpc.1.NEQ0891532.15.STATE"/*Flur_EG_Licht:15.STATE*/;
          
           var indirectLight = "hm-rpc.1.NEQ0891532.16.STATE"/*EG_OG_DG_Indirekts_Licht:16.STATE*/;
          
           var timer = null;
          
           // liefert minuten in ms zurück
            function getMS(){
               var ms = interval * 60 * 1000;
               return ms;
           }
          
          function triggerIndirectLight(){
              if(!getState(indirectLight).val){
                  setState(indirectLight, true);
                  log('Indirektes Licht an');
              }
          
              // Timer löschen, damit Licht an bleibt
              if (timer){
                  clearTimeout(timer);
                  log('Reset Timer');
              } 
          
              // Timer neu setzen ab jetzt
              timer = setTimeout(function() {
                  timer = null; // Timer abgelaufen, jetzt löschen
                  setState(indirectLight, false);
                  log('Indirektes Licht aus');
              }, getMS());
          }
          
          // DG
          on({id: motionDetector_DG}, function (obj) {
              if (!obj.state.val) {
                  // NUr wenn das Hauptlicht aus ist, darf das Licht eingeschaltet werden.
                  if(!getState(light_DG).val){
                      log('BWM Flur DG reagiert!');
                      triggerIndirectLight();
                  }
              }
          });
          
          // OG
          on({id: motionDetector_OG}, function (obj) {
              if (!obj.state.val) {
                  // NUr wenn das Hauptlicht aus ist, darf das Licht eingeschaltet werden.
                  if(!getState(light_OG).val){
                      log('BWM Flur OG reagiert!');
                      triggerIndirectLight();
                  }
              }
          });
          
          // EG
          on({id: motionDetector_EG}, function (obj) {
              if (!obj.state.val) {
                  // NUr wenn das Hauptlicht aus ist, darf das Licht eingeschaltet werden.
                  if(!getState(light_EG).val){
                      log('BWM Flur EG reagiert!');
                      triggerIndirectLight();
                  }
              }
          });
          
          

          Etwas gemein war, das setTimeout() die Parameter genau umgekehrt erwartet.

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

            @Creator:

            Etwas gemein war, das setTimeout() die Parameter genau umgekehrt erwartet. `
            Ooops, ich verwechsel das immer. Zum Glück gibt's Auto-Vervollständigung in Entwicklungsumgebungen 😄

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

              Das wäre was für die StateMachine 🙂

              http://forum.iobroker.net/viewtopic.php?f=21&t=5556

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

              Support us

              ioBroker
              Community Adapters
              Donate

              785
              Online

              31.7k
              Users

              79.8k
              Topics

              1.3m
              Posts

              3
              5
              838
              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