Alarm auto ein

Hallo zusammen
Habe als Anfänger eine LUA Szene geschrieben, die leider nur zum Teil funktioniert. Abends Licht aus, warte 15 Min dann Alarm ein. Die Blockzeiten (Zeit von, bis)werden nicht eingehalten? Also die Szene dürfte nur von 20.00 Uhr bis 04.00 Uhr aktiv sein. Ebenso wenn der Timer läuft, möchte ich wenn das Licht erneut eingeschaltet wird dass der Timer stoppt, also der Alarm nicht eingeschaltet wird.
Könnte mir jemand sagen wo ich den Fehler eingebaut habe, bzw. was ich machen muss das der Timer stoppt bei erneutem Licht einschalten.
Vielen Dank für eure Hilfe

Gruss Willi

--[[
%% properties
%% globals
--Sonnenstand
Licht
--]]

-- VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
 local scene= 98 -- ID dieser Szene
 local Licht= 128
 local SunSet= fibaro:getValue(1, "sunsetHour")
 local Sunrise= fibaro:getValue(1, "sunriseHour")
 local currentDate = os.date("*t");
 local sourceTrigger = fibaro:getSourceTrigger();
 local startSource = fibaro:getSourceTrigger();
 local starttimer = 900;
 local timer = (starttimer);
 

-- Lösche doppelte Szene(n)
 if (fibaro:countScenes()>1) 
 
 then 
 fibaro:abort(); 
 end
 
 -- Prüfe Tageszeit
 if (((tonumber(os.date("%H%M")) >= tonumber(string.format("%02d%02d", "20", "00")) or tonumber(os.date("%H%M")) <= tonumber(string.format("%02d%02d", "04", "00"))))) 

 then
 fibaro:debug("Prüfe Tageszeit");
 --fibaro:debug('Die Sonne ist heute um ' ..Sunrise.. ' Uhr aufgegangen und geht um ' ..SunSet.. ' Uhr unter.');
 fibaro:debug("Szene angehalten, ausserhalb der Zeitbeschränkung!");
 fibaro:abort();
 fibaro:killScenes(scene);
 else
  
 --Prüfe Lichtstatus
 if (tonumber(fibaro:getValue(Licht, "value"))) > 0
 
 then 
 fibaro:debug("Licht eingeschaltet...");
 fibaro:debug("Alarm wird nicht aktiviert!");
 fibaro:abort();
 fibaro:killScenes(scene);   
 end
  
 -- Licht aus, Timer ein
 if (((tonumber(os.date("%H%M")) >= tonumber(string.format("%02d%02d", "20", "00")) or tonumber(os.date("%H%M")) <= tonumber(string.format("%02d%02d", "04", "00"))) 
 and  tonumber(fibaro:getGlobalValue("Alarm")) == tonumber("0")  
 and  (tonumber(fibaro:getValue(Licht, "value"))) < 1))

      
 then  
 fibaro:debug(os.date("Licht um %H:%M Uhr ausgeschaltet!. (%d.%m.%Y)"));       
 timer = (starttimer);
 fibaro:debug("Starte Timer");
 fibaro:debug(""..timer /60 .. " Minuten bis Alarm einschaltet wird...!");     
 
 --Licht erneut ein
 --if(tonumber(fibaro:getValue(Licht, "value"))) > 0
 
 --then
 --timer=startimer
 --fibaro:debug("Licht wieder eingeschaltet!");       
 --fibaro:debug("Timer gestoppt...!");   
 --fibaro:abort();
 --fibaro:killScenes(scene); 
    
 repeat 
 fibaro:sleep(1000);
 
 timer=timer-1;  
 until (timer<1)    
  
 -- Schalte Alarm ein, wenn Timer vollständig abgelaufen ist 
 fibaro:debug("Timer abgelaufen, Alarm wird eingeschaltet...");
 --fibaro:startScene(24);
 fibaro:debug(os.date("Alarm um %H:%M Uhr eingeschaltet!. (%d.%m.%Y)"));   
 fibaro:killScenes(scene);

 --else
-- fibaro:debug("Szene angehalten, ausserhalb des vorgegebenen Zeitrasters...!");     
 --fibaro:abort();
 --fibaro:killScenes(scene);
    
 end
 end

Hi,

oben in dem Config-Header dürfen keine Kommentare gesetzt sein, sonst funktioniert das Triggern nicht korrekt.

