Licht am WC unterbrechen

Hi Leute,
Habe mir für meine HC2 etwas mehr Zeut genommen und würde gerne ein Skript perfektionieren.
Es läuft schon sehr gut aber es geht darum ein zusätzliches Event abzufangen.

Wenn man kurz hinter jemandem ins WC geht, der das Licht händisch abgeschaltet hat, dann funktioniert mein Skript nicht!

Bis jetzt ist es so, dass das Skript in so einem Fall weiterläuft und der Bewegungsmelder solange nicht reagiert bis es fertig abgelaufen ist.
Ich hätte gerne dass wenn jemand das Licht händisch abschaltet, dann soll die laufende Szene unterbrochen werden.
Eventuell mit einer kurzen Verzögerung von ca. 5-10 Sekunden!

Die Prüfung wäre meiner Meinung nach dass man das Script beendet sobald der “switch” mit ID 43 AUS ist.
Ich habe nur noch keine Ahnung WO man WELCHEN Befehl dazu einbaue könnte.

Vielleicht hat jemand einen Tipp??
Vielleicht gibt es ja auch sinnvolle Verbesserungsmöglichkeiten …
Hier das Skript:

--[[
%% properties
232 value
%% globals
--]]
local sensors = {232}		-- ID der Sensoren (auch mehrere möglich!) 
local switch = 43			-- ID des Relay Switches
local delay = 300			-- Zeit in Sekunden bis zur Abschaltung
local debug = true

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

function actionsMotion()
-- Aktion bei Beginn der Bewegung
 fibaro:call(switch, "turnOn")
 Debug("yellow",(os.date("%A %d %B %Y - Schalte Licht ein")))
end

function actionsNoMotion()
-- Aktion nach Ende der Bewegung
	fibaro:call(switch, "turnOff")
  	Debug("purple",(os.date("%A %d %B %Y - Schalte Licht aus")))
end

local instances = tonumber(fibaro:countScenes())

function getSensorStatus()
for i,n in ipairs(sensors) do
 if (tonumber(fibaro:getValue(n, "value")) > 0) then
  return 1
 end
end
 return 0
end

function getLastBreach()
local breach = 0
for i,n in ipairs(sensors) do
 local nBreach = tonumber(fibaro:getValue(n, "lastBreached"))
 if(nBreach > breach) then
  breach = nBreach;
 end
end
 return breach
end

function checkMotion()
lastBreached = getLastBreach()
time = os.time()
if (debug) then Debug( "grey", "Zuletzt ausgelöst: Vor "..(time-lastBreached).." Sekunden"); end
if (getSensorStatus() == 1) then
 return true
end

if ((time-lastBreached)>=delay) then
 return false
end
 return true
end

local lastBreached = getLastBreach()

if (fibaro:getSourceTriggerType() == 'property' and getSensorStatus() == 1) then
 if (instances > 1) then fibaro:abort(); end
  Debug("green",(os.date("%A %d %B %Y - Bewegung im Raum erkannt - Starte Timer - "..delay.." Sekunden")))
  actionsMotion()
 while (checkMotion()) do
  fibaro:sleep(5000)
 end
if (debug) then Debug( "green", "Keine Bewegung mehr erkannt."); end
 actionsNoMotion()
end

Hast du Fibaro komponenten?
das geht um einiges einfacher.
Fibaro Relais auf automatisch aus nach 300sec stellen.
Dann kannst manuell oder Szenen gesteuert einschalten und nach 300sec ists finster.
Dann eine kurze Szene welche nur Bewegung registriert und den Schalter nochmal einschaltet.
Jedes mal Szenen ausführen sollte der Timer neu gestartet werden.

Ja, ich habe fast nur Fibaro Komponenten.
Das mir dem Relais ist grundsätzlich eine gute Idee.
Allerdings gibt es dann Situationen wo das Licht kurz ausgeht, wenn ich das richtig verstanden hab, ODER?

Da ich aber will dass jede Bewegung den Zeitintervall zur Abschaltung zurücksetzt wäre mir die Steuerung per Skript lieber.
Grund ist, dass wir in diesen Räumen auch Seminarbetrieb haben und da will ich sicherstellen, dass es NICHT finster wird solange jemand drin ist :wink:
Deshalb hab ich auch dieses eher komplexe Skript für diese doch recht einfache Aufgabe ausgesucht.

Hallo,
in deiner While-Schleife müstest du abfragen, ob der Schalter noch AN ist und falls nicht die Schleife abbrechen bzw. deine Variable auf False setzen.

Grüße
Arno

Danke für deinen Tipp, ArnoNym.
Das ist mir schon klar, ich habe auch schon eine Codezeile, die meiner Meinung nach funktioniert:
if (tonumber(fibaro:getValue(switch, "value"))) < 1 then fibaro:abort()
Ich weiss nur noch nicht wo rein damit :wink:

Da ich dieses Skript hier aus dem Forum habe, sind da noch einige Dinge drin, die ich eigentlich gar nicht brauche.
z.B. die Schleife für mehrere Bewegungsmelder!

Ich glaube ich werde es bei der Gelegenheit gleich vereinfachen und dann schauen WO ich ansetzen muss wenn ich es zu 100% verstanden habe …

Habs inzwischen geschafft.
Der Code des oben geposteten Skripts hat sich ab Zeile 70 geändert.
Hier das neue Ergebnis:

while (checkMotion()) do
  fibaro:sleep(5000)
  -- Prüfen ob Licht nicht inzwischen AUS ist
  if (tonumber(fibaro:getValue(switch, "value"))) < 1 then 
	Debug( "green", "Licht inzwischen aus, beende Scene bei Delay: ".. delay.. "")
	local delay = 0
	Debug( "green", "Delay gelöscht, dleay ist nun: ".. delay.. "")
	fibaro:abort()
	end
 end
if (debug) then Debug( "green", "Keine Bewegung mehr erkannt."); end
 actionsNoMotion()
end