Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Javaskript Datenpunkt mit Zeit für schedule() umformen

    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

    Javaskript Datenpunkt mit Zeit für schedule() umformen

    This topic has been deleted. Only users with topic management privileges can see it.
    • F
      fastfoot @OliverIO last edited by

      @oliverio nicht nur, auch die Klammern sind wichtig 😀 eine meiner ersten Begegnungen mit await, deshalb springt mir sowas sofort ins Auge

      1 Reply Last reply Reply Quote 0
      • G
        GuybrushThreepwood 0 @OliverIO last edited by GuybrushThreepwood 0

        @oliverio Danke für die Erläuterung, ich habe nach deinem ersten Post die Hilfe die im javascript-Adapter verlinkt ist nach split durchsucht und nichts gefunden. Der Teil zum Thema await war mir bislang nicht bekannt.

        Um das ganze Thema noch zum Abschluss zu bringen, könnt ihr mir noch sagen wie ich die Konstanten für hour und minute noch ersetzen kann? Ich habe die Konstanten einfach durch zwei interne Variablen ersetzt, was irgendwie nicht klappt.

        var h = 0 
        var m = 0
        
        async function convertTime() 
        {
            var time = (await getStateAsync('0_userdata.0.gardenaVentilbox.automatik.Startzeit')).val.split(":");
        
            h   = time[0];
            m = time[1];
        
            //console.log("Stunden: " + h);
            //console.log("Minuten: " + m);
        };
        
        schedule({hour: h, minute: m}, function () {
            log("funktioniert");    
        });
        OliverIO 1 Reply Last reply Reply Quote 0
        • OliverIO
          OliverIO @GuybrushThreepwood 0 last edited by OliverIO

          @guybrushthreepwood-0

          du wirst schedule erneut aufrufen müssen um den zeitrythmus zu ändern.
          den alten schedule musst du abmelden

          das könnte ungefähr so aussehen (ungetestet,blind geschrieben, da können noch fehler drin sein

          let mySchedule=null;
          on('0_userdata.0.gardenaVentilbox.automatik.Startzeit', function (obj) {
              let  time  = convertTime();
              if (mySchedule) clearSchedule(mySchedule);
          
              mySchedule = schedule({hour: time[0], minute:time[1]}, function () {
                  log("funktioniert");    
              });
          
          });
          
          async function convertTime() 
          {
              return (await getStateAsync('0_userdata.0.gardenaVentilbox.automatik.Startzeit')).val.split(":");
          };
          

          immer wenn sich die zeit im datenpunkt ändert wird der code nach on aufgerufen
          die zeit konvertiert
          geprüft ob es schon ein altes schedule gibt, wenn ja abgemeldet
          dann neues schedule gestartet und gemerkt
          dann bis zur nächsten änderung gewartet

          1 Reply Last reply Reply Quote 0
          • BananaJoe
            BananaJoe Most Active last edited by

            Der Fall nach dem Neustart muss auch beachtet werden - also

            let mySchedule=null;
            mySchedule = schedule({hour: time[0], minute:time[1]}, function () {
                    log("Start nach Skriptstart");    
                });
            
            on('0_userdata.0.gardenaVentilbox.automatik.Startzeit', function (obj) {
            

            einmal nach dem

            OliverIO 1 Reply Last reply Reply Quote 0
            • OliverIO
              OliverIO @BananaJoe last edited by OliverIO

              damit wir nix doppelt schreiben dann so
              bei dem async vor function newSchedule bin ich mir unsicher.

              let mySchedule = newSchedule();
              on('0_userdata.0.gardenaVentilbox.automatik.Startzeit', function (obj) {
                  if (mySchedule) clearSchedule(mySchedule);
                  mySchedule=newSchedule();
               });
              
              function newSchedule() {
                  let  time  = convertTime();
                  return schedule({hour: time[0], minute:time[1]}, function () {
                      log("funktioniert");    
                  });
              } 
              async function convertTime() 
              {
                  return (await getStateAsync('0_userdata.0.gardenaVentilbox.automatik.Startzeit')).val.split(":");
              };
              
              
              G 1 Reply Last reply Reply Quote 0
              • G
                GuybrushThreepwood 0 last edited by

                @oliverio

                Ich habe den Code übernommen und eine neue Logzeile eingefügt und das Skript wird ohne Fehlermeldung gespeichert. Die Änderung meiner Zeiteingabe wird erkannt und laut log funktioniert das Skript bis zur Zeile 9, hier erscheint die Fehlermeldung "javascript.0 (1535) script.js.common.gardenaVentilbox.ansteuerungVentilbox: schedule(cron=[object Object]): cannot create schedule"

                on('0_userdata.0.gardenaVentilbox.automatik.Startzeit', function (obj) 
                    {
                        log("neue Zeiteingabe erkannt"); 
                        let  time  = convertTime();
                
                        log("Zeitfunktion abmelden")       
                        if (mySchedule) clearSchedule(mySchedule);
                 
                        mySchedule = schedule({hour: time[0], minute: time[1]}, function () 
                        {
                        log("neue Zeitfunktion anlegen");    
                        });
                 
                    });
                
                1 Reply Last reply Reply Quote 0
                • G
                  GuybrushThreepwood 0 @OliverIO last edited by

                  @oliverio

                  let mySchedule = newSchedule();
                  on('0_userdata.0.gardenaVentilbox.automatik.Startzeit', function (obj) {
                      if (mySchedule) clearSchedule(mySchedule);
                      mySchedule=newSchedule();
                   });
                   
                  function newSchedule() {
                      let  time  = convertTime();
                      return schedule({hour: time[0], minute:time[1]}, function () {
                          log("funktioniert");    
                      });
                  } 
                  async function convertTime() 
                  {
                      return (await getStateAsync('0_userdata.0.gardenaVentilbox.automatik.Startzeit')).val.split(":");
                  };
                  

                  23:07:24.887 error javascript.0 (1535) script.js.common.gardenaVentilbox.ansteuerungVentilbox: ReferenceError: Cannot access 'mySchedule' before initialization

                  Für mich wird's langsam kompliziert....danke für die Nerven 😃

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

                    @guybrushthreepwood-0 sagte: Für mich wird's langsam kompliziert

                    Ich würde es so machen:

                    const idStartzeit = '0_userdata.0.gardenaVentilbox.automatik.Startzeit';
                    let mySchedule = null;
                    
                    function startSchedule(time) {
                        time = time.split(':');
                        mySchedule = schedule({hour: time[0], minute:time[1]}, function () {
                            log("funktioniert");    
                        });
                    }
                    
                    startSchedule(getState(idStartzeit).val); // Skriptstart
                    
                    on(idStartzeit, function(dp) {
                        if (mySchedule) clearSchedule(mySchedule);
                        startSchedule(dp.state.val);
                    });
                    
                    G 2 Replies Last reply Reply Quote 0
                    • G
                      GuybrushThreepwood 0 @paul53 last edited by

                      @paul53 Hat auf anhieb funktioniert...danke !

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

                        @paul53 Hallo nochmal, ich habe noch eine Frage zum Skript. Ich kann noch nicht nachvollziehen was in Zeile 13 mit dem "dp" gemeint ist. Hier wird einfach der Wert aus idStartzeit übergeben? Anschließend die bestehende schedule gelöscht und eine neue mit dem Aufruf der Funktion startSchedule angelegt.

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

                          @guybrushthreepwood-0 sagte: mit dem "dp" gemeint ist. Hier wird einfach der Wert aus idStartzeit übergeben?

                          dp enthält das komplette Datenpunkt-Objekt von "0_userdata.0.gardenaVentilbox.automatik.Startzeit". dp.state.val enthält den Wert, also die Startzeit.

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          829
                          Online

                          31.9k
                          Users

                          80.1k
                          Topics

                          1.3m
                          Posts

                          5
                          18
                          835
                          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