Licht Dimmen wenn Button gehalten bis losgelassen

Hallo zusammen

Wir haben in unserem Schlafzimmer einen Fibaro Button über dem Bett, damit wir alle Leuchten darüber ein- und ausschalten können.
Gerne möchte ich nun die “gedrückt halten”-Funktion vom Button Nutzen, um die eine Hue Leuchte zu dimmen. So wie man dies von Tastern sonst kennt. Das Licht soll zuerst in die eine Richtung dimmen bis Min. oder Max erreicht ist, 1 Sek. warten und danach in die andere Richtung dimmen bis anderen Endstellung erreicht und wieder 1 Sek. warten. Solange halt, bis ich den Taster loslasse.

Habe dazu folgendes Script gemacht, was von der Funktion grundsätzlich auch funktioniert. Aber die Ressourcen oder Programmablauf oder irgendetwas passt nicht.

--[[
%% properties
%% events
47 CentralSceneEvent
%% globals
--]]

--selfId = fibaro:getSelfId()
local a = 0
local scene = 21 -- ID dieser Szene

-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:abort(); 
end

local button_source = fibaro:getSourceTrigger()["event"]["data"]

if (tostring(button_source["keyAttribute"]) == "HeldDown") then
  	fibaro:debug('Fibaro Button gehalten.')  	
	fibaro:debug (fibaro:getValue(95, "ui.sldBrightness.value"))
  	-- Aktueller Wert aus dem VD als Startwert setzen für den Vergleich
  	hueBright = tonumber(fibaro:getValue(95, "ui.sldBrightness.value"))
  	--(a) als Math. Operator definieren 
    if (hueBright >= 50) then
      	a = -1
    elseif (hueBright < 50) then
      	a = 1
    end
  	fibaro:debug("a vor Repeat = "..a)
  	--repeat Schlaufe für den Dimmvorgang
  	repeat
    	fibaro:sleep(50)
    	hueBright = hueBright + a
    	fibaro:call(95, "setSlider", "1", hueBright)
    	--Prüfung, ob Min. oder Max. Wert erreicht ist um Operator zu invertieren
    	if (hueBright == 20) then
      		fibaro:sleep(1000)
      		a = 1
      	elseif (hueBright == 100) then
      		fibaro:sleep(1000)
      		a = -1
      	end
    	fibaro:debug("a während Repeat = "..a)	
    until(tostring(button_source["keyAttribute"]) == "Released")
  	--Slider Value in VD auf den aktuellen Wert setzen
  	fibaro:call(95, "setProperty", "ui.sldBrightness.value", hueBright)
end

fibaro:killScenes(scene);

Die Szene bricht nicht mehr selber ab, vermutlich weil es den Befehl “übersieht”. Weiter treibt das Skript die CPU ziemlich an die Grenze.

Hat einer eine Idee und kann mir den Richtigen Denkanstoss geben?

Besten Dank und Gruss
Raffael

Fib_CPU.png