NEWS
(gelöst) clearSchedule Frage
-
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
per0_userdata.0.test.del_dp
erhalte ich den Fehlerjavascript.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 -
@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
-
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 ausschedule2,schedule4
.Oder funktioniert das nicht so?
-
@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.
-
@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)
-
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; }
-
@ticaki @fastfoot @paul53 erstmals vielen Dank dass Ihr euch Zeit nehmt mir zu helfen!
Der Ansatz dieschedule
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
funktioniertich 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?
-
@ice987 sagte: an was liegt das?
Ist ein Skript unter der Gruppe "global" aktiv (Expertenmodus)?
Oder gibt es die Zeile 41 wirklich (weit unten)? -
Der Ordner global ist komplett leer.
Zeile 41 referenziert auflog('Timer #' + i + ' (Gerät: '+ timer[i][1] +') hat ' + ((timer[i][2]) ? 'ein' : 'aus') + 'geschaltet', 'info');
hab‘ oben im Script noch Kommentare rausgelöscht
-
@ice987 sagte: Zeile 41 referenziert auf
Das kann nicht die angemeckerte Zeile sein, denn in der wird nicht auf ein Objekt zugegriffen
-
Irgendwie schon. Kommentiere ich diese Zeile aus, wird
setState(timer[i][1], timer[i][2]);
angemeckert…
-
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
-
@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.
-
hmmm… hat was…
dann müsste ich, wenn ich einen lösche, immer alle schedules löschen und anschliessend neu anlegen… nicht sehr effizient -
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); });
-
diese Lösung funktioniert perfekt! Vielen Dank für deine Hilfe!