Ich habe vor der Haustüre einen Bewegungsmelder der das Licht für die Einfahrt steuert mit einem LUA Skirpt realisiert.
Wenn Bewegung = Licht AN, solange Bewegung ist läuft ein Counter und das Licht geht erst nach einer eingestellten Zeit wieder aus.
Mein Problem ist, das es den ganzen Tag diese Funktion hat. Wie kann ich die Szene nur zur Abendzeit aktivieren wenn es dunkel wird.
Der BWM schalten auch tagsüber das Licht an.
Hier mal der Skript den ich verwende. Vielen Dank im Voraus !
–[[
%% properties
238 value
250 value
%% globals
–]]
– VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene = 74 – ID dieser Szene
local motion = 238 – ID des Bewegungssensors
local switch = 250 – 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:call(250, “setBrightness”, “5”);
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 = 30;
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
-Kannst Du das Script beser formatieren? Im Beitrag einfügen, markieren und auf Code klicken.
-Hast Du eine Tageszeitenvariable (TimeOfDay etc)? Damit steuere ich sowas. Man kann aber auch direkt auf die Variable zugreifen ->
local sunrise = fibaro:getValue(1, "sunriseHour") -- Sonnenaufgang
local sunset = fibaro:getValue(1, "sunsetHour") -- Sonnenuntergang
–[[
%% properties
238 value
250 value
%% globals
–]]
— VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene = 74 — ID dieser Szene
local motion = 238 — ID des Bewegungssensors
local switch = 250 — 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:call(250, „setBrightness“, „5“);
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 = 30;
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
local sunrise = string.gsub(fibaro:getValue(1, "sunriseHour"), ":", "") -- Sonnenaufgang
local sunset = string.gsub(fibaro:getValue(1, "sunsetHour"), ":", "") -- Sonnenuntergang
local time = os.date("%H%M") --aktuelle Uhrzeit
fibaro:debug (time .. " | " .. sunrise .. " | " .. sunset)
if time > sunrise and time < sunset then --prüfe ob hell
fibaro:debug ("kein Licht notwendig")
fibaro:call(switch, „turnOff“) --Licht aus falls an
fibaro:abort() --Szene beenden
end
Hab es nur teilweise probieren können. Evtl. muss man noch ein paar tonumber() einbauen aber wenn es so läuft würde ich es lassen.
Hallo Sketzer, du kannst das auch mit einem Helligkeitssensor z.B. aus einem Fibaro Motion Sensor lösen. Dazu müsstes du den Sensor als Bedingung mit einbinden:
Ich nutze das in meinem Script in Zeile 11 ( da steh die ID des Lichtsensors drin) und in Zeile 19 (dort steht der Wert drin, ab wann bei mir das Licht angehen soll).
Musst dann aber im Motion Sensor auch die Abfragezeiträume in den Parametern für den Lichtsensor entprechend anpassen. Ansonsten aktualisiert sich der Wert ggf. erst nach einer Stunde.
--[[
%% properties
82 value
36 value
%% globals
--]]
-- VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene = 28 -- ID dieser Szene
local motion = 82 -- ID des Bewegungssensors
local switch = 100 -- ID des Relay Switches
local lux = 84 -- ID des Helligkeistsensors
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:abort();
end
-- SCHALTE LICHT EIN & AUS
if ((tonumber(fibaro:getValue(motion, "value")) > 0 )
or (tonumber(fibaro:getValue(36, "value")) > 0 )) --Türsensor HWR
and (tonumber(fibaro:getValue(lux, "value")) <= 50 )
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 = 120;
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
Ich bekomme hier jetzt einen Fehler. Ich wollte das Licht nur einschalten lassen , nach Sonnenuntergang und hab wie von @ aendy den Teil mit Sunrise und Sunset eingefügt.
–[[
%% properties
338 value
335 value
%% globals
–]]
— VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene = 66 — ID dieser Szene
local motion = 338 — ID des Bewegungssensors
local switch = 335 — ID des Relay Switches
— Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:abort();
end
— SCHALTE LICHT EIN & AUS
local sunrise = string.gsub(fibaro:getValue(1, "sunriseHour"), ":", "") -- Sonnenaufgang
local sunset = string.gsub(fibaro:getValue(1, "sunsetHour"), ":", "") -- Sonnenuntergang
local time = os.date("%H%M") --aktuelle Uhrzeit
fibaro:debug (time .. " | " .. sunrise .. " | " .. sunset)
if time > sunrise and time < sunset then --prüfe ob hell
fibaro:debug ("kein Licht notwendig")
fibaro:call(switch, „turnOff“) --Licht aus falls an
fibaro:abort() --Szene beenden
end
if (tonumber(fibaro:getValue(motion, „value“)) > 0 ) and (tonumber(fibaro:getValue(switch, „value“))) < 1 then
fibaro:call(switch, „turnOn“);
fibaro:call(250, „setBrightness“, „5“);
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 = 30;
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
[DEBUG] 14:08:42: 2020-11-10 14:08:42.083182 [ fatal] Unknown exception: /opt/fibaro/scenes/66.lua:1: unexpected symbol near char(226)