Hallo zusammen,
über Weihnachten habe ich sämtliche Lichtschalter mit Fibaro versehen. Ich habe mich auch von Scripts der Siio-Seite inspirieren lassen und ein paar Szenen programmiert. Ich würde jetzt gerne von Euch wissen, ob die Szenen “sauber” programmiert sind, zumal nicht immer das passiert, was passieren soll.
Szenario 1 - Gäste WC: Verbaut ist ein Fibaro Single Switch und ein Fibaro Motion Sensor. Hier soll das Licht in Abhängigkeit der Helligkeit nach einer Bewegung für 60 Sekunden eingeschaltet werden. Wird innerhalb dieser Zeit eine weitere Bewegung erkannt, erfolgt ein Reset und der Timer beginnt von neu. Sollte jemand beim Verlassen des Raumes den Schalter drücken, wird der Bewegungsmelder für 5 Sekunden deaktiviert, um ein erneutes Einschalten beim Verlassen zu verhindern.
Probleme: Das Licht schaltet sich manchmal nicht zuverlässig ein. Zudem erhalte ich im HC2 die Meldung “Too many instances”.
--[[
%% properties
119 value
125 value
127 value
%% globals
--]]
-- VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene = 6 -- ID dieser Szene
local motion = 125 -- ID des Bewegungssensors
local luxsensor = 127 -- ID des Lichtsensors
local switch = 119 -- ID des Relay Switches
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:abort();
end
-- Wenn Bewegung erkannt und Licht aus, dann...
if (tonumber(fibaro:getValue(motion, "value")) > 0 ) and (tonumber(fibaro:getValue(switch, "value"))) < 1 then
fibaro:debug("Bewegung erkannt!");
-- Prüfe LUX-Wert, wenn LUX unter Wert, dann...
if ( tonumber(fibaro:getValue(luxsensor, "value")) < 25 ) then
fibaro:debug("Es ist dunkel!");
fibaro:call(switch, "turnOn");
fibaro:debug("Licht an!");
else
fibaro:debug("Es ist hell genug!");
end
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 = 60;
local timer = (starttimer);
fibaro:debug("Starte Timer");
repeat
fibaro:sleep(1000);
-- Schalte Licht aus, wenn Schalter manuell betätigt wird und warte 5 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(5000);
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
Szenario 2 - Flur: Verbaut ist ein Fibaro Dimmer 2 und zwei Fibaro Motion Sensor. Nach manuellem Einschalten soll ein Timer von 30 Sekunden gestartet werden. Läuft der Timer ab, wird das Licht ausgeschaltet. Wird innerhalb der 30 Sekunden eine weitere Bewegung erkannt, erfolgt ein Reset und der Timer beginnt von neu.
Problem: Die Abschaltung erfolgt oft trotz Wahrnehmung einer Bewegung in den 30 Sekunden.
--[[
%% properties
17 value
243 value
249 value
199 value
%% globals
--]]
-- VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene = 17 -- ID dieser Szene
local motion = 243, 249 -- ID des Bewegungssensors
local switch = 199 -- ID des Relay Switches
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:abort();
end
-- Verzögerung in Sekunden nach der letzten erkannten Bewegung, bevor das Licht ausgeschaltet wird
if (tonumber(fibaro:getValue(switch, "value"))) > 1 then
local starttimer = 30;
local timer = (starttimer);
fibaro:debug("Licht eingeschaltet - Timer gestartet!");
repeat
fibaro:sleep(1000);
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;
end
fibaro:debug("Bewegung erkannt - Timer reset!");
until (timer<1)
-- Schalte Licht aus, wenn Timer vollständig abgelaufen ist
fibaro:call(switch, "turnOff");
fibaro:debug("Timer abgelaufen - Licht aus!");
fibaro:killScenes(scene);
end
Ich bin gespannt auf Eure Rückmeldung!
VG
Andi