Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [Gelöst] Wert in dyn. schedule nicht vorhanden

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    [Gelöst] Wert in dyn. schedule nicht vorhanden

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

      Hi,
      ich möchte für verschiedene Geräte welche in einem Object aufgelistet sind, bei Erfüllung einer Bedingung (Wunscheinschaltzeit / Wunschausschaltzeit) dynamisch verschiedene "Schedules" erzeugen, welche eben dann zur Wunschzeit auslösen.

      Das Erzeugen der Schedules ist kein Problem, aber den jeweiligen hinterlegten Aktor zu schalten funktioniert nicht, da zum Ausführungszeitpunkt des Schaltbefehls der Wert im Objekt (welches Gerät geschalten werden soll) nicht mehr vorhanden ist (weil die "Beauftragungsschleife" ja schon durchgelaufen ist).

      Nun stellt sich mir die Frage ob es möglich ist der Schedule-Funktion Werte mit zu geben, welche der Aufruf auch noch im Nachhinein zur Verfügung hat?

      Hier mal die Funktion:

      async function scheduleDeviceStates(){ 
          try {
              var valueOn;
              var valueOff;
              for(var i = 0; i < devices.length; i++) { 
      
                  await clearExistingSchedules(devices[i].deviceName);
                  if(devices[i].deviceType == 'state'){
                      valueOn = true;
                      valueOff = false;
                  }
                  if(devices[i].deviceType == 'level'){
                      valueOn = 100;
                      valueOff = 0;
                  }
                  if(getState(instanz + pfad0 + devices[i].deviceName +  '.onTime1').val != 'OFF'){
                      deviceSchedules[devices[i].deviceName + '.onTime1'] = schedule({hour: getState(instanz + pfad0 + devices[i].deviceName +  '.onTime1').val.split(':')[0], minute: getState(instanz + pfad0 + devices[i].deviceName +  '.onTime1').val.split(':')[1]}, function (deviceID) {
                          if(getState(deviceID).val != valueOn)setState(deviceID, valueOn);
                      });
                      deviceSchedules[devices[i].deviceName + '.offTime1'] = schedule({hour: getState(instanz + pfad0 + devices[i].deviceName +  '.offTime1').val.split(':')[0], minute: getState(instanz + pfad0 + devices[i].deviceName +  '.offTime1').val.split(':')[1]}, function () {
                          if(getState(deviceID).val != valueOff)setState(deviceID, valueOff);
                      });
                  }
                  if(getState(instanz + pfad0 + devices[i].deviceName +  '.onTime2').val != 'OFF'){
                      deviceSchedules[devices[i].deviceName + '.onTime2'] = schedule({hour: getState(instanz + pfad0 + devices[i].deviceName +  '.onTime2').val.split(':')[0], minute: getState(instanz + pfad0 + devices[i].deviceName +  '.onTime2').val.split(':')[1]}, function () {
                          if(getState(deviceID).val != valueOn) setState(deviceID, valueOn);
                      });
                      deviceSchedules[devices[i].deviceName + '.offTime2'] = schedule({hour: getState(instanz + pfad0 + devices[i].deviceName +  '.offTime2').val.split(':')[0], minute: getState(instanz + pfad0 + devices[i].deviceName +  '.offTime2').val.split(':')[1]}, function () {
                          if(getState(deviceID).val != valueOff)setState(deviceID, valueOff);
                      });
                  }
                  
              }
          } catch (error) {
              log(`Unexpected error - ${error}`, 'error');
          }
      }
      

      Wenn hier nun zum Wunschzeitpunkt if(getState(deviceID).val != valueOn) setState(deviceID, valueOn); ausgeführt wird, sind die Werte nicht mehr da.

      Wenn dies nicht möglich ist, müsste ich das ganze irgendwie umstricken, hier bin ich dankbar für jede Anregung

      Peoples 1 Reply Last reply Reply Quote 0
      • Peoples
        Peoples @Peoples last edited by Peoples

        Für die, die es interessiert 😉

        Habe es gelöst bekommen aber durch eine Änderung im Script (2 Funktionen), vielleicht braucht es mal jemand:

        In der ersten Funktion werden die schedules erstellt und übergeben an eine zweite Funktion dann die aktuelle Zeit beim Auslösen des Schedule-Befehls

        async function scheduleDeviceStates(){ 
            try {
                for(var i = 0; i < devices.length; i++) { 
                    await clearExistingSchedules(devices[i].deviceName);
                    if(getState(instanz + pfad0 + devices[i].deviceName +  '.onTime1').val != 'OFF'){
                        deviceSchedules[devices[i].deviceName + '.onTime1'] = schedule({hour: getState(instanz + pfad0 + devices[i].deviceName +  '.onTime1').val.split(':')[0], minute: getState(instanz + pfad0 + devices[i].deviceName +  '.onTime1').val.split(':')[1]}, function (deviceID) {
                           switchDevicesByTime(new Date().getHours() +':'+ new Date().getMinutes(),'onTime1');  
                        });
                        deviceSchedules[devices[i].deviceName + '.offTime1'] = schedule({hour: getState(instanz + pfad0 + devices[i].deviceName +  '.offTime1').val.split(':')[0], minute: getState(instanz + pfad0 + devices[i].deviceName +  '.offTime1').val.split(':')[1]}, function () {
                           switchDevicesByTime(new Date().getHours() +':'+ new Date().getMinutes(),'offTime1');
                        });
                    }
                    if(getState(instanz + pfad0 + devices[i].deviceName +  '.onTime2').val != 'OFF'){
                        deviceSchedules[devices[i].deviceName + '.onTime2'] = schedule({hour: getState(instanz + pfad0 + devices[i].deviceName +  '.onTime2').val.split(':')[0], minute: getState(instanz + pfad0 + devices[i].deviceName +  '.onTime2').val.split(':')[1]}, function () {
                           switchDevicesByTime(new Date().getHours() +':'+ new Date().getMinutes(),'onTime2');
                        });
                        deviceSchedules[devices[i].deviceName + '.offTime2'] = schedule({hour: getState(instanz + pfad0 + devices[i].deviceName +  '.offTime2').val.split(':')[0], minute: getState(instanz + pfad0 + devices[i].deviceName +  '.offTime2').val.split(':')[1]}, function () {
                           switchDevicesByTime(new Date().getHours() +':'+ new Date().getMinutes(),'offTime2');
                        });
                    } 
                }
            } catch (error) {
                log(`Unexpected error - ${error}`, 'error');
            }
        }
        

        Die zweite Funktion, schaltet dann in einem Intervall alle Elemente der Reihe nach durch, bei denen die Übermittelte Uhrzeit als Auslösezeit eingetragen ist.

        function switchDevicesByTime(swTime,dp){
            var hours = swTime.split(':')[0] < 10 ? '0' + swTime.split(':')[0] : swTime.split(':')[0];
            var minutes = swTime.split(':')[1] < 10 ?  '0' + swTime.split(':')[1] : swTime.split(':')[1];
            var swValue;
            var i =0;
            var DevicesInterval = setInterval(function() { 
                if(i < devices.length){
                    log(hours+':'+minutes+'----------------'+dp)
                    if(dp.substr(0,dp.length -1) == 'onTime'){
                        if(devices[i].deviceType == 'state') swValue = true;
                        if(devices[i].deviceType == 'level') swValue = 100;
                    }
                    if(dp.substr(0,dp.length -1) == 'offTime'){
                        if(devices[i].deviceType == 'state') swValue = false;
                        if(devices[i].deviceType == 'level') swValue = 0;
                    }
                    if(getState(instanz + pfad0 + devices[i].deviceName +  '.'+dp).val.indexOf(hours+':'+minutes)!=-1){
                        if(getState(devices[i].deviceID).val != swValue)setState(devices[i].deviceID, swValue);
                    }
                i++;
                }else {
                    clearInterval(DevicesInterval);
                }
            }, 1000);  // alle 1 Sekunden ausführen
        }
        
        1 Reply Last reply Reply Quote 0
        • First post
          Last post

        Support us

        ioBroker
        Community Adapters
        Donate

        745
        Online

        31.9k
        Users

        80.1k
        Topics

        1.3m
        Posts

        javascript
        1
        2
        162
        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