Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. (gelöst) clearSchedule Frage

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    2.0k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    924

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

(gelöst) clearSchedule Frage

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascript
16 Beiträge 4 Kommentatoren 838 Aufrufe 3 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • ice987I Offline
    ice987I Offline
    ice987
    schrieb am zuletzt editiert von ice987
    #1

    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

    husqvarna-automower, meteoblue, wiserbyfeller, spritmonitor

    F T 2 Antworten Letzte Antwort
    0
    • ice987I 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 Offline
      F Offline
      fastfoot
      schrieb am zuletzt editiert von
      #2

      @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

      iobroker läuft unter Docker auf QNAP TS-451+
      SkriptRecovery: https://forum.iobroker.net/post/930558

      ice987I 1 Antwort Letzte Antwort
      0
      • F fastfoot

        @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

        ice987I Offline
        ice987I Offline
        ice987
        schrieb am zuletzt editiert von ice987
        #3

        @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?

        husqvarna-automower, meteoblue, wiserbyfeller, spritmonitor

        paul53P F 2 Antworten Letzte Antwort
        0
        • ice987I 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?

          paul53P Offline
          paul53P Offline
          paul53
          schrieb am zuletzt editiert von
          #4

          @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.

          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

          1 Antwort Letzte Antwort
          0
          • ice987I 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?

            F Offline
            F Offline
            fastfoot
            schrieb am zuletzt editiert von
            #5

            @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)

            iobroker läuft unter Docker auf QNAP TS-451+
            SkriptRecovery: https://forum.iobroker.net/post/930558

            1 Antwort Letzte Antwort
            0
            • ice987I 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

              T Nicht stören
              T Nicht stören
              ticaki
              schrieb am zuletzt editiert von ticaki
              #6

              @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;
              }
              

              Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

              Spenden

              ice987I 1 Antwort Letzte Antwort
              0
              • T 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;
                }
                
                ice987I Offline
                ice987I Offline
                ice987
                schrieb am zuletzt editiert von
                #7

                @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 :face_with_head_bandage:

                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?

                husqvarna-automower, meteoblue, wiserbyfeller, spritmonitor

                paul53P 2 Antworten Letzte Antwort
                0
                • ice987I ice987

                  @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 :face_with_head_bandage:

                  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?

                  paul53P Offline
                  paul53P Offline
                  paul53
                  schrieb am zuletzt editiert von paul53
                  #8

                  @ice987 sagte: an was liegt das?

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

                  Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                  Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                  ice987I 1 Antwort Letzte Antwort
                  0
                  • paul53P 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)?

                    ice987I Offline
                    ice987I Offline
                    ice987
                    schrieb am zuletzt editiert von
                    #9

                    @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

                    husqvarna-automower, meteoblue, wiserbyfeller, spritmonitor

                    paul53P 1 Antwort Letzte Antwort
                    0
                    • ice987I ice987

                      @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

                      paul53P Offline
                      paul53P Offline
                      paul53
                      schrieb am zuletzt editiert von
                      #10

                      @ice987 sagte: Zeile 41 referenziert auf

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

                      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                      ice987I 1 Antwort Letzte Antwort
                      0
                      • paul53P paul53

                        @ice987 sagte: Zeile 41 referenziert auf

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

                        ice987I Offline
                        ice987I Offline
                        ice987
                        schrieb am zuletzt editiert von
                        #11

                        @paul53

                        Irgendwie schon. Kommentiere ich diese Zeile aus, wird

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

                        angemeckert…

                        husqvarna-automower, meteoblue, wiserbyfeller, spritmonitor

                        T 1 Antwort Letzte Antwort
                        0
                        • ice987I ice987

                          @paul53

                          Irgendwie schon. Kommentiere ich diese Zeile aus, wird

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

                          angemeckert…

                          T Nicht stören
                          T Nicht stören
                          ticaki
                          schrieb am zuletzt editiert von
                          #12

                          @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 :)

                          Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                          Spenden

                          1 Antwort Letzte Antwort
                          0
                          • ice987I ice987

                            @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 :face_with_head_bandage:

                            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?

                            paul53P Offline
                            paul53P Offline
                            paul53
                            schrieb am zuletzt editiert von paul53
                            #13

                            @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.

                            Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                            Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                            1 Antwort Letzte Antwort
                            1
                            • ice987I Offline
                              ice987I Offline
                              ice987
                              schrieb am zuletzt editiert von
                              #14

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

                              husqvarna-automower, meteoblue, wiserbyfeller, spritmonitor

                              T 1 Antwort Letzte Antwort
                              0
                              • ice987I ice987

                                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 Nicht stören
                                T Nicht stören
                                ticaki
                                schrieb am zuletzt editiert von ticaki
                                #15

                                @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);
                                });
                                

                                Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                                Spenden

                                ice987I 1 Antwort Letzte Antwort
                                1
                                • T 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);
                                  });
                                  
                                  ice987I Offline
                                  ice987I Offline
                                  ice987
                                  schrieb am zuletzt editiert von
                                  #16

                                  @ticaki

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

                                  husqvarna-automower, meteoblue, wiserbyfeller, spritmonitor

                                  1 Antwort Letzte Antwort
                                  0
                                  Antworten
                                  • In einem neuen Thema antworten
                                  Anmelden zum Antworten
                                  • Älteste zuerst
                                  • Neuste zuerst
                                  • Meiste Stimmen


                                  Support us

                                  ioBroker
                                  Community Adapters
                                  Donate

                                  713

                                  Online

                                  32.6k

                                  Benutzer

                                  82.2k

                                  Themen

                                  1.3m

                                  Beiträge
                                  Community
                                  Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                  ioBroker Community 2014-2025
                                  logo
                                  • Anmelden

                                  • Du hast noch kein Konto? Registrieren

                                  • Anmelden oder registrieren, um zu suchen
                                  • Erster Beitrag
                                    Letzter Beitrag
                                  0
                                  • Home
                                  • Aktuell
                                  • Tags
                                  • Ungelesen 0
                                  • Kategorien
                                  • Unreplied
                                  • Beliebt
                                  • GitHub
                                  • Docu
                                  • Hilfe