Mit einem Remotec Scene Master, der an der Haustür angebracht ist, starten wir die LUA-Szenen “Gehen” und “Kommen” und einiges mehr.
So weit so gut. Nun die Frage:
Wenn (als Beispiel) die Tasten des Geräts in der Reihenfolge Key1, Key2, Key3 gedrückt und werden, und jede setzt eine globale Variable G1, G2, G3,
a) springen dann auch die Szenen, die auf die Änderung dieser globalen Variablen reagieren in derselben Reihenfolge an (Reaktion_auf_G1, Reaktion_auf_G2, Reaktion_auf_G3)?
b) Starten die Szenen überhaupt nacheinander oder werden sie womöglich parallel abgearbeitet?
Ich frage, weil ich mich mit Race Conditions bei asynchronen Prozessen sehr gut auskenne (allerdings in großen Oracle-Datenbanken), nur über das HC2 und den LUA-Interpreter fand ich bisher keine Infos darüber. In bestimmten Konstellationen ist es in meinen Skripten entscheidend, ob ein Tastendruck bereits ausgewertet wurde oder eventuell hinterherhinkt. Das müsste ich ansonsten selbst sicherstellen, und genau darauf hätte ich überhaupt keine Lust…
Mit etwas mehr Sensor-Erfahrung möchte ich hier gerne posten, wie ich diese Herausforderung nun mit LUA löse.
Im Bad habe ich einen Fibaro Motion Sensor, der bei Bewegungserkennung das Licht einschalten soll (Fibaro Switch hinter dem Lichtschalter). Es gibt natürlich auch eine Ausschalt-Szene, aber die lass ich hier mal weg.
Das Problem: Hin und wieder, wenn man beim Verlassen des Badezimmers den Lichtschalter bedient (“aus”), meldet der Sensor dies noch als “Bewegung” und schaltet das Licht sofort wieder ein. War ja auch zu erwarten.
Zunächst dachte ich es würde reichen, eine 15-Sekunden-Sperre einzubauen (siehe Skript, Variable “seit_wann”), aber auch das hat nicht zu 100% funktioniert! Denn die Betätigung des Lichtschalters wird vom HC2 unter Umständen erst ein paar Millisekunden nach dem Bewegungssensor ausgewertet. Und schon greift die Logik nicht mehr.
Hier also die Lösung.
--[[
%% properties
104 value
--]]
local bewegungssensor = 104
local jalousie = 10
local lichtschalter = 297 -- Spiegel-LED
local helligkeit = 155 -- der D-Link an der Tür
local licht_ist_an, seit_wann = fibaro:get(lichtschalter, "value")
-- Abbruchbedingungen:
-- innerhalb von 15 Sekunden seit dem letzten Betätigen des Lichtschalters
-- soll das Licht nicht wieder automatisch eingeschaltet werden,
-- denn sonst bewirkt die Handbewegung beim Ausschalten
-- schon wieder ein neues Einschalten
if (licht_ist_an > '0' -- Das Licht ist entweder tatsächlich "an",
-- oder HC2 verarbeitet das Ausschalten etwas
-- später als dieses Sensor-Skript,
-- so dass es nur scheinbar "an" ist
-- => kommt aufs Selbe raus
or os.time() - seit_wann < 15 -- oder 15 Sekunden Sperre
)
then
fibaro:abort() -- nichts tun und raus
end
--[[--------------------------------------------------------
Wenn der Sensor Bewegung meldet und es dunkel ist,
dann Licht einschalten
--]]--------------------------------------------------------
if (tonumber(fibaro:getValue(bewegungssensor, "value")) > 0 -- ausgelöst
and
(fibaro:getGlobalValue("Tageszeit") ~= "tagsüber" -- es ist morgens, abends, nachts
or tonumber(fibaro:getValue(jalousie , "value")) < 50 -- abgedunkelt oder geschlossen
or tonumber(fibaro:getValue(helligkeit, "value")) < 20 -- draußen finster
))
then
fibaro:call(lichtschalter, "turnOn") -- es werde Licht
end