Ich muss vorneweg schicken, dass ich selbst kein zwave verwende. Ich gehe aber davon aus, dass es wie bei anderne Bindings auch einen Unterschied zwischen UI und Binding indizierten Änderungen gibt. Über die UI wird immer ein sendCommand Befehl gesendet, erfolgt eine Änderung innerhalb zwave, gibt es nur ein update. Auch wenn Du in der Rule den Dimmerwert änderst, arbeitest Du immer mit sendCommand. Eine mögliche Variante sähe also ungefähr so aus:
Code: Alles auswählen
var Timer tDimmEin = null
rule "Dimmer Eingang received command"
when
Item Dimmer_Eingang received command
then
tDimmEin?.cancel
tDimmEin = createTimer(now.plusMillis(500),[|
tDimmEin = null
])
end
rule "Dimmer Eingang change"
when
Item Dimmer_Eingang changed
then
if(tDimmEin !== null)
return;
timer_Sensor_Haupteingang_Tuere_Dimmer_Eingang?.cancel
end
Ich bevorzuge kurze Variablennamen
Das ganze Konstrukt arbeitet etwas indirekt. Die erste Rule (received command) triggert nur, wenn der Dimmer einen Befehl aus openHAB heraus bekommt. Nur in diesem Fall wird der Timer tDimmEin gestartet. Der Befehl tDimmEin?.cancel bedeutet: breche den Timer ab, falls er existiert, das sind also 3 Zeilen Code...
Wenn der Timer nach eine halben Sekunde abläuft, tut der Code nichts anderes, als die Timer Variable zu leeren.
Die zweite Rule (changed) triggert immer, wenn sich der Wert des Items ändert, also gewöhnlich, wenn der Dimmer einen neuen Wert meldet.
Die Rule prüft, ob der Timer tDimmEin existiert (!== null) und bricht ab, falls das zutrifft. Ansonsten cancelt sie den eigentlichen Timer, falls dieser existiert.
Ich habe hier 500 Millisekunden für tDimmEin angesetzt, Du musst aber vermutlich hier einen wesentlich höheren Wert ansetzen, da der Dimmwert von zwave vermutlich erst gegen Ende des Dimmvorgangs gemeldet wird, und vermutlich wird der Dimmer "weich" dimmen. Die Totzeit (von tDimmEin vorgegeben) muss also mindestens die Zeitspanne abdecken, die Dimmer_Eingang benötigt, um von 0 auf 20% zu dimmen, plus einige hundert Millisekunden zur Sicherheit.