Delay

Hallo zusammen,

in Anlehung an “Bewegung im Raum erkennen” habe ich ein Script gebastelt, welches PresnetState und TimeOfDay berücksichtigt. Hier werden diverse Hue Lampen und ein appar Meter LED Stripe (mit RGBW Controller von Fibaro gesteuert) im Innen und Außenbereich durch 2 Außenmotionsensoren getriggert. Die Szene soll eine gemütliche Atmosphäre Im Außenbereich generieren, wenn man sich im Garten aufhält. Nachdem ich die Variablen für Anwesenheit und Stand der Sonne eingebaut habe, geht der Delay immer nur bis 120 Sekunden. In Folge wird die Szene, insofern nicht erneut getriggert, nach 120 Sekunden abgebrochen. Dies ist für diese Anwendung zu kurz. Woran kann das liegen? Die Variable TimeOfDay frage ich alle 5 Minuten ab. Mir fällt nichts auf, woran sich die 120 Sekunden trotz längeren Delays herleiten. Ich wäre über einen Tipp dankbar.

--[[
%% properties
201 value
189 value
%% globals
TimeOfDay
PresentState
--]]
local sensors = {201,189}
local delay = 360
local debug = true

function actionsMotion()
 fibaro:debug('Führe Aktionen bei Bewegungserkennung aus')
  if (fibaro:getGlobal('TimeOfDay') == 'Night') or (fibaro:getGlobal('TimeOfDay') == 'Evening') and (fibaro:getGlobal('PresentState') == 'Home') then
fibaro:debug('Bewegung erkannt, es ist Nacht')
fibaro:call(53, "turnOn")
fibaro:call(53, "changeSaturation", 255)
fibaro:call(53, "changeBrightness", 255)
fibaro:call(53, "changeHue", 4500)

fibaro:call(57, "turnOn")
fibaro:call(57, "changeSaturation", 255)
fibaro:call(57, "changeBrightness", 255)
fibaro:call(57, "changeHue", 13797)
    
fibaro:call(60, "turnOn")
fibaro:call(60, "changeSaturation", 255)
fibaro:call(60, "changeBrightness", 255)
fibaro:call(60, "changeHue", 4500)

fibaro:call(59, "turnOn")
fibaro:call(59, "changeSaturation", 255)
fibaro:call(59, "changeBrightness", 255)
fibaro:call(59, "changeHue", 13797)

fibaro:call(58, "turnOn")
fibaro:call(58, "changeSaturation", 255)
fibaro:call(58, "changeBrightness", 255)
fibaro:call(58, "changeHue", 13797)
    
fibaro:call(55, "turnOn")
fibaro:call(55, "changeBrightness", 255)
    	fibaro:call(240, "startProgram", "3")
    fibaro:call(287, "turnOn")
fibaro:call(287, "changeBrightness", 255)
    	fibaro:call(287, "startProgram", "3")
 
end
end
function actionsNoMotion()
  fibaro:call(48, "turnOff")
    fibaro:call(60, "turnOff")
    fibaro:call(59, "turnOff")
    fibaro:call(57, "turnOff")
    fibaro:call(58, "turnOff")
      fibaro:call(55, "turnOff")
        fibaro:call(53, "turnOff")
          fibaro:call(287, "turnOff")
            fibaro:call(240, "turnOff")
 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


Hi,

ich nutze den Delay in dem Skript nicht, sondern steuere dies über die Parameter des MS. Dieser meldet dann anstatt nach 30 Sekunden nach 120 Sekunden, dass keine Bewegung mehr erkannt wurde. So kannst du Rechenleistung auf dem HC2 einsparen und eine bereits vorhandene Hardwarefunktion nutzen.

BTW: Die Variable hat in den Triggern oben im Header nichts verloren :wink:

Gruß

Ich habe die MS überwiegend von Fibaro in Nutzung. Meinst Du Parameter 6? Ich will eine ruhige Szene ohne Stress, will heißen, keiner soll im Dunkeln sitzen, von daher wäre ein langes Delay von Vorteil.
Noch einmal nachgedacht… Wenn man den Delay hoch ansetzt und der MS aber bei einem geringeren Wert steht, läuft die Szene ohne den MS. Von daher sollten Delay der Szene und Delay des MS zueinander passen?

Frage hat sich nach kürzerem Denken in Teilen selbst beantwortet. Ich war nur verwirrt, weil die Szene immer nach 120 Sekunden das Licht abdrehte, egal welches Delay ich vorgab.Ich habe die Szene neu aufgesetzt und nun bleiben die Lichter auchentsprechend länger an. Bleibt nur die Frage zum Parameter 6 (?). Nimmst Du 120 Sekunden für alle MS oder nur für lichtsteuernde?

Ja, Parameter 6 beim MS.
Ich nutzte auch den Weg über den Parameter 6, damit die Szene nicht so oft getriggert wird.
Der steht je nach MS bei 30 bzw 60.

Wie Hoogle bereits geschrieben hat (danke =)) passe ich die Parameter (Parameter 6) meiner MS an. Die Szenen an sich haben immer einen Delay = 0.

Gruß

ok, dann versuche ich es einmal mit Parameter 6 auf 120 s und in der Szene Delay = 0
Bin gespannt, ob das für meine Gartensituation passt und wenn nicht, werde ich daran schrauben. Für heute: gute Nacht :slight_smile:

Guten Morgen zusammen,

eine Verständinsfeage zum Header: In der perfekten Lichtsteuerung habe ich z.B. folgenden Aufbau

--[[
%% properties
477 value
480 value
491 value
%% globals
TimeOfDay
PresentState
--]]

Wann nimmt man den die Variablen und wann nicht in den Header zu den Triggern?

Kennst Du das schon:
http://www.siio.de/fibaro-homecenter-einsteigerguide-teil-2-getriggerte-szenen/

Jepp, auch da wird auf die MS als Trigger hingewiesen. Jedoch nicht auf die Bedeutung Variablen. Mir ist unklar, warum (siehe Besipiel oben) mal Variablen im Header sind und dann wiederum nicht. In der perfekten Lichtsteuerung wird man das nicht ohne Grund im Header stehen haben.

Die Szene wird dann ausgeführt, wenn sich der Status der Variable ändert. In diesem Fall völlig unnötig, da im Code ja keine Aktion anhand dieser Variablenänderung passiert.

Gruß