@asgothian
Habe es im ersten Schritt so gelöst, dass ich das Array neu einlesen lasse und statisch Werte erstmal im Skript lasse. Dafür habe ich ein Array erstellt für die key-Worte, welche in der gleichen Reihenfolge sein müssen:
const room=['DG','SZ','AZ','Zimmer','Kueche','Essen','WZli','WZre'];
const rollos= [
{
posDP:'alias.0.DG_Zimmer.Fenster.RolloPositionSoll',
wait1_ms:60*1000,
wait2_ms:60*1000
},
{
posDP:'alias.0.OG_SZ.Fenster.RolloPositionSoll',
wait1_ms:40*1000,
wait2_ms:40*1000
},
...
Mit der Funktion
function readArray(key,room,storage){
const robj =storage[key];
robj.enabled1=getState(`0_userdata.0.Rollo.AutoTiming1_`+room).val;
robj.enabled2=getState(`0_userdata.0.Rollo.AutoTiming2_`+room).val;
robj.position1=getState(`0_userdata.0.Rollo.PositionHoch_`+room).val;
robj.position2=getState(`0_userdata.0.Rollo.PositionRunter_`+room).val;
return robj;
}
erweitere ich dynamisch das Array mit aktuellen Werten. Mit den SetTimer Funktionen
function setTimer1(){
var h=getState(idTime1_h).val;
var min=getState(idTime1_min).val;
clearSchedule(timer1);
log('neuer Timer1 gesetzt');
timer1 = schedule(min + ' ' + h + ' * * *', function() {
if (getState(idAutoModeEnabled).val)
{
Object.keys(room).forEach (id =>
{
const rollo = readArray(id,room[id],rollos);
var timeout1=null;
timeout1=setTimeout(function()
{
if(rollo.enabled1)
{ // für jedes Rollo bestimmbar
setState(rollo.posDP,rollo.position1);
//log('Rollo '+ rollo.posDP + ' auf '+rollo.position1 + ' bei Zeit ' + idTime1+' gefahren.');
}
clearTimeout(timeout1);
timeout1=null;
},rollo.wait1_ms);
});
}
});
}
und dem Listener auf alles was im Ordner "Rollo" ist:
$('state[id=0_userdata*Rollo*]').on(function(obj){
//log('sth changed');
setTimer1();
setTimer2();
});
werden die Timer bei jeder Änderung neu erstellt. Noch nicht ganz schön sauber, aber es klappt. Erster Funktionstest steht aus. Die Grundfrage aber, ob ein Array mit DP als Objekte dynamisch angepasst werden kann, ist gelöst.