NEWS
Überwachen in Objektbaum
-
Hi Ihr,
ich müsste eine Aktion immer dann ausführen, wenn sich ein value eines Baumes ändert, der in etwa so aussieht:{ "ctype": "group", "id": "LivingRoomLight", "params": { "switches": [ { "outlet": 0, "switch": "off" } ], "white": { "br": 100, "ct": 42 } } }
Das ganze befindet sich aber im Objektbaum unter:
Adapter.<DeviceID>.RESULT
Geht das? Wenn ja, kann mir einer von Euch bitte sagen, wie das möglich wäre?
DANKE !!!
-
@great-sun sagte in Überwachen in Objektbaum:
Adapter.<DeviceID>.RESULT
Wenn es darunter Datenpunkte gibt, machst Du ein Subscription auf alle Datenpunkte darunter:
Adapter.<DeviceID>.RESULT.*
Das was Du aber gepostet hast ist ein Objekt in dem Result, hier bekommst Du nur mit wenn sich das ganze Objekt geändert hat.
Um aber einzelne Werte zu überwachen, dann musst Du das Objekt in einzelne Datenpunkte auftrennen.
Wenn Du NodeRed nutzt habe ich dafür einen fertigen Subflow - ansonsten musst das halt selbst machen. Könntest - wenn Du es nicht selbst programmieren willst - Node Red nur für das Aufsplitten des Objektes verwenden und die Datenpunkte in Deiner Dir bevorzugten Logikmaschine weiterverarbeiten (JS oder Blockly). -
Hi nochmal an alle...
Ich hab mich falsch ausgedrückt, wie es scheint...
Den Objektbaum habe ich mangels alternativen als JSON dargestellt. Wenn ich den Objektbaum als JSON abziehen könnte via JavaScript und das resultierende JSON überwachen könnte, wäre das genial.
Durch die Überwachung von allen Einzelpunkten bekomme ich bei zwei Änderungen im Objektbaum nämlich zwei Ausführungen, trotzdem ich eigentlich beide auf einmal abarbeiten wollen würde.Andere Frage, ähnliches Thema:
In einem weiteren Objektbaum wird ein Objekt nur temporär angelegt. Ich würde aber gerne auf dieses Objekt reagieren, wenn es angelegt wird, bzw. wenn der Wert des angelegten Objektes geändert wird, oder es wieder entfernt wird. Gibt es dafür eine Option?
Ich könnte mir natürlich vorstellen, dass ich das da genauso überwachen könnte, wenn ich das Problem mit dem Objektbaum als JSON überwachen gelöst bekäme...Bin für jede Idee dankbar!
-
@great-sun Wenn Du deinen Objektbaum einliest und ein JS Objekt erzeugst, kannst Du das doch über stringify in einem DP abspeichern. Wenn sich dieser String dann ändert - liest Du den DP wieder ein - wandelst es intern mit parse wieder in ein Objekt und verarbeitest es. - Aber wie gesagt - ich bin da nicht so drin, weil ich wie gesagt all solche Aufgaben mit NR löse, weil es einfach easy ist - aber gibt ja noch andere hier, die Dir gerne unter die Arme greifen und ggf. ein Skript für Dich erstellen.
-
@great-sun
Du kannst fast jeden Datenpunkt im Objektbau via Subscriber überwachen lassen. Im Javascript Adapter ein neues Script anlegen und:on({id: 'adapter.instanz.Pfad.zu.deinem.datenpunkt', change: "ne"}, async function (obj) { try { //wenn json drin ist: let wert = JSON.parse(obj.state.val).wert; //sonst: let wert = obj.state.val; //und hier was auch immer du dann als reaktion auf die Änderung tun möchtest //setState('datenpunktpfad', wert) } catch (e) { return; } });
Beste Grüße
Chris -
@great-sun sagte in Überwachen in Objektbaum:
Andere Frage, ähnliches Thema:
In einem weiteren Objektbaum wird ein Objekt nur temporär angelegt. Ich würde aber gerne auf dieses Objekt reagieren, wenn es angelegt wird, bzw. wenn der Wert des angelegten Objektes geändert wird, oder es wieder entfernt wird. Gibt es dafür eine Option?
Ich könnte mir natürlich vorstellen, dass ich das da genauso überwachen könnte, wenn ich das Problem mit dem Objektbaum als JSON überwachen gelöst bekäme...Das reagieren auf erstellen und löschen ging nur über JSON.stringify() mit schedule. Ist zwar möglich das sie da etwas in letzter Zeit eingebaut haben, halte ich aber für unwahrscheinlich. Auf Änderungen von (noch) nicht existierenden Datenpunkten kannst du jedoch mit RegExp reagieren
on(new RegExp(getRegEx('adapter.instanz.bla', '^')+'.*'), function(obj) {}
Hab das aus einem Skript von mir, aktuell keine Ahnung wie RegEx nochmal funktioniert, muß ich immer nachlesen
-
@ticaki
die Funktion erzeugt eine neue Regular Expression, welche auf alle mit adapter.instanz.bla beginnenden Elemente anspringt.
Sprich Du erzeugst für diese Schnittmenge eine subscription und nicht nur für einen Datenpunkt. -
@tyantreides
ich hab mich wohl falsch ausgedrückt. Ich weiß was es macht, aber in die Sprache um einen Regex String richtig zu schreiben muß ich mich erst einlesen. Mit Regex reagiert das Skript auch auf Datenpunkte die später hinzugefügt wurden.