NEWS
Script optimieren - Frage an Experten mit einem Beispiel
-
Liebe Script Experten,
nach ein paar Tagen "Eingewöhnung" in ioBroker hab ich nun sehr viel weiter gebracht, dashUI und ccu.io wird heute noch abgedreht, da ist alles portiert UND die ersten meiner Scripte aus der CCU sind nun endlich unter ioBroker funktionstüchtig!
ABER - anbei mal ein Beispiel Script, dass von mir sicher zu umständlich gelöst wurde - würde mich freuen, wenn der eine oder andere da seinen Senf dazu gibt und ich ein bisschen was lernen kann.
Zum Script:
Das Script prüft auf Änderung von sechs JavaScript Variablen und soll wenn nur eine davon den Wert 6 enthält eine Variable Klima.Alarm auf true setzen. Ist keiner der überprüften Werte eine 6, dann soll der Alarm wieder gelöscht werden.
Der Hintergrund ist, dass ich mir in VIS einen Button einfärbe sobald ein Klimaalarm aktiv ist um so auf der Hauptseite in VIS einen Hinweis zu bekommen, die Klimawerte zu checken.
Im Hintergrund werkelt ein Check, ob in einem Raum gelüftet werden sollte (weil zu warm oder zu feucht…).
on ({id: "javascript.0.Klima.BD.open_color", change: "ne"}, function () { // wenn dringend Lüften, dann Klimaalarm setzen if ("javascript.0.Klima.BD.open_color" == 6) { setState("javascript.0.Klima.Alarm", true)} // wenn nicht, dann alle anderen Kanäle checken und wenn geht, Alarm löschen else { if (("javascript.0.Klima.BR.open_color" < 6) && ("javascript.0.Klima.KZ.open_color" < 6) && ("javascript.0.Klima.SZ.open_color" < 6) && ("javascript.0.Klima.WC.open_color" < 6) && ("javascript.0.Klima.WZ.open_color" < 6)) { setState("javascript.0.Klima.Alarm", false); } } }); on ({id: "javascript.0.Klima.BR.open_color", change: "ne"}, function () { // wenn dringend Lüften, dann Klimaalarm setzen if ("javascript.0.Klima.BR.open_color" == 6) { setState("javascript.0.Klima.Alarm", true)} // wenn nicht, dann alle anderen Kanäle checken und wenn geht, Alarm löschen else { if (("javascript.0.Klima.BD.open_color" < 6) && ("javascript.0.Klima.KZ.open_color" < 6) && ("javascript.0.Klima.SZ.open_color" < 6) && ("javascript.0.Klima.WC.open_color" < 6) && ("javascript.0.Klima.WZ.open_color" < 6)) { setState("javascript.0.Klima.Alarm", false); } } }); on ({id: "javascript.0.Klima.KZ.open_color", change: "ne"}, function () { // wenn dringend Lüften, dann Klimaalarm setzen if ("javascript.0.Klima.KZ.open_color" == 6) { setState("javascript.0.Klima.Alarm", true)} // wenn nicht, dann alle anderen Kanäle checken und wenn geht, Alarm löschen else { if (("javascript.0.Klima.BD.open_color" < 6) && ("javascript.0.Klima.BR.open_color" < 6) && ("javascript.0.Klima.SZ.open_color" < 6) && ("javascript.0.Klima.WC.open_color" < 6) && ("javascript.0.Klima.WZ.open_color" < 6)) { setState("javascript.0.Klima.Alarm", false); } } }); on ({id: "javascript.0.Klima.SZ.open_color", change: "ne"}, function () { // wenn dringend Lüften, dann Klimaalarm setzen if ("javascript.0.Klima.SZ.open_color" == 6) { setState("javascript.0.Klima.Alarm", true)} // wenn nicht, dann alle anderen Kanäle checken und wenn geht, Alarm löschen else { if (("javascript.0.Klima.BD.open_color" < 6) && ("javascript.0.Klima.BR.open_color" < 6) && ("javascript.0.Klima.KZ.open_color" < 6) && ("javascript.0.Klima.WC.open_color" < 6) && ("javascript.0.Klima.WZ.open_color" < 6)) { setState("javascript.0.Klima.Alarm", false); } } }); on ({id: "javascript.0.Klima.WZ.open_color", change: "ne"}, function () { // wenn dringend Lüften, dann Klimaalarm setzen if ("javascript.0.Klima.WZ.open_color" == 6) { setState("javascript.0.Klima.Alarm", true)} // wenn nicht, dann alle anderen Kanäle checken und wenn geht, Alarm löschen else { if (("javascript.0.Klima.BD.open_color" < 6) && ("javascript.0.Klima.BR.open_color" < 6) && ("javascript.0.Klima.KZ.open_color" < 6) && ("javascript.0.Klima.WC.open_color" < 6) && ("javascript.0.Klima.SZ.open_color" < 6)) { setState("javascript.0.Klima.Alarm", false); } } }); on ({id: "javascript.0.Klima.WC.open_color", change: "ne"}, function () { // wenn dringend Lüften, dann Klimaalarm setzen if ("javascript.0.Klima.WC.open_color" == 6) { setState("javascript.0.Klima.Alarm", true)} // wenn nicht, dann alle anderen Kanäle checken und wenn geht, Alarm löschen else { if (("javascript.0.Klima.BD.open_color" < 6) && ("javascript.0.Klima.BR.open_color" < 6) && ("javascript.0.Klima.KZ.open_color" < 6) && ("javascript.0.Klima.SZ.open_color" < 6) && ("javascript.0.Klima.WZ.open_color" < 6)) { setState("javascript.0.Klima.Alarm", false); } } });
Danke vorab für Tipps :idea:
Grüße
etv
-
Vorschlag:
var idBD = "javascript.0.Klima.BD.open_color"; var idBR = "javascript.0.Klima.BR.open_color"; var idKZ = "javascript.0.Klima.KZ.open_color"; var idSZ = "javascript.0.Klima.SZ.open_color"; var idWZ = "javascript.0.Klima.WZ.open_color"; var idWC = "javascript.0.Klima.WC.open_color"; var ocBD = getState(idBD).val; var ocBR = getState(idBR).val; var ocKZ = getState(idKZ).val; var ocSZ = getState(idSZ).val; var ocWZ = getState(idWZ).val; var ocWC = getState(idWC).val; function setalarm() { if(ocBD == 6 || ocBR == 6 || ocKZ == 6 || ocSZ == 6 || ocWZ == 6 || ocWC == 6) { setState("javascript.0.Klima.Alarm", true); } else {setState("javascript.0.Klima.Alarm", false);} } on(idBD, function(dp) { ocBD = dp.newState.val; setalarm(); }); on(idBR, function(dp) { ocBR = dp.newState.val; setalarm(); }); on(idKZ, function(dp) { ocKZ = dp.newState.val; setalarm(); }); on(idSZ, function(dp) { ocSZ = dp.newState.val; setalarm(); }); on(idWZ, function(dp) { ocWZ = dp.newState.val; setalarm(); }); on(idWC, function(dp) { ocWC = dp.newState.val; setalarm(); }); setalarm(); // bei Scriptstart
-
Hallo,
sehe gerade, da war paul53 schneller, aber ich zeig mal trotzdem (ungeprüften) meinen Vorschlag:
function sechs_pruefen () { var br = getState("javascript.0.Klima.BR.open_color").val, bd = getState("javascript.0.Klima.BR.open_color").val, kz = getState("javascript.0.Klima.KZ.open_color").val, sz = getState("javascript.0.Klima.SZ.open_color").val, wz = getState("javascript.0.Klima.WZ.open_color").val, wc = getState("javascript.0.Klima.WC.open_color").val; var alarm = false; var alarm_br = (br > 5) ? true : false; // wenn br = 6 dann true, sonst false var alarm_bd = (bd > 5) ? true : false; var alarm_kz = (kz > 5) ? true : false; var alarm_sz = (sz > 5) ? true : false; var alarm_wz = (wz > 5) ? true : false; var alarm_wc = (wc > 5) ? true : false; if ( (!alarm_br) && (!alarm_bd) && (!alarm_kz) && (!alarm_sz) && (!alarm_wz) && (!alarm_wc) ) { // wenn alle false sind alarm = false; } else { alarm = true; } setState("javascript.0.Klima.Alarm", alarm); } on ({id: "javascript.0.Klima.BD.open_color", change: "ne"}, function () { sechs_pruefen(); }); on ({id: "javascript.0.Klima.BR.open_color", change: "ne"}, function () { sechs_pruefen(); }); on ({id: "javascript.0.Klima.KZ.open_color", change: "ne"}, function () { sechs_pruefen(); }); on ({id: "javascript.0.Klima.SZ.open_color", change: "ne"}, function () { sechs_pruefen(); }); on ({id: "javascript.0.Klima.WZ.open_color", change: "ne"}, function () { sechs_pruefen(); }); on ({id: "javascript.0.Klima.WC.open_color", change: "ne"}, function () { sechs_pruefen(); });
Gruß,
Pix
6443_13.jpg -
wow…OK, ich hab noch viel zu lernen
Danke euch für die Vereinfachungen - werd' beide Versionen ausprobieren und meine Schlüsse daraus ziehen!!
Grüße
etv
6443_14.jpg -
@Pix: getState(id).val macht eine Datenbankabfrage. Bei jeder Änderung einer der 6 Variablen erfolgen 6 Datenbankabfragen !
-
@Pix: getState(id).val macht eine Datenbankabfrage. Bei jeder Änderung einer der 6 Variablen erfolgen 6 Datenbankabfragen ! `
In Wirklichkeit, getState liest die Daten aus dem Array und nicht aus dem DB. Also getState ist fast genauso schnell wie deine Lösung. -
getState liest die Daten aus dem Array und nicht aus dem DB `
Danke, wieder was dazu gelernt. Das bedeutet aber im Umkehrschluss, dass bei einer Aktualisierung der Werte diese sowohl im Array als auch in der DB aktualisiert werden ? -
getState liest die Daten aus dem Array und nicht aus dem DB
Danke, wieder was dazu gelernt. Das bedeutet aber im Umkehrschluss, dass bei einer Aktualisierung der Werte diese sowohl im Array als auch in der DB aktualisiert werden ?
Ja. Javascript Adpater hält eine Kopie von allen States im Bauch(Array), damit die Skripts bequem direkt auf die Werte zugreifen können. Datenbank konnte auf anderem Rechner sein.
4733_id_hm-rega_0.png -
…danke nochmal an paul53 und pix für ihre genialen Beispiele!
Hab beide Versionen ausprobiert - sie funktionieren!
Im Einsatz hab ich nun die Version von paul53, weil's noch einen Tick kürzer ist....
Beide Scripte haben sehr interessanten code drinnen, der mir bei meinen weiteren Projekte sicher weiter helfen wird!
Grüße
etv