Timer für Licht verlängern wenn Türkontakt betätigt

Habe seit einige Zeit ein Skript laufen, das mir Licht einschaltet, wenn ein Türkontakt betätigt wird.
Nun bin ich draufgekommen, dass es nicht richtig funktioniert!
Nun bin ich gerade am Debuggen ;-(
Ziel:
Wenn ein Türkontakt betätigt wird soll Licht eingeschaltet werden -> Hab ich fertig.
Wenn Türe geschlossen wird, soll nach 10 Sekunden Licht ausgehen -> hab ich auch fertig

Was nicht klappt ist, dass wenn die Türe offen bleibt nach 3 Minuten ebenfalls das Licht ausgehen soll, dass hab ich noch nicht geschafft.
Kann mir vielleicht jemand einen Tipp geben?

Hier mein Script, sorry ist noch viel Debugg Code drinnen :wink:

--[[ 
%% properties 
228 value
%% globals 
--]]

-- Debug in Farbe
Debug = function ( color, message )
fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span")) 
end

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

local door = 228
local light = 256

if (tonumber(fibaro:getValue(door, "value")) > 0 ) and (tonumber(fibaro:getValue(light, "value"))) < 1 then 
Debug("yellow","Schalte Licht ein")
fibaro:call(light, "turnOn")
end

-- Wenn Tür geschlossen dann startet hier
if (tonumber(fibaro:getValue(light, "value"))) > 0 then
local starttimer = 10
local timer = (starttimer) 
Debug("green","Starte Timer ...")

repeat 
	Debug("grey","Hier nach repeat")
	fibaro:sleep(1000) 

	-- Schalte Licht aus, wenn Schalter manuell betätigt wird und warte 10 Sekunden, um ein erneutes Aktivieren zu verhindern
	if (tonumber(fibaro:getValue(light, "value"))) < 1 then 
		timer=1 
		fibaro:call(light, "turnOff") 
		fibaro:sleep(1000)
		Debug("grey","Hier vor break")
		break 
		Debug("grey","Hier nach break")
	end 
	timer=timer-1 
	Debug("green","Timer ist "..timer.." ")
	if (tonumber(fibaro:getValue(door, "value"))) > 0 then 
		timer=starttimer 
		Debug("green","Türkontakt betätigt -> Resete Timer")
	end 

Debug("grey","hier vor until Timer")
until (timer<1) 

Debug("grey","hier nach until Timer")
Debug("magenta","Schalte Licht aus")
fibaro:call(light, "turnOff")
end

Also sollte ungefähr so funktionieren:

Lösche Doppelszenen
Wenn Tür ==1 dann (local timer =30, local open=1)
Licht ein

Schleife Anfang
sleep 1000
Wenn Tür == 0 und open == 1 dann(open=0, timer=10)
timer = timer -1
Schleife Ende (until timer < 1)

Licht aus

Hallo pblacky,

ich habe kurz etwas zusammen kopiert… habe es nicht testen können.

Versuch mal dein Glück.

--[[
%% properties
228 value
%% globals
--]]

------------------------- 
--- ### Variablen ### --- 
------------------------- 
local light = 256

local offTimeout = 0
local instances = tonumber(fibaro:countScenes());
local trigger = fibaro:getSourceTrigger();
local sensorID = tonumber(trigger['deviceID']);
local name = fibaro:getName(sensorID); 

-------------------------------- 
---- ### Debug Funktion ### ---- 
-------------------------------- 
function debug(message) 
if (vardebug) then fibaro:debug(message); end 
end 

--------------------------- 
--- ### Debug-Modus ### --- 
--------------------------- 
vardebug = true

--------------- ### Code ### ----------------------

--- ### Sensor ausgelöst ### --- 
if tonumber(fibaro:getValue(trigger['deviceID'], "value")) > 0 then
 debug(" ".. name .. " wurde geöffnet"); 

	--- ### Check ob Abend oder Nacht ### --- 
	if (fibaro:getGlobalValue("TOD") == "Abend" or fibaro:getGlobalValue("TOD") == "Nacht") then
	 debug("Es ist Abend oder Nacht"); 

			--- ### Check ob Licht bereits an  ### --- 
	   		if tonumber(fibaro:getValue(light, "value")) == 0 then 
           	          debug("Licht ist aus und wird eingeschaltet");
			  fibaro:call(light, "turnOn")

				--- ### Timer ### --- 
				local timer = 0 
				while tonumber(fibaro:getValue(light, "value")) == 1 do
 				timer  = timer+1
 				fibaro:debug(timer) 
 				if timer == 5 then 
    				break 
  				end
  				fibaro:sleep(2000) -- var wird alle 2 sekunden um +1 erhöht
				end --hier geht es nach "break" weiter
				fibaro:call(light, "turnOff")
				fibaro:debug("Ende")

       	 	  else
		    debug("Licht ist bereits eingeschaltet.")
		  end
		
	--- ### es ist NICHT Abend oder Nacht ### --- 
	else
	 debug("Lichter werden Tagsüber nicht eingeschaltet")
	end

--- ### Sensor sicher ### --- 
elseif fibaro:getGlobalValue("TOD") == "Abend" or fibaro:getGlobalValue("TOD") == "Nacht" then
  debug("Sensor " .. name .. ": " .. " ist Sicher aber wartet noch " .. offTimeout .. " Sekunden bis zum Ausschalten." )
  fibaro:sleep(offTimeout*1000)
 
	--- ### Wenn Lichter AN sind und Türe wird geschlossen: wird das das Licht ausgeschaltet ### ---
	if tonumber(fibaro:getValue(light, "value")) == 1 then 
	debug("Licht ist an und Türe ist zu: Licht aus!");
	fibaro:call(light, "turnOff")
	elseif tonumber(fibaro:getValue(light, "value")) == 0 then
	debug("Licht ist bereits ausgeschaltet.")
	end
	
--- ### Sensor ist sicher und es ist NICHT Abend oder Nacht  ### ---
else
debug("Türe zu. Es ist Tag.") 
end

Folgender code klappt

--[[
%% properties
228  value
%% globals
--]]

------------------------- 
--- ### Variablen ### --- 
------------------------- 
local light = 256

local offTimeout = 0
local instances = tonumber(fibaro:countScenes());
local trigger = fibaro:getSourceTrigger();
local sensorID = tonumber(trigger['deviceID']);
local name = fibaro:getName(sensorID); 

-------------------------------- 
---- ### Debug Funktion ### ---- 
-------------------------------- 
function debug(message) 
if (vardebug) then fibaro:debug(message); end 
end 

--------------------------- 
--- ### Debug-Modus ### --- 
--------------------------- 
vardebug = true

--------------- ### Code ### ----------------------

--- ### Sensor ausgelöst ### --- 
if tonumber(fibaro:getValue(trigger['deviceID'], "value")) > 0 then
 debug(" ".. name .. " wurde geöffnet"); 

	--- ### Check ob Abend oder Nacht ### --- 
	if (fibaro:getGlobalValue("TOD") == "Abend" or fibaro:getGlobalValue("TOD") == "Nacht") then
	 debug("Es ist Abend oder Nacht"); 

			--- ### Check ob Licht bereits an  ### --- 
	   		if tonumber(fibaro:getValue(light, "value")) == 0 then 
           	          debug("Licht ist aus und wird eingeschaltet");
			  fibaro:call(light, "turnOn")
				fibaro:sleep(5000)
				--- ### Timer ### --- 
				local timer = 0 
				while tonumber(fibaro:getValue(light, "value")) ~= 0 do
 				timer  = timer+1
 				fibaro:debug(timer) 
 				if timer == 10 then 
    				break 
  				end
  				fibaro:sleep(2000) -- var wird alle 2 sekunden um +1 erhöht
				end
				fibaro:call(light, "turnOff")
				fibaro:debug("Licht Aus!")

       	 	  else
		    debug("Licht ist bereits eingeschaltet.")
		  end
		
	--- ### es ist NICHT Abend oder Nacht ### --- 
	else
	 debug("Lichter werden Tagsüber nicht eingeschaltet")
	end

--- ### Sensor sicher ### --- 
elseif fibaro:getGlobalValue("TOD") == "Abend" or fibaro:getGlobalValue("TOD") == "Nacht" then
  debug("Sensor " .. name .. ": " .. " ist Sicher aber wartet noch " .. offTimeout .. " Sekunden bis zum Ausschalten." )
  fibaro:sleep(offTimeout*1000)
 
	--- ### Wenn Lichter AN sind und Türe wird geschlossen: wird das das Licht ausgeschaltet ### ---
	if tonumber(fibaro:getValue(light, "value")) ~= 0 then 
	debug("Licht ist an und Türe ist zu: Licht aus!");
	fibaro:call(light, "turnOff")
	elseif tonumber(fibaro:getValue(light, "value")) == 0 then
	debug("Licht ist bereits ausgeschaltet.")
	end
	
--- ### Sensor ist sicher und es ist NICHT Abend oder Nacht  ### ---
else
debug("Türe zu.") 
end

Danke Nevv für dein Skript!

Ich erklär mal wozu ich das eigentlich brauche:
Wir haben einen kleinen Abstellraum mit Türe (Trigger 228) durch den man durchgehen muss, wenn man auf das WC will.
In einer Seminarpause machen dort alle paar Minuten Leute die Türe zum Abstellraum auf und durch zum WC zu gehen.
Meine Idee war, dass jedesmal, wenn die Türe dort auf ODER zu geht im Skript einen Timer um 10 Min verlängert und das Licht (light 256) dort solange brennen bleibt, bis mal 10 Min lang KEINER die Tür auf oder zumacht.
Da der Raum sehr klein ist wollte ich keinen zusätzlichen Bewegungsmelder dafür opfern :wink:
Vielleicht solte ich doch einen kaufen …

Ich übe noch immer an meiner Szene :wink:

Gibt es eigentlich beim Fibaro Türkontakt eine Möglichkeit abzufragen ob sich der Zustand geändert hat?
Habe in den Eigenschaften des Schaltrs leider nichts finden können.

Hallo pblacky,

ich weiß nicht ob es deine Frage beantwortet:
Aber du kannst dir die Zeit anzeigen lassen, wann sich der Zustand verändert hat…

tonumber(fibaro:getValue(deviceID), "lastBreached")

Hallo,

ich habe das Script für meine Beleuchtung im Flur mit Türkontakt seit gestern im Einsatz. Nur leider funktioniert es nicht, muss ich Variablen einfügen?
Kenne mich leider nicht mit LUA aus, würde das Script aber gerne nutzen. Am liebsten zu einer festgelegten Zeit zB von 22:00 - 03:00 Uhr und das ich die Dauer
noch verändern kann.

Danke und Grüße

DickerDad

Hi,

Was genau funktioniert denn nicht?
Wie lautet die Fehlermeldung?

Viele Grüße Hoggle

Hallo,
es passiert eben gar nichts, also wenn ich die Tür öffne bleibt das Licht aus. Und Fehlermeldung im Debug war keine.
Oder hast du vielleicht ein Script wie ich oben geschrieben hatte, im Forum bei den LUA Skripten habe ich nichts passendes gefunden.
Ich möchte ganz einfach das Licht nur innerhalb eines bestimmten Zeitraumes Ein und Aus schalten durch den Türsensor. Es soll dann nach einer
einstellbaren Zeit wieder ausgehen. Schön wäre wohl noch wenn das Script prüft ob das Licht schon eingeschaltet ist.

Danke und Grüße

DickerDad

Die IDs hast du korrekt angepasst?

Ganz einfach geht das auch mit zwei Blockszenen

  1. Szene
    per Uhrzeit wird eine (neu anzulegende) globale Variable um. 22 Uhr auf zB 1 gesetzt und nach Ende Deines Zeitraumes wieder auf 0 (nach 5 Stunden, was 3 Uhr bedeutet).

  2. Szene:
    Wenn globale Var = 1 UND Tür offen
    DANN Licht An Und
    Licht Aus (Zeitlänge in das rote Feld)

Ja die IDs passen. Und das mit den Blockszenen werde ich testen.

Danke für die schnelle Info.