Gibt es einen Befehl in LUA das eine Szene nur einmal ausgeführt wird?
Habe bei mir eine Szene die Morgens im Bad über einen Bewegungsmelder eine Sonos Box einschaltet. Das passiert logischerweise aber bei jeder Bewegung was immer zu Aussetzern führt. Also ich möchte die Szene nicht abbrechen, da die Sonos darüber nach einer Stunde auch wieder ausgeschaltet wird, sondern nur einmalig ausführen.
Gibt es da eine Möglichkeit?
Du kannst entweder per LUA prüfen, ob der Player läuft (und dann macht die Szene nichts), ggf. noch ein Zeitintervall dazu tun oder
Du legst eine globale Var an, die du in die Bedingung deines Stcriptes implementierst. Diese GV setzt du bei der ersten Bewegung (auf 1), Dein Script startet Sonos und setzt diese GV auf zB 0.
Bei meiner Szene mit der Sonosbox gibt es keine Aussetzer und je nachdem wie lange der Bewegungssensor bis zur nächsten Bewegungsmeldung eingestellt ist bleibt die Sonosbox an:
--[[
%% properties
79 value
%% globals
%% events
--]]
local sensors = {79}
local delay = 0
local debug = false
function actionsMotion()
fibaro:call(66, "pressButton", "8");
fibaro:call(66, "pressButton", "22");
fibaro:debug('Führe Aktionen bei Bewegungserkennung aus')
end
function actionsNoMotion()
fibaro:call(66, "pressButton", "6");
fibaro:debug('Führe Aktionen nach Ende Bewegung aus')
end
local instances = tonumber(fibaro:countScenes());
function getSensorStatus()
for i,n in ipairs(sensors) do
if (tonumber(fibaro:getValue(n, "value")) > 0) then
return 1;
end
end
return 0;
end
function getLastBreach()
local breach = 0;
for i,n in ipairs(sensors) do
local nBreach = tonumber(fibaro:getValue(n, "lastBreached"));
if(nBreach > breach) then
breach = nBreach;
end
end
return breach;
end
function checkMotion()
lastBreached = getLastBreach();
time = os.time();
if (debug) then fibaro:debug("Zuletzt ausgelöst: Vor "..(time-lastBreached).." Sekunden"); end
if (getSensorStatus() == 1) then
return true;
end
if ((time-lastBreached)>=delay) then
return false;
end
return true;
end
local lastBreached = getLastBreach()
if (fibaro:getSourceTriggerType() == 'property' and getSensorStatus() == 1) then
if (instances > 1) then fibaro:abort(); end
fibaro:debug('Bewegung im Raum erkannt - Starte Timer')
actionsMotion()
while (checkMotion()) do
fibaro:sleep(5000);
end
if (debug) then fibaro:debug("Keine Bewegung mehr erkannt."); end
actionsNoMotion()
end
Ich habe nur ein Problem, ich hätte gerne die Box in der Nacht nicht eingeschaltet, wenn ich den Raum betrete, wie müßte ich da meinen Code ändern?