Abwesenheit

Hallo zusammen
Wer könnte mir behilflich sein? Habe eine Abwesenheits Szene programmiert, klappt soweit sehr gut. Kleines Problem, das Licht löscht nicht wie erwartet nach vorgegebener Zeit. Wo habe ich einen Fehler eingebaut?
Vielen Dank…

--[[
%% properties
101 value
165 value
134 value
182 value
226 value
277 value
%% globals
--]]
 
 local scene            = 439 
 -- Licht
 local licht_wz         = tonumber(fibaro:getGlobalValue("licht_wz", "value"))
-------------------------------------------------------------------------------
 -- Handys
 local handy_willi      = tonumber(fibaro:getGlobalValue("handy_willi", "value"))
 local handy_yvonne     = tonumber(fibaro:getGlobalValue("handy_yvonne", "value"))
-------------------------------------------------------------------------------
 -- Bewegungsmelder
 local bm_schlafz       = tonumber(fibaro:getGlobalValue("bm_schlafz", "value"))
 local bm_diele         = tonumber(fibaro:getGlobalValue("bm_diele", "value"))
 local bm_decke         = tonumber(fibaro:getGlobalValue("bm_decke", "value"))
 local bm_sued          = tonumber(fibaro:getGlobalValue("bm_sued", "value"))
 local bm_nord          = tonumber(fibaro:getGlobalValue("bm_nord", "value")) 
-------------------------------------------------------------------------------
 --Sensoren
 local tuere_eingang    = tonumber(fibaro:getGlobalValue("tuere_eingang", "value"))
-------------------------------------------------------------------------------
 local starttimer       = 900 -- Zeit bis Aktivation (Sek)
 local lichttimer       = 15
 local timer            = (starttimer);
 local timer1           = (lichttimer);
-------------------------------------------------------------------------------
 -- Ist erste Zeit grösser als zweite dann "OR" sonst "AND" in Programmierung
 local start            = 0600 -- 20:00 = 2000
 local ende             = 0559 -- 05:30 = 0530
-------------------------------------------------------------------------------
 local currentDate      = os.date("*t");
 local sourceTrigger    = fibaro:getSourceTrigger();
 local startSource      = fibaro:getSourceTrigger();
