NEWS
Bind Object in Schleife
-
Hallo,
ich versuche mal mein Vorhaben zu beschreiben und hoffe jemand versteht es.
Ich habe ein Paar Datenpunkte in „0_userdata.0.Home.Rollos.*.Datenpfad_TF-Kontakt“ diese haben als Wert den Datenpfad zu einen Tür/Fenster Kontakt. (Bei einen Datenpunkt ist der Wert z.B. alias.0.Kontakt_Fenster_Ankleidezimmer.STATE)
Nicht alle Datenpunkte in „0_userdata.0.Home.Rollos.*.Datenpfad_TF-Kontakt“ haben einen Wert. (z.B. Fenster ohne Kontakt)
Bei Datenpunkte mit Wert zum eigentlichen Kontakt möchte ich eine Bindung auf einen anderen Datenpunkt (0_userdata.0.Home.Rollos.*.do_not_edit.TFK_Status) herstellen.
Grund: der durch Bindung vorhandene Datenpunkt kann im Skript wieder als Trigger etc. eingesetzt werden wobei der Auslöser durch den Datenpunkt „0_userdata.0.Home.Rollos.*.Datenpfad_TF-Kontakt“ dynamisch ist.
Dafür habe ich folgende Schleife erstellt, laut debug Log ist auch alles so wie ich es möchte, aber das Binding wird immer nur auf den letzten Wert angewendet.
Ich habe auch schon mit Pausen von mehreren Sekunden getestet aber keine Änderung.
Wie gesagt die debug Blöcke sagen alles i.O.Bild Blockly
Code Blockly
Log -
@xbit Ohne mir alles genau durchgelesen zu haben, sieht
Binde
Wert von Objekt ID "i"
falsch aus. Das würde ja heißen, dass der Wert des Objektes eine weitere Objekt ID beinhalten müsste. Da sollte doch bestimmt nur die ID rein, oder?EDIT: Okay, scheint wirklich so zu sein. Verwirrend gemacht
Zeig mal den generiertern JS-Code.
-
-
-
@xbit Das Problem sind (mal wieder) die "globalen" Scopes von erstellten Variablen in Blockly:
on({id: getState(i).val, change: "ne"}, function (obj) { setState(TFK_Status, obj.state.val); });
Dadurch wird
TFK_Status
immer die letzte ID enthalten, welche die Schleife durchlaufen hat. Wenn der Trigger nun auslöst, dann steht inTFK_Status
in jeder Trigger-Logik der gleiche Wert.Das würde so funktionieren, wenn Blockly nicht in der ersten Zeile des scripts
var Debugmeldung_Steuerung_TFK, Liste_TFK_DP, i, TFK_Status;
schreiben würde... Ich glaube da hilft nur: Blockly wegwerfen und in JavaScript implementieren.
-
Okay .. bin froh das ich mir das zusammen klicken kann
da wird es nichts mit JS ...
Fraglich ist halt nur warum der debug Block am ende alle Werte richtig anzeigt. also auch TFK_Status..
Danke für deine Hilfe.
-
@xbit sagte in Bind Object in Schleife:
Fraglich ist halt nur warum der debug Block am ende alle Werte richtig anzeigt. also auch TFK_Status..
Weil während des Schleifendurchlaufes die Variable ja den Wert hat. Aber da diese global deklariert wird, eben nicht mehr wenn die Logik innerhalb der Trigger ausgelöst wird. Hier als JS, so gehts:
let Debugmeldung_Steuerung_TFK = true; const Liste_TFK_DP = Array.prototype.slice.apply($('0_userdata.0.Home.Rollos.*.Datenpfad_TF-Kontakt')); for (const idx in Liste_TFK_DP) { const i = Liste_TFK_DP[idx]; if (getState(i).val == '') { if (Debugmeldung_Steuerung_TFK == true) { console.log(`**ROLLO** Kein Tür/Fenster Kontakt im Datenpunkt ${i} eingetragen`); } } else { if (Debugmeldung_Steuerung_TFK == true) { console.log(`**ROLLO** Tür/Fenster Kontakt im Datenpunkt ${i} eingetragen`); } const TFK_Status = String(i.slice(0, i.length - 21)) + '.do_not_edit.TFK_Status'; on({id: getState(i).val, change: "ne"}, (obj) => { setState(TFK_Status, obj.state.val); }); if (Debugmeldung_Steuerung_TFK == true) { console.log(`**ROLLO** Wert vom Object ${getState(i).val} mit ${TFK_Status} verbunden`); } } }
-
1000 Dank für die Hilfe,
habe es als Javascript-Funktion in das Blockly mit rein gemacht (weil noch mehr in dem Blockly ist als gezeigt) und es läuft.
Besten Dank