Navigation

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

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Funksteckdose per Bewegungsmelder schalten

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

      Hallo,

      habe mir einen Bewegungsmelder (HM-Sec-MDIR-2) und eine Funksteckdose (HM-ES-PMSw1-PI-DN-R1) gekauft.

      Ziel ist es, den Bewegungsmelder ins Bad zu stellen und damit über die Funksteckdose die Zirkulationspumpe zu schalten.

      Dazu habe ich mir folgendes Script "zusammen geklaut".

      // isTimeInRange
      function currentDate() {
          var d = new Date();
          return new Date(d.getFullYear(), d.getMonth(), d.getDate());
      }
      function addTime(strTime) {
          var time = strTime.split(':');
          var d = currentDate();
          d.setHours(time[0]);
          d.setMinutes(time[1]);
          d.setSeconds(time[2]);
          return d;
      }
      function isTimeInRange(strLower, strUpper) {
          var now = new Date();
          var lower = addTime(strLower);
          var upper = addTime(strUpper);
          var inRange = false;
          if (upper > lower) {
              // opens and closes in same day
              inRange = (now >= lower && now <= upper) ? true : false;
          } else {
              // closes in the following day
              inRange = (now >= upper && now <= lower) ? false : true;
          }
          return inRange;
      }
      // isTimeInRange ENDE
      
      createState('Warmwasser.Trigger', false, {
          name: 'Warmwasser bei Bewegung',
          type: 'boolean'
      });
      
      var idBewegung = "hm-rpc.0.MEQ0700004.1.MOTION", // Auslösender Bewegungsmelder
          idTrigger = 'Warmwasser.Trigger';
      
      setState("hm-rpc.0.NEQ0707005.1.STATE"/*Schalter-1.STATE*/,true); //Funksteckdose einschalten
      
      on({id: idBewegung, val: true}, function (obj) {
         if ( isTimeInRange('04:30:00', '08:00:00')) setState(idTrigger, true); // Trigger auslösen
      });
      
      // Zurücksetzen vom Trigger
      schedule("1 8 * * *", function () {
          setState(idTrigger, false);
      });
      
      

      Jetzt meinen Fragen als absoluter Anfänger in JavaScript.

      Wird das Programm nur einmal in der angegebenen Zeit ausgeführt?

      Schaltet der BW die Steckdose?

      Um es einmal zu testen, wo muss ich die Zeit ändern? Zum Beispiel zwischen 08:00 und 20:00? Das rot markierte?

      on({id: idBewegung, val: true}, function (obj) {

      if ( isTimeInRange('04:30:00', '08:00:00')) setState(idTrigger, true); // Trigger auslösen

      });

      // Zurücksetzen vom Trigger

      schedule("1 8 * * *", function () {

      setState(idTrigger, false);

      Gruss Superdad

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

        Hallo superdad,

        dein Skript schaltet die Variable bei der ersten Bewegung zwischen 4:30 Uhr und 8:00 Uhr. Um 08:01 setzt es die Variable wieder zurück.

        isTimeInRange('04:30:00', '08:00:00')
        ````liefert __true__, wenn die aktuelle Uhrzeit zwischen halb fünf und acht Uhr ist.
        

        schedule("1 8 * * *", function () {
        setState(idTrigger, false);
        });

        
        Für die Zeit zwischen 19:00 und 20:00 Uhr sollte es so aussehen:
        
        >! ````
        >! // isTimeInRange
        function currentDate() {
            var d = new Date();
            return new Date(d.getFullYear(), d.getMonth(), d.getDate());
        }
        function addTime(strTime) {
            var time = strTime.split(':');
            var d = currentDate();
            d.setHours(time[0]);
            d.setMinutes(time[1]);
            d.setSeconds(time[2]);
            return d;
        }
        function isTimeInRange(strLower, strUpper) {
            var now = new Date();
            var lower = addTime(strLower);
            var upper = addTime(strUpper);
            var inRange = false;
            if (upper > lower) {
                // opens and closes in same day
                inRange = (now >= lower && now <= upper) ? true : false;
            } else {
                // closes in the following day
                inRange = (now >= upper && now <= lower) ? false : true;
            }
            return inRange;
        }
        // isTimeInRange ENDE
        >! createState('Warmwasser.Trigger', false, {
            name: 'Warmwasser bei Bewegung',
            type: 'boolean'
        });
        >! var idBewegung = "hm-rpc.0.MEQ0700004.1.MOTION", // Auslösender Bewegungsmelder
            idTrigger = 'Warmwasser.Trigger';
        
        setState("hm-rpc.0.NEQ0707005.1.STATE"/*Schalter-1.STATE*/,true); //Funksteckdose einschalten
        
        on({id: idBewegung, val: true}, function (obj) {
           if ( isTimeInRange('19:00:00', '20:00:00')) setState(idTrigger, true); // Trigger auslösen
        });
        >! // Zurücksetzen vom Trigger
        schedule("1 20 * * *", function () {
            setState(idTrigger, false);
        });
        >! ````
        
        Gruß
        
        Pix
        1 Reply Last reply Reply Quote 0
        • S
          Superdad last edited by

          Danke dir für die schnelle Antwort.

          Habe ich ja mal was hin bekommen. Mit Hilfe des Forums.

          Jetzt frage ich mich aber, ob das Script nur einmal ausgeführt wird zwischen 04:30 und 08:00 Uhr?

          Ist das so richtig geschrieben?

          Und wenn ich das Script dann noch einmal zwischen 19:00 und 20:00 Uhr ausführen möchte, dann einfach?

          on({id: idBewegung, val: true}, function (obj) {
             if ( isTimeInRange('05:00:00', '06:00:00') || isTimeInRange('19:00:00', '20:00:00')) setState(idTrigger, true); // Trigger auslösen
          });
          

          Gruß

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

            Da mir aufgefallen ist, dass die Zirkulationspumpe jetzt von 4.30 - 8.00 Uhr durch läuft (zumindest nach meinem Verständnis als Anfänger), habe ich noch eine Ablaufzeit eingegeben.

            Hoffe, dass es so richtig ist.

            Vielleicht kann ja ein Profi mal drüber schauen?

            // isTimeInRange
            function currentDate() {
                var d = new Date();
                return new Date(d.getFullYear(), d.getMonth(), d.getDate());
            }
            function addTime(strTime) {
                var time = strTime.split(':');
                var d = currentDate();
                d.setHours(time[0]);
                d.setMinutes(time[1]);
                d.setSeconds(time[2]);
                return d;
            }
            function isTimeInRange(strLower, strUpper) {
                var now = new Date();
                var lower = addTime(strLower);
                var upper = addTime(strUpper);
                var inRange = false;
                if (upper > lower) {
                    // opens and closes in same day
                    inRange = (now >= lower && now <= upper) ? true : false;
                } else {
                    // closes in the following day
                    inRange = (now >= upper && now <= lower) ? false : true;
                }
                return inRange;
            }
            // isTimeInRange ENDE
            
            createState('Warmwasser.Trigger', false, {
                name: 'Warmwasser bei Bewegung',
                type: 'boolean'
            });
            
            var idBewegung = "hm-rpc.0.MEQ0700004.1.MOTION", // Auslösender Bewegungsmelder
                idTrigger = 'Warmwasser.Trigger';
            
            setState("hm-rpc.0.NEQ0707005.1.STATE"/*Schalter-1.STATE*/,true); //Funksteckdose einschalten
            setStateDelayed("hm-rpc.0.NEQ0707005.1.STATE", false, 10 * 60000); //Funksteckdose nach 10min. ausschalten
            
            on({id: idBewegung, val: true}, function (obj) {
               if ( isTimeInRange('04:30:00', '08:00:00')) setState(idTrigger, true); // Trigger auslösen
            });
            
            // Zurücksetzen vom Trigger
            schedule("1 8 * * *", function () {
                setState(idTrigger, false);
            });
            
            

            Gruss

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

              So hat es heute früh funktioniert.

              // isTimeInRange
              function currentDate() {
                  var d = new Date();
                  return new Date(d.getFullYear(), d.getMonth(), d.getDate());
              }
              function addTime(strTime) {
                  var time = strTime.split(':');
                  var d = currentDate();
                  d.setHours(time[0]);
                  d.setMinutes(time[1]);
                  d.setSeconds(time[2]);
                  return d;
              }
              function isTimeInRange(strLower, strUpper) {
                  var now = new Date();
                  var lower = addTime(strLower);
                  var upper = addTime(strUpper);
                  var inRange = false;
                  if (upper > lower) {
                      // opens and closes in same day
                      inRange = (now >= lower && now <= upper) ? true : false;
                  } else {
                      // closes in the following day
                      inRange = (now >= upper && now <= lower) ? false : true;
                  }
                  return inRange;
              }
              // isTimeInRange ENDE
              
              createState('Warmwasser.Trigger', false, {
                  name: 'Warmwasser bei Bewegung',
                  type: 'boolean'
              });
              
              var idBewegung = "hm-rpc.0.MEQ0700004.1.MOTION", // Auslösender Bewegungsmelder
                  idTrigger = 'Warmwasser.Trigger';
              
              setState("hm-rpc.0.NEQ0707005.1.STATE",true); //Funksteckdose einschalten
              setStateDelayed("hm-rpc.0.NEQ0707005.1.STATE", false, 10 * 60000); //Funksteckdose nach 10min. ausschalten
              
              on({id: idBewegung, val: true}, function (obj) {
                 if ( isTimeInRange('04:30:00', '08:00:00')) setState(idTrigger, true); // Trigger auslösen
              });
              
              // Zurücksetzen vom Trigger
              schedule("1 8 * * *", function () {
                  setState(idTrigger, false);
              });
              
              

              Kann man das eventuell kürzer fassen?

              Gruss

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

              Support us

              ioBroker
              Community Adapters
              Donate

              1.0k
              Online

              31.7k
              Users

              79.8k
              Topics

              1.3m
              Posts

              2
              5
              1013
              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