Blog Licht an solange Bewegung

Hi,

Deine Szene wird durch jede Bewegung erneut gestartet, die Dein Bewegungsmelder erkennt.

Nach welcher Zeit meldet Dir dieser eine neue Bewegung ?
Parameter 2, 4, 6 weiß gerade nicht genau, welcher es ist…

Viele Grüße Hoggle

Hallo,

meinst du, dass die Szene durch den Bewegungsmelder bei jeder Bewegung komplett neu angetriggert wird, obwohl sie noch läuft? Ich war der Meinung, dass sich ein erneutes Auslösen des Bewegungsmelders nur innerhalb der laufenden Szene auswirkt; andernfalls wäre das ja in diesem Fall völlig kontraproduktiv.
Läßt sich dieses Verhalten umstellen bei den von dir erwähnten Parametern? Ich habe mir diese Parameter bisher noch nicht näher angeschaut und alle in den default-Einstellungen belassen.

Alex

Hallo zusammen,

ich bin mittlerweile selbst weitergekommen: ich hatte Fehler in meinem Script entdeckt, jetzt tut es das, was es soll - FAST :wink: : die Überprüfung am Anfang des Scripts, ob das Licht schon an ist, und die das Script dann beenden soll (ab Zeile 18), funktioniert irgendwie nur beim ersten Mal. Also per HC2 das Licht im Bad einschalten, Bad betreten, -> Debugmeldung: Licht bereits an, beende Script. Aber dann nach 10 Sekunden: “Starte Timer”, obwohl das Script beendet werden sollte mit “fibaro:abort();”.
Hat jemand eine Idee, warum mein Script an dieser Stelle nicht abbricht wie es soll?

--[[ 
%% properties
29 value
%% globals 
--]]
-- VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene = 9 -- ID dieser Szene
local motion = 29 -- ID des Bewegungssensors
local switch = 26 -- ID des Relay Switches
local switch2 = 27 -- ID des Relay Switches2
local starttimer = 60 -- Timer in Sekunden (+ Wert in Sekunden aus Sensor-Default-Parameter (30 Sekunden))
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:debug("Instanz läuft bereits, beende Script");
fibaro:abort();
end
-- Prüfe, ob Licht bereits an ist
if ((tonumber(fibaro:getValue(motion, "value")) > 0) and (tonumber(fibaro:getValue(switch, "value")) > 0)) or ((tonumber(fibaro:getValue(motion, "value")) > 0) and (tonumber(fibaro:getValue(switch2, "value")) > 0)) then
fibaro:debug("Licht bereits an, exit");
fibaro:abort();
end
-- SCHALTE LICHT EIN & AUS
if (tonumber(fibaro:getValue(motion, "value")) > 0) and (tonumber(fibaro:getValue(switch, "value")) < 1) and (tonumber(fibaro:getValue(switch2, "value")) < 1) then
fibaro:call(switch, "turnOn");
fibaro:call(switch2, "turnOn");
fibaro:debug("Bewegung erkannt, 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) and (tonumber(fibaro:getValue(switch2, "value")) > 0) then
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) and (tonumber(fibaro:getValue(switch2, "value")) < 1) then
timer=1;
fibaro:call(switch, "turnOff");
fibaro:call(switch2, "turnOff");
fibaro:debug("Licht wurde durch Schalter ausgeschaltet");
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("Resette 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:call(switch2, "turnOff");
fibaro:debug("Timer abgelaufen, schalte Licht aus");
fibaro:killScenes(scene);
end

HAllo SIIO Forum,

ich unternehme gerade die ersten Gehversuche mit LUA auf meinem nagelneuen HC 2 (whuhu). Leider habe ich ein kleines Problem, bei dem ich nicht weiter komme: Ich möchte zwei Fibaro Wall Plugs (ID 10 und ID 23) schalten. Leider bekomme ich es nicht hin, dass beide gleichzeitig geschaltet werden. Immer wenn ich beide in die Szene eingefügt habe, schaltet nur der ID 23. Ist ID 10 als einziger in der Szene reagiert er ganz artig.

Weiß da jemand Rat? Vielen Dank! :slight_smile:

--[[ 
%% properties 
18 value
10 value
23 value

%% globals 
--]]
-- VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)

local scene = 2 -- ID dieser Szene
local motion = 18 -- ID des Bewegungssensors
local switch = 10 -- ID des Relay Switches
local switch = 23 -- 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
and ((tonumber(os.date("%H%M"))) >= (tonumber(string.format("%02d%02d", "16", "00"))) or (tonumber(os.date("%H%M"))) <= (tonumber(string.format("%02d%02d", "23", "50")))) --wenn die zeit größer als 1930 oder kleiner als 0700 ist. also zwischen 19.30 und 7.00 Uhr geht das licht an
  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 = 900;
    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

Hallo Lex,

es liegt daran, dass du beide switches in der lokalen variablen mit “switch” benannt hast:

