Ich nutze folgendes LUA Skript zur Schaltung meiner Beleuchtung vor der Haustür:
-------------------------------------------------------------------------
--[[
%% properties
81 value
%% globals
--]]
-- VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene = 32 -- ID dieser Szene
local motion = 81 -- ID des Bewegungssensors
local switch = 100 -- ID des Relay Switches
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:abort();
end
-- SCHALTE LICHT EIN & AUS
if (tonumber(fibaro:getValue(motion, "value")) > 0 ) and (tonumber(fibaro:getValue(switch, "value"))) < 1 then
fibaro:call(switch, "turnOn");
fibaro:debug("Schalte Licht ein");
end
-- Verzögerung in Sekunden nach der letzten erkannten Bewegung, bevor das Licht ausgeschaltet wird
if (tonumber(fibaro:getValue(switch, "value"))) > 0 then
local starttimer = 20;
local timer = (starttimer);
fibaro:debug("Starte Timer");
repeat
fibaro:sleep(1000);
-- Schalte Licht aus, wenn Schalter manuell betätigt wird und warte 10 Sekunden, um ein
-- versehentliches (erneutes) Aktivieren der Szene zu verhindern
if (tonumber(fibaro:getValue(switch, "value"))) < 1 then
timer=1;
fibaro:call(switch, "turnOff");
fibaro:sleep(10000);
break
end
timer=timer-1;
-- Timer zurücksetzen, wenn neue Bewegung erkannt wird innherhalb der Verzögerungszeit
if (tonumber(fibaro:getValue(motion, "value"))) > 0 then
timer=starttimer;
fibaro:debug("Resete Time, Bewegung erkannt bzw. Motionsensor sendet noch nicht (vgl. Parameter 6)");
end
until (timer<1)
-- Schalte Licht aus, wenn Timer vollständig abgelaufen ist
fibaro:call(switch, "turnOff");
fibaro:debug("Timer abgelaufen/Schalte Licht aus");
fibaro:killScenes(scene);
end
-------------------------------------------------------------------------
Die Szene funktioniert super (sie ist übrigens aus einem anderen Blogbeitrag kopiert, da ich selber nicht in der Lage bin, das zu schreiben), aber ich möchte tagsüber natürlich nicht, dass das Außenlicht vor der Tür angeht. Mit welchen zusätzlichen Zeilen könnte ich also nun steuern, dass das Licht nur in der Zeit von beispielsweise 18:00 Uhr bis 6:00 Uhr eingeschaltet wird?
Vielen Dank für Eure Hilfe,
Oliver
PS: und wenn Ihr mir antwortet, dann bitte für Doofe. Copy&Paste kann ich, aber ansonsten habe ich leider keine Ahnung, was da in den Skripten passiert.
je nach dem, was genau Du wo eingefügt hast.
Hast Du das als zusätzliche Bedingung oder als separate Bedingung über alles gemacht?
ggf die Klammer weg - und das “and” - und ein “end” einfügen…
probiere mal das Skript. Geht von Sonnenuntergang bis Sonnenaufgang.
--[[
%% autostart
%% properties
80 value
259 value
%% globals
--]]
--[[
* Licht nach Sonnenuntergang auf 10% einschalten
* Bei Bewegung oder Tür auf Licht auf 99% für X Sekunden
* Nur zwischen sunset und sunrise Licht einschalten
** Max. running Instances muss auf 3 stehen!
--]]
---------------------------------------------------
--------- Schleifenschutz -------------------------
if (fibaro:countScenes()>2) then
fibaro:debug('Kill the third scene!');
fibaro:abort();
end
---------------------------------------------------
------------- stime -------------------------------
-- Funktion zum Umrechnen von Uhrzeiten in Sekunden
-- seit 0 Uhr
---------------------------------------------------
function stime(s)
local pattern = "(%d+):(%d+)"
local hours, minutes, seconds = string.match(s, pattern)
return (hours*3600)+(minutes*60)
end
---------------------------------------------------
------------- Config ------------------------------
dimmerID = 210 --Dimmer
motionID = 80 --MotionSensor
doorID = 259 --Türsensor
lightLow = 1 --unterer Prozentwert für den Dimmer
lightHigh = 99 --oberer Prozentwert für den Dimmer
lightTimer = 300 --Zeit in Sekunden die das Licht auf lightHigh bleiben soll
offsetSunrise = 0 --Offset Sonnenaufgang in Minuten (+10 oder -10)
offsetSunset = 0 --Offset Sonnenuntergang in Minuten (+10 oder -10)
version = 'v0.1'
---------------------------------------------------
--------- Farbiges Debug --------------------------
function debug( color, message )
fibaro:debug(string.format('<%s style="color:%s;">%s<!--%s-->', "span", color, message, "span"));
end
---------------------------------------------------
--------- GetGlobals ------------------------------
function getGlobals()
sunset = fibaro:getValue(1, "sunsetHour")
sunsetSeconds = stime(sunset)
sunrise = fibaro:getValue(1, "sunriseHour")
sunriseSeconds = stime(sunrise)
timeNow = stime(os.date("%H:%M"))
sourceTrigger = fibaro:getSourceTrigger();
end
---------------------------------------------------
--------- setLightHighTimer -----------------------
-- (sec) -- Sekunden die das Licht auf 100% bleiben soll
---------------------------------------------------
function setLightHighTimer(sec)
fibaro:call(dimmerID,"setValue",lightHigh)
i = 1
while i <= sec do
debug("yellow","Restzeit "..sec-i.." Sekunden")
i = i + 1
if fibaro:getValue(motionID, "value") == "1" or fibaro:getValue(doorID, "value") == "1" then
i = 0
debug("red","Bewegung dauert an / Tür ist noch offen, setzte Timer zurück")
end
fibaro:sleep(1000)
end
debug("yellow","Timer abgelaufen, schalte wieder auf "..lightLow.."%")
if timeNow > sunsetSeconds or timeNow < sunriseSeconds then
fibaro:call(dimmerID,"setValue",lightLow)
else
fibaro:call(dimmerID,"setValue",0)
end
end
---------------------------------------------------
--------- START -----------------------------------
--------- Globale Werte auslesen
getGlobals()
--------- Timerfunktion
function tempFunc()
getGlobals()
if os.date("%H:%M", os.time()+offsetSunset*60) == sunset then
debug("green","Sunset erkannt, schalte Licht auf "..lightLow.."% ein")
fibaro:call(dimmerID,"setValue",lightLow)
elseif os.date("%H:%M", os.time()+offsetSunrise*60) == sunrise then
debug("green","Sunrise erkannt, schalte Licht aus")
fibaro:call(dimmerID,"setValue",0)
else
debug("green","Sunset "..sunset.." // Sunrise "..sunrise)
end
setTimeout(tempFunc, 60*1000)
end
-- Bei Autostart Timer aktivieren
if sourceTrigger["type"] == "autostart" then
debug("green","Autostart erkannt, starte Timer")
tempFunc()
else
-- Wenn getriggert (Motion oder Door), dann Licht auf lightHigh für x Sekunden
debug("red","Bewegung oder Tür auf erkannt, schalte Dimmer auf "..lightHigh.."%")
if timeNow > sunsetSeconds or timeNow < sunriseSeconds then
setLightHighTimer(lightTimer)
end
end