Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Hilfe bei Script Timer

    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

    Hilfe bei Script Timer

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

      Hallo zusammen,

      ich bin zur Zeit mal wieder ein wenig mit meine Anfänger Wissen am Programmieren.
      Benötige jetzt noch mal eure Hilfe.

      Ich lege in einem Script folgende Datenpunkte an:

      createState(pfad + '_beginn', "",{read: true, write: true, name: Info Start, type: "string", unit: "hh:mm"})
      

      Innerhalb des Scriptes möchte ich diese Uhrzeit dann nutzen um einen Timer zu setzen.

      let timerstunde = parseInt(getState(pfad + '_beginn').val.slice(0,2), 10)
      let timerminute = parseInt(getState(pfad + '_beginn').val.slice(3,5), 10)
      
      if (timer) clearSchedule(timer)
                  timer = on({
                      time: {
                          hour: timerstunde,
                          minute: timerminute
                          }
                  }, function () {
                     log (Testeintrag)
                       });
      

      Irgendwie fühlt es sich nicht so gut an hier den Weg um einen String zu gehen und diesen zu zerlegen.
      Gibt es eine bessere Methode dafür ?

      Gruß
      Michael

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

        @mctom sagte: Gibt es eine bessere Methode dafür ?

        In ein Array splitten:

        let arr = getState(pfad + '_beginn').val.split(':');
        
        if (timer) clearSchedule(timer);
        timer = schedule(arr[1] + ' ' + arr[0] + ' * * *', function() {
            log('Testeintrag');
        });
        
        M 1 Reply Last reply Reply Quote 0
        • M
          mctom @paul53 last edited by

          @paul53 vielen Dank für deine Hilfe.

          Da sind dann schon wieder ein paar Codezeilen weniger.

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

            @mctom sagte: ein paar Codezeilen weniger.

            ... und man kann in der Uhrzeit die führende 0 weglassen.

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

              @paul53 stimmt.

              vielleicht hast du noch eine Idee wie ich etwas umsetzen kann.
              Ich habe in diesem Script verschiedene Timer.

              Beispiel:

              Timer 1: 06:00
              Timer 2: 12:00
              Timer 3: 20:00
              Timer 4: 22:00

              Ich würde gerne prüfen welcher Timer der aktuell relevante ist.
              Heute mache ich das dann so:

              let Stundeaktuell   =   new Date().getHours()
                          let Minutenaktuell  =   new Date().getMinutes()
              
                          if (timerstunde <= Stundeaktuell){
                              if (timerminute <= Minutenaktuell){
                                  log ("Test")
                              }                    
                          }
              

              Das Problem ist hier aber, dass der mehrere Logeinträge erscheinen.
              Ich würde aber nur den einen gültigen haben.

              Ich hoffe man kann verstehen was ich meine.

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

                @mctom sagte: Ich hoffe man kann verstehen was ich meine.

                ?? Die aktuelle Timer-Uhrzeit steht doch im Datenpunkt.

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

                  @paul53 Vielleicht habe ich mich schlecht ausgedrückt.

                  Ich würde in einer Schleife Datenpunkte checken.

                  Beispiel:

                  Timer 1: 06:00 => Wert1
                  Timer 2: 12:00 => Wert 2
                  Timer 3: 20:00 => Wert 3
                  Timer 4: 22:00 => Wert 4

                  Aktuell ist es so dass erst im Log Wert 1 steht und dann Wert 2.
                  Ich würde aber gerne nur Wert 2 dort stehen haben.

                  So verständlicher ?

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

                    @mctom sagte: So verständlicher ?

                    Nein.
                    Zeige mal die Schleife, die zwei Werte ausgibt.

                    Einen Uhrzeitvergleich macht man so:

                    let Minutenaktuell = new Date().getMinutes() + 60 * new Date().getHours();
                     
                    if(60 * timerstunde + timerminute <= Minutenaktuell) {
                        log ("Test")
                    }
                    
                    M 1 Reply Last reply Reply Quote 0
                    • M
                      mctom @paul53 last edited by

                      Ja okay ich drücke mich etwas kompliziert aus daher hier noch mal der Versuch.

                      ab 06:00 Wert 1
                      ab 08:00 Wert 2
                      ab 15:00 Wert 3
                      ab 20:00 Wert 4
                      ab 22:00 Wert 5

                      Und ich möchte gerne wissen welcher Wert für die aktuelle Uhrzeit gültig ist.
                      Und meiner Methode taucht erst Wert 1 Wert2 Wert3 und dann der richtige Wert4 auf.
                      So besser ?

                      for (let countSlot = 0; countSlot < paProfileSlots[countRoom]; countSlot++) {
                                     
                                  
                                  let timerstunde = parseInt(getState(pfad + paRaeume[countRoom] + '.profil_'+ profil +'.' + countSlot + '_beginn').val.slice(0,2), 10)
                                  let timerminute = parseInt(getState(pfad + paRaeume[countRoom] + '.profil_'+ profil +'.' + countSlot + '_beginn').val.slice(3,5), 10)
                      
                                  let Stundeaktuell   =   new Date().getHours()
                                  let Minutenaktuell  =   new Date().getMinutes()
                      
                                  if (timerstunde <= Stundeaktuell){
                                      if (timerminute <= Minutenaktuell){
                                          setlocalTagetTemp(countRoom,profil,countSlot,'Timerset durchgeführt')
                                      }                    
                                  }
                              }
                      
                      paul53 1 Reply Last reply Reply Quote 0
                      • paul53
                        paul53 @mctom last edited by paul53

                        @mctom sagte: taucht erst Wert 1 Wert2 Wert3 und dann der richtige Wert4 auf.

                        Du möchtest den letzten countSlot der Schleife haben, bei dem die Bedingung erfüllt ist?

                        let Minutenaktuell = new Date().getMinutes() + 60 * new Date().getHours();
                        let last = 0;
                        for (let countSlot = 0; countSlot < paProfileSlots[countRoom]; countSlot++) {
                            let timer = getState(pfad + paRaeume[countRoom] + '.profil_'+ profil +'.' + countSlot + '_beginn').val.split(':');
                            let timerstunde = parseInt(timer[0], 10)
                            let timerminute = parseInt(timer[1], 10)
                          
                            if(60 * timerstunde + timerminute <= Minutenaktuell) {
                                last = countSlot;
                            }
                        }
                        setlocalTagetTemp(countRoom,profil,last,'Timerset durchgeführt');   
                        
                        M 1 Reply Last reply Reply Quote 0
                        • M
                          mctom @paul53 last edited by

                          @paul53
                          Hi, mir ist es im Altagstrubel durch die Lappen gegangen.
                          Danke für deine Hilfe. Es hat mir geholfen. Mein Script ist jetzt optimiert.

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          845
                          Online

                          31.8k
                          Users

                          80.0k
                          Topics

                          1.3m
                          Posts

                          2
                          11
                          493
                          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