NEWS
[Gelöst] Wert in dyn. schedule nicht vorhanden
-
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
-
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 }