local switch = 10 -- ID des Relay Switches
local switch = 23 -- ID des Relay Switches

nenn den einen “switch” und den anderen “switch2” dann sollte es klappen.

grüße

Danke nevv, das war es. jetzt funktioniert alles. :slight_smile:

Allerdings habe ich noch ein zweites Prblemchen. Ich verwende das Script noch, um einen Bildschirm zu steuer, der im Flur hängt und auf dem die Fibaro Oberfläche, Netatmo Wetterstation, Outlook, etc. angezeigt werden. Der Bildschirm soll immer dann angehen, wenn der Motion Sensor Bewegung meldet und das ganze nur zwischen 8.00h und 23.50h, weil ich ihn nachts nicht brauche. Ich habe alle Werte eingetragen, aber leider geht eher trotzdem nach Mitternacht an. Ich weiß nicht warum :frowning:

--[[ 
%% properties 
13 value
25 value
%% globals 
--]]
-- VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)

local scene = 1 -- ID dieser Szene
local motion = 13 -- ID des Bewegungssensors
local switch = 25 -- 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
and ((tonumber(os.date("%H%M"))) >= (tonumber(string.format("%02d%02d", "08", "00"))) or (tonumber(os.date("%H%M"))) <= (tonumber(string.format("%02d%02d", "23", "50")))) --wenn die zeit größer als 1930 oder kleiner als 0700 ist. also zwischen 19.30 und 7.00 Uhr geht das licht an
  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 = 900;
    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

Dein Switch triggert die Szene, nimm ihn mal aus dem Header raus.
Setze mal die Bedingungen in Zeile 21 insgesamt in eine Klammer.

Und in Zeile 21 muss es and statt or heißen.

Hey zusammen,

Habe das Script super zum laufen gebracht. Habe noch die Bedingung der Rollade zu/auf mit and untergebracht, möchte aber jetzt auch noch den Lichtsensor mit einbauen.
Das heißt wenn rollo oben soll das Licht an gehen wenn der Lux Wert unter 100 fällt. Habe etwas rumprobiert aber es nicht hinbekommen.