Gruß

Hi boomx
Vielen Dank für die Info, könntest Du vielleicht noch ein Auge auf die gesamte Programmierung werfen? Wie ich die Unterbrechung " Licht erneut ein, Timer stopp"
hinkriege.
Danke schon mal…

Habe die Szene abgeändert, leider läuft der Timer so nicht mehr ab? Finde keinen Fehler, bin um jede Hilfe dankbar…
Danke und Gruss…

--[[
%% properties
%% globals
Licht
--]]
 
 local scene= 98 
 local Licht= 128
 local SunSet= fibaro:getValue(1, "sunsetHour")
 local Sunrise= fibaro:getValue(1, "sunriseHour")
 local currentDate = os.date("*t");
 local sourceTrigger = fibaro:getSourceTrigger();
 local startSource = fibaro:getSourceTrigger();
 local starttimer = 9;
 local timer = (starttimer);
 	    
-- Lösche doppelte Szene(n)
 if (fibaro:countScenes()>1) 
 
 then 
 fibaro:abort(); 
 end
 
 -- Prüfe Tageszeit
 if not(((tonumber(os.date("%H%M")) >= tonumber(string.format("%02d%02d", "20", "00")) or tonumber(os.date("%H%M")) <= tonumber(string.format("%02d%02d", "04", "00"))))) 
 
 then
 fibaro:debug("Prüfe Tageszeit");
 --fibaro:debug('Die Sonne ist heute um ' ..Sunrise.. ' Uhr aufgegangen und geht um ' ..SunSet.. ' Uhr unter.');
 fibaro:debug("Szene angehalten, ausserhalb der Zeitbeschränkung!");
 fibaro:abort();
 fibaro:killScenes(scene);
 else
  
 -- Licht aus, Timer ein
 if (((tonumber(os.date("%H%M")) >= tonumber(string.format("%02d%02d", "20", "00")) or tonumber(os.date("%H%M")) <= tonumber(string.format("%02d%02d", "04", "00"))) 
 and  tonumber(fibaro:getGlobalValue("Alarm")) == tonumber("0")  
 and  (tonumber(fibaro:getValue(Licht, "value"))) < 1))
 
      
 then  
 fibaro:debug(os.date("Licht um %H:%M Uhr ausgeschaltet!. (%d.%m.%Y)"));       
 timer = (starttimer);
 fibaro:debug("Starte Timer");
 fibaro:debug(""..timer /60 .. " Minuten bis Alarm einschaltet wird...!");     
 

 repeat 
 fibaro:sleep(1000);
 
 timer=timer-1;
 until (timer<1)    
  
 -- Schalte Alarm ein, wenn Timer vollständig abgelaufen ist 
 fibaro:debug("Timer abgelaufen, Alarm wird eingeschaltet...");
 --fibaro:startScene(24);
 fibaro:debug(os.date("Alarm um %H:%M Uhr eingeschaltet!. (%d.%m.%Y)"));   
 fibaro:killScenes(scene);
 else
 
 if (tonumber(fibaro:getValue(Licht, "value"))) > 0
      
 then
 fibaro:debug("Szene angehalten, Licht eingeschaltet!");
 timer = (starttimer);
 fibaro:abort();
 fibaro:killScenes(scene);     
 
end
end
end

Hallo Willi,
zuerst muss in Zeile 4 “Licht” durch “128” ersetzt werden.

… und ein “value” hinter die 128 im Header setzen.

Warum arbeitest Du mit killScenes?
Damit wird nicht die Schleife beendet und die Szene läuft weiter, sondern Du schießt die gesamte Szene ab.

… und direkt nach:
%% properties
128 value

Hi zusammen

Vielen Dank für eure Antworten, habe die Szene gemäss euren Angaben geändert. Bin sehr
gespannt auf das Ergebnis…

Vielen Dank nochmal, Gruss fastsnake

--[[
%% properties
%% globals
128 value
--]]
 
 local scene= 98 
 local Licht= 128
 local SunSet= fibaro:getValue(1, "sunsetHour")
 local Sunrise= fibaro:getValue(1, "sunriseHour")
 local currentDate = os.date("*t");
 local sourceTrigger = fibaro:getSourceTrigger();
 local startSource = fibaro:getSourceTrigger();
 local starttimer = 9;
 local timer = (starttimer);
 	    
-- Lösche doppelte Szene(n)
 if (fibaro:countScenes()>1) 
 
 then 
 fibaro:abort(); 
 end
 
 -- Prüfe Tageszeit
 if not(((tonumber(os.date("%H%M")) >= tonumber(string.format("%02d%02d", "09", "00")) or tonumber(os.date("%H%M")) <= tonumber(string.format("%02d%02d", "04", "00"))))) 
 
 then
 fibaro:debug("Prüfe Tageszeit");
 --fibaro:debug('Die Sonne ist heute um ' ..Sunrise.. ' Uhr aufgegangen und geht um ' ..SunSet.. ' Uhr unter.');
 fibaro:debug("Szene angehalten, ausserhalb der Zeitbeschränkung!");
 fibaro:abort();
 --fibaro:killScenes(scene);
 else
  
 -- Licht aus, Timer ein
 if (((tonumber(os.date("%H%M")) >= tonumber(string.format("%02d%02d", "09", "00")) or tonumber(os.date("%H%M")) <= tonumber(string.format("%02d%02d", "04", "00"))) 
 and  tonumber(fibaro:getGlobalValue("Alarm")) == tonumber("0")  
 and  (tonumber(fibaro:getValue(Licht, "value"))) < 1))
 
      
 then  
 fibaro:debug(os.date("Licht um %H:%M Uhr ausgeschaltet!. (%d.%m.%Y)"));       
 timer = (starttimer);
 fibaro:debug("Starte Timer");
 fibaro:debug(""..timer /60 .. " Minuten bis Alarm einschaltet wird...!");     
 

 repeat 
 fibaro:sleep(1000);
 
 timer=timer-1;
 until (timer<1)    
  
 -- Schalte Alarm ein, wenn Timer vollständig abgelaufen ist 
 fibaro:debug("Timer abgelaufen, Alarm wird eingeschaltet...");
 --fibaro:startScene(24);
 fibaro:debug(os.date("Alarm um %H:%M Uhr eingeschaltet!. (%d.%m.%Y)"));   
 fibaro:killScenes(scene);
 else
 
 if (tonumber(fibaro:getValue(Licht, "value"))) > 0
      
 then
 fibaro:debug("Szene angehalten, Licht eingeschaltet!");
 timer = (starttimer);
 fibaro:abort();
 fibaro:killScenes(scene);     
 end
  end
   end

Die Szene läuft, ausser wenn das Licht im Timer Bereich wieder eingeschaltet wird läuft der Timer trotzdem ab.
Gerade das möchte ich verhindern.
Wenn der Timer läuft (also bereits im countdown Modus ist) und das Licht erneut eingeschaltet wird, sollte der Timer
gestoppt werden.
Danke schon mal…

Muss ich da irgedwie mit “break” arbeiten?

Hi, erst mal Zeile 3 und 4 vertauschen wie im Post vor deinem beschrieben.

Zumindest springst Du mit Break aus einer wühle-Schleife raus.

Vielen Dank, für eure Hilfe. Habe die Zeilen 3+4 vertauscht. Werde
die Szene heute Abend wieder testen. Gruss fastsnake

in Zeiel 58 und 67 hast Du noch ein “fibaro:killScenes(scene);” statt abort.
Bzw. in Zeile 66 davor den abort.

Aber was willst Du grundsätzlich mit den abort oder kill erreichen?

Arbeite mal mit Einschüben zum Strukturieren der Teilabschnitte, dann sieht man besser, was zusammengehört und was nicht.
So ist das durchsehen etwas schwierig…

Hallo Hoggle
Da die Szene offenbar in der Timerschleife hängt wenn ich das Licht innerhalb des countdown wieder einschalte, dachte ich
mit „fibaro:killScenes(scene);“ das ganze zu entladen. Mit “brake” funktioniert es auch nicht, kommt die Fehlermeldung
das die Szene in keinem Loop ist. Habe versucht die Szene etwas übersichtlicher darzustellen.
PS. Die Szene funktioniert grundsätzlich, ausser Licht wieder ein wenn Timer läuft. Dann läuft der Timer trotzdem zu Ende
und schaltet Alarm ein.
Gruss und vielen Dank

--[[
%% properties
128 value
%% globals
--]]
 
 local scene= 98 
 local Licht= 128
 local currentDate = os.date("*t");
 local sourceTrigger = fibaro:getSourceTrigger();
 local startSource = fibaro:getSourceTrigger();
 local starttimer = 900;
 local timer = (starttimer);
 	    
-- Lösche doppelte Szene(n)
 if (fibaro:countScenes()>1) 
  
 then 
 fibaro:abort(); 
 end
 
 -- Prüfe Tageszeit
 if not(((tonumber(os.date("%H%M")) >= tonumber(string.format("%02d%02d", "20", "00")) or tonumber(os.date("%H%M")) <= tonumber(string.format("%02d%02d", "04", "00"))))) 
 
 then
 fibaro:debug("Prüfe Tageszeit");
 fibaro:debug(os.date("Es ist %H:%M Uhr"));       
 fibaro:debug("Szene angehalten, ausserhalb der Zeitbeschränkung!");
 fibaro:abort();
  
 -- Prüfe Tageszeit (Licht ein?)
 else
 if (((tonumber(os.date("%H%M")) >= tonumber(string.format("%02d%02d", "20", "00")) or tonumber(os.date("%H%M")) <= tonumber(string.format("%02d%02d", "04", "00"))) 
 and (tonumber(fibaro:getValue(Licht, "value"))) > 0))      
 
 then
 fibaro:debug("Szene angehalten!");
 fibaro:debug(os.date("Licht um %H:%M Uhr eingeschaltet!"));
 fibaro:debug(os.date("Alarm wird nicht aktiviert!"));       
 fibaro:abort();
 end 
  
 -- Licht aus, Timer ein
 if (((tonumber(os.date("%H%M")) >= tonumber(string.format("%02d%02d", "20", "00")) or tonumber(os.date("%H%M")) <= tonumber(string.format("%02d%02d", "04", "00"))) 
 and  tonumber(fibaro:getGlobalValue("Alarm")) == tonumber("0")  
 and  (tonumber(fibaro:getValue(Licht, "value"))) < 1))
       
 then  
 fibaro:debug(os.date("Licht um %H:%M Uhr ausgeschaltet!. (%d.%m.%Y)"));       
 timer = (starttimer);
 fibaro:debug("Starte Timer");
 fibaro:debug(""..timer /60 .. " Minuten bis Alarm einschaltet wird...!");     
 end
  
 repeat 
 fibaro:sleep(1000);
 
 timer=timer-1;
 until (timer<1)    
  
 -- Schalte Alarm ein, wenn Timer vollständig abgelaufen ist 
 fibaro:debug("Timer abgelaufen, Alarm wird eingeschaltet...");
 fibaro:startScene(24);
 fibaro:debug(os.date("Alarm um %H:%M Uhr eingeschaltet!. (%d.%m.%Y)"));   
 fibaro:abort();
 end

Break nicht brake

Scahu auch mal hier vorbei:https://wiki.multitheftauto.com/wiki/DE/Lua_Tutorial#Syntax

http://www.activevb.de/tutorials/tut_lua/tut_lua.html

http://www.lua.org/manual/5.1/

Sorry habe einen Tippfehler gemacht, meinte natürlich break! Dachte jemand von euch
LUA Spezis könnte mir sagen wo ich eine Änderung vornehmen müsste, dass die Szene
sauber läuft.
Trotzdem vielen Dank für euren Einsatz!

Gruss fastsnake

Hallo fastsnake,

füge mal folgende Zeilen ein, dann müsste dein script laufen.

 repeat 
 fibaro:sleep(1000);
 --fibaro:debug("timer = "..timer) 
 timer=timer-1;
 if (tonumber(fibaro:getValue(Licht, "value")) > 0) then
		fibaro:debug("Szene angehalten!");
		fibaro:debug(os.date("Licht um %H:%M Uhr eingeschaltet!"));
 		fibaro:debug(os.date("Alarm wird nicht aktiviert!"));       
    	fibaro:abort();
 end
 until (timer<1)    

Hi Jeff,
Genau das wars!! Ich habe repeat fibaro:sleep(1000); und timer=timer-1; am falschen Ort platziert. Vielen Dank dass Du
Dir die Zeit genommen hast um den Fehler ausfindig zu machen.
Bin LUA Anfänger und habe wieder etwas gelernt!!
Super gemacht… Danke.
Gruss fastsnake