Probleme mit Bewegungsskript für Bad

Hallo Leute,
Ich habe mir aus Beispielen hier im Forum ein Skript erstellt, das mir im WC über einen Bewegungsmelder (ID:222) das Licht eischaltet.
Solange sich was bewegt, soll ein Timer immer wieder auf 15min erneuern und wenn 15 Min lang keine Bewegung ist soll das Licht (ID:43) abschalten.

Ich habe in der Config des Motion Sensors einige Einstellungen geändert, weil der Sensor ursprünglich so langsam ausgelöst hat, dass man den Lichtschalter INNEN drücken konnte, bevor er hell wurde.
Folgende Parameter hab ich geändert:
Parameter1 = 8
Parameter2 = 8
Parameter3 = 0-1 Pulse
Parameter4 = 2-12 Seconds
Parameter6 = 10s
Sonst ist alles DEFAULT!

Das Skript funktioniert zwar gut, aber manchmal schaltet sich das Skript unmotiviert ein obwohl niemand im Raum ist.
Oft sogar bei geschlosener Tür!! Der Raum hat auch keine Fenster!
Ich kann aber nicht sagen wieso!?
Ich hab das Skript in ZWEI Räumen laufen und in BEIDEN Räumen habe ich das Symptom!

Habt ihr einen Tipp, wie ich das Problem finden kann?

Bei der Gelegenheit gleich eine Frage:
local scene = 2 – ID dieser Szene
Habe ich in JEDEM Skript eine EIGENE Szenen ID gegeben.
Ist das richtig?
Muss ich die Szene überhaupt killen?
fibaro:killScenes(scene);
Oder ist das eh sinnlos?

Anbei der komplette Code:

--[[ 
%% properties 
220 value
%% globals 
--]]
-- automatisches Licht WC 1.0
-- VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene = 2 -- ID dieser Szene
local motion = 220 -- ID des Bewegungssensors
local switch = 43 -- 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 = 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("Bewegung erkannt bzw. MS sendet nicht - Resete Time");
 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

Hab den heutigen Vormittag mit Fehlersuche verbracht, leider noch keine Lösung gefunden ;-(
Irgendwie schafft es mein Bewegungsmelder in einem geschlossenen Raum Bewegung zu erkennen obwohl KEINER drin ist.

1.)
Ich habe mit den Komponenten in den beiden WCs und BAD sehr viel rumexperimentiert. Die Geräte untereinander getauscht u.s.w.
Kann es sein dass das Mesh Netzwerk noch allte IDs gespeichert hat und diese noch ausgelöst werden??

2.) Kann mir irgendwer einen Tipp geben ob das mit den Scenen Nummer so stimmt, oder ob ich mir da vielleicht einen unnötigen Fehler eingebait habe?

Hi,

1.) Nein, das kann nicht sein. Module müssen vor dem erneuten Anlernen immer aus dem Netzwerk gelöscht werden, von daher können keine nicht mehr vorhandenen Module etwas auslösen.

2.) SzenenIDs brauchst du in dem Skript nicht vergeben. Diese werden selbstständig beim Anlegen der Skripte vergeben.

Gruß

Danke Boomx für die Tipps.Das verwendete Skript war für was Anderes gedacht und ich habe es massiv umgebaut, vielleicht ist das der Grund!
Ich habe nun beschlossen das alte Skript zu verwerfen und habe mir im Fibaro Forum Teile zusammengesucht die ich verwenden kann.

Hab jetzt mal eine Testlampe mit einem Fibaro Fenstersensor zum Testen genommen und folgendes Skript zusammengestellt:

--[[ 
%% properties 
228 value
%% globals 
--]]
local sensor = 228			-- ID des Bewegungssensors
local switch = 38			-- ID des Relay Switches
local endTimer = 35			-- Zeit bis zur Abschaltung des Lichtes

-- Debug in Farben
Debug = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span")); 
end

-- Lösche doppelte Szene(n)
if (fibaro:countScenes() > 1) then
  Debug( "red", "Abort, count scene = "..fibaro:countScenes());
  fibaro:abort();
end

-- schalte Licht ein
if (tonumber(fibaro:getValue(sensor, "value")) > 0 ) and (tonumber(fibaro:getValue(switch, "value"))) < 1 then 
 fibaro:call(switch, "turnOn");
 Debug( "grey", "Schalte Licht ein");
end

-- Timer
Debug( "green", "Timer für "..endTimer.." Sekunden gestartet"); 
if (tonumber(fibaro:getValue(switch, "value"))) > 0 then
	local counter = endTimer
	while(counter > 0)
		do
			counter = counter - 1
			Debug( "blue", "Restzeit: "..counter.."Sekunden"); 
			fibaro:sleep(1000)
		if
			tonumber(fibaro:getValue(sensor, "value")) > 0 then 
			counter = endTimer;
        end
    end
    Debug( "green", "Timer abgelaufen");
	fibaro:call(switch, "turnOff");
	Debug( "grey", "Schalte Licht aus");
end

Mein Skript lässt sich jetzt nicht nur debuggen, sondern funktiert auch schon ganz brauchbar mit dem Türsensor.

Was ich noch nicht geschafft habe ist, dass der Timer von vorne beginnt, wenn ich den Kontakt erneut betätige.
Derzeit wird das Skript dadurch nochmal aufgefufen und erzeugt eine weitere Szene, die dann abgefangen wird.

Falls jemand einen Tipp hat würde ich mich freuen!!

So ich hab mal ein funktionierendes Skript fertig und dieses auch schon mit einem Motion Sensor getestet. Sieht schon sehr gut aus!
Beim Testen sind einige Verständnisfragen aufgetaucht:

