NEWS
[gelöst] Auf Änderung in Enumeration reagieren
-
Hi Leute,
Wie kann ich darauf reagieren, wenn sich eine Enumeration-Liste ändert?
Ich habe ein allgemeines Skript, dass bei Änderungen in einem der Devices in einer Enumeration eine "spezielle" Logmeldung schreibt.
Aber wenn ich ein Device zu der Liste hinzufüge, muss ich das Skript immer neu starten$('state[id=*](functions=log)').on(function(dp) { log("$" + dp.name + (dp.newState.val ? " eingeschaltet" : " ausgeschaltet")); });
Soweit funktioniert das auch, aber der Trigger registriert die beim Start vorhanden Devices in der Liste.
Ich hätte nun gerne, dass ich nur die Function dem Device zuordne und das automatisch erkannt wird. Sozusagen ein äusserer Trigger, der bei Änderungen den inneren Trigger neu aufsetzt. -
@diwoma
Ich möchte da noch einmal nachhaken, sollte meine Anfrage unverständlich sein, und die Fragen präzisieren.
Wie erkenne ich im JavaScript, dass sich eine Enumerationsliste geändert hat? Das also Einträge hinzugekommen sind oder weggenommen worden sind?Und daraus eine weitere Frage:
Kann ich den Trigger aus dem ersten Post irgendwie benennen um ihn in JS vor dem neu Aufsetzen löschen?
Oder kann ich das gesamte Skript in JS restarten? -
@diwoma sagte: Wie erkenne ich im JavaScript, dass sich eine Enumerationsliste geändert hat?
Da nur auf Datenpunkte getriggert werden kann, hilft höchstens eine zyklische Abfrage von
getObject('enum.functions.log').common.members
EDIT: Gerade getestet und funktioniert:
const select = $('*(functions=Beleuchtung)'); const anzahl = getObject('enum.functions.Beleuchtung').common.members.length; schedule('*/5 * * * * *', function() { let members = getObject('enum.functions.Beleuchtung').common.members; if(members.length != anzahl) { startScript(scriptName); } }); select.each(function(id, i) { log(id); });
@diwoma sagte in Auf Änderung in Enumeration reagieren:
Kann ich den Trigger aus dem ersten Post irgendwie benennen um ihn in JS vor dem neu Aufsetzen löschen?
Trigger lassen sich mit unsubscribe(handler) löschen. Ein Neustart des Skriptes erledigt es auch.
-
@paul53
Vielen Dank für die ausführliche Antwort.
Schade, dass der Enumerationhandler kein Event wirft, wenn sich eine Liste ändert.
Aber die Idee, die Anzahl in einem Loop zu vergleichen, ist eine schöne Idee.Danke dafür.
Eine Frage hätte ich noch:
@paul53 said in Auf Änderung in Enumeration reagieren:
Trigger lassen sich mit unsubscribe(handler) löschen. Ein Neustart des Skriptes erledigt es auch.
Wo bekomme ich den handler her?
-
@diwoma sagte: Wo bekomme ich den handler her?
Siehe unsubscribe. Das ist eine Variable, die on() zugewiesen wird.
var handler = on(id, callback);
-
@paul53
Danke