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.
wenn du mir jetzt noch sagst wo ich die Zeile für die Abhängigkeit meines Lux Wertes einfügen huldige ich dir ;p
Ach ja und benutzen würde ich das Ganze im Gang mit zwei Motionsensoren die nur <8 Lux einen Wallplug schalten
und sorry für den Spam :)
Wollt nur mal den gigantischen Support von euch loben den ihr hier tagtäglich hinlegt.
Fettes Merci.
Gruss
Hi,
kannst du in den Actions mit einfügen. if (fibaro:getValue() < 8) then Gruß
Möchte bei Bewegung Licht einschalten – erhalte jedoch
„[DEBUG] 17:25:19: line 12: ‚)‘ expected near „‚:“
Ausschnitt aus dem Script:
–[[
%% properties
61 value
42 value
%% globals
–]]
local sensors = {61,42}
local delay = 0
local debug = false
function actionsMotion(fibaro:call(50,“turnOn“))
fibaro:debug(‚Führe Aktionen bei Bewegungserkennung aus‘)
end
Hi,
du nutzt die Funktion falsch. :)
Es muss so aussehen:
function actionsMotion()
fibaro:call(50,”turnOn”)
fibaro:debug(‘Führe Aktionen bei Bewegungserkennung aus’)
end
Gruß :)
Suppi. Sorry, bin mit LUA so gar nicht vertraut. ;)
Und wenn ich zwei Module schalten möchte? Genügt es, wenn ich beispielsweise fibaro:call(50,44,”turnOn”) schreibe oder muss das so aussehen:
function actionsMotion()
fibaro:call(50,”turnOn”)
fibaro:call(44,”turnOn”)
Hi,
kein Problem :)
Genau. Bei mir sieht es zum Beispiel so aus:
function actionsMotion()
fibaro:debug('Führe Aktionen bei Bewegungserkennung aus')
fibaro:call(56, "setColor", "0","0","255","255")
fibaro:call(124, "setColor", "0","0","255","0")
fibaro:call(114, "setColor", "0","0","100","0")
fibaro:call(183, "pressButton", "11")
end
Gruß
Also eure LUA Skripte Reihe finde ich mal echt genial. Bitte weiter so,ist zum lernen und probieren echt super. Konnte daher schon viel umsetzen.
Generell mal ein Danke für den Blog!!!
Funktioniert soweit. Vielen Dank. Leider bekomme ich Fehler, beim Versuch die Helligkeit mit ins Spiel zu bringen.
–[[
%% properties
60 value
51 value
52
%% globals
–]]
local sensors = {60,51}
local delay = 0
local debug = false
function actionsMotion()
if (fibaro:getValue(52) [DEBUG] 22:08:21: line 73: ‚end‘ expected (to close ‚function‘ at line 13) near
Hi,
was mir als erstes auffällt:
–[[
%% properties
60 value
51 value
52 — DAS MUSS RAUS
%% globals
–]]
und du scheinst ein End vergessen zu haben. Poste doch mal den Code der Funktion.
Gruß :)
Die ID des Sensors für die Helligkeit wird im HC als 53 angegeben. Muss ich die nicht irgendwo angeben?
Gruß
Maik
–> [DEBUG] 09:57:12: line 73: ‚end‘ expected (to close ‚function‘ at line 12) near
–[[
%% properties
60 value
51 value
%% globals
–]]
local sensors = {60,51}
local delay = 0
local debug = false
function actionsMotion()
if (fibaro:getValue() 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
Hi,
leider weiß ich nicht, was du hier machen willst: (fibaro:getValue() 0)
Bei den end end ist ein end zu viel.
Gruß
Stimmt. ^^
Ich möchte, das die Aktion (Licht an) erst ab einem bestimmten LUX-Wert erfolgt.
Das müsste dann so aussehen:
function actionsMotion()
if (fibaro:getValue(53, "value") <= 10) then return 1; else return 0; end end
Hi,
super Script, weil kurz und knackig und auch für nicht-LUA Experten gut nachvollziehbar.
Wenn ich zusätzlich die Variable TimeOfDay einbringen möchte, um z.B. nur Abends zu schalten:
Wo müsste die stehen?
Gruß und schöne Ostern
TT
Hi,
bei der Funktion actionsMotion() baust du dann noch eine if-Abfrage ein, ob die Variable auf „night“ steht.
function actionsMotion()
fibaro:debug('Führe Aktionen bei Bewegungserkennung aus')
if (fibaro:getGlobal('TimeOfDay') == 'night') then
fibaro:debug('Bewegung erkannt, es ist Nacht')
end
end
Gruß
Classe, das ist genau das Script, welches ich für meine Licht- und Sonossteuerung für mein Bad gesucht habe, ich kann sowohl die Helligkeit, als auch die Lautstärke verändern, aber es ändert sich nicht bei Bewegungserkennung, prima und vielen Dank.
Gruß Salve.
Hallo alle zusammen,
ich bin schon seit mehreren Tagen am herumprobieren aber irgendwie bekomme ich es nicht hin.
Für die meisten von Euch wird das kein Problem darstellen.
Ich möchte mit einem Motion Sensor bei Bewegung bzw. Alarm die Sirene eines Pop Rauchmelders (POPE004001) ansprechen.
Ich benutze ein HC2 mit der Softwareversion 4.153 Beta.
Vielen Dank schon mal im voraus.
Gruß