NEWS
[gelöst] Datenpunkt Echo vermeiden - Wie?
-
Liebe Scripter,
aktuell probiere ich über ein kleines Script meinen Verstärker zu steuern. Hierbei habe ich folgenden Effekt den ich gerne vermeiden würde:
Über den Datenpunkt VOLUME möchte ich die aktuelle Lautstärke sehen {read:true} und über den gleichen Datenpunkt diese auch ändern können {write:true}.
Wenn ich die Lautstärke des Verstärkers am Gerät selber verändere, schickt dieser sofort ein entsprechendes Datenpaket mit dem neuen Volume Level heraus. Dieses wird in einem Script interpretiert und daraufhin der Datenpunkt mit dem neuen Wert aktualisiert:
var volume = parseInt(read.subarray(14,16),10); if (volume > 0 && volume < 100) { setState(adapter+'.volume', volume, true); }
Wenn ich die Lautstärke über den Datenpunkt im ioBroker ändere (z.B. über VIS mit Slider für Volume), erkennt das Skript die Veränderung und schickt daraufhin ein entspr. Kommando an den Verstärker, der dann die neue Lautstärke entspr. einstellt:
on ({id:'javascript.0.Rotel.volume', ack: true}, function (obj) { console.log ('Set volume level to:'+obj.state.val); rotelWrite (0x30, obj.state.val); });
Natürlich löst aber diese Veränderung beim Verstärker ein Datenpakt aus, bei dem der Verstärker dem Script mitteilen möchte welcher Volume Level eingestellt wurde, worauf der ioBroker die Veränderung bemerkt, den Wert aktualisiert und genau DIESE Veränderung wiederum an den Verstärker schickt. Dieser stellt den neun Wert ein und Schickt ein Datenpakt zurück usw. usw. usw. Das loopt dann so 20-30 mal und hört vermutlich wegen diverser Delays dann irgendwann auf. Ein Datenpunkt Echo so zu sagen
Wie macht man das richtig? Wenn man mit einem Datenpunkt Lesen und Schreiben möchte? Und die geschriebene Information über einen Umweg als lesende Information wieder zurück kommt? Das muss doch loopen...
Ich habe probiert beim Setzten des Datenpunktes ein ack: false mitzugeben und die Veränderung nur bei einem ack: true zu verarbeiten. Das klappt schon recht gut, ist aber nicht perfekt - Wäre das die richtige Lösung?
-
@oberstel dein Ansatz ist gut. Du kannst auch mit getObject das Objekt holen und dann auswerten woher die Änderung kommt. Das steht im objekt unter from.
-
@Jey-Cee said in Datenpunkt Echo vermeiden - Wie?:
@oberstel Du kannst auch mit getObject das Objekt holen und dann auswerten woher die Änderung kommt. Das steht im objekt unter from.
Das ist ein guter Tipp!
Ich habe das mal eingebaut:on ({id:'javascript.0.Rotel.volume'}, function (obj) { if (getState(obj.id).from != 'system.adapter.javascript.0') { console.log ('Set volume level to:'+obj.state.val); rotelWrite (0x30, obj.state.val); } });
Klappt super und ist wesentlich besser als die acknowledge Lösung - Danke!!!
-
@oberstel Ich sehe dein Vertärker ist ein Rotel Ich hab auch einen und kämpfe ehrlich gesagt auch mit der Scriptsteuerung. Würde es dir was ausmachen dein Script sharen? Das würde mir helfen.
Danke- -
@geko-eder @oberstel reden wir zufällig hierüber: https://github.com/oberstel/ioBroker.js-rotelControl?