-------------------------------------------------------------------------------

  
      -- Lösche doppelte Szene(n)
 if   (fibaro:countScenes()> 1) 
  
 then
      --fibaro:debug("Es läuft mehr als eine Instanz");
      fibaro:abort(); 
 end
 
      Debug = function ( color, message ) fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")) end
      
      function DT(DATETIME)
      local WD = {'Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'}
      local M = {'Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'}
      local tableDT= (os.date('*t', tonumber(DATETIME))) 
      tableDT.month = M[tonumber(tableDT.month)]
      tableDT.wday =  WD[tonumber(tableDT.wday)]
      return ""..tableDT.wday ..', ' ..tableDT.day ..'. ' ..tableDT.month ..' ' ..tableDT.year ..' '..os.date " / %H:%M Uhr" 
      end 

 if   (tonumber(fibaro:getValue(tuere_eingang, "value")) > 0)
 then
  
 if   (tonumber(os.date("%H%M")) >= start or tonumber(os.date("%H%M")) <= ende) 
 and  fibaro:getGlobalValue("AnwesenheitsCheck") == "Abwesend" 
  
 then     
      x= DT(os.date())
      fibaro:debug (x) 
  
      fibaro:debug("------------------------------------------------------------------------------------------");
      Debug("tan",("Rückkehr nach Hause, Türe Eingang geöffnet... "));
      Debug("orange",("Abwesenheit erkannt!"));
      Debug("lime",(os.date("Variable um %H:%M Uhr auf ANWESENHEIT geschaltet!"))); 
      fibaro:debug("------------------------------------------------------------------------------------------");
      fibaro:setGlobal("AnwesenheitsCheck", "Anwesend");
      fibaro:call(331, "pressButton", "1");
      fibaro:abort()
 end 
 end 

      -- Eingangstüre auf Anwesenheit erkannt, Timer ein
      ------------------------------------------------------------------------------------------------------------
    
 if   (tonumber(fibaro:getValue(tuere_eingang, "value")) > 0)
 then
  
 if   (tonumber(os.date("%H%M")) >= start or tonumber(os.date("%H%M")) <= ende) 
 and  fibaro:getGlobalValue("AnwesenheitsCheck") == "Anwesend"        
 then
    
 while   
      (tonumber(fibaro:getValue(tuere_eingang, "value")) > 0) do
	  Debug("red","Türe Eingang meldet Status OFFEN..!");
      Debug("cyan",(""..starttimer /60 .." Minuten Timer wird noch NICHT aktiviert!"));
      Debug("white","Warten...");
	  fibaro:sleep(5*1000)
      
 end      
 
      x= DT(os.date())
      fibaro:debug (x) 
  
      zeit = os.time();   
      timer = (starttimer);
      fibaro:debug("------------------------------------------------------------------------------------------");
      Debug("lime",(os.date("Türe Eingang wurde GESCHLOSSEN...")));
      Debug("cyan",("Starte Timer..."));
      Debug("cyan",(os.date("In "..starttimer /60 .." Minuten also um %H:%M Uhr wird ABWESENHEIT aktiviert!",zeit+starttimer)))
      fibaro:debug("------------------------------------------------------------------------------------------");
   
      -- Licht aus wenn noch an
      ------------------------------------------------------------------------------------------------------------
     
 if   (tonumber(fibaro:getValue(licht_wz, "value")) > 0)      
 then
      zeit = os.time();   
      timer1 = (lichttimer);
      fibaro:debug("------------------------------------------------------------------------------------------");
      Debug("yellow",(os.date("Licht ist noch EINGESCHALTET...")));
      Debug("cyan",("Starte Timer..."));
      Debug("cyan",(os.date("In "..lichttimer /60 .." Minuten also um %H:%M Uhr wird das Licht ausgeschaltet!",zeit+lichttimer)))
      fibaro:debug("-------------------------------------------------------------------------------------------");  
 
 repeat 
      fibaro:sleep(1000);
      timer1=timer1-1;        
      
 repeat 
      fibaro:sleep(1000);
      timer=timer-1;
 
              
     -- Wurde Eingangstüre wieder geöffnet?
     ------------------------------------------------------------------------------------------------------------
    
 if   (tonumber(fibaro:getValue(tuere_eingang, "value")) > 0)
 then
        
 while   
      (tonumber(fibaro:getValue(tuere_eingang, "value")) > 0) do
      Debug("red",("Türe Eingang meldet innerhalb der Vorgegebenen "..starttimer /60 .." Minuten erneut OFFEN..."));
      Debug("cyan","Timer wird zurückgestellt!");
      Debug("white","Warten...");
      timer = os.time();
	  fibaro:sleep(5*1000)
      
 end      
      zeit = os.time();   
      timer = (starttimer);
      fibaro:debug("------------------------------------------------------------------------------------------");
      Debug("lime",(os.date("Türe Eingang wurde GESCHLOSSEN...")));
      --Debug("white",("Reaktivierung OK."));
      Debug("cyan",(""..starttimer /60 .." Minuten Timer wird reaktiviert!"));
      Debug("orange",(os.date("Ohne weitere Aktivität wird um %H:%M Uhr auf Abwesenheit geschaltet!",zeit+starttimer)))
      fibaro:debug("------------------------------------------------------------------------------------------");
 end
    
      -- Anwesenheit erkannt, Szene stoppen   
      ------------------------------------------------------------------------------------------------------------
    
 if   (tonumber(os.date("%H%M")) >= start or tonumber(os.date("%H%M")) <= ende) 
 and  fibaro:getGlobalValue("AnwesenheitsCheck") == "Anwesend"
 and  (tonumber(fibaro:getValue(tuere_eingang, "value")) < 1)
 and  (tonumber(fibaro:getValue(bm_diele, "value")) > 0)
 or   (tonumber(fibaro:getValue(bm_schlafz, "value")) > 0)
 or   (tonumber(fibaro:getValue(bm_decke, "value")) > 0)
 or   (tonumber(fibaro:getValue(bm_sued, "value")) > 0)
 or   (tonumber(fibaro:getValue(bm_nord, "value")) > 0)
 
 then
      x= DT(os.date())
      fibaro:debug (x) 
        
      fibaro:debug("------------------------------------------------------------------------------------------");
      Debug("white",(os.date("%H:%M Uhr BEWEGUNG registriert...")));
      Debug("cyan",("Timer wird gestoppt!"));
      Debug("red",(os.date("Abwesenheit wird NICHT aktiviert!")));
      fibaro:debug("------------------------------------------------------------------------------------------");
      fibaro:abort()
 break
 end

 until (timer1 < 1) 
    
      Debug("cyan",("Timer abgelaufen, Licht wird ausgeschaltet..."));
      fibaro:call(licht_wz, "turnOff");
      --fibaro:call(handy_willi, "sendPush",os.date("(%d.%m.%Y) ABWESENHEIT um %H:%M Uhr AKTIVIERT!"));
      Debug("gray",(os.date("Licht um %H:%M Uhr AUSGESCHALTET!"))); 
      fibaro:debug("------------------------------------------------------------------------------------------");

        
 until (timer < 1) 
    
     fibaro:setGlobal("AnwesenheitsCheck", "Abwesend");
     fibaro:call(331, "pressButton", "2");
     Debug("cyan",("Timer abgelaufen, Abwesenheit wird eingeschaltet..."));    
     --fibaro:call(handy_willi, "sendPush",os.date("(%d.%m.%Y) ABWESENHEIT um %H:%M Uhr AKTIVIERT!"));
     Debug("orange",(os.date("Abwesenheit um %H:%M Uhr AKTIVIERT!"))); 
     fibaro:debug("------------------------------------------------------------------------------------------");

 end
  end
   end