Lichtsteuerung nur zur bestimmten Uhrzeit

Hallo.

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. :wink:

Hi,

als zeitliche Bedingung nutze ich folgendes:


local currentTime = os.date("%H:%M");

if ( currentTime >= "05:00"  and currentTime < "08:00" and........


Dein Code ist etwas aufwendig zu verstehen, weil wenig zB durch Einschübe srukturiert.

VG Hoggle

Weitere Beispiele zur zeitlichen Steuerung:
https://www.siio.de/board/thema/weihnachtsbeleuchtung/#post-18440

Hallo Hoggle,

wenn ich Deine Zeilen einfüge, bekomme ich folgenden Fehler:
[DEBUG] 20:38:33: line 13: ‘)’ expected (to close ‘(’ at line 11) near ‘if’

Die entsprechende Zeile 13 sieht so aus:
if (fibaro:countScenes()>1) then

Kannst Du helfen? Das seltsame ist, dass der Fehler ohne Deine Zeilen nicht kommt.

VG,
Oliver

Hi,

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…

VG Hoggle

Hallo Caulfield,

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