Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. (gelöst) clearSchedule Frage

    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

    (gelöst) clearSchedule Frage

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

      Hallo zusammen,

      ich möchte mit folgendem Script mehrere Schedules auslösen:

      let timer = [['12 20 * * *','hm-rpc.0.123',true],['13 20 * * *','hm-rpc.0.123',false],['14 20 * * *','hm-rpc.0.123',true],['15 20 * * *','hm-rpc.0.123',false]];
      let schedules = [];
      
      for (let i = 0; i < timer.length; i++) {
          schedules[i] = schedule(timer[i][0], function () {
              log('Timer #' + i + ' (Gerät: '+ timer[i][1] +') hat ' + ((timer[i][2]) ? 'ein' : 'aus') + 'geschaltet', 'info');
              setState(timer[i][1] + '.3.STATE', timer[i][2]);
          });
          log('Timer #' + i + ' hinzugefügt', 'info');
      }
      
      on({id: '0_userdata.0.test.del_dp', change:'any'}, function (dp) {
          clearSchedule(schedules[dp.state.val]);
          log('Timer #' + dp.state.val + ' gelöscht', 'info');
      });
      

      lösche ich nun zwei oder mehr schedules mit jeweils dem Wert 0 per 0_userdata.0.test.del_dp erhalte ich den Fehler javascript.2 (309) script.js.test_1 compile failed: at script.js.test_1:24.
      Lösche ich nur einen, funktioniert die Ausführung weiterhin.

      Wie können am einfachsten mehrere schedules in einem Array gespeichert, gelöscht und wieder hinzugefügt werden, so dass es "nachhaltig" funktioniert? Hätte da ggf. jemand einen Tipp?

      System
      javascript v.5.2.13

      F T 2 Replies Last reply Reply Quote 0
      • F
        fastfoot @ice987 last edited by

        @ice987 sagte in clearSchedule Frage:

        lösche ich nun zwei oder mehr schedules

        wie machst dudas konkret? du kannst doch immer nur einen löschen, die Zahl in del_dp ist dann der timer

        ice987 1 Reply Last reply Reply Quote 0
        • ice987
          ice987 @fastfoot last edited by ice987

          @fastfoot

          Wenn ich das Script starte, sollten ja im array schedules vier Werte stehen: schedule1,schedule2,schedule3,schedule4

          Mit dem dp-wert lösche ich den jeweiligen schedule; z.b mit 0 den schedule 1 somit habe ich noch 3 werte/schedules: schedule2,schedule3,schedule4
          Dann den dp-wert 1, das array schedules besteht noch aus schedule2,schedule4.

          Oder funktioniert das nicht so?

          paul53 F 2 Replies Last reply Reply Quote 0
          • paul53
            paul53 @ice987 last edited by

            @ice987 sagte: Dann den dp-wert 1, das array schedules besteht noch aus schedule2,schedule4.

            Das Array wir durch clearSchedule() nicht verändert, sondern es wird nur das referenzierte Schedule gestoppt. Der dp-wert 1 stoppt das 2. Schedule.

            1 Reply Last reply Reply Quote 0
            • F
              fastfoot @ice987 last edited by

              @ice987 also das Löschen der einzelnen schedules funktioniert, eben getestet, allerdings ändert das ja nichts an deinem Array schedules, da bleiben die Inhalte erhalten(und sind nach dem Löschen auch ungültig, sprich können nicht noch einmal verwendet werden)

              1 Reply Last reply Reply Quote 0
              • T
                ticaki Developer @ice987 last edited by ticaki

                @ice987

                Ich würde es in einem Objekt speichern. Einfach weil die ID dann aussagekräftiger ist und man das ganze auch ein Jahr später mit einem Blick versteht. 🙂 (zumindest wenn man das Objekt nicht schedules nenn ^^)

                var schedules = {gartenpumpe: {id:'hm-rpc...', val:false, schedule: '1 * * * *', ref:null}}
                for (let i in schedules) {
                    schedules[i].ref = schedule(schedules[i].schedule, function () {
                        setState(schedules[i].id + '.3.STATE', schedules[i].val);
                    });
                

                Davon abgesehen hab ich aber keine Ahnung wieso du einen Fehler bekommst. Wenn ich mit schedule/timeout arbeite ist es immer so:

                if (schedules[dp.state.val]) {
                  clearSchedule(schedules[dp.state.val]);
                  schedules[dp.state.val] = null;
                }
                
                ice987 1 Reply Last reply Reply Quote 0
                • ice987
                  ice987 @ticaki last edited by

                  @ticaki @fastfoot @paul53 erstmals vielen Dank dass Ihr euch Zeit nehmt mir zu helfen!
                  Der Ansatz die schedule in einem Array zu speichern ist demnach machbar 🙂 .

                  @paul53 sagte in clearSchedule Frage:

                  @ice987 sagte: Dann den dp-wert 1, das array schedules besteht noch aus schedule2,schedule4.

                  Das Array wir durch clearSchedule() nicht verändert, sondern es wird nur das referenzierte Schedule gestoppt. Der dp-wert 1 stoppt das 2. Schedule.

                  das ist korrekt

                  @ticaki sagte in clearSchedule Frage:

                  Ich würde es in einem Objekt speichern. Einfach weil die ID dann aussagekräftiger ist und man das ganze auch ein Jahr später mit einem Blick versteht. 🙂 (zumindest wenn man das Objekt nicht schedules nenn ^^)

                  ist ein guter Ansatz, werde ich versuchen umzusetzen, sobald ich verstanden habe, wie das Speichern der schedule funktioniert 🤕

                  ich habe mein Script nun wie folgt umgeschrieben:

                  let timer = getState('0_userdata.0.test.switch.timer').val;
                  let schedules = [];
                  
                  main();
                  
                  function main() {
                      for (let i = 0; i < timer.length; i++) {
                          setSchedule(i)
                      }
                      log('schedules.length: ' + schedules.length, 'info');
                  }
                  
                  function setSchedule(i) {
                      schedules[i] = schedule(timer[i][0], function () {
                          log('Timer #' + i + ' (Gerät: '+ timer[i][1] +') hat ' + ((timer[i][2]) ? 'ein' : 'aus') + 'geschaltet', 'info');
                          setState(timer[i][1], timer[i][2]);
                      });
                      log('Timer #' + i + ' hinzugefügt', 'info');
                  }
                  
                  on({id: '0_userdata.0.test.switch.deleteID', change: 'any'}, function (dp) {
                      timer.splice(dp.state.val, 1);
                      clearSchedule(schedules[dp.state.val]);
                      log('Timer #' + dp.state.val + ' gelöscht', 'info');
                      setState('0_userdata.0.test.switch.timer', timer);
                  });
                  
                  //DP-SCHEMA: ["22 7 * * *","0_userdata.0.test.switch.switch",true]
                  on({id: '0_userdata.0.test.switch.addTimer', change: 'any'}, function (dp) {
                      timer.push(dp.state.val);
                      log('timer: ' + timer, 'info');
                      setSchedule(timer.length - 1);
                      setState('0_userdata.0.test.switch.timer', timer);
                  });
                  

                  im DP 0_userdata.0.test.switch.timer sind vier Elemente drin: [["16 20 * * *","0_userdata.0.test.switch.switch",true],["17 20 * * *","0_userdata.0.test.switch.switch",false],["18 20 * * *","0_userdata.0.test.switch.switch",true],["19 20 * * *","0_userdata.0.test.switch.switch",false]]

                  ich starte das Script, die Timer werden gesetzt. Lösche ich nun Timer 0, erhalte ich die Fehlermeldung wie folgt:

                  20:20:29.742	info	javascript.2 (257) Start javascript script.js.test_1
                  20:20:29.757	info	javascript.2 (257) script.js.test_1: Timer #0 hinzugefügt
                  20:20:29.763	info	javascript.2 (257) script.js.test_1: Timer #1 hinzugefügt
                  20:20:29.771	info	javascript.2 (257) script.js.test_1: Timer #2 hinzugefügt
                  20:20:29.772	info	javascript.2 (257) script.js.test_1: Timer #3 hinzugefügt
                  20:20:29.773	info	javascript.2 (257) script.js.test_1: schedules.length: 4
                  20:20:29.773	info	javascript.2 (257) script.js.test_1: registered 2 subscriptions and 4 schedules
                  20:22:00.019	info	javascript.2 (257) script.js.test_1: Timer #0 (Gerät: 0_userdata.0.test.switch.switch) hat eingeschaltet
                  20:23:00.018	info	javascript.2 (257) script.js.test_1: Timer #1 (Gerät: 0_userdata.0.test.switch.switch) hat ausgeschaltet
                  20:23:12.320	info	javascript.2 (257) script.js.test_1: Timer #0 gelöscht
                  20:24:00.016	info	javascript.2 (257) script.js.test_1: Timer #2 (Gerät: 0_userdata.0.test.switch.switch) hat ausgeschaltet
                  20:25:00.019	error	javascript.2 (257) at Object.<anonymous> (script.js.test_1:41:50)
                  

                  an was liegt das?

                  paul53 2 Replies Last reply Reply Quote 0
                  • paul53
                    paul53 @ice987 last edited by paul53

                    @ice987 sagte: an was liegt das?

                    Ist ein Skript unter der Gruppe "global" aktiv (Expertenmodus)?
                    Oder gibt es die Zeile 41 wirklich (weit unten)?

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

                      @paul53

                      Der Ordner global ist komplett leer.
                      Zeile 41 referenziert auf

                      log('Timer #' + i + ' (Gerät: '+ timer[i][1] +') hat ' + ((timer[i][2]) ? 'ein' : 'aus') + 'geschaltet', 'info');
                      

                      hab‘ oben im Script noch Kommentare rausgelöscht

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

                        @ice987 sagte: Zeile 41 referenziert auf

                        Das kann nicht die angemeckerte Zeile sein, denn in der wird nicht auf ein Objekt zugegriffen

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

                          @paul53

                          Irgendwie schon. Kommentiere ich diese Zeile aus, wird

                                  setState(timer[i][1], timer[i][2]);
                          

                          angemeckert…

                          T 1 Reply Last reply Reply Quote 0
                          • T
                            ticaki Developer @ice987 last edited by

                            @ice987

                            Das Problem ist ein Denkfehler 🙂

                            function setSchedule(i)
                            

                            das i ist das Problem, woher soll dieses i wissen das es nicht mehr 3 sondern 2 ist wenn du das array veränderst 🙂

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

                              @ice987 sagte:

                              timer.splice(dp.state.val, 1);
                              

                              ist das Problem, weil dann die ursprüngliche Referenz über i nicht mehr stimmt. Timer #3 existiert nicht mehr.

                              1 Reply Last reply Reply Quote 1
                              • ice987
                                ice987 last edited by

                                hmmm… hat was…
                                dann müsste ich, wenn ich einen lösche, immer alle schedules löschen und anschliessend neu anlegen… nicht sehr effizient

                                T 1 Reply Last reply Reply Quote 0
                                • T
                                  ticaki Developer @ice987 last edited by ticaki

                                  @ice987

                                  nein die Antwort von Paul bezeichnet zwar das Problem, verwirrt aber nur bei der Lösung.

                                  du übergibst aktuell den Index an deine Funktion und das ist keine Konstante da du das Array veränderst. Also übergebe den Inhalt des Arrayfeldes:

                                  for (let i = 0; i < timer.length; i++) {
                                          setSchedule(timer[i])
                                      }
                                  
                                  

                                  EDIT:

                                  Das oben wäre eine Art es zu beheben, zusätzlich mußt du auch noch die Art wie du die Referenz auf den Schedule speicherst ändern. Geht aber einfacher. In dem du die Array felder die nicht belegt sind auf null setzt und beim hinzufügen diese Felder wieder verwendest:

                                  let timer = getState('0_userdata.0.test.switch.timer').val;
                                  let schedules = [];
                                   
                                  main();
                                   
                                  function main() {
                                      for (let i = 0; i < timer.length; i++) {
                                          if (timer[i]) setSchedule(i)
                                      }
                                      log('schedules.length: ' + schedules.length, 'info');
                                  }
                                   
                                  function setSchedule(i) {
                                      if (!timer[i]) return; // nur zur sicherheit
                                      schedules[i] = schedule(timer[i][0], function () {
                                          log('Timer #' + i + ' (Gerät: '+ timer[i][1] +') hat ' + ((timer[i][2]) ? 'ein' : 'aus') + 'geschaltet', 'info');
                                          setState(timer[i][1], timer[i][2]);
                                      });
                                      log('Timer #' + i + ' hinzugefügt', 'info');
                                  }
                                   
                                  on({id: '0_userdata.0.test.switch.deleteID', change: 'any'}, function (dp) {
                                      timer[dp.state.val] = null;
                                      clearSchedule(schedules[dp.state.val]);
                                      log('Timer #' + dp.state.val + ' gelöscht', 'info');
                                      setState('0_userdata.0.test.switch.timer', timer);
                                  });
                                   
                                  //DP-SCHEMA: ["22 7 * * *","0_userdata.0.test.switch.switch",true]
                                  on({id: '0_userdata.0.test.switch.addTimer', change: 'any'}, function (dp) {
                                      let i = timer.length;
                                      while(--i >= 0) {
                                          if (!timer[i]) {
                                              timer[i] = dp.state.val;
                                              break;
                                          }
                                      }
                                      if (i == -1) {
                                          timer.push(dp.state.val);
                                          i = timer.length - 1;
                                      }
                                      log('timer: ' + timer, 'info');
                                      setSchedule(i)
                                      setState('0_userdata.0.test.switch.timer', timer);
                                  });
                                  
                                  ice987 1 Reply Last reply Reply Quote 1
                                  • ice987
                                    ice987 @ticaki last edited by

                                    @ticaki

                                    diese Lösung funktioniert perfekt! Vielen Dank für deine Hilfe! 🕺

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

                                    Support us

                                    ioBroker
                                    Community Adapters
                                    Donate

                                    614
                                    Online

                                    31.9k
                                    Users

                                    80.2k
                                    Topics

                                    1.3m
                                    Posts

                                    javascript
                                    4
                                    16
                                    439
                                    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