NEWS
Javascript Schedule Start-End wann ist der letzte Lauf
-
Ich habe jetzt mal versucht, die Zeit "19:00" und "19:30" in Sekunden und auch in Millisekunden umzuwandeln und diese Werte in dem Skript aus dem Link eingetragen. Beim Speichern wird zwar kein Fehler angezeigt, das Skript wird aber auch nicht ausgeführt. Mit der funktion new date geht es natürlich. Aber da ist dann halt auch der Datumsteil dabei, was für heute okay ist, aber nicht mehr für morgen.
Und in der schedule function des Javascript Adapters schaffe ich es nicht das Event nextInvocation abzufangen. -
Zeige mal das was du da wie geschrieben hast.
Das Beispiel im link zeigt was zu einem extra Node Modul, was so direkt mit iobroker Nix zu tun hat.
Mn kann die Bibliothek zwar verwenden, muss dieses aber nochmal extra registrieren
Welches schedule meinst du da genau? -
@trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:
aber auch nicht ausgeführt.
Natürlich nicht!
@trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:
da ist dann halt auch der Datumsteil dabei,
und den braucht ein Unix Timestamp!
@trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:
aber nicht mehr für morgen.
warum nicht?
Nimm den Timestamp des jeweiligen Tages um 00:00 und rechne
@trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:
die Zeit "19:00" und "19:30" in Sekunden und auch in Millisekunden umzuwandeln
hinzu
PS Solange du nicht zeigst, was du da genau tust, wird dir such niemand spezifisch helfen können
-
@oliverio sagte: zu einem extra Node Modul, was so direkt mit iobroker Nix zu tun hat.
Das Modul "node-schedule" ist Teil des Javascript-Adapters.
-
@paul53
W
Das wusste ich tatsächlich nicht, aber so wie es dort beschrieben wird kann man es im iobroker nicht verwenden.aber das werden wir erst sehen wenn er seinen Code zeigt.
-
@homoran
Hier ist soweit mein Code, angelehnt an das Beispiel aus dem Netz.const schedule = require('node-schedule'); const EventEmitter = require('events'); class Ee extends EventEmitter {} const jobStatus = new Ee(); jobStatus.on('finished', () => { console.log('JOB FINISHED'); job.cancel(); // Preform your DB Operations here (in your case: delete job from database) }); function calcSecondsFromTime(time){ //console.log("Time: " + time); var array = time.split(":"); var seconds = 0; if(typeof(array[2] = "undefined")){ seconds = (parseInt(array[0], 10) * 60 * 60) + (parseInt(array[1], 10) * 60); } else { seconds = (parseInt(array[0], 10) * 60 * 60) + (parseInt(array[1], 10) * 60) + parseInt(array[2], 10); } //console.log("Array: "+ array.length +" Seconds: " + seconds); //console.log(array[0] +" -- " + array[1] +" -- " + array[2] +" -- " ); return seconds; } //So funktioniert das nicht. const strStart = "20:10" const strEnd = "21:15" const startTime = calcSecondsFromTime(strStart); const endTime = calcSecondsFromTime(strEnd); log("StartTime: " + startTime,"info"); log("EndTime: " + endTime, "info"); /* //So funktioniert das. const startTime = new Date(Date.now() + 5000); const endTime = new Date(startTime.getTime() + 5000); */ const job = schedule.scheduleJob({ start: startTime, end: endTime, rule: '*/1 * * * * *' }, function(){ console.log('Time for tea!'); if (this.nextInvocation() === null) { //here you can code whatever you need to do in the last invocation jobStatus.emit('finished'); // Emit your job done emitter when you are done. } });
Das mit dem jeweiligen Timestamp um Mitternacht setzt immer eine Bearbeitung voraus. Mein Ziel ist es aber einmal Start und Ende als hh:mm anzugeben und dann nicht mehr.
Wenn ich in Blockly den Wizard vom kleinen Cron Bauteil nehme, kann ich da Start und Endzeit eingeben.
Dann kommt als JS sowas raus:
'{"time":{"start":"08:00","end":"20:00","mode":"minutes","interval":2},"period":{"days":1}}'
Und das habe ich mit den Werten aus den Objekten nachgebaut und es funktioniert.Hier ist mein Ansatz als Blockly. Den Teil mit nextInvocation ist in der function createSchedule als Block auskommentiert, da er Fehler schmeißt und den Adapter zum Neustart zwingt.
var cronConditions, modus, conditions, rootdp, ObjectID, var_CronConditions, dp, var_Raum, schedule1; // Beschreibe diese Funktion … async function getSchedule() { const list = getSchedules(false); list.forEach(schedule => log(JSON.stringify(schedule))); } // Beschreibe diese Funktion … async function createSchedule(cronConditions) { let testSched = null; const EventEmitter = require('events'); class Ee extends EventEmitter {} const jobStatus = new Ee(); //log("cronConditions: " + cronConditions,"info"); jobStatus.on('finished', () => { console.log('JOB FINISHED'); job.cancel(); // Preform your DB Operations here (in your case: delete job from database) }); (() => { if (testSched) { clearSchedule(testSched); testSched = null; }})(); //log("TestSchedCond: " + cronConditions,"warn"); console.info('Hier wird der TESTScheduler gesetzt'); (() => { if (testSched) { clearSchedule(testSched); testSched = null; }})(); testSched = schedule((await buildCronRule('time', cronConditions)), function() { console.info('Hier läuft der TESTTrigger'); /* if (this.nextInvocation() === null) { //here you can code whatever you need to do in the last invocation jobStatus.emit('finished'); // Emit your job done emitter when you are done. } */ }); } // Beschreibe diese Funktion … async function buildCronRule(modus, conditions) { let result = ""; let resultStart = ""; let ovalPeriod = ""; conditions.forEach(function (line,index, array) { /* '{"time":{"start":"08:00","end":"20:00","mode":"minutes","interval":2},"period":{"days":1}}' */ let okey = Object.keys(line); let oval = line[okey]; okey = okey.toString().replace(/\s+/g, ''); //log(okey,"info"); if(okey == "period"){ okey = stringQuote({strVariable: okey}); //log("okey is: ","info"); ovalPeriod = ovalPeriod.concat(okey,":", oval); } else if(okey != "period") { okey = stringQuote({strVariable: okey}); if(typeof oval == "string"){ oval = stringQuote({strVariable: oval}); } //log(okey,"warn"); //log("Val: " + oval + " | typeof: "+ typeof oval,"info"); if(index === array.length -1){ result =result.concat(okey,":", oval); } else { result =result.concat(okey,":", oval,","); } } }); result = stringQuote({strVariable: result,strQuote: "{}", boolSplitQuote: true}); //log(ovalPeriod,"warn"); switch(modus){ case "time": resultStart = "time"; default: resultStart = "time"; } resultStart = stringQuote({strVariable: resultStart}); resultStart = "".concat(resultStart,":") ; result = "".concat(resultStart, result,",", ovalPeriod); result = stringQuote({strVariable:result,strQuote:"{}",boolSplitQuote: true }) ; //log(result,"warn"); return result; } // Beschreibe diese Funktion … async function getCronConditions(rootdp) { let result = []; log("getCronConds","warn"); const dps = $(rootdp).toArray(); log(dps); dps.forEach((id) => { const dpval = getState(id).val; const dp = splittVariable(id,"last","."); let obj = {}; obj[dp] = dpval; result.push(obj); }); //log(result,"warn"); return result; } // Beschreibe diese Funktion … async function gl_leseRaum(ObjectID) { let room = leseRaum(ObjectID); return room; } // Beschreibe diese Funktion … async function runTest(dp) { console.info('Hier wird der Scheduler gesetzt'); (() => { if (schedule1) { clearSchedule(schedule1); schedule1 = null; }})(); schedule1 = schedule((await buildCronRule('time', var_CronConditions)), async () => { console.info('Hier läuft der Trigger'); }); await getSchedule(); } var_CronConditions = await getCronConditions('0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*'); console.info((await buildCronRule('time', var_CronConditions))); console.info(var_CronConditions); await createSchedule(var_CronConditions); await getSchedule(); on({ id: [].concat(Array.prototype.slice.apply($('state[state.id=0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*]'))), change: 'any' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; var_CronConditions = await getCronConditions('0_userdata.0.Rolladen.Allgemein.Schatten.cronConditions.*'); await runTest(var_CronConditions); }); //JTNDeG1sJTIweG1sbnMlM0QlMjJodHRwcyUzQSUyRiUyRmRldmVsb3BlcnMuZ29vZ2xlLmNvbSUyRmJsb2NrbHklMkZ4bWwlMjIlM0UlM0N2YXJpYWJsZXMlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyYyU1QiUzQVd3aiU3QnNpd3JOJTJGRiU1RSglNjBoTHclMjIlM0Vjcm9uQ29uZGl0aW9ucyUzQyUyRnZhcmlhYmxlJTNFJTNDdmFyaWFibGUlMjBpZCUzRCUyMlVRaCUyNVMhJTVERyU3Qig4UUU3YW9SRkNvJTIyJTNFbW9kdXMlM0MlMkZ2YXJpYWJsZSUzRSUzQ3ZhcmlhYmxlJTIwaWQlM0QlMjJtUnhrcSklNUQxMUclMkYqVlglNDBxdkxkRCUyMiUzRWNvbmRpdGlvbnMlM0MlMkZ2YXJpYWJsZSUzRSUzQ3ZhcmlhYmxlJTIwaWQlM0QlMjJvNk51LUZjQnZEMyUyNHIlMkYlN0QuanElNjAqJTIyJTNFcm9vdGRwJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyTSU2MGZyOS1hRyUzQVMlMkNLcSh4JTVFYTkoLiUyMiUzRU9iamVjdElEJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyNVElMkNXQkYlNUJtJTIzJTJGSCUyQ2tPIXglN0M4NCU1RCUyMiUzRWRwJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMGlkJTNEJTIyQSUyNHpKJTNELm9hLkslN0MlMkM4MCUzRFclMjRTJTQwRyUyMiUzRXZhcl9SYXVtJTNDJTJGdmFyaWFibGUlM0UlM0N2YXJpYWJsZSUyMHR5cGUlM0QlMjJjcm9uJTIyJTIwaWQlM0QlMjJzY2hlZHVsZTElMjIlM0VzY2hlZHVsZTElM0MlMkZ2YXJpYWJsZSUzRSUzQyUyRnZhcmlhYmxlcyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMkZiKE9oV3BGJTdEbmMlM0ZHZDB0ODIlMjQpJTIyJTIweCUzRCUyMjYzJTIyJTIweSUzRCUyMjM4JTIyJTNFJTNDbXV0YXRpb24lMjBzdGF0ZW1lbnRzJTNEJTIyZmFsc2UlMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VnZXRTY2hlZHVsZSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU0NSSVBUJTIyJTNFWTI5dWMzUWdiR2x6ZENBOUlHZGxkRk5qYUdWa2RXeGxjeWhtWVd4elpTazdEUXBzYVhOMExtWnZja1ZoWTJnb2MyTm9aV1IxYkdVZ1BUNGdiRzluS0VwVFQwNHVjM1J5YVc1bmFXWjVLSE5qYUdWa2RXeGxLU2twT3clM0QlM0QlM0MlMkZmaWVsZCUzRSUzQ2NvbW1lbnQlMjBwaW5uZWQlM0QlMjJmYWxzZSUyMiUyMGglM0QlMjI4MCUyMiUyMHclM0QlMjIxNjAlMjIlM0VCZXNjaHJlaWJlJTIwZGllc2UlMjBGdW5rdGlvbiUyMCVFMiU4MCVBNiUzQyUyRmNvbW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMnIlNUV0KWQhLlQlNURtJTJCR1hoMCUyNTlYUUklMjIlMjB4JTNEJTIyNjMlMjIlMjB5JTNEJTIyNjMlMjIlM0UlM0NtdXRhdGlvbiUyMHN0YXRlbWVudHMlM0QlMjJmYWxzZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjcm9uQ29uZGl0aW9ucyUyMiUyMHZhcmlkJTNEJTIyYyU1QiUzQVd3aiU3QnNpd3JOJTJGRiU1RSglNjBoTHclMjIlM0UlM0MlMkZhcmclM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VjcmVhdGVTY2hlZHVsZSUzQyUyRmZpZWxkJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU0NSSVBUJTIyJTNFYkdWMElIUmxjM1JUWTJobFpDQTlJRzUxYkd3N0RRcGpiMjV6ZENCRmRtVnVkRVZ0YVhSMFpYSWdQU0J5WlhGMWFYSmxLQ2RsZG1WdWRITW5LVHNOQ21Oc1lYTnpJRVZsSUdWNGRHVnVaSE1nUlhabGJuUkZiV2wwZEdWeUlIdDlEUW9OQ21OdmJuTjBJR3B2WWxOMFlYUjFjeUE5SUc1bGR5QkZaU2dwT3cwS0x5OXNiMmNvSW1OeWIyNURiMjVrYVhScGIyNXpPaUFpSUNzZ1kzSnZia052Ym1ScGRHbHZibk1zSW1sdVptOGlLVHNOQ2cwS2FtOWlVM1JoZEhWekxtOXVLQ2RtYVc1cGMyaGxaQ2NzSUNncElEMCUyQklIc05DaUFnSUNCamIyNXpiMnhsTG14dlp5Z25TazlDSUVaSlRrbFRTRVZFSnlrN0RRb2dJQ0FnYW05aUxtTmhibU5sYkNncE93MEtJQ0FnSUNBdkx5QlFjbVZtYjNKdElIbHZkWElnUkVJZ1QzQmxjbUYwYVc5dWN5Qm9aWEpsSUNocGJpQjViM1Z5SUdOaGMyVTZJR1JsYkdWMFpTQnFiMklnWm5KdmJTQmtZWFJoWW1GelpTa05DZzBLZlNrN0RRb2dJQ0FOQ2lnb0tTQTlQaUI3SUdsbUlDaDBaWE4wVTJOb1pXUXBJSHNnWTJ4bFlYSlRZMmhsWkhWc1pTaDBaWE4wVTJOb1pXUXBPeUIwWlhOMFUyTm9aV1FnUFNCdWRXeHNPeUI5ZlNrb0tUc05DaTh2Ykc5bktDSlVaWE4wVTJOb1pXUkRiMjVrT2lBaUlDc2dZM0p2YmtOdmJtUnBkR2x2Ym5Nc0luZGhjbTRpS1RzTkNpQWdZMjl1YzI5c1pTNXBibVp2S0NkSWFXVnlJSGRwY21RZ1pHVnlJRlJGVTFSVFkyaGxaSFZzWlhJZ1oyVnpaWFI2ZENjcE93MEtJQ0FvS0NrZ1BUNGdleUJwWmlBb2RHVnpkRk5qYUdWa0tTQjdJR05zWldGeVUyTm9aV1IxYkdVb2RHVnpkRk5qYUdWa0tUc2dkR1Z6ZEZOamFHVmtJRDBnYm5Wc2JEc2dmWDBwS0NrN0RRb05DaUFnZEdWemRGTmphR1ZrSUQwZ2MyTm9aV1IxYkdVb0tHRjNZV2wwSUdKMWFXeGtRM0p2YmxKMWJHVW9KM1JwYldVbkxDQmpjbTl1UTI5dVpHbDBhVzl1Y3lrcExDQm1kVzVqZEdsdmJpZ3BJSHNOQ2lBZ0lDQmpiMjV6YjJ4bExtbHVabThvSjBocFpYSWdiTU9rZFdaMElHUmxjaUJVUlZOVVZISnBaMmRsY2ljcE93MEtJQ0FnSUM4cURRb2dJQ0FnYVdZZ0tIUm9hWE11Ym1WNGRFbHVkbTlqWVhScGIyNG9LU0E5UFQwZ2JuVnNiQ2tnZXcwS0lDQWdJQ0FnSUNBZ0lDQWdMeTlvWlhKbElIbHZkU0JqWVc0Z1kyOWtaU0IzYUdGMFpYWmxjaUI1YjNVZ2JtVmxaQ0IwYnlCa2J5QnBiaUIwYUdVZ2JHRnpkQ0JwYm5adlkyRjBhVzl1RFFvZ0lDQWdJQ0FnSUdwdllsTjBZWFIxY3k1bGJXbDBLQ2RtYVc1cGMyaGxaQ2NwT3lBdkx5QkZiV2wwSUhsdmRYSWdhbTlpSUdSdmJtVWdaVzFwZEhSbGNpQjNhR1Z1SUhsdmRTQmhjbVVnWkc5dVpTNGdJQ0FnSUNBZ0lDQWdJQ0FOQ2lBZ0lDQWdJQ0FnSUNBZ0lIME5DaUFnSUNBZ0lDQWdJQ0FnSUNvdkRRb2dJSDBwT3cwS0lBMEtEUW8lM0QlM0MlMkZmaWVsZCUzRSUzQ2NvbW1lbnQlMjBwaW5uZWQlM0QlMjJmYWxzZSUyMiUyMGglM0QlMjI4MCUyMiUyMHclM0QlMjIxNjAlMjIlM0VCZXNjaHJlaWJlJTIwZGllc2UlMjBGdW5rdGlvbiUyMCVFMiU4MCVBNiUzQyUyRmNvbW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfZGVmY3VzdG9tcmV0dXJuJTIyJTIwaWQlM0QlMjJzJTVFJTJDZkhEJTNBZEMlMjRkb2VoJTQwRSUyRjNhMSUyMiUyMHglM0QlMjI2MyUyMiUyMHklM0QlMjI4OCUyMiUzRSUzQ211dGF0aW9uJTIwc3RhdGVtZW50cyUzRCUyMmZhbHNlJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMm1vZHVzJTIyJTIwdmFyaWQlM0QlMjJVUWglMjVTISU1REclN0IoOFFFN2FvUkZDbyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTIwdmFyaWQlM0QlMjJtUnhrcSklNUQxMUclMkYqVlglNDBxdkxkRCUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRWJ1aWxkQ3JvblJ1bGUlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNDUklQVCUyMiUzRWJHVjBJSEpsYzNWc2RDQTlJQ0lpT3cwS2JHVjBJSEpsYzNWc2RGTjBZWEowSUQwZ0lpSTdEUXBzWlhRZ2IzWmhiRkJsY21sdlpDQTlJQ0lpT3cwS0RRcGpiMjVrYVhScGIyNXpMbVp2Y2tWaFkyZ29ablZ1WTNScGIyNGdLR3hwYm1Vc2FXNWtaWGdzSUdGeWNtRjVLU0I3RFFvTkNpQWdJQ0F2S2cwS0lDQWdJQ0FnSUNBbmV5SjBhVzFsSWpwN0luTjBZWEowSWpvaU1EZzZNREFpTENKbGJtUWlPaUl5TURvd01DSXNJbTF2WkdVaU9pSnRhVzUxZEdWeklpd2lhVzUwWlhKMllXd2lPako5TENKd1pYSnBiMlFpT25zaVpHRjVjeUk2TVgxOUp3MEtJQ0FnSUNvdkRRb2dJQ0FnYkdWMElHOXJaWGtnUFNCUFltcGxZM1F1YTJWNWN5aHNhVzVsS1RzTkNpQWdJQ0JzWlhRZ2IzWmhiQ0E5SUd4cGJtVmJiMnRsZVYwN0RRb2dJQ0FnYjJ0bGVTQTlJRzlyWlhrdWRHOVRkSEpwYm1jb0tTNXlaWEJzWVdObEtDOWNjeXN2Wnl3Z0p5Y3BPdzBLSUNBZ0RRb2dJQ0FnTHk5c2IyY29iMnRsZVN3aWFXNW1ieUlwT3cwS0lDQWdJQ0FnSUNCcFppaHZhMlY1SUQwOUlDSndaWEpwYjJRaUtYc05DaUFnSUNBZ0lDQWdJQ0FnSUc5clpYa2dQU0J6ZEhKcGJtZFJkVzkwWlNoN2MzUnlWbUZ5YVdGaWJHVTZJRzlyWlhsOUtUc05DaUFnSUNBZ0lDQWdJQ0FnSUM4dmJHOW5LQ0p2YTJWNUlHbHpPaUFpTENKcGJtWnZJaWs3RFFvZ0lDQWdJQ0FnSUNBZ0lDQnZkbUZzVUdWeWFXOWtJRDBnYjNaaGJGQmxjbWx2WkM1amIyNWpZWFFvYjJ0bGVTd2lPaUlzSUc5MllXd3BPdzBLSUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lvYjJ0bGVTQWhQU0FpY0dWeWFXOWtJaWtnZXcwS0lDQWdJQ0FnSUNCdmEyVjVJRDBnYzNSeWFXNW5VWFZ2ZEdVb2UzTjBjbFpoY21saFlteGxPaUJ2YTJWNWZTazdJQ0FnSUEwS0lDQWdJQ0FnSUNCcFppaDBlWEJsYjJZZ2IzWmhiQ0E5UFNBaWMzUnlhVzVuSWlsN0RRb2dJQ0FnSUNBZ0lDQWdJQ0J2ZG1Gc0lEMGdjM1J5YVc1blVYVnZkR1VvZTNOMGNsWmhjbWxoWW14bE9pQnZkbUZzZlNrN0RRb2dJQ0FnSUNBZ0lIME5DaUFnSUNBZ0lDQWdMeTlzYjJjb2IydGxlU3dpZDJGeWJpSXBPdzBLSUNBZ0lDQWdJQ0F2TDJ4dlp5Z2lWbUZzT2lBaUlDc2diM1poYkNBcklDSWdmQ0IwZVhCbGIyWTZJQ0lySUhSNWNHVnZaaUJ2ZG1Gc0xDSnBibVp2SWlrN0RRb2dJQ0FnSUNBZ0lHbG1LR2x1WkdWNElEMDlQU0JoY25KaGVTNXNaVzVuZEdnZ0xURXBldzBLSUNBZ0lDQWdJQ0J5WlhOMWJIUWdQWEpsYzNWc2RDNWpiMjVqWVhRb2IydGxlU3dpT2lJc0lHOTJZV3dwT3lBTkNpQWdJQ0FnSUNBZ2ZTQmxiSE5sSUhzTkNpQWdJQ0FnSUNBZ2NtVnpkV3gwSUQxeVpYTjFiSFF1WTI5dVkyRjBLRzlyWlhrc0lqb2lMQ0J2ZG1Gc0xDSXNJaWs3SUNBZ0lDQWdJQ0FOQ2lBZ0lDQWdJQ0FnZlEwS0RRb2dJQ0FnSUNBZ0lIME5DZzBLRFFvTkNuMHBPdzBLRFFweVpYTjFiSFFnUFNCemRISnBibWRSZFc5MFpTaDdjM1J5Vm1GeWFXRmliR1U2SUhKbGMzVnNkQ3h6ZEhKUmRXOTBaVG9nSW50OUlpd2dZbTl2YkZOd2JHbDBVWFZ2ZEdVNklIUnlkV1Y5S1RzTkNpOHZiRzluS0c5MllXeFFaWEpwYjJRc0luZGhjbTRpS1RzTkNnMEtjM2RwZEdOb0tHMXZaSFZ6S1hzTkNpQWdJQ0JqWVhObElDSjBhVzFsSWpvTkNpQWdJQ0FnSUNBZ2NtVnpkV3gwVTNSaGNuUWdQU0FpZEdsdFpTSTdEUW9OQ2lBZ0lDQmtaV1poZFd4ME9nMEtJQ0FnSUNBZ0lDQnlaWE4xYkhSVGRHRnlkQ0E5SUNKMGFXMWxJanNOQ24wTkNuSmxjM1ZzZEZOMFlYSjBJRDBnYzNSeWFXNW5VWFZ2ZEdVb2UzTjBjbFpoY21saFlteGxPaUJ5WlhOMWJIUlRkR0Z5ZEgwcE93MEtjbVZ6ZFd4MFUzUmhjblFnUFNBaUlpNWpiMjVqWVhRb2NtVnpkV3gwVTNSaGNuUXNJam9pS1NBN0RRb05DZzBLY21WemRXeDBJRDBnSWlJdVkyOXVZMkYwS0hKbGMzVnNkRk4wWVhKMExDQnlaWE4xYkhRc0lpd2lMQ0J2ZG1Gc1VHVnlhVzlrS1RzTkNnMEtjbVZ6ZFd4MElEMGdjM1J5YVc1blVYVnZkR1VvZTNOMGNsWmhjbWxoWW14bE9uSmxjM1ZzZEN4emRISlJkVzkwWlRvaWUzMGlMR0p2YjJ4VGNHeHBkRkYxYjNSbE9pQjBjblZsSUgwcElEc05DaTh2Ykc5bktISmxjM1ZzZEN3aWQyRnliaUlwT3cwS0RRb05DbkpsZEhWeWJpQnlaWE4xYkhRNyUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19kZWZjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMiU3QjBjVyUzRjBWJTdCJTIzb05+fipzMzAwMkklMjIlMjB4JTNEJTIyNjMlMjIlMjB5JTNEJTIyMTEzJTIyJTNFJTNDbXV0YXRpb24lMjBzdGF0ZW1lbnRzJTNEJTIyZmFsc2UlMjIlM0UlM0NhcmclMjBuYW1lJTNEJTIycm9vdGRwJTIyJTIwdmFyaWQlM0QlMjJvNk51LUZjQnZEMyUyNHIlMkYlN0QuanElNjAqJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJOQU1FJTIyJTNFZ2V0Q3JvbkNvbmRpdGlvbnMlM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNDUklQVCUyMiUzRWJHVjBJSEpsYzNWc2RDQTlJRnRkT3cwS2JHOW5LQ0puWlhSRGNtOXVRMjl1WkhNaUxDSjNZWEp1SWlrN0RRcGpiMjV6ZENCa2NITWdQU0FrS0hKdmIzUmtjQ2t1ZEc5QmNuSmhlU2dwT3cwS2JHOW5LR1J3Y3lrN0RRcGtjSE11Wm05eVJXRmphQ2dvYVdRcElEMCUyQklIc05DaUFnSUNCamIyNXpkQ0JrY0haaGJDQTlJR2RsZEZOMFlYUmxLR2xrS1M1MllXdzdEUW9nSUNBZ1kyOXVjM1FnWkhBZ1BTQnpjR3hwZEhSV1lYSnBZV0pzWlNocFpDd2liR0Z6ZENJc0lpNGlLVHNOQ2lBZ0lDQnNaWFFnYjJKcUlEMGdlMzA3RFFvZ0lDQWdiMkpxVzJSd1hTQTlJR1J3ZG1Gc093MEtJQ0FnSUhKbGMzVnNkQzV3ZFhOb0tHOWlhaWs3RFFwOUtUc05DaUFnSUNBdkwyeHZaeWh5WlhOMWJIUXNJbmRoY200aUtUc05DbkpsZEhWeWJpQnlaWE4xYkhRNyUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19kZWZjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMlhZU185WiUzQmZOJTNENi5XKjdCMDEzYiUyMiUyMHglM0QlMjI2MyUyMiUyMHklM0QlMjIxMzglMjIlM0UlM0NtdXRhdGlvbiUyMHN0YXRlbWVudHMlM0QlMjJmYWxzZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJPYmplY3RJRCUyMiUyMHZhcmlkJTNEJTIyTSU2MGZyOS1hRyUzQVMlMkNLcSh4JTVFYTkoLiUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRWdsX2xlc2VSYXVtJTNDJTJGZmllbGQlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTQ1JJUFQlMjIlM0ViR1YwSUhKdmIyMGdQU0JzWlhObFVtRjFiU2hQWW1wbFkzUkpSQ2s3RFFweVpYUjFjbTRnY205dmJUcyUzRCUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyNHUlNDB0Tl9tZCklM0ElNUQlNDBLJTQwMG9yQyU1RHclMjIlMjBkaXNhYmxlZCUzRCUyMnRydWUlMjIlMjB4JTNEJTIyMTA2MyUyMiUyMHklM0QlMjIxODglMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFJTdCJTIydGltZSUyMiUzQSU3QiUyMmVuZCUyMiUzQSUyMjIwJTNBMDAlMjIlMkMlMjJpbnRlcnZhbCUyMiUzQTIlMkMlMjJtb2RlJTIyJTNBJTIybWludXRlcyUyMiUyQyUyMnN0YXJ0JTIyJTNBJTIyMDglM0EwMCUyMiU3RCUyQyUyMnBlcmlvZCUyMiUzQSU3QiUyMmRheXMlMjIlM0ExJTdEJTdEJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19zZXQlMjIlMjBpZCUzRCUyMkwlNUJxNkQlNURtREJvV1klNURLTCUzQWNoJTI1ZCUyMiUyMHglM0QlMjIxMiUyMiUyMHklM0QlMjIyNjklMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVkFMVUUlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMjllcGslMkNDbyUyQzZlRVFUMDRhXyU0ME1xJTIyJTIwaW5saW5lJTNEJTIydHJ1ZSUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmdldENyb25Db25kaXRpb25zJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMnJvb3RkcCUyMiUzRSUzQyUyRmFyZyUzRSUzQyUyRm11dGF0aW9uJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQVJHMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnRleHQlMjIlMjBpZCUzRCUyMjJ4V3AyTn5VJTdDVmguTkJwVzQlNURwVCUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UwX3VzZXJkYXRhLjAuUm9sbGFkZW4uQWxsZ2VtZWluLlNjaGF0dGVuLmNyb25Db25kaXRpb25zLiolM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjJuJTNCVCUzRDhqT1J+JTNGTjBWOHYuQUVvSyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlNldmVyaXR5JTIyJTNFaW5mbyUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRSUzQ3NoYWRvdyUyMHR5cGUlM0QlMjJ0ZXh0JTIyJTIwaWQlM0QlMjJEU1NtcWElN0MxbV9EcCUzRCF6UVE0dVMlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFdGVzdCUzQyUyRmZpZWxkJTNFJTNDJTJGc2hhZG93JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsY3VzdG9tcmV0dXJuJTIyJTIwaWQlM0QlMjIuOVlnRi1GTTlFVkh6RXY0JTIzZzElMkYlMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyYnVpbGRDcm9uUnVsZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJtb2R1cyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIySG1HOCUzQkolMkJaWCUzRnlwJTdEJTI0cyUyNWxZRyU3RCUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0V0aW1lJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyQVJHMSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMnE2RjZsJTdCVUpYJTNGM1Y5dHUlNDAhamxlJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVkFSJTIyJTIwaWQlM0QlMjIuaDZYVyUyNXFfWUMlM0RoMmFfLXhMOVMlMjIlM0V2YXJfQ3JvbkNvbmRpdGlvbnMlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjIlMkJKfmklNDBLMEZhJTdCeTBkKiUzQkFXbjglN0IlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyRFNTbXFhJTdDMW1fRHAlM0QhelFRNHVTJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRlc3QlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMkIzViFiSkclMkNOcUJ0Y0lfc1RRdW0lMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21ub3JldHVybiUyMiUyMGlkJTNEJTIyc2RVaWN0fiU0MFglN0JDKVhKS34lMkMoJTNESCUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmNyZWF0ZVNjaGVkdWxlJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmNyb25Db25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyOSElMjMlMjMlM0I1JTdCJTNCNDUzJTJGVXglM0FCN2hMWiUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfY2FsbGN1c3RvbW5vcmV0dXJuJTIyJTIwaWQlM0QlMjJyJTIzSG1iVW4uTUt3aEk4flZpNl9CJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyZ2V0U2NoZWR1bGUlMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJvbl9leHQlMjIlMjBpZCUzRCUyMmZ0UG9VZ0hNdG8lM0ElNUV6cDElN0JzWlktJTIyJTNFJTNDbXV0YXRpb24lMjB4bWxucyUzRCUyMmh0dHAlM0ElMkYlMkZ3d3cudzMub3JnJTJGMTk5OSUyRnhodG1sJTIyJTIwaXRlbXMlM0QlMjIxJTIyJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJDT05ESVRJT04lMjIlM0VhbnklM0MlMkZmaWVsZCUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMkFDS19DT05ESVRJT04lMjIlM0UlM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMk9JRDAlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIyZmllbGRfb2lkJTIyJTIwaWQlM0QlMjJTdTdCel9wJTdCMjMuU00lM0R0Rn5+dWYlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJvaWQlMjIlM0VJRCUyMGF1c3clQzMlQTRobGVuJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0NibG9jayUyMHR5cGUlM0QlMjJzZWxlY3RvciUyMiUyMGlkJTNEJTIyWS5kanRib0x2KkxTTVEqdSUyNTclMkNkJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXN0YXRlJTVCc3RhdGUuaWQlM0QwX3VzZXJkYXRhLjAuUm9sbGFkZW4uQWxsZ2VtZWluLlNjaGF0dGVuLmNyb25Db25kaXRpb25zLiolNUQlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NzdGF0ZW1lbnQlMjBuYW1lJTNEJTIyU1RBVEVNRU5UJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX3NldCUyMiUyMGlkJTNEJTIyR1UwViUzRFBUSHdPby41MXVkKHVPSSUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyLmg2WFclMjVxX1lDJTNEaDJhXy14TDlTJTIyJTNFdmFyX0Nyb25Db25kaXRpb25zJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJWQUxVRSUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnByb2NlZHVyZXNfY2FsbGN1c3RvbXJldHVybiUyMiUyMGlkJTNEJTIyLUhJJTVEKFZSaCloJTYwKCUzQmhiWkwxQ1YlMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyZ2V0Q3JvbkNvbmRpdGlvbnMlMjIlM0UlM0NhcmclMjBuYW1lJTNEJTIycm9vdGRwJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyd0hCa1QlMkJWcSUyM045UzchdWtMZWw2JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRTBfdXNlcmRhdGEuMC5Sb2xsYWRlbi5BbGxnZW1laW4uU2NoYXR0ZW4uY3JvbkNvbmRpdGlvbnMuKiUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsbm9yZXR1cm4lMjIlMjBpZCUzRCUyMiU0MCgyZnlXIVRoYWpON19OWml6RmYlMjIlM0UlM0NtdXRhdGlvbiUyMG5hbWUlM0QlMjJydW5UZXN0JTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmRwJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyYTg2S04uJTdCc3IlMjN2JTNBJTQwZiUzQXUlN0J+Qk0lMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGbmV4dCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGc3RhdGVtZW50JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0MlMkZuZXh0JTNFJTNDJTJGYmxvY2slM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2RlZm5vcmV0dXJuJTIyJTIwaWQlM0QlMjJseS0lN0RZRSUyM1pxJTJCUW8lNURtfiUyRllRblElMjIlMjB4JTNEJTIyOTg4JTIyJTIweSUzRCUyMjMxMyUyMiUzRSUzQ211dGF0aW9uJTNFJTNDYXJnJTIwbmFtZSUzRCUyMmRwJTIyJTIwdmFyaWQlM0QlMjI1USUyQ1dCRiU1Qm0lMjMlMkZIJTJDa08heCU3Qzg0JTVEJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJOQU1FJTIyJTNFcnVuVGVzdCUzQyUyRmZpZWxkJTNFJTNDY29tbWVudCUyMHBpbm5lZCUzRCUyMmZhbHNlJTIyJTIwaCUzRCUyMjgwJTIyJTIwdyUzRCUyMjE2MCUyMiUzRUJlc2NocmVpYmUlMjBkaWVzZSUyMEZ1bmt0aW9uJTIwJUUyJTgwJUE2JTNDJTJGY29tbWVudCUzRSUzQ3N0YXRlbWVudCUyMG5hbWUlM0QlMjJTVEFDSyUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjJXJTNBViUzRlNLKElqM1hPJTQwTnNGKSUyM3AtJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyU2V2ZXJpdHklMjIlM0VpbmZvJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJURVhUJTIyJTNFJTNDc2hhZG93JTIwdHlwZSUzRCUyMnRleHQlMjIlMjBpZCUzRCUyMjdieiU1RU9JJTI1MUhIZ0gwYS1zeiUyQiU1REQlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJURVhUJTIyJTNFSGllciUyMHdpcmQlMjBkZXIlMjBTY2hlZHVsZXIlMjBnZXNldHp0JTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0MlMkZ2YWx1ZSUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJ2YXJpYWJsZXNfc2V0JTIyJTIwaWQlM0QlMjJ6bSFITVA3X1pOViUyMyUyRikpQndNcVglMjIlMjBkaXNhYmxlZCUzRCUyMnRydWUlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMkElMjR6SiUzRC5vYS5LJTdDJTJDODAlM0RXJTI0UyU0MEclMjIlM0V2YXJfUmF1bSUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyVkFMVUUlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMkJWJTQwTDJaNCUzQjFVSCUzRiU1RCU1QmFXRDQ0eiUyMiUzRSUzQ211dGF0aW9uJTIwbmFtZSUzRCUyMmdsX2xlc2VSYXVtJTIyJTNFJTNDYXJnJTIwbmFtZSUzRCUyMk9iamVjdElEJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyNnRXQWJFNlpEMmElN0JHTkEtQ3UlMjM0JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVkFSJTIyJTIwaWQlM0QlMjI1USUyQ1dCRiU1Qm0lMjMlMkZIJTJDa08heCU3Qzg0JTVEJTIyJTNFZHAlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnNjaGVkdWxlX2NsZWFyJTIyJTIwaWQlM0QlMjIpYzElMjMlM0JCTkNNaWoyJTNEJTJCJTJDTWklMjRfcyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMk5BTUUlMjIlM0VzY2hlZHVsZTElM0MlMkZmaWVsZCUzRSUzQ25leHQlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJzY2hlZHVsZV9jcmVhdGUlMjIlMjBpZCUzRCUyMiUyNCglMjQlNUJ0ZDVscjhKJTNCZiUzQjlFejhUJTdDJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyTkFNRSUyMiUzRXNjaGVkdWxlMSUzQyUyRmZpZWxkJTNFJTNDdmFsdWUlMjBuYW1lJTNEJTIyU0NIRURVTEUlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIyZmllbGRfY3JvbiUyMiUyMGlkJTNEJTIydSElMkIlNUIhJTIzby0lNUV5YSU3RHlSQXF+VC5FJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyQ1JPTiUyMiUzRSolMjAqJTIwKiUyMColMjAqJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0NibG9jayUyMHR5cGUlM0QlMjJwcm9jZWR1cmVzX2NhbGxjdXN0b21yZXR1cm4lMjIlMjBpZCUzRCUyMnd3JTNGWFMqfl9UTHh0ZUY5S09aenglMjIlMjBpbmxpbmUlM0QlMjJ0cnVlJTIyJTNFJTNDbXV0YXRpb24lMjBuYW1lJTNEJTIyYnVpbGRDcm9uUnVsZSUyMiUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJtb2R1cyUyMiUzRSUzQyUyRmFyZyUzRSUzQ2FyZyUyMG5hbWUlM0QlMjJjb25kaXRpb25zJTIyJTNFJTNDJTJGYXJnJTNFJTNDJTJGbXV0YXRpb24lM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcwJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyMyg1YTBNLWMlNDAxVWwoRERVUlQlMkM2JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRpbWUlM0MlMkZmaWVsZCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBUkcxJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIySzlBVU1oJTQwMFZyJTNBLThtVTN+JTdCcmElMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMi5oNlhXJTI1cV9ZQyUzRGgyYV8teEw5UyUyMiUzRXZhcl9Dcm9uQ29uZGl0aW9ucyUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0NzdGF0ZW1lbnQlMjBuYW1lJTNEJTIyU1RBVEVNRU5UJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIyZGVidWclMjIlMjBpZCUzRCUyMk0lMkY4RipPeGQqTVc0NSU3RCUyNWgpWDQlN0IlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyRyUzRCU1RFAyZ3pMJTVCbUUlM0ZlMC1xLS5DLiUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0VIaWVyJTIwbCVDMyVBNHVmdCUyMGRlciUyMFRyaWdnZXIlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQyUyRnZhbHVlJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZzdGF0ZW1lbnQlM0UlM0NuZXh0JTNFJTNDYmxvY2slMjB0eXBlJTNEJTIycHJvY2VkdXJlc19jYWxsY3VzdG9tbm9yZXR1cm4lMjIlMjBpZCUzRCUyMmJOJTdCcC0lN0JJYnAhJTdEJTJCRktnSWRBaF8lMjIlM0UlM0NtdXRhdGlvbiUyMG5hbWUlM0QlMjJnZXRTY2hlZHVsZSUyMiUzRSUzQyUyRm11dGF0aW9uJTNFJTNDbmV4dCUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmNvbnRyb2xzX2lmJTIyJTIwaWQlM0QlMjJYcmclMjQyTlMlNUVnQ04qJTNGT3BVc0cwUSUyMiUyMGRpc2FibGVkJTNEJTIydHJ1ZSUyMiUzRSUzQ211dGF0aW9uJTIwZWxzZSUzRCUyMjElMjIlM0UlM0MlMkZtdXRhdGlvbiUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMklGMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmxvZ2ljX2NvbXBhcmUlMjIlMjBpZCUzRCUyMld4LiU3QkolNUVhX3olMkJKJTI1SUlkJTQwJTVCJTdCU0clMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJPUCUyMiUzRUVRJTNDJTJGZmllbGQlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJBJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyVyUzRCUyNUF5JTYwLkRpMCUyNHFlcSU3Q24lMkIlMjUlM0J1JTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXVuZGVmaW5lZCUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMkIlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJjb252ZXJ0X3R5cGUlMjIlMjBpZCUzRCUyMjBTOSU1Qjl4SClsRU0teF9Edk5YVjQlMjIlM0UlM0N2YWx1ZSUyMG5hbWUlM0QlMjJJVEVNJTIyJTNFJTNDYmxvY2slMjB0eXBlJTNEJTIydmFyaWFibGVzX2dldCUyMiUyMGlkJTNEJTIyMjU5SkglMkIoN1ZYdEd4cTlhJTJGTyglN0QlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJWQVIlMjIlMjBpZCUzRCUyMkElMjR6SiUzRC5vYS5LJTdDJTJDODAlM0RXJTI0UyU0MEclMjIlM0V2YXJfUmF1bSUzQyUyRmZpZWxkJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGdmFsdWUlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMkRPMCUyMiUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMmRlYnVnJTIyJTIwaWQlM0QlMjIhLSU3Q1RZSlZjQ35XMyU3QnhYan5oS1glMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIyISU3QiUzQiUyQ3BnNiU2MC4yRyU3QyU1QkxuJTJCbjFoJTYwJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRWtlaW4lMjBSYXVtJTNDJTJGZmllbGQlM0UlM0MlMkZzaGFkb3clM0UlM0MlMkZ2YWx1ZSUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGc3RhdGVtZW50JTNFJTNDc3RhdGVtZW50JTIwbmFtZSUzRCUyMkVMU0UlMjIlM0UlM0NibG9jayUyMHR5cGUlM0QlMjJkZWJ1ZyUyMiUyMGlkJTNEJTIyNjclNUJzUnBMJTJCblEwNUFnJTQwMSlHNHYlMjIlM0UlM0NmaWVsZCUyMG5hbWUlM0QlMjJTZXZlcml0eSUyMiUzRWluZm8lM0MlMkZmaWVsZCUzRSUzQ3ZhbHVlJTIwbmFtZSUzRCUyMlRFWFQlMjIlM0UlM0NzaGFkb3clMjB0eXBlJTNEJTIydGV4dCUyMiUyMGlkJTNEJTIydWMyJTJDOHQ4Qk5IdnYlMjV6JTJCSCUzQSUyMy5iJTIyJTNFJTNDZmllbGQlMjBuYW1lJTNEJTIyVEVYVCUyMiUzRXRlc3QlM0MlMkZmaWVsZCUzRSUzQyUyRnNoYWRvdyUzRSUzQ2Jsb2NrJTIwdHlwZSUzRCUyMnZhcmlhYmxlc19nZXQlMjIlMjBpZCUzRCUyMnMlMkYlMjVGJTNGKkUpZmNPSWMlMjRteGlGJTVEdyUyMiUzRSUzQ2ZpZWxkJTIwbmFtZSUzRCUyMlZBUiUyMiUyMGlkJTNEJTIyQSUyNHpKJTNELm9hLkslN0MlMkM4MCUzRFclMjRTJTQwRyUyMiUzRXZhcl9SYXVtJTNDJTJGZmllbGQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnZhbHVlJTNFJTNDJTJGYmxvY2slM0UlM0MlMkZzdGF0ZW1lbnQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRm5leHQlM0UlM0MlMkZibG9jayUzRSUzQyUyRnN0YXRlbWVudCUzRSUzQyUyRmJsb2NrJTNFJTNDJTJGeG1sJTNF
-
@trojanhector
Das hier ist noch eine hilfsfunction, die bei mir im globalen Javascript Modul läuft.function stringQuote({strVariable='',strQuote = '"',boolReverse = false, boolSplitQuote = false}){ let result = ""; let strRQuote = ""; if(boolReverse){ strRQuote = boolReverse ? strQuote.split('').reverse().join(""): strQuote ; } else if(boolSplitQuote){ strRQuote = strQuote.substring(1,2); strQuote = strQuote.substring(0,1); } else { strRQuote = strQuote; } result = result.concat(strQuote,strVariable,strRQuote); return result; }
-
Soweit ich das grob überblicke, liegt das Problem in deiner Funktion calcSecondsFromTime
Das berechnet sozusagen die Anzahl der Sekunden seit Mitternacht
Node-schedule möchte aber ein Jahr was Skript Datum Objekt, was die Anzahl an Millisekunden seit dem 1.1.1970 beinhaltet. Das musst du noch berücksichtigen.
Aus diesem Grund funktioniert auch das Beispiel, welches du aus der Dokumentation kopiert hast.
Dort wird das Date Objekt verwendet, welches du nicht verwändestSo wie du es jetzt verwändest, wird der Job auch nur einmalig gestartet.
Wenn du es wiederholt gestartet haben möchtest, musst du unter Recurring schauenWenn du es noch einfacher machen möchtest, schaue meinen Adapter
Mytime an.
Dort kannst du beliebige Zeitreihen definieren, zu denen dann ein Datenpunkt für eine definierbar a Zeit lang getriggert wird. Auf diesen Daten. Kannst du dann reagieren und beliebige Aktionen ausführen. -
@oliverio
Aber wie funktionert das denn in Blockly mit dem kleinen Cron Bauteil aus den Triggern? Wenn Du da was mit dem Wizard baust, hast in JS auch nur die Uhrzeiten. -
Für recurring musst du andere Eigenschaften verwenden. Nicht Start und end, sondern
RecurrenceRule properties
second (0-59)
minute (0-59)
hour (0-23)
date (1-31)
month (0-11)
year
dayOfWeek (0-6) Starting with Sunday
tz -
Du könntest natürlich, so wie du es machst, immer den nächsten Start berechnen und wenn der Zeitpunkt erreicht ist, wiederum den darauf folgenden Start neu berechnen.
Ich habe auch noch nicht ganz verstanden, was du überhaupt erreichen möchtest:Du möchtest innerhalb einer Zeitspanne, dann immer wieder was erneut ausführen?
Also ein schedule in einem schedule? -
@oliverio
Mein Usecase sind meine Rolladen. Ich habe eine Schattenfunction, die alle 2 Minuten überprüft, ob die Sonne scheint.
Wenn ja: Rolladen runter, wenn nein: Rolladen hoch. (Anmerkung: Meine Rolladen bleiben mind. 5 Minuten auf ihrer letzten Position)
Diese Funktion soll zwischen 08:00 und 20:00 Uhr laufen. Wenn jetzt das letzte Intervall gelaufen ist, sollen die Rolladen, unabhängig vom Sonnenschein wieder hochfahren. Früher habe ich das mit dem Zeitenvergleich zwischen Zielzeit und Executiontime gemacht. Das wollte ich jetzt umstellen auf Eventsteuerung. -
@trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:
Das wollte ich jetzt umstellen auf Eventsteuerung.
dann mach das doch!
@trojanhector sagte in Javascript Schedule Start-End wann ist der letzte Lauf:
ob die Sonne scheint.
dann Trigger auf den Sonnensensor bei Änderung.
Anschließend
FALLS Wert>xy UND aktuelle Zeit ist zwischen 08:00 und 20:00
MACHE Rolladen auf Beschattung
SONST FALLS Wert <(xy-Hysterese)
MACHE Rollladen hochim sonst falls ggf noch eine Zeitabfrage damit der Rollladen nachts nicht hochfährt
edit: