NEWS
On Change nur bei Änderung über vis
-
Ich meine, ich hatte da schon mal eine Lösung gehabt, stehe aber gerade total auf dem Schlauch.
Ich würde gerne ein Script erstellen, dass nur bei Änderung einer Variable reagiert, die man über die vis geändert hat.
Aktuell läuft es so
on({ id: "viessmann.0.get.VitoBetriebsart", change: 'ne'}, function(obj) { setState("viessmann.0.set.VitoBetriebsart", obj.newState.val); });
Das Script reagiert dann aber auch, wenn die Variable von einem anderen Adapter oder von sich selbst geändert hat.
-
ich würde es so machen…
einen Datenpunkt anlegen (bool)
Diesen Datenpunkt über VIS Schalten und darauf im Script reagieren.
-
Habe ich auch erst überlegt, dann wird aber der neue Datenpunkt nicht vom Adapter aktualisiert.
-
dann wird aber der neue Datenpunkt nicht vom Adapter aktualisiert. `
Auch das kann man per Skript lösen.var vitoBa = getState("viessmann.0.get.VitoBetriebsart").val; setState("javascript.0.vis.VitoBetriebsart", vitoBa); on({ id: "viessmann.0.get.VitoBetriebsart", change: 'ne'}, function(obj) { if(obj.state.val != vitoBa) { vitoBa = obj.state.val; setState("javascript.0.vis.VitoBetriebsart", vitoBa); } }); on({ id: "javascript.0.vis.VitoBetriebsart", change: 'ne'}, function(obj) { vitoBa = obj.state.val; setState("viessmann.0.set.VitoBetriebsart", vitoBa); });
-
muss er das denn? Ich würde den "neuen" Datenpunkt nur als Auslöser nehmen und ihn am Ende des Scriptes auch wieder auf False zurückstellen.
Edit…oder so wie Paul geschrieben hat, aber ich glaube das muss gar nicht sein.
-
An sich sollte in obj.state.from drin stehen welcher Adapter den neuen Wert gesetzt hat. Bei vis sollte da System.adapter.vis.0 stehen … an sich sollte man das nutzen können
-
Danke das war es. Hätte mir das Objekt einfach mal ausgeben lassen sollen. Dann wäre es mir vermutlich selbst wieder aufgefallen. 8-)
-
sollte in obj.state.from drin stehen welcher Adapter den neuen Wert gesetzt hat. Bei vis sollte da System.adapter.vis.0 stehen `
Ein Test mit VIS ergab für obj.state.from: system.adapter.web.0Aktuell läuft es so
on({ id: "viessmann.0.get.VitoBetriebsart", change: 'ne'}, function(obj) { setState("viessmann.0.set.VitoBetriebsart", obj.newState.val); }); ```` `
Wofür ist das überhaupt nötig ? Es müsste auch ohne das Skript funktionieren (ack = false).
-
Hallo,
ich nutze das bei einigen Logiken, um herauszufiltern, ob die Eingabe aus VIS gemacht wurde. Dann kommt die Eingabe (zum Beispiel Nachtruhe einschalten) von einem Menschen und nicht von einem Timer o.ä.
Auf diese Weise lassen sich auch die Logs präzisieren ("Nachtruhe per VIS eingeschaltet" / "Nachtruhe per Zeitsteuerung eingeschaltet")
Die on-Funktion ist ja https://github.com/ioBroker/ioBroker.javascript/blob/master/doc/en/javascript.md#on–-subscribe-on-changes-or-updates-of-some-state. Es gibt auch eine Negierung von From.
fromNe - New Value is not from defined adapter
Damit kann man (leichte) Sicherheitsschranken bauen und so zB verhindern, dass bestimmte Aktionen per VIS (oder einen anderen Adapter) gestartet werden, für die eigentlich eine on-Funktion einen Datenpunkt überwacht.
Gruß
Pix