--[[ 
%% properties 
133 value
186 value
141 value
188 value
135 value
%% globals 
--]]
-- VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene = 38 -- ID dieser Szene
local motion = 133 -- ID des Bewegungssensors
local switch = 186 -- ID des Spiegels
local switch1 = 141 -- ID Nischen
local switch2 = 142 -- ID Deko Glas
local roller = 188 -- ID Rollo Bad
local lux = 135 -- ID Luxsensor
-- 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 and (tonumber(fibaro:getValue(switch1, "value"))) < 1 and (tonumber(fibaro:getValue(switch2, "value"))) < 1 and ((tonumber(fibaro:getValue(roller, "value"))) < 1 then 
 fibaro:call(switch, "turnOn");
 fibaro:call(switch1, "turnOn");
 fibaro:call(switch2, "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 or (tonumber(fibaro:getValue(switch1, "value"))) > 0 or (tonumber(fibaro:getValue(switch2, "value"))) > 0 then
 local starttimer = 420;
 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 and (tonumber(fibaro:getValue(switch1, "value"))) < 1 and (tonumber(fibaro:getValue(switch2, "value"))) < 1 then 
 timer=1; 
 fibaro:call(switch, "turnOff");
 fibaro:call(switch1, "turnOff");
 fibaro:call(switch2, "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:call(switch1, "turnOff");
 fibaro:call(switch2, "turnOff");
 fibaro:debug("Timer abgelaufen/Schalte Licht aus");
 fibaro:killScenes(scene); 
end

Kann jemand helfen?

Danke und Grüße

Was genau funktioniert nicht?

Was genau funktioniert nicht?

Hey,

ich hatte versucht die Lux Bedingung genau wie die Rollershutter Bedingung hinzu zu fügen.
Siehe Zeile 23:

…and (tonumber(fibaro:getValue(roller, “value”))) < 1 or (tonumber(fibaro:getValue(lux, “value”))) < 100 then

Das hat so nicht funktioniert. Das Licht ging immer wieder von alleine an. Ich denke weil die eigentliche Bedingung ( Bewegung ) dann nicht mehr greift. Richtig?

Grüße

Arbeite mal mit Klamnetn und gruppiere, was für Dich zusammengehört.
So wird er alle Bedingungen ignorieren und nur zum “or” gehen.

ok probiere ich mal aus… werde berichten

Hallo,

ich habe hier fleißig mitgelesen und habe versucht das genannte Skript mit zwei Motion Sensoren und der LUX Erkennung einzusetzen. Leider erhalte ich immer folgenden Fehler “[DEBUG] 15:27:41: line 18: unexpected symbol near char(226)”. Ich finde den Fehler leider nicht… Kann vielleicht jemand helfen? :slight_smile: Danke!

--[[ 
%% properties
82 value
108 value
%% globals 
--]]
-- VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene = 35 -- ID dieser Szene
local motion1 = 82 -- ID des 1. Bewegungssensors
local motion2 = 108 -- ID des 2. Bewegungssensors
local switch = 105 -- ID des Relay Switches
local licht = 84 -- ID Lichtsensor
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:abort(); 
end
-- SCHALTE LICHT EIN & AUS
if (tonumber(fibaro:getValue(motion1, "value")) > 0 ) or (tonumber(fibaro:getValue(motion2, "value")) > 0 ) and (tonumber(fibaro:getValue(switch, "value")) < 1 ) and (tonumber(fibaro:getValue(licht, „value“)) < 15 ) 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 = 60;
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(motion1, "value"))) > 0 or (tonumber(fibaro:getValue(motion2, "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

Hi,

Die Anführungszeichen bei

getValue(licht, „value“))

sind abweichend. Vergleiche diese mal mit den anderen davor.

Viele Grüße Hoggle

Hi, wurde oben schonmal gefragt, wie sieht das Script denn aus wenn ich statt einem, zwei Geräte schalten möchte? Daniel schrieb “im Script duplizieren”, leider übersteigt das meine bisherigen LUA Fähigkeiten.

Hi, ich nochmal, irgendwie habe ich die restlichen 6 Seiten übersehen gehabt, habe inzwischen gefunden wie es geht. Danke ^^

Hi,

ich habe ein merkwürdiges Problem, ich habe das Script von Daniel in der korrigierten Version aus chriss´ post vom 13.11. kopiert und für meinen Eingangsbereich eine weitere Lampe eingefügt, sowie die IDs angepasst. Dort funktioniert auch alles einwandfrei.

Wollte das gleiche dann im Flur im 1.Stock benutzen, dort ist allerdings nur 1 Lampe, entsprechend habe ich die 2. Lampe wieder herausgenommen und die IDs angepasst. Hier habe ich jetzt allerdings das Problem, das wenn ich das Licht von Hand anschalte und dann den Bewegungssensor auslöse, das Licht wieder ausgeht.
Dachte ok, haste irgendeinen Fehler gemacht beim anpassen, also habe ich nochmal das Skript aus diesem Post (s.o.) für eine Lampe kopiert und angepasst. Aber immer noch das Gleiche Problem. Könnt ihr mal schauen ob ihr einen Fehler findet, oder ob ihr eine Idee habt was das Problem sein könnte?

Ich habe bei den Notifications auch eine Nachricht “To many instances” in Bezug auf diese Szene, bin mir aber nicht sicher, das stammt von vor 2 Tagen, evtl. war ich da am herumtesten und es bezieht sich gar nicht auf die aktuelle Version des Scripts.

Hier nochmal das Script wie ich es bei mir jetzt in der Szene drin habe:

--[[
%% properties
130 value
%% globals
--]]
 
-- VARIABLEN Konfiguration (Bewegungsmelder muss oben unter %% properties aufgeführt sein) löst die szene aus
-----------------------------------------------------------------------------------------------------------------------------------------
local scene = 26 -- ID dieser Szene
local motion = 130 -- ID des Bewegungssensors
local licht = 132 -- ID Lichtsensor
local switch = 29 -- ID der Lampe
 
local nachtstart = 1700 --22:00 = 2200
local nachtende = 0830 -- 07:00 = 0700
local starttimer = 30 -- licht an zeit (+ zeit des bewegungssensors - par. 6)
local lichtwert = -1 -- grenze zum nachtmodus (nur ausführen, wenn licht größer als)
-----------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------
---------------------Script-----------------
fibaro:debug("start1")
if (fibaro:countScenes()>1) then
	fibaro:debug("stop scene");
	fibaro:abort();
end
 
-- SCHALTE LICHT EIN & AUS (wenn nicht nacht)
if (tonumber(fibaro:getValue(motion, "value")) > 0 ) and tonumber(fibaro:getValue(licht, "value")) > lichtwert and (tonumber(os.date("%H%M")) >= nachtstart or tonumber(os.date("%H%M")) <= nachtende) then -- hier fehlt noch "und schalter aus"
 	fibaro:debug("ausgelöst");
	--led auf wert einstellen
	fibaro:call(switch, "turnOn");
	-- timer start und einstellen
	timer = os.time();
	while os.time() - timer < starttimer do
		fibaro:sleep(1000);
		-- Timer zurücksetzen, wenn neue Bewegung erkannt wird innherhalb der Verzögerungszeit
		if (tonumber(fibaro:getValue(motion, "value"))) > 0 then
			timer = os.time();
		end
end
	-- Schalte Licht aus, wenn Timer vollständig abgelaufen ist
	fibaro:call(switch, "turnOff");
end
fibaro:debug("ende1");
fibaro:killScenes(scene);

Gruß, Jens