Zuverlässige Lichtsteuerung

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

Hi,

Warum triggert bei der 2. Szene die Szene sich selbst?
Zeile 11 wird dort so nicht funktionieren. Entweder als Array definieren oder mit zwei Variablen arbeiten.

Deine Szenen werden durch jede Motion und Luxänderung getriggert.
Je nach dem wie die Parameter eingestellt sind, kann das etwas häufig sein.

Viele Grüße Hoggle

Hallo Hoggle,

ich bin relativ neu und verstehe leider nicht, was du genau mit “triggern” meinst. Wie würdest Du das programmieren? Hast Du vielleicht ein Beispiel für mich?!

VG

Hast du mal hier geschaut:

https://www.siio.de/fibaro-szene-licht-solange-bewegung/

Oder

https://www.siio.de/board/thema/licht-oder-rgb-zu-bestimmten-zeiten-an-solange-bewegung/