/* ####################################################################### */ // Nachfolgende Einträge anpassen: // Eine Aufzählung für Geräte (z.B. Rollläden) angeben: Zeile 339 auch ändern var deviceEnum = "enum.functions.dummy"; // Eine Aufzählung für States der Bedingungen: var deviceCond = "enum.functions.timerconditions"; // Widget-Nummer für Widget "Timer bearbeiten" (View in Dialog) var DlgWidget = 'w03131' // HTML Code aufteilen? Wenn pro Gerät eine eigenständige HTML Tabelle verwendet werden soll // false: HTML Code wird vollständig in "Timer.RollladenTerrassentuer.TableHTML" geschrieben // true : HTML Code nach Geräten aufteilen -> "Timer.RollladenTerrassentuer.HTML_" var splitHTML = false; /* ####################################################################### */ var device_members = getObject(deviceEnum).common.members; var cronArr = []; // Anzahl Keys in JSON ermitteln function length(obj) { return Object.keys(obj).length; } // Einfaches Kopieren von JSON Objekten function jsonCopy(src) { return JSON.parse(JSON.stringify(src)); } // Initiales erstellen des JSON für States der Bedingungen // Aufruf erfolgt aus main-Function function createConditionsJSON(){ var defCond ={"ID": "", "Val": 0, "Changed": false}; // default JSON für jede Bedingung aus Aufzählung var condition_members = getObject(deviceCond).common.members; var ConditionJSON = {}; var dropDownListe = ""; if (getState("javascript.0.Timer.RollladenTerrassentuer.ConditionJSON").val == "") { for(var i = 0; i < condition_members.length; i++) { var condName = getObject(condition_members[i]).common.name; var condObj = condition_members[i]; dropDownListe += condName + ";"; ConditionJSON[condName] = jsonCopy(defCond); ConditionJSON[condName].ID = condObj; ConditionJSON[condName].Val = getState(condObj).val; } dropDownListe = dropDownListe.substring(0, dropDownListe.length - 1); // Entfernen letztes Semikolon setState("javascript.0.Timer.RollladenTerrassentuer.ConditionJSON", JSON.stringify(ConditionJSON)); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.ConditionKeyDropDown", dropDownListe); } else { ConditionJSON = JSON.parse(getState("javascript.0.Timer.RollladenTerrassentuer.ConditionJSON").val); dropDownListe = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.ConditionKeyDropDown").val; var addedState = false for(var i = 0; i < condition_members.length; i++) { var condName = getObject(condition_members[i]).common.name; var condObj = condition_members[i]; if(!ConditionJSON.hasOwnProperty(condName)){ dropDownListe += ";" + condName; ConditionJSON[condName] = jsonCopy(defCond); ConditionJSON[condName].ID = condObj; ConditionJSON[condName].Val = getState(condObj).val; addedState = true } } if (addedState){ setState("javascript.0.Timer.RollladenTerrassentuer.ConditionJSON", JSON.stringify(ConditionJSON)); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.ConditionKeyDropDown", dropDownListe); } } } // Vergleicht aktuelle Zustände der Bedingungen mit den letzten Zuständen und beschreibt ConditionJSON // Zusätzlich werden die relevanten Timer neu getriggert function compareCond(){ var ConditionJSON = JSON.parse(getState("javascript.0.Timer.RollladenTerrassentuer.ConditionJSON").val); var changed = false; Object.keys(ConditionJSON).forEach(function(key) { if (ConditionJSON[key].Val != getState(ConditionJSON[key].ID).val){ ConditionJSON[key].Val = getState(ConditionJSON[key].ID).val; ConditionJSON[key].Changed = true; changed = true; } else{ ConditionJSON[key].Changed = false; } }); if (changed){ setState("javascript.0.Timer.RollladenTerrassentuer.ConditionJSON", JSON.stringify(ConditionJSON)); var TimerJSON = JSON.parse(getState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON").val); Object.keys(TimerJSON).forEach(function(key) { // Alle RollladenTerrassentuer werden durchlaufen for(let i = 1; i <= length(TimerJSON[key]); i++) { // Alle Timer innerhalb RollladenTerrassentuer werden durchlaufen var affectedTimer = false; var affectedCond = ""; for(let j = 1; j <= TimerJSON[key][i].ConditionsNr; j++) { // Alle Conditions innerhalb einzelner Timer werden durchlaufen // Wenn ein State der Bedingungen oben auf Changed=True geändert wurde, wird hier ein Flag gesetzt var tmpCond = TimerJSON[key][i].Conditions[j].CondState; if (ConditionJSON[tmpCond].Changed){ affectedCond += tmpCond + " | "; affectedTimer = true; } } if (affectedTimer){ // Triggern des autoScheduler um bei veränderten Bedingungen ggf. Schedules neu zu erstellen bzw. zu löschen console.log("Relevante Bedingung(en) für Timer \"" + key + " #" + i + "\" wurde(n) geändert. | " + affectedCond); TimerJSON[key][i].ConditionsTrue = autoScheduler(TimerJSON, key, i); } } }); setState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON", JSON.stringify(TimerJSON)); // rückschreiben in State } } schedule('* * * * *', compareCond); // Führt Evaluation der Bedingungen durch und gibt true oder false zurück // Aufruf nur aus Funktion autoScheduler function condEval(DeviceJSON){ var sumEval, strEval1, strEval2, strEval3; var ConditionsNr = parseInt(DeviceJSON.ConditionsNr); switch(ConditionsNr){ case 0: sumEval = true; break; case 1: strEval1 = eval(DeviceJSON.Conditions[1].ConditionStr); sumEval = strEval1; break; case 2: strEval1 = eval(DeviceJSON.Conditions[1].ConditionStr); strEval2 = eval(DeviceJSON.Conditions[2].ConditionStr); sumEval = (strEval1 && strEval2); break; case 3: strEval1 = eval(DeviceJSON.Conditions[1].ConditionStr); strEval2 = eval(DeviceJSON.Conditions[2].ConditionStr); strEval3 = eval(DeviceJSON.Conditions[3].ConditionStr); sumEval = (strEval1 && strEval2 && strEval3); break; } return sumEval; } // schedules werden variabel erstellt; zunächst wird gelöscht und wenn create=true wird neu erstellt function autoScheduler(TimerJSON, deviceName, timerNr) { var scheduleNr = (TimerJSON[deviceName][timerNr].DeviceNr * 10) + timerNr; var create = TimerJSON[deviceName][timerNr].Aktiv; var cronString = TimerJSON[deviceName][timerNr].Cron; var objID = TimerJSON[deviceName][timerNr].ObjID; var sollwert = TimerJSON[deviceName][timerNr].Sollwert; // Auswertung der Bedingungen var conditionState = condEval(TimerJSON[deviceName][timerNr]); // Timer zunächst immer löschen (function () { if (cronArr[scheduleNr]) { console.log("Schedule für \"" + deviceName + " #" + timerNr + "\" (" + scheduleNr + ") gelöscht!"); clearSchedule(cronArr[scheduleNr]); cronArr[scheduleNr] = null; } })(); // Timer neu erstellen falls AKTIV == true if (create){ if (conditionState){ // Verschiedene Mappings aus DropDown zu realen States if (sollwert == "An"){sollwert = true} else if (sollwert == "Aus"){sollwert = false} else if (sollwert == "Auf"){sollwert = 100} else if (sollwert == "Ab"){sollwert = 0} else (sollwert = parseInt(sollwert)); console.log("Schedule für \"" + deviceName + " #" + timerNr + "\" erstellen:"); console.log("Schedule \"" + deviceName + " #" + timerNr + "\": " + scheduleNr + " | " + cronString + " | " + objID + " | " + sollwert) cronArr[scheduleNr] = schedule(cronString, function(){ setState(objID, sollwert); }); } else { console.log("Schedule für \"" + deviceName + " #" + timerNr + "\" (" + scheduleNr + ") nicht erstellt: Bedingung(en) nicht erfüllt!"); } } return conditionState; } // Erstellt das DropDownFeld für die Nummern-Auswahl function getDropDown(anz) { var strTMP = ""; for (var j = 1; j <= anz ; j++){ strTMP += j + ";"; } strTMP += "+"; return strTMP; } // Cron Tage in Wochentage umwandlen und ggf. abkürzen mit "von - bis" function shortDays(cronTage) { var TageJSON = {1: "Mo", 2: "Di", 3: "Mi", 4: "Do", 5: "Fr", 6: "Sa", 7: "So"}; var cronSplit, cronLast; var tageVIS = ""; // 0 mit 7 ersetzen und ans Ende setzen if (cronTage.substring(0,2) == ",0"){ cronTage = cronTage.substring(2,cronTage.length) + ",7"; } // Erstes Komma entfernen cronTage = cronTage.substring(1, cronTage.length); if (cronTage.length == 1){ tageVIS = TageJSON[cronTage]; } else if (cronTage.length == 13){ tageVIS = "täglich"; } else { cronSplit = cronTage.split(","); cronLast = cronSplit.length - 1; // Wenn Anzahl der Elemente = mathematische Differenz dann "aufeinanderfolgend", also kürzen if ((cronSplit[cronLast] - cronSplit[0]) == cronLast) { tageVIS = TageJSON[cronSplit[0]] + " - " + TageJSON[cronSplit[cronLast]]; } else { for (var j = 0; j <= cronLast ; j++){ tageVIS += TageJSON[cronSplit[j]] + ", "; } // letztes Komma entfernen tageVIS = tageVIS.substring(0, tageVIS.length-1); } } return tageVIS; } // Input: Minute + Stunde + Zufallsbereich (1 bis 59 Min) + Vorzeichen von Zufall // Return: Json Object mit Struktur von timeJSON, siehe unten function randomTime(min,std,rand,opt) { // Erstellung des JSON mit Vorbelegung der Keys var timeJSON = {"Zeit": "23:59", "Cron": "59 23 * * *", "Std": "23", "Min": "59"}; if (rand > 0){ if (rand > 59) {rand = 59;} if (opt === "pm"){var delta_min = Math.floor(Math.random() * (rand - (-1 * rand) + 1) + (-1 * rand));} if (opt === "p"){var delta_min = Math.floor(Math.random() * (rand + 1));} if (opt === "m"){var delta_min = Math.floor(Math.random() * (rand + 1) - rand);} min += delta_min; if (min >= 60){std++;min -= 60;} else if (min < 0){std--;min += 60;} if (std >= 24){std -= 24;} else if (std < 0){std += 24;} } timeJSON.Zeit = (std <= 9 ? "0" : "") + std + ":" + (min <= 9 ? "0" : "") + min; timeJSON.Std = std; timeJSON.Min = min; timeJSON.Cron = min + " " + std + " *" + " * "; // Wochentage für Cron bewusst nicht vorhanden, wird später angehängt return timeJSON; } // Input timeJSON aus function randomTime + Offset + Vorzeichen von Offset // Output timeJSON mit verrechnetem Offset function offsetTime(randJSON,offset,opt) { var min = randJSON.Min, std = randJSON.Std, delta_min = 0; var timeJSON = {"Zeit": "23:59", "Cron": "59 23 * * *", "Std": "23", "Min": "59"}; if (offset > 0){ if (offset > 59) {offset = 59;} if (opt === "p"){ delta_min = offset } if (opt === "m"){ delta_min = -1 * offset} min += delta_min; if (min >= 60){std++;min -= 60;} else if (min < 0){std--;min += 60;} if (std >= 24){std -= 24;} else if (std < 0){std += 24;} } timeJSON.Zeit = (std <= 9 ? "0" : "") + std + ":" + (min <= 9 ? "0" : "") + min; timeJSON.Std = std; timeJSON.Min = min; timeJSON.Cron = min + " " + std + " *" + " * "; // Wochentage für Cron bewusst nicht vorhanden, wird später angehängt return timeJSON; } // Setzt die 3 Felder für Astro-DropDown Werte, Texte und das Json für spätere Berechnungen. function setAstro() { var strWerte = "manuell"; var strTexte = "manuell"; var AstroJSON = {}; var tmpAstro; var astro_times = ["sunrise", "sunriseEnd", "goldenHourEnd", "solarNoon", "goldenHour", "sunsetStart", "sunset", "dusk", "nauticalDusk", "nadir", "nauticalDawn", "dawn"] var defaultJSON = {"Zeit" : "10:00", "Std" : 10, "Min" : 0}; astro_times.forEach(function(entry) { tmpAstro = entry; var zeit = formatDate(getDateObject(getAstroDate(tmpAstro, undefined, 0)), "hh:mm"); var zeitSplit = zeit.split(':'); AstroJSON[tmpAstro] = jsonCopy(defaultJSON); AstroJSON[tmpAstro].Zeit = zeit; AstroJSON[tmpAstro].Std = parseInt(zeitSplit[0]); AstroJSON[tmpAstro].Min = parseInt(zeitSplit[1]); strTexte += ";" + tmpAstro + ", " + zeit; strWerte += ";" + tmpAstro; }); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.DropDownAstroTexte", strTexte); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.DropDownAstroWerte", strWerte); setState("javascript.0.Timer.AstroJSON", JSON.stringify(AstroJSON)); } // setAstro wird täglich einmal getriggert schedule('2 15 * * *', setAstro); // recalc wird automatisch täglich ausgeführt und zieht Random und Astro neu an // Trigger erfolgt vorzugsweise nach Trigger für setAstro // recalc erfolgt auch wenn CopyAll im Editor PopUp aktiviert wird function recalc() { var CalcJSON = {}; var astro, device, nr; var AstroJSON = JSON.parse(getState("javascript.0.Timer.AstroJSON").val); var TimerJSON = JSON.parse(getState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON").val); Object.keys(TimerJSON).forEach(function(key) { for(var i = 1; i <= length(TimerJSON[key]); i++) { astro = TimerJSON[key][i].Astro; device = key; nr = i; if (astro === "manuell" ){ CalcJSON = randomTime(parseInt(TimerJSON[key][i].Min,10),parseInt(TimerJSON[key][i].Std,10),TimerJSON[key][i].Random,TimerJSON[key][i].RandPM); } else { CalcJSON = randomTime(parseInt(AstroJSON[astro].Min,10),parseInt(AstroJSON[astro].Std,10),TimerJSON[key][i].Random,TimerJSON[key][i].RandPM); CalcJSON = offsetTime(CalcJSON,TimerJSON[key][i].Offset,TimerJSON[key][i].OffsetPM); } TimerJSON[key][i].Zeit = CalcJSON.Zeit; TimerJSON[key][i].Cron = CalcJSON.Cron + TimerJSON[key][i].CronTage; TimerJSON[key][i].ConditionsTrue = autoScheduler(TimerJSON, key, i); } }); setState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON", JSON.stringify(TimerJSON)); // rückschreiben in State setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Nummer", "", true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Device", "Timer.RollladenTerrassentuer.Editor.Verschluss", true); } schedule('12 15 * * *', recalc); // ENDE DER HILFS-FUNKTIONEN //########################################################################################################## //########################################################################################################## // NACHFOLGEND DIE TRIGGER // Trigger zum Erstellen der Bedingungen als String für späteres eval() (3x) on({id: new RegExp('javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.Cond1Comp' + "|" + 'javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.Cond1State' + "|" + 'javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.Cond1Value'), change: "any", ack: false}, function (obj) { var ConditionJSON = JSON.parse(getState("javascript.0.Timer.RollladenTerrassentuer.ConditionJSON").val); var Cond1State = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond1State").val var Cond1Comp = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond1Comp").val var Cond1Value = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond1Value").val var strCond1 = "getState(\"" + ConditionJSON[Cond1State].ID + "\").val " + Cond1Comp + " " + Cond1Value setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Condition1", strCond1); }); on({id: new RegExp('javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.Cond2Comp' + "|" + 'javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.Cond2State' + "|" + 'javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.Cond2Value'), change: "any", ack: false}, function (obj) { var ConditionJSON = JSON.parse(getState("javascript.0.Timer.RollladenTerrassentuer.ConditionJSON").val); var Cond2State = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond2State").val var Cond2Comp = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond2Comp").val var Cond2Value = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond2Value").val var strCond2 = "getState(\"" + ConditionJSON[Cond2State].ID + "\").val " + Cond2Comp + " " + Cond2Value setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Condition2", strCond2); }); on({id: new RegExp('javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.Cond3Comp' + "|" + 'javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.Cond3State' + "|" + 'javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.Cond3Value'), change: "any", ack: false}, function (obj) { var ConditionJSON = JSON.parse(getState("javascript.0.Timer.RollladenTerrassentuer.ConditionJSON").val); var Cond3State = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond3State").val var Cond3Comp = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond3Comp").val var Cond3Value = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond3Value").val var strCond3 = "getState(\"" + ConditionJSON[Cond3State].ID + "\").val " + Cond3Comp + " " + Cond3Value setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Condition3", strCond3); }); // Bei Änderung der Zeiten oder Astros im PopUp-View werden direkt End-Zeiten berechnet on({id: new RegExp('javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.Std' + "|" + 'javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.Min' + "|" + 'javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.Random' + "|" + 'javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.RandPM' + "|" + 'javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.Offset' + "|" + 'javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.OffsetPM' + "|" + 'javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.DropDownAstro'), change: "ne", ack: false}, function (obj) { var astro = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.DropDownAstro").val; var CalcJSON = {}; var rand = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Random").val; var randpm = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.RandPM").val; var offset = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Offset").val; var offsetPM = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.OffsetPM").val; if (astro === "manuell" ){ min = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Min").val; std = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Std").val; CalcJSON = randomTime(parseInt(min,10),parseInt(std,10),rand,randpm); } else { var AstroJSON = JSON.parse(getState("javascript.0.Timer.AstroJSON").val); CalcJSON = randomTime(AstroJSON[astro].Min,AstroJSON[astro].Std,rand,randpm); CalcJSON = offsetTime(CalcJSON,offset,offsetPM); } // Eintrag für vollst. Cron aktualisieren setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Zeit", CalcJSON.Zeit); var CronTage = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.CronTage").val; setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cron", (CalcJSON.Cron + CronTage)); }); // Trigger wenn Device-Auswahl geändert wird (triggert automatisch die Nr 1 des Device) on({id: "javascript.0.Timer.RollladenTerrassentuer.Editor.Device", change: "any", ack: false}, function (obj) { // auf Pulldownmenü das jeweilige device auslesen var device = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Device").val; var TimerJSON = JSON.parse(getState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON").val); //einlesen der Einträge aus State var devlen = length(TimerJSON[device]); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.DropDownNr", getDropDown(devlen)); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Nummer", 1); }); // Trigger wenn Timer-Nummer vom Device aktualisiert wird on({id: "javascript.0.Timer.RollladenTerrassentuer.Editor.Nummer", change: "any", ack: false}, function (obj) { // auf Pulldownmenü den jeweiligen Eintrag auslesen var TimerJSON = JSON.parse(getState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON").val); //einlesen der Einträge aus State var device = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Device").val; var nr = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Nummer").val; if (nr == "+"){ var devlen = length(TimerJSON[device]); nr = devlen + 1; TimerJSON[device][nr] = TimerJSON[device][devlen]; // Falls kopierter Timer aktiv war wird der Neue auch direkt gesetzt TimerJSON[device][nr].ConditionsTrue = autoScheduler(TimerJSON, device, nr); setState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON", JSON.stringify(TimerJSON)); // rückschreiben in State setState("javascript.0.Timer.RollladenTerrassentuer.Editor.DropDownNr", getDropDown(nr)); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Nummer", nr); } setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Aktiv", TimerJSON[device][nr].Aktiv, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Zeit", TimerJSON[device][nr].Zeit, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cron", TimerJSON[device][nr].Cron, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.TageVIS", TimerJSON[device][nr].TageVIS, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.CronTage", TimerJSON[device][nr].CronTage, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagMo", TimerJSON[device][nr].Mo, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagDi", TimerJSON[device][nr].Di, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagMi", TimerJSON[device][nr].Mi, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagDo", TimerJSON[device][nr].Do, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagFr", TimerJSON[device][nr].Fr, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagSa", TimerJSON[device][nr].Sa, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagSo", TimerJSON[device][nr].So, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Std", TimerJSON[device][nr].Std, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Min", TimerJSON[device][nr].Min, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Sollwert", TimerJSON[device][nr].Sollwert, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.DropDownAstro", TimerJSON[device][nr].Astro, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Random", TimerJSON[device][nr].Random, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.RandPM", TimerJSON[device][nr].RandPM, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Offset", TimerJSON[device][nr].Offset, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.OffsetPM", TimerJSON[device][nr].OffsetPM, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.ConditionsNr", TimerJSON[device][nr].ConditionsNr, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Condition1", TimerJSON[device][nr].Conditions[1].ConditionStr, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond1State", TimerJSON[device][nr].Conditions[1].CondState, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond1Comp", TimerJSON[device][nr].Conditions[1].CondComp, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond1Value", TimerJSON[device][nr].Conditions[1].CondValue, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Condition2", TimerJSON[device][nr].Conditions[2].ConditionStr, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond2State", TimerJSON[device][nr].Conditions[2].CondState, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond2Comp", TimerJSON[device][nr].Conditions[2].CondComp, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond2Value", TimerJSON[device][nr].Conditions[2].CondValue, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Condition3", TimerJSON[device][nr].Conditions[3].ConditionStr, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond3State", TimerJSON[device][nr].Conditions[3].CondState, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond3Comp", TimerJSON[device][nr].Conditions[3].CondComp, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond3Value", TimerJSON[device][nr].Conditions[3].CondValue, true); }); // Wenn Status "Aktiv" geändert wird erfolgt sofortiges Sichern des TimerJSON on({id: "javascript.0.Timer.RollladenTerrassentuer.Editor.Aktiv", change: "any", ack: false}, function (obj) { var TimerJSON = JSON.parse(getState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON").val); //einlesen der Einträge aus State var device = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Device").val; var nr = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Nummer").val; TimerJSON[device][nr].Aktiv = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Aktiv").val; // Schedule setzen bzw. löschen TimerJSON[device][nr].ConditionsTrue = autoScheduler(TimerJSON, device, nr); setState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON", JSON.stringify(TimerJSON)); // rückschreiben in State }); // Trigger des Delete-Button für Löschen eines Timer-Eintrags on({id: "javascript.0.Timer.RollladenTerrassentuer.Editor.Del", change: "any", ack: false}, function (obj) { var device = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Device").val; var nr = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Nummer").val; var TimerJSON = JSON.parse(getState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON").val); //einlesen der Einträge aus State var devlen = length(TimerJSON[device]); if (devlen > 1 ){ // Aktueller Timer wird ausschließlich gelöscht TimerJSON[device][nr].Aktiv = false TimerJSON[device][nr].ConditionsTrue = autoScheduler(TimerJSON, device, nr); delete TimerJSON[device][nr]; if (nr < devlen){ for (var j = nr; j < devlen ; j++) { var tmpAktiv = TimerJSON[device][j+1].Aktiv TimerJSON[device][j+1].Aktiv = false TimerJSON[device][j+1].ConditionsTrue = autoScheduler(TimerJSON, device, j+1); TimerJSON[device][j+1].Aktiv = tmpAktiv; TimerJSON[device][j] = TimerJSON[device][j+1]; TimerJSON[device][j].ConditionsTrue = autoScheduler(TimerJSON, device, j); delete TimerJSON[device][j+1]; } } devlen = length(TimerJSON[device]); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.DropDownNr", getDropDown(devlen)); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Nummer", devlen); setState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON", JSON.stringify(TimerJSON)); // rückschreiben in State } else { TimerJSON[device][1].Aktiv = false; TimerJSON[device][1].ConditionsTrue = autoScheduler(TimerJSON, device, 1); delete TimerJSON[device]; var dropDownListe = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.DropDownDevice").val; if(dropDownListe.indexOf(device + ";") > 0){ dropDownListe = dropDownListe.replace(device + ";", ""); } else if(dropDownListe.indexOf(";" + device) > 0){ dropDownListe = dropDownListe.replace(";" + device, ""); } setState("javascript.0.Timer.RollladenTerrassentuer.Editor.DropDownDevice", dropDownListe, true); setState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON", JSON.stringify(TimerJSON)); // rückschreiben in State setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Nummer", "", true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Device", "", true); } }); // Änderung der ausgewählten Tage triggern sofort den Tage-String-Eintrag, so wird OK-Trigger übersichtlicher on({id: new RegExp('javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.WTagDi' + "|" + 'javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.WTagDo' + "|" + 'javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.WTagFr' + "|" + 'javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.WTagMi' + "|" + 'javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.WTagMo' + "|" + 'javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.WTagSa' + "|" + 'javascript\\.0\\.Timer\\.RollladenTerrassentuer\\.Editor\\.WTagSo'), change: "ne"}, function (obj) { var strTage = ""; // Nur für Anzeige var cronTage = ""; // Für setzen von Cron-Schedule if(getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagSo").val){cronTage += ",0";} if(getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagMo").val){cronTage += ",1";} if(getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagDi").val){cronTage += ",2";} if(getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagMi").val){cronTage += ",3";} if(getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagDo").val){cronTage += ",4";} if(getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagFr").val){cronTage += ",5";} if(getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagSa").val){cronTage += ",6";} // String für VIS übersetzen, kürzen und setzen setState("javascript.0.Timer.RollladenTerrassentuer.Editor.TageVIS", shortDays(cronTage)); cronTage = cronTage.substring(1, cronTage.length); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.CronTage", cronTage); // Cron-Eintrag anpassen var cronSplit = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cron").val.split(" "); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cron", (cronSplit[0] + " " + cronSplit[1] + " " + cronSplit[2] + " " + cronSplit[3] + " " + cronTage)); }); // Trigger für OK-Button in PopUp-View; alle Werte werden in TimerJSON gesichert on({id: "javascript.0.Timer.RollladenTerrassentuer.Editor.OK", change: "any", ack: false}, function (obj) { var device = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Device").val; var nr = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Nummer").val; var TimerJSON = JSON.parse(getState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON").val); //einlesen der Einträge aus State var copyAll = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.CopyAll").val; if (copyAll){ Object.keys(TimerJSON).forEach(function(key) { if(TimerJSON[key].hasOwnProperty(nr.toString())){ device = key; TimerJSON[device][nr].Zeit = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Zeit").val; TimerJSON[device][nr].Std = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Std").val; TimerJSON[device][nr].Min = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Min").val; TimerJSON[device][nr].Cron = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cron").val; TimerJSON[device][nr].Sollwert = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Sollwert").val; TimerJSON[device][nr].TageVIS = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.TageVIS").val; TimerJSON[device][nr].CronTage = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.CronTage").val; TimerJSON[device][nr].Astro = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.DropDownAstro").val; TimerJSON[device][nr].Random = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Random").val; TimerJSON[device][nr].RandPM = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.RandPM").val; TimerJSON[device][nr].Offset = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Offset").val; TimerJSON[device][nr].OffsetPM = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.OffsetPM").val; TimerJSON[device][nr].Mo = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagMo").val; TimerJSON[device][nr].Di = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagDi").val; TimerJSON[device][nr].Mi = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagMi").val; TimerJSON[device][nr].Do = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagDo").val; TimerJSON[device][nr].Fr = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagFr").val; TimerJSON[device][nr].Sa = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagSa").val; TimerJSON[device][nr].So = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagSo").val; TimerJSON[device][nr].ConditionsNr = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.ConditionsNr").val; TimerJSON[device][nr].Conditions[1].ConditionStr = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Condition1").val; TimerJSON[device][nr].Conditions[1].CondState = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond1State").val; TimerJSON[device][nr].Conditions[1].CondComp = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond1Comp").val; TimerJSON[device][nr].Conditions[1].CondValue = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond1Value").val; TimerJSON[device][nr].Conditions[2].ConditionStr = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Condition2").val; TimerJSON[device][nr].Conditions[2].CondState = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond2State").val; TimerJSON[device][nr].Conditions[2].CondComp = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond2Comp").val; TimerJSON[device][nr].Conditions[2].CondValue = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond2Value").val; TimerJSON[device][nr].Conditions[3].ConditionStr = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Condition3").val; TimerJSON[device][nr].Conditions[3].CondState = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond3State").val; TimerJSON[device][nr].Conditions[3].CondComp = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond3Comp").val; TimerJSON[device][nr].Conditions[3].CondValue = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond3Value").val; } }); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.CopyAll", false); setState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON", JSON.stringify(TimerJSON)); // rückschreiben in State setTimeout(recalc,100); } else { TimerJSON[device][nr].Zeit = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Zeit").val; TimerJSON[device][nr].Std = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Std").val; TimerJSON[device][nr].Min = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Min").val; TimerJSON[device][nr].Cron = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cron").val; TimerJSON[device][nr].Sollwert = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Sollwert").val; TimerJSON[device][nr].TageVIS = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.TageVIS").val; TimerJSON[device][nr].CronTage = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.CronTage").val; TimerJSON[device][nr].Astro = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.DropDownAstro").val; TimerJSON[device][nr].Random = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Random").val; TimerJSON[device][nr].RandPM = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.RandPM").val; TimerJSON[device][nr].Offset = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Offset").val; TimerJSON[device][nr].OffsetPM = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.OffsetPM").val; TimerJSON[device][nr].Mo = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagMo").val; TimerJSON[device][nr].Di = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagDi").val; TimerJSON[device][nr].Mi = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagMi").val; TimerJSON[device][nr].Do = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagDo").val; TimerJSON[device][nr].Fr = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagFr").val; TimerJSON[device][nr].Sa = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagSa").val; TimerJSON[device][nr].So = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.WTagSo").val; TimerJSON[device][nr].ConditionsNr = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.ConditionsNr").val; TimerJSON[device][nr].Conditions[1].ConditionStr = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Condition1").val; TimerJSON[device][nr].Conditions[1].CondState = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond1State").val; TimerJSON[device][nr].Conditions[1].CondComp = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond1Comp").val; TimerJSON[device][nr].Conditions[1].CondValue = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond1Value").val; TimerJSON[device][nr].Conditions[2].ConditionStr = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Condition2").val; TimerJSON[device][nr].Conditions[2].CondState = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond2State").val; TimerJSON[device][nr].Conditions[2].CondComp = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond2Comp").val; TimerJSON[device][nr].Conditions[2].CondValue = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond2Value").val; TimerJSON[device][nr].Conditions[3].ConditionStr = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Condition3").val; TimerJSON[device][nr].Conditions[3].CondState = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond3State").val; TimerJSON[device][nr].Conditions[3].CondComp = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond3Comp").val; TimerJSON[device][nr].Conditions[3].CondValue = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.Cond3Value").val; // Schedule setzen bzw. löschen TimerJSON[device][nr].ConditionsTrue = autoScheduler(TimerJSON, device, nr); setState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON", JSON.stringify(TimerJSON)); // rückschreiben in State } // Dialog schließen setState("vis.0.control.instance"/*Control vis*/, 'FFFFFFFF'); setState("vis.0.control.data"/*Data for control vis*/, DlgWidget); setState("vis.0.control.command"/*Command for vis*/, 'dialogClose'); }); // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // +++++++++++++++++++++ initiales Erstellen und Schreiben der Objekte im State nur beim ersten Start ++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ createState("Timer.RollladenTerrassentuer.ConditionJSON", "", { name: 'JSON für Conditions in VIS', desc: 'JSON für Conditions in VIS', type: 'string', role: 'value', unit: '' }); createState("Timer.AstroJSON"); createState("Timer.RollladenTerrassentuer.Editor.Del"); createState("Timer.RollladenTerrassentuer.Editor.OK"); createState("Timer.RollladenTerrassentuer.Editor.CopyAll"); createState("Timer.RollladenTerrassentuer.Editor.DropDownNr"); createState("Timer.RollladenTerrassentuer.Editor.DropDownDevice"); createState("Timer.RollladenTerrassentuer.Editor.DropDownAstro"); createState("Timer.RollladenTerrassentuer.Editor.DropDownAstroWerte"); createState("Timer.RollladenTerrassentuer.Editor.DropDownAstroTexte"); createState("Timer.RollladenTerrassentuer.Editor.Device"); createState("Timer.RollladenTerrassentuer.Editor.Nummer"); createState("Timer.RollladenTerrassentuer.TimerJSON"); createState("Timer.RollladenTerrassentuer.Editor.Aktiv"); createState("Timer.RollladenTerrassentuer.Editor.Zeit"); createState("Timer.RollladenTerrassentuer.Editor.Cron"); createState("Timer.RollladenTerrassentuer.Editor.TageVIS"); createState("Timer.RollladenTerrassentuer.Editor.CronTage"); createState("Timer.RollladenTerrassentuer.Editor.WTagMo"); createState("Timer.RollladenTerrassentuer.Editor.WTagDi"); createState("Timer.RollladenTerrassentuer.Editor.WTagMi"); createState("Timer.RollladenTerrassentuer.Editor.WTagDo"); createState("Timer.RollladenTerrassentuer.Editor.WTagFr"); createState("Timer.RollladenTerrassentuer.Editor.WTagSa"); createState("Timer.RollladenTerrassentuer.Editor.WTagSo"); createState("Timer.RollladenTerrassentuer.Editor.Std"); createState("Timer.RollladenTerrassentuer.Editor.Min"); createState("Timer.RollladenTerrassentuer.Editor.Sollwert"); createState("Timer.RollladenTerrassentuer.Editor.Random"); createState("Timer.RollladenTerrassentuer.Editor.RandPM"); createState("Timer.RollladenTerrassentuer.Editor.Offset"); createState("Timer.RollladenTerrassentuer.Editor.OffsetPM"); createState("Timer.RollladenTerrassentuer.Editor.ConditionKeyDropDown"); createState("Timer.RollladenTerrassentuer.Editor.Condition"); createState("Timer.RollladenTerrassentuer.Editor.ConditionsNr"); createState("Timer.RollladenTerrassentuer.Editor.Condition1"); createState("Timer.RollladenTerrassentuer.Editor.Cond1State"); createState("Timer.RollladenTerrassentuer.Editor.Cond1Comp"); createState("Timer.RollladenTerrassentuer.Editor.Cond1Value"); createState("Timer.RollladenTerrassentuer.Editor.Condition2"); createState("Timer.RollladenTerrassentuer.Editor.Cond2State"); createState("Timer.RollladenTerrassentuer.Editor.Cond2Comp"); createState("Timer.RollladenTerrassentuer.Editor.Cond2Value"); createState("Timer.RollladenTerrassentuer.Editor.Condition3"); createState("Timer.RollladenTerrassentuer.Editor.Cond3State"); createState("Timer.RollladenTerrassentuer.Editor.Cond3Comp"); createState("Timer.RollladenTerrassentuer.Editor.Cond3Value"); var DefaultInhalte = { "1": {"ObjID": "", "DeviceNr": "", // wird für cron-schedules genutzt "Aktiv": false, "Zeit":"10:00", "Std": "10", "Min": "00", "Sollwert":"100", // Sollwert der Geräte "TageVIS": "täglich", // Für Anzeige "CronTage": "0,1,2,3,4,5,6", "Cron": "0 10 * * 0,1,2,3,4,5,6", "Astro":"manuell", "Random":"0", "RandPM":"pm", "Offset":"0", "OffsetPM":"m", "ConditionsNr": "0", "ConditionsTrue": true, "Conditions":{ "1":{ "ConditionStr": "", "CondState": "", "CondComp": "==", "CondValue": "" }, "2":{ "ConditionStr": "", "CondState": "", "CondComp": "==", "CondValue": "" }, "3":{ "ConditionStr": "", "CondState": "", "CondComp": "==", "CondValue": "" } }, "Mo": true, "Di": true, "Mi": true, "Do": true, "Fr": true, "Sa": true, "So": true, }, "2": {"ObjID": "", "DeviceNr": "", // wird für cron-schedules genutzt "Aktiv": false, "Zeit":"19:00", "Std": "19", "Min": "00", "Sollwert": "0", // Sollwert der Geräte "TageVIS": "täglich", // Für Anzeige "CronTage": "0,1,2,3,4,5,6", "Cron": "0 19 * * 0,1,2,3,4,5,6", "Astro":"manuell", "Random":"0", "RandPM":"pm", "Offset":"0", "OffsetPM":"m", "ConditionsTrue": true, "ConditionsNr": "0", "Conditions":{ "1":{ "ConditionStr": "", "CondState": "", "CondComp": "==", "CondValue": "" }, "2":{ "ConditionStr": "", "CondState": "", "CondComp": "==", "CondValue": "" }, "3":{ "ConditionStr": "", "CondState": "", "CondComp": "==", "CondValue": "" } }, "Mo": true, "Di": true, "Mi": true, "Do": true, "Fr": true, "Sa": true, "So": true, }, }; function main () { var dropDownListe = ""; var devName; var TimerJSON = {}; setTimeout(createConditionsJSON,100); if (getState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON").val === null) { // Erste Initialisierung falls Objekte noch nicht existieren console.log("States werden neu erstellt! Script bitte erneut starten!"); setTimeout(setAstro,100); for(var i = 0; i < device_members.length; i++) { devName = getObject(device_members[i]).common.name; dropDownListe += devName + ";"; TimerJSON[devName] = jsonCopy(DefaultInhalte); TimerJSON[devName][1].ObjID = TimerJSON[devName][2].ObjID = device_members[i]; TimerJSON[devName][1].DeviceNr = TimerJSON[devName][2].DeviceNr = i; TimerJSON[devName][1].ConditionsTrue = autoScheduler(TimerJSON, devName, 1); TimerJSON[devName][2].ConditionsTrue = autoScheduler(TimerJSON, devName, 2); } dropDownListe = dropDownListe.substring(0, dropDownListe.length - 1); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.DropDownDevice", dropDownListe, true); setState("javascript.0.Timer.RollladenTerrassentuer.Editor.DropDownNr", "1;2;+", true); setState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON", JSON.stringify(TimerJSON)); //rückschreiben der Einträge in State setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Device", devName); // Erstes Triggern für Erstellung der Tabelle } else { setTimeout(setAstro,100); TimerJSON = JSON.parse(getState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON").val); // Check ob neue Device hinzugekommen sind var addedDevice = false; dropDownListe = getState("javascript.0.Timer.RollladenTerrassentuer.Editor.DropDownDevice").val; for(var i = 0; i < device_members.length; i++) { devName = getObject(device_members[i]).common.name; if(!TimerJSON.hasOwnProperty(devName)){ addedDevice = true; console.log("Device # " + devName + " # fehlt und wird neu hinzugefügt mit Schedules-ID: " + i); // Zunächst DropDownListe für RollladenTerrassentuer erweitern dropDownListe += ";" + devName; // Device mit DefaultInhalt erstellen TimerJSON[devName] = jsonCopy(DefaultInhalte); TimerJSON[devName][1].ObjID = TimerJSON[devName][2].ObjID = device_members[i]; TimerJSON[devName][1].DeviceNr = TimerJSON[devName][2].DeviceNr = i; } else { for(let j = 1; j <= length(TimerJSON[devName]); j++) { TimerJSON[devName][j].DeviceNr = i; } } } // Schedules werden immer nach Start des Skripts automatisch erstellt // Auch durchführen wenn "Aktiv != true" damit Conditions neu validiert werden // recalc Funktion nicht erlaubt, da JSON in State nicht aktuell sein muss (neue RollladenTerrassentuer usw.) Object.keys(TimerJSON).forEach(function(key) { for(let i = 1; i <= length(TimerJSON[key]); i++) { TimerJSON[key][i].ConditionsTrue = autoScheduler(TimerJSON, key, i); } }); // States sichern setState("javascript.0.Timer.RollladenTerrassentuer.Editor.DropDownDevice", dropDownListe, true); setState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON", JSON.stringify(TimerJSON)); //rückschreiben der Einträge in State setState("javascript.0.Timer.RollladenTerrassentuer.Editor.Device", devName); // Erstes Triggern für Erstellung der Tabelle setTimeout(tableMain,1000); } } setTimeout(main,1000); //########################################################################################################## // NACHFOLGEND die Erstellung der JSON Tabelle und HTML Aufbereitung //########################################################################################################## function buildJson(tabelle) { var tmpAstro, tmpRand, tmpOffset; var TimerJSON = JSON.parse(getState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON").val); Object.keys(TimerJSON).sort().forEach(function(key) { for (var j = 1; j <= Object.keys(TimerJSON[key]).length; j++) { var tempJsonNr = TimerJSON[key][j]; // JSON Objekt wird umkopiert um im weiteren Verlauf ohne Indizes zu arbeiten tmpAstro = tempJsonNr.Astro == "manuell" ? (tempJsonNr.Std + ":" + tempJsonNr.Min) : tempJsonNr.Astro; if (tempJsonNr.Random != "0"){ switch(tempJsonNr.RandPM){ case "p": tmpRand = "+" + " " + tempJsonNr.Random; break; case "m": tmpRand = "-" + " " + tempJsonNr.Random; break; case "pm": tmpRand = "±" + " " + tempJsonNr.Random; break; } } else { tmpRand = " " } if (tempJsonNr.Offset != "0"){ switch(tempJsonNr.OffsetPM){ case "p": tmpOffset = "+" + " " + tempJsonNr.Offset; break; case "m": tmpOffset = "-" + " " + tempJsonNr.Offset; break; } } else { tmpOffset = " " } if (tempJsonNr.Astro == "manuell"){tmpOffset = " "} tabelle.push({ "Geraet" : key, "Nr" : j, "Aktiv" : tempJsonNr.Aktiv, "CondNr" : tempJsonNr.ConditionsNr, "CondTrue" : tempJsonNr.ConditionsTrue, "Zeit" : tempJsonNr.Zeit, "Tage" : tempJsonNr.TageVIS, "Sollwert" : tempJsonNr.Sollwert, "Astro" : tmpAstro, "offset" : tmpOffset, "rand" : tmpRand, }); } }); return tabelle; } function jsonToHtml(tabelle) { var html = "\n"; var astro = ""; var tmpTage = ""; for (var i=0; i" + tabelle[i].Nr + ""; } else { html+=""; } if (tabelle[i].CondNr > 0){ if (tabelle[i].CondTrue){ html+=""; } else { html+=""; } } else { html+=""; } html+=""; html+=""; html+=""; html+=""; html+=""; html+=""; html+=""; } html+="
Nr!ZeitWochentagSollAstroOffsetZufall
" + tabelle[i].Nr + "*" + tabelle[i].CondNr + "*" + tabelle[i].CondNr + " " + tabelle[i].Zeit + "" + tabelle[i].Tage + "" + tabelle[i].Sollwert + "" + tabelle[i].Astro + "" + tabelle[i].offset + "" + tabelle[i].rand + "
"; return html; } function tableMain() { var device; var tabelle = []; createState("Timer.RollladenTerrassentuer.TableJSON"); setState("javascript.0.Timer.RollladenTerrassentuer.TableJSON", JSON.stringify(buildJson(tabelle))); var TimerJSON = JSON.parse(getState("javascript.0.Timer.RollladenTerrassentuer.TimerJSON").val); if (splitHTML) { var tableIndex = 0; Object.keys(TimerJSON).sort().forEach(function(device) { var timerNr = Object.keys(TimerJSON[device]).length var strState = "Timer.RollladenTerrassentuer.HTML_" + device; // Falls Device mit einem Punkt endet, muss dieser entfernt werden um State zu erstellen strState = (strState.slice(-1) == ".") ? strState.slice(0, strState.length - 1) : strState; createState(strState); setState(strState, jsonToHtml(tabelle.slice(tableIndex, tableIndex + timerNr))); tableIndex += timerNr; }); } else { createState("Timer.RollladenTerrassentuer.TableHTML"); setState("javascript.0.Timer.RollladenTerrassentuer.TableHTML", jsonToHtml(tabelle)); } } on({id: "javascript.0.Timer.RollladenTerrassentuer.TimerJSON", change: "ne"}, function (obj) { tableMain(); });