Kleine LUA Scripte Teil 5: Bewegung im Raum erkennen

Geschrieben von boomx

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

In den ersten Zeilen müssen eure triggernden MotionSensoren, also die Geräte, welche die Szene starten sollen, eingetragen werden. In meinem Fall wären dies die IDs 43 und 76. Diese müssen dann auch parallel in das Array "sensors" mit eingetragen werden. Weitere IDs können einfach, mit einem Komma getrennt, hinten dran gehängt werden.

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.

motion_para6

Parameter 6 beim Fibaro MotionSensor

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.

Und hier das ganze Skript:

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

ein mehrfaches Ausführen der Szene verhindert, aber Ihr würdet "Too many instances"-Meldungen im Fibaro HomeCenter angezeigt bekommen.

motion_szene

Einstellen der Instanzen

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.

motion_szene

Icon für die Szene

Diesen Blogpost hat geschrieben ...

boomx

19 Kommentare

      • 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,
    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ß

Gib deinen Senf dazu!

Cookie Consent mit Real Cookie Banner