Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Frage: isTimeInRange umschreiben auf Datum

    NEWS

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    Frage: isTimeInRange umschreiben auf Datum

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

      Hallo pix,

      recht herzlichen Dank für deinen Lösungsvorschlages und anhand deiner Beiträge würde ich sagen du stehst voll im Stoff mit Javascript.

      Funktioniert soweit erstmal, habe es als Globales Script angelegt genauso wie isTimeInRange.

      Ich habe jetzt einiges ausprobiert und hänge gerade bei meiner Weihnachtsbeleuchtung für außen.

      Dort will ich ein Zeitbereich und Datumsbereich gleichzeitig abfragen aber ich bekomme es nicht hin.

      Hast du vielleicht noch ein paar Beispiele?

      Danke und weiterhin gutes Gelingen mit Iobroker

      Sebastian

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

        Hallo,

        du kannst für die Weihnachtsbeleuchtung auch mit schedule schalten.

        Nehmen wir an, sie soll vom 01.12.2016 bis 10.01.2017 einschalten. Dazu setzt du am 1. Dezember eine Variable "Weihnachtsbeleuchtung" mit schedule auf true und am 10. Januar wieder auf false. Zur Sicherheit vielleicht nochmal am 2. und 3. Dezeber auf true, falls dein System am 1.12. nicht läuft….

        createState('Weihnachtsbeleuchtung', false, {
        name: 'Soll Weihnahctsbeleuchtung eingeschaltet werden',
        type: 'boolean'});
        
        var idLicht = 'javascript.0.Weihnachtsbeleuchtung';
        
        schedule("0 0 1 12 * ", function() { // 1.12\. Mitternacht
            setState(idLicht, true);
        });
        
        schedule("0 0 10 1 * ", function() { // 10.1\. Mitternacht
            setState(idLicht, false);
        });
        
        

        Wenn du jetzt dein Licht abends einschaltest (per Javascript [Wandtasterabfrage, Fernbedienung, …] oder auch über schedule), baust du immer die Abfrage mit ein:

        if (getState(idLicht).val) {
            // Befehl zum Einschalten
        }
        
        ````Dann wird das Licht nur eingeschaltet, wenn die Variable __'Weihnachtsbeleuchtung'__ auf true steht.
        
        Gruß
        
        Pix
        1 Reply Last reply Reply Quote 0
        • Eisbaeeer
          Eisbaeeer Developer last edited by

          @pix:

          Zum Aufruf ein deutsches Datumsformat DD.MM.JJJJ nutzen. Zweites Datum muss später als erstes sein.

          on (idTrigger,function(obj){
             if (isDateInRange('01.04.2016', '05.04.2016')) log('Date is in Range');
             else log('Date is not in Range');
          });
          
          

          Gruß,

          Pix `

          Hallo Pix

          habe gerade dein Script in der Sammlung gefunden. Hab mich jetzt auf die Schnelle noch nicht in das Script eingelesen. Hast du auch eine Lösung für das "Standard" Datumsformat, welches ja VIS mit den Widgets von Haus aus mitbringt, wenn man z.B. "ctrl - input date" verwendet. Dann sieht das ganze in iobroker so aus:

          139_datum.png

          Gruß Eisbaeeer

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

            Hallo,

            @Eisbaeeer:

            Hast du auch eine Lösung für das "Standard" Datumsformat, welches ja VIS mit den Widgets von Haus aus mitbringt, wenn man z.B. "ctrl - input date" verwendet. Dann sieht das ganze in iobroker so aus:

            filename="Datum.png" index="0">~~

            Gruß Eisbaeeer `

            Das wurde geändert für die Eingabe in amerikanischem Datumsformat.

            function addDate(strDate) {
                var date = strDate.split('-');
                var d = currentDate2();
                d.setDate(date[2]);
                d.setMonth(date[1]-1);
                d.setFullYear(date[0]);
                return d;
            }
            
            

            Aufruf

            on (idTrigger,function(obj){
               if (isDateInRange('2016-05-16', '2016-05-17')) log('Date is in Range');
               else log('Date is not in Range');
            });
            

            Gruß

            Pix

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

              Hallo Pix

              Ich habe jetzt auch mal Dein Script "Datum in Bereich" ausprobiert.

              Dabei ist mir aufgefallen, dass wenn der aktuelle Tag mit dem letzen Tag des Bereichs übereinstimmt bereits "false" ausgegeben wird.

              In der Funktion "IsDateInRange" wird die Variable "now" mit````
              var now = new Date();

              
              Mit````
              new Date()
              ````wird auch immer die aktuelle Zeit übergeben.
              
              Dadurch wird die Bedingung````
              "....&& now <= upper..."
              ````nicht erfüllt wenn das Tagesdatum gleich ist.
              
              Mit der Zuweisung````
              var now = currentDate2();
              ````klappt es einwandfrei.
              
              

              //var now = new Date();
              var now = currentDate2();
              var lower = addDate(strLower);
              var upper = addDate(strUpper);
              var inRange = false;
              if (upper > lower) inRange = (now >= lower && now <= upper) ? true : false;
              else log('isDateInRange meldet Fehler! "von"-Datum ist nicht früher als "bis"-Datum', 'error');
              return inRange;

              
              Grüße
              1 Reply Last reply Reply Quote 0
              • M
                Mihaeru last edited by

                @rantanplan:

                Mit der Zuweisungvar now = currentDate2();klappt es einwandfrei. `

                Auch eine Idee. Alternativ kann man auch einfach das upper Datum um einen Tag erhöhen. Dann kann man currentDate2 auch ganz weglassen:

                function createDate(strDate) {
                    var date = strDate.split('.');
                    var d =  new Date(date[2], date[1]-1, date[0]);    
                    return d;
                }
                function isDateInRange(strLower, strUpper) {
                    var now = new Date();
                    var lower = createDate(strLower);
                    var upper = createDate(strUpper);
                    upper.setDate(upper.getDate() + 1);
                    var inRange = false;
                    if (upper > lower) inRange = (now >= lower && now <= upper) ? true : false;
                    else log('isDateInRange meldet Fehler! "von"-Datum ist nicht früher als "bis"-Datum', 'error');
                    return inRange;
                }
                
                1 Reply Last reply Reply Quote 0
                • Mic
                  Mic Developer last edited by Mic

                  Hi,

                  danke für die Scripts hier. Da ich es aktuell brauchte, habe ich es etwas optimiert.

                  /**
                   * Abfrage, ob ein Datum innerhalb eines Bereichs ist.
                   * Angeregt von: https://forum.iobroker.net/topic/2289/
                   * Zum Aufruf ist das ISO-Datumsformat JJJJ-MM-TT erforderlich, z.B. 2019-12-24.
                   * Autor: Mic
                   * Version: 0.1 - 28-Apr-2019
                   * Gepostet unter: https://forum.iobroker.net/post/256400
                   * @param {string}   strDateToCheck       Das zu prüfende Datum; 
                   *                                        Falls aktuelles Datum geprüft werden soll: 'now' eingeben.
                   * @param {string}   strDateFirst         Datum: Zeitraum erster Tag.
                   * @param {string}   strDateLast          Datum: Zeitraum letzter Tag.
                   */
                  function isDateInRange(strDateToCheck, strDateFirst, strDateLast) {
                      // Prepare the date we want to check. Either current date, or provided date in variable strDateToCheck
                      let dtToCheck;
                      if (strDateToCheck == 'now') {
                          dtToCheck = new Date();
                      } else {
                           dtToCheck = new Date(strDateToCheck);
                      }
                      dtToCheck.setHours(0, 0, 0, 0); // Same basis for hours, minutes etc. as for all dates
                      let dtFirst = new Date(strDateFirst);
                      dtFirst.setHours(0, 0, 0, 0);
                      let dtLast = new Date(strDateLast);
                      dtLast.setHours(0, 0, 0, 0);
                      let isInRange = false;
                      if (dtLast < dtFirst) {
                          // We need to swap the variables since user mixed up first and last date.
                          let dtTempFirst = dtFirst;
                          dtFirst = dtLast;
                          dtLast = dtTempFirst;
                          log('Function isDateInRange: first date is later than last date, but the function corrected this accordingly.', 'debug');
                      }
                      if ( (dtToCheck >= dtFirst) && (dtToCheck <= dtLast) )  {
                          isInRange = true;
                      }
                      return isInRange;
                  }
                  

                  Aufruf A: Prüfen ob aktuelles Datum innerhalb des Zeitraums 20.-30.04.liegt:

                  let res = isDateInRange('now', '2019-04-20', '2019-04-30');
                  

                  Aufruf B: Prüfen ob das Datum "25.04.2019" innerhalb des Zeitraums 20.-30.04. liegt:

                  let res = isDateInRange('2019-04-25', '2019-04-20', '2019-04-30');
                  
                  1 Reply Last reply Reply Quote 0
                  • G
                    gutgut30 @webseb79 last edited by

                    @webseb79 said in Frage: isTimeInRange umschreiben auf Datum:

                    Guten Abend liebes Forum,

                    in diesem Beitrag

                    http://forum.iobroker.org/viewtopic.php?t=1072

                    wird ein Script vorgestellt wo es um die Funktion zur Prüfung eines Zeitfenster geht.

                    Meine Frage ist, ob es möglich ist dieses Script umzuschreiben und auf ein Datumsbereich zu prüfen?

                    Danke im voraus

                    Sebastian

                    Gibt es das Script "isTimeInRange()" noch irgendwo zum kopieren?

                    Codierknecht 1 Reply Last reply Reply Quote 0
                    • Codierknecht
                      Codierknecht Developer Most Active @gutgut30 last edited by

                      @gutgut30 sagte in Frage: isTimeInRange umschreiben auf Datum:

                      Gibt es das Script "isTimeInRange()" noch irgendwo zum kopieren?

                      Ja - einen Beitrag über Deinem 😉

                      G 1 Reply Last reply Reply Quote 0
                      • G
                        gutgut30 @Codierknecht last edited by

                        @codierknecht Oh je, da war ich richtig blind. Danke 🙂

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        941
                        Online

                        31.6k
                        Users

                        79.4k
                        Topics

                        1.3m
                        Posts

                        8
                        12
                        3287
                        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