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
--[[
%% 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
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
--[[
%% 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
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
Vielleicht solte ich doch einen kaufen …
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.
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.
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.
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).
Szene:
Wenn globale Var = 1 UND Tür offen
DANN Licht An Und
Licht Aus (Zeitlänge in das rote Feld)