Pünktlich zum Sonntag gibt es ein neues Skript unserer kleinen LUA-Skript Serie. Diesmal haben wir ein kleines Skript programmiert, welches mit einem oder mehreren MotionSensoren die Bewegung im Raum erkennt.
Mit diesem Skript könnt Ihr bei Erkennung von Bewegung unterschiedliche Aktionen durchführen. So ist es zum Beispiel möglich, eine Anwesenheitsvariable für jeden Raum zu setzen oder das Skript als vereinfachte Lichtsteuerung (an/aus; eine umfangreiche Lichtsteuerung haben wir euch bereits in einem anderen Artikel vorgestellt) zu nutzen. An dem Skript müsst Ihr noch zwei, drei Änderungen vornehmen, so dass das Skript auch bei euch läuft.
Vorzunehmende Änderungen im Skript
1 2 3 4 5 6 7 8 9 10 11 12 |
--[[ %% properties 43 value 76 value %% globals --]] local sensors = {43,76} local delay = 0 local debug = false |
Das Skript richtet sich grundsätzlich nach dem Parameter 6 der MotionSensoren. Dort kann die Zeit eingestellt werden, nach welcher der MotionSensor dem HomeCenter den Status "Keine Bewegung mehr erkannt" zurück meldet. Sollte in der Zwischenzeit wieder Bewegung erkannt werden, dann wird die Zeit wieder zurückgesetzt. In meiner Küche habe ich zwei MotionSensoren mit je 120 Sekunden Verzögerung im Einsatz und hab damit gute Erfahrungen gemacht.
Es gibt in dem Skript auch die Möglichkeit die Zeit des Parameters 6 zu verlängern. Dazu könnt Ihr euch mit der Variablen "delay" eine zusätzliche Zeit setzen, nach der das Skript die Aktionen ausführen soll. Hier könnt Ihr einfach zum Beispiel 180 Sekunden eintragen, wenn nach der Meldung von "Keine Bewegung mehr erkannt" noch drei Minuten gewartet werden soll.
Eure Aktionen, die ausgeführt werden sollen
Kommen wir zu den Aktionen, welche Ihr ausführen könnt, wenn der MotionSensor einen bestimmten Status meldet. Hier könnt Ihr in der Funktion actionsMotion() die Aktionen eintragen, welche bei euch ausgeführt werden sollen, wenn eine Bewegung erkannt wird. Als Beispiel könntet Ihr hier Licht einschalten, Radio anschalten oder einfach eine globale Variable auf "true" setzen. So könntet Ihr erkennen, in welchen Räumen grad Bewegung ist.
Die Funktion actionsNoMotion() führt Befehle aus, wenn eure MotionSensoren den Status "sicher" an das Fibaro HomeCenter 2 zurückmelden. Hier könnte man dann das Licht wieder ausschalten und so weiter.
1 2 3 4 5 6 7 |
function actionsMotion() fibaro:debug('Führe Aktionen bei Bewegungserkennung aus') end function actionsNoMotion() fibaro:debug('Führe Aktionen nach Ende Bewegung aus') end |
Und hier das ganze Skript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
--[[ %% properties 43 value 76 value %% globals --]] local sensors = {43,76} local delay = 0 local debug = false function actionsMotion() fibaro:debug('Führe Aktionen bei Bewegungserkennung aus') end function actionsNoMotion() fibaro:debug('Führe Aktionen nach Ende Bewegung 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 fibaro:debug("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 fibaro:debug('Bewegung im Raum erkannt - Starte Timer') actionsMotion() while (checkMotion()) do fibaro:sleep(5000); end if (debug) then fibaro:debug("Keine Bewegung mehr erkannt."); end actionsNoMotion() end |
Die Anzahl der Instanzen solltet Ihr bei der Szene auf 2 oder 3 erhöhen, sofern Ihr mehrere Motions nutzen möchtet. Dies hängt mit der Anzahl der triggernden Geräten zusammen. Es könnte ja sein, dass ein MotionSensor ausgelöst und bereits die Szene gestartet hat, während ein Anderer noch nicht ausgelöst wurde. Sollte dieser irgendwann auch ausgelöst werden, dann würde die Szene ein zweites Mal gestartet werden. In dem Skript wird zwar mit dem Code
1 |
if (instances > 1) then fibaro:abort(); end |
ein mehrfaches Ausführen der Szene verhindert, aber Ihr würdet "Too many instances"-Meldungen im Fibaro HomeCenter angezeigt bekommen.
Und zum Ende gibt es wieder ein Icon für die Szene. Ihr könnt ja mal einen Kommentar hinterlassen, was Ihr für Aktionen mit der Szene schaltet :) Viel Spass beim Umsetzen.