1.) Parameter 6 im Motionsensor sagt:
Motion detection - alarm cancellation delay
Time period after which the motion alarm will be cancelled in the main controller and associated devices.
Any motion detected during this period resets the timer.

Doch dieser Parameter resettet nicht den Timer, sondern verzögert die Antwortzeit des Sensors um den eingestellten Wert!
Hat es irgendeinen Grund, diese Verzögerung auf 30s zu stellen?
Hält der Akku länger oder so??
Nach meinem Verständnis verkompliziert diese Zeitspanne nur das Testen, weil man 30s länger warten muss :wink:

2.) Kann man beim Debuggen einen Unterschied machen zwischen der Verzögerung des Sensors und der Zeit des Timers?
Ich würde gerne eine seperate Meldung bekommen wenn der Sensor nicht sendet und wenn der Timer läuft.
Derzeit wird die Debugmeldung so dargestellt als würde der Timer solange mit der selben Zeit laufen, bis der Sensor wieder sendet (siehe Skript unten)

3.) Ob mein Skript länger zuverlässig läuft werde ich ab morgen testen.
Sorry dass ich so detailiert frage, aber ich würde gerne verstehen was da genau passiert um die Skripte nicht nur zu verwenden sondern auch was dabei zu lernen.
Falls ihr also Ideen oder Verbesserungsvorschläge habt, bitte meldet euch :wink:

Hier nun das Skript falls es jemand testen möchte:

--[[ 
%% properties 
232 value
%% globals 
--]]
local sensor = 232			-- ID des Bewegungssensors (auch oben bei "value" ändern!!
local switch = 38			-- ID des Relay Switches
local endTimer = 5			-- Zeit bis zur Abschaltung des Lichtes

-- Debug in Farben
Debug = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span")); 
end

-- Lösche doppelte Szene(n)
if (fibaro:countScenes() > 1) then
  Debug( "red", "Abort, count scene = "..fibaro:countScenes());
  fibaro:abort();
end

-- schalte Licht ein
if (tonumber(fibaro:getValue(sensor, "value")) > 0 ) and (tonumber(fibaro:getValue(switch, "value"))) < 1 then 
 fibaro:call(switch, "turnOn");
 Debug( "yellow", "Schalte Licht ein");
end

-- Timer
Debug( "green", "Timer für "..endTimer.." Sekunden gestartet"); 
if (tonumber(fibaro:getValue(switch, "value"))) > 0 then
	local counter = endTimer
	while(counter > 0)
		do
			counter = counter - 1
			Debug( "grey", "Restzeit: "..counter.." Sekunden"); 
			fibaro:sleep(1000)
		if
			tonumber(fibaro:getValue(sensor, "value")) > 0 then counter = endTimer;
        end
    end
    Debug( "green", "Timer abgelaufen");
	fibaro:call(switch, "turnOff");
	Debug( "orange", "Schalte Licht aus");
end

Das hast du falsch verstanden. Der Parameter 6 des MotionSensors ist dafür verantwortlich, wann der Bewegungsmelder wieder sicher meldet. Jede Bewegung in der Zeit resetet die eingestellte Zeit. So kann die Hardware etwas abbilden, was dann softwareseitig nicht mehr umgesetzt werden muss. Ist schon optimal umgesetzt :slight_smile: Sobald du eine weitere Delay-Time im Skript einstellst, dann kommt diese natürlich auf die andere Zeit drauf. Schau dir doch mal folgendes Skript an:

https://www.siio.de/connected-home/kleine-lua-scripte-teil-5-bewegung-im-raum-erkennen/

Und ja, wenn diese Zeit zu gering eingestellt ist, dann kann die Batterie extrem schnell verbraucht sein, da der MS immer wieder neue Signale durch Netzwerk sendet und zum anderen kann dadurch das Z-Wavenetzwerk schnell gefloodet werden.

Gruß

Danke Boomx für das Beispiel!!
Habe es gleich mal zum Testen genommen und es funktioniert ganz gut.
Jetzt brauch ich nur noch eine Lösung wenn jemand händisch im Klo das Licht abschaltet. Dann wird das Skript in meinem Test nicht mehr, oder eine gewisse Zeit nicht mehr aktiviert…

Hi,

kein Problem :slight_smile:

In deinem speziellen Fall wird das Licht ausgeschaltet, aber es ist noch Bewegung im Raum. Solange der MS keinen neuen Status an das HC übermittelt, funktioniert das Skript natürlich nicht mehr. Eine spontane Lösung fällt mir hierzu nicht ein.

Gruß

Schade, dann werd ich doch mit meinem Skript weitermachen, dort hat das Ansatzweise schon funktioniert.
Vielleicht finde ich im Fibaro Forum ja eine Hilfe dazu, danke jedenfalls …

Hi,
Ich habe inzwischen sowohl mein selbst erstelltes Skript, als auch das Beispiel von Boomx für mich umgeändert und getestet.
Beide Skripte funktionieren grundsätzlich.
In Einem der WC’s schaltet sich immer noch regelmäßig (ca. alle 1-3 Stunden) das Licht ein, selbst wenn niemand zu Hause ist!!

Frage:
Gibt es irgendwas in einem Raum, außer ein Lebewesen, das einen Bewegungsmelder auslösen kann?
Oder ist einfach der Sensor defekt?

2016-10-18-07_35_25-Home-Center-2.jpg

Hi,

lern Sensor mal neu an und geh dann die Parameter durch. Hatte ich auch mal und das neu anlernen hat geholfen.

Gruß

Hab den Sensor jetzt mal neu angelernt und so wenig wie möglich an den Parametern gedreht.
Mal sehen obs klappt…