Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. ioBroker Allgemein
    4. Javascript Schedule Start-End wann ist der letzte Lauf

    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

    Javascript Schedule Start-End wann ist der letzte Lauf

    This topic has been deleted. Only users with topic management privileges can see it.
    • Homoran
      Homoran Global Moderator Administrators @trojanhector last edited by Homoran

      @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

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

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

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

          @paul53
          W
          Das wusste ich tatsächlich nicht, aber so wie es dort beschrieben wird kann man es im iobroker nicht verwenden.

          https://github.com/ioBroker/ioBroker.javascript/blob/dcc86d319d6e9b5a5e2f0ae6c93c9e7814df35f3/docs/en/javascript.md#time-schedule

          aber das werden wir erst sehen wenn er seinen Code zeigt.

          1 Reply Last reply Reply Quote 0
          • T
            trojanhector @Homoran last edited by

            @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
            
            T OliverIO 2 Replies Last reply Reply Quote 0
            • T
              trojanhector @trojanhector last edited by

              @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;
              }
              
              1 Reply Last reply Reply Quote 0
              • OliverIO
                OliverIO @trojanhector last edited by OliverIO

                @trojanhector

                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ändest

                So 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 schauen

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

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

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

                  OliverIO 2 Replies Last reply Reply Quote 0
                  • OliverIO
                    OliverIO @trojanhector last edited by

                    @trojanhector

                    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

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

                      @trojanhector

                      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?

                      T 1 Reply Last reply Reply Quote 1
                      • T
                        trojanhector @OliverIO last edited by

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

                        Homoran 1 Reply Last reply Reply Quote 0
                        • Homoran
                          Homoran Global Moderator Administrators @trojanhector last edited by Homoran

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

                          im sonst falls ggf noch eine Zeitabfrage damit der Rollladen nachts nicht hochfährt

                          edit:
                          Screenshot_20250720-220532_Firefox.jpg

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate
                          FAQ Cloud / IOT
                          HowTo: Node.js-Update
                          HowTo: Backup/Restore
                          Downloads
                          BLOG

                          830
                          Online

                          31.9k
                          Users

                          80.1k
                          Topics

                          1.3m
                          Posts

                          4
                          15
                          68
                          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