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 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
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…
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
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!
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