Szene einmalig ausführen

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?

Hi,

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.

Viele Grüße Hoggle

Ah - die GV setzt Du in der Nacht dann wieder zurück.

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?

Gruß Salve

Hi,

dann legst Du um Deine Ausführung eine If-Bedingung:


if currentTime >= "06:00"  and currentTime < "22:30"
then......
end

oben zuvor definieren:


local currentTime = os.date("%H:%M");

Klasse, vielen Dank, ich habs grad getestet, funktioniert super.
Gruß Salve.