Hallo zusammen
Ich stehe bei LUA noch am Anfang und versuche für meine Küche eine gut programmierte Steuerung hinzukriegen. Viele Ideen und auch Code wurde von diversen Scripts übernommen. Nun befinde ich mich irgendwie in einer Sackgasse was den LUA Code meiner Steuerung betrifft.
Idee:
Das Licht soll bei Bewegung o. Schalter eingeschaltet und der Dimmer auf einen definierten Wert gesetzt werden. Es beginnt ein Timer zu laufen welcher bei Bewegung wieder auf den Ausgangswert springt. Läuft dieser Timer gegen <= 8s so wird der Dimmer für die restliche Zeit auf 1 gesetzt. Wird jedoch innerhalb dieser 8s eine Bewegung registriert, so soll der Dimmer wieder auf den definierten Ausgangwert gesetzt werden.
Nun möchte ich jedoch die Möglichkeit haben, die Helligkeit via App zu verändern und zwar so, dass wenn der Timer <= 8s ist, und nun eine Bewegung registriert wird, dass die Helligkeit auf den manuell also durch die App eingestellten Wert zurück gesetzt wird.
Code:
--[[
%% properties
9 value
19 value
%% globals
--]]
-- VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene = 1 -- ID dieser Szene
local motion = 19 -- ID des Bewegungssensors
local switch = 9 -- ID des Schalters
local dimmer = 17 -- ID des Dimmers
DimmerKuecheWert = 15 -- Startwert des Dimmers
DimTempKuecheWert = 1 -- Wert des <=8s Bereichs
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1)
then
fibaro:abort()
end
-- Schalten des Lichts
if (tonumber(fibaro:getValue(motion, "value")) > 0 )
and (tonumber(fibaro:getValue(switch, "value"))) < 1 then
fibaro:debug("Schalte Licht ein")
fibaro:call(switch, "turnOn")
fibaro:sleep(1000)
fibaro:call(dimmer,"setValue",DimmerKuecheWert)
end
-- Verzögerung in Sekunden
if (tonumber(fibaro:getValue(switch, "value"))) > 0 then
local starttimer = 30
local timer = (starttimer)
fibaro:debug("Starte Timer")
--fibaro:call(dimmer,"setValue",DimmerKuecheWert);
repeat
fibaro:sleep(1000) --fraglich
-- DimmerKuecheWert = fibaro:getValue(dimmer, "value")
-- Schalte Licht aus, wenn Schalter manuell betätigt wird und warte 5 Sekunden, um ein
-- versehentliches (erneutes) aktivieren der Szene zu verhindern
if (tonumber(fibaro:getValue(switch, "value"))) < 1 then
timer=1
fibaro:debug("Licht wird ausgeschaltet")
fibaro:call(dimmer,"setvalue", "0")
fibaro:sleep(1000)
fibaro:call(switch, "turnOff")
fibaro:sleep(4000)
break
end
-- Helligkeit reduzieren während den letzten 8 Sekunden
if timer <= 8 then
fibaro:debug("Das Licht wird in 8 Sekunden ausgeschaltet wenn keine Bewegung erfolgt");
fibaro:debug(DimmerKuecheWert)
fibaro:sleep(1000)
fibaro:call(dimmer,"setValue",DimTempKuecheWert)
fibaro:sleep(3000)
fibaro:debug("Wert sollte 1 sein")
fibaro:debug(DimTempKuecheWert)
fibaro:debug("Wert sollte X sein")
fibaro:debug(DimmerKuecheWert)
end
timer=timer-1;
-- Setze Timer zurück wenn Bewegung erkannt
if (tonumber(fibaro:getValue(motion, "value"))) > 0 then
timer=starttimer;
-- --Wert bei Bewegung auf Ausgangswert zurücksetzen
fibaro:call(dimmer,"setValue",DimmerKuecheWert)
fibaro:debug("Bewegung erkannt bzw. Motionsensor sendet noch nicht (vgl. Parameter 6)");
fibaro:debug(DimmerKuecheWert)
end
-- --Dimmer auslesen und in Variabel schreiben
-- DimmerKuecheWert = fibaro:getValue(dimmer, "value")
fibaro:debug("Ende Repeat Schleife")
fibaro:debug(DimmerKuecheWert)
until (timer < 1)
-- Schalte Licht aus, wenn Timer vollständig abgelaufen ist
fibaro:call(dimmer,"setValue", "0")
fibaro:sleep(1000)
fibaro:debug("Timer abgelaufen. Licht wird ausgeschaltet")
fibaro:call(switch, "turnOff")
fibaro:killScenes(scene)
end
Problem
Da ich die Helligkeit auch mal ändern möchte wenn mehr Licht benötigt wird als der definierte Standardwert (DimmerKuecheWert), muss ich irgendwo den aktuellen Wert des Dimmers auslesen, welche ich dann in der Variable (DimmerKuecheWert) speichere. Gibt es nun eine Bewegung in den letzten 8s so soll der Dimmer auf den zuletzt ausgelesenen Wert gesetzt werden. Mir ist bewusst, dass ich mich in einer Repeat Schleife befinde und ich habe immer das Problem, dass ich mir die Variable (DimmerKuecheWert) überschreibe. Dies geschieht sobald die Bedingung <= 8s greift und in dieser Zeit eine Bewegung registriert wird. Ich komme nicht weiter, wo ich den aktuellen Wert abfragen und in der Variable speichern soll.
Wenn mir da jemand auf die Sprünge helfen könnte wäre ich wirklich dankbar.
Grüsse
mrfunky