Moin zusammen,
wie kann ich folgendes am besten mit LUA abbilden?
Ich möchte, wenn PresentState “Away” Alarmanlage aktiviert, dass bei Bewegung auf der Terrasse die Rolladen runterfahren.
Gruß Sascha
Moin zusammen,
wie kann ich folgendes am besten mit LUA abbilden?
Ich möchte, wenn PresentState “Away” Alarmanlage aktiviert, dass bei Bewegung auf der Terrasse die Rolladen runterfahren.
Gruß Sascha
Hi,
du kannst folgende Szene nehmen und dort eine zusätzliche Prüfung der variablen in den entsprechenden Funktionen einbauen.
Würde ungefähr so aussehen:
function actionsMotion()
fibaro:debug('Führe Aktionen bei Bewegungserkennung aus')
if (fibaro:getGlobal('PresentState') == 'Away') then
fibaro:debug('ACHTUNG! Status Away')
else
fibaro:debug('Status != Away')
end
end
https://www.siio.de/connected-home/kleine-lua-scripte-teil-5-bewegung-im-raum-erkennen/
Gruß
Hallo Sascha,
versuch mal folgendes:
--[[
%% properties
yy value
%% globals
--]]
--- ### Schleifen Schutz ### ---
if (fibaro:countScenes()>1) then
fibaro:abort();
fibaro:debug("Doppelte Szene abgebrochen");
end
--# Funktionen #--
---- ### Debug Funktion ### ----
function debug(message)
if (vardebug) then fibaro:debug(message); end
end
--- ### Debugger-Status ### ---
vardebug = true
---------------------- ### Code ### ----------------------
local rolladen = xx
local motion = yy
--- ### Motion ausgelöst ### ---
if tonumber(fibaro:getValue(motion, "value")) ~= 0 then
debug("Motion ausgelöst wurde ausgelöst");
--- ### Status Abwesend ### ---
if (fibaro:getGlobalValue("PresentState") == "Away") then
debug("PresentState = Abwesend");
--- ### Rolladen ist offen ### ---
if tonumber(fibaro:getValue(rolladen, "value")) == 0 then
fibaro:call(rolladen, "close")
debug("Rolladen wurde geschlossen");
--- ### Rolladen ist zu ### ---
else
debug("Rolladen sind bereits geschlossen");
end
--- ### Status Anwesend ### ---
else
debug("PresentState = Anwesend");
end
--- ### Motion sicher ### ---
else
debug("Motion ist sicher");
end
HE,
habe jetzt das Scipt von nevv genommen, ich erhalte folgenden Debug.
Die Rolladen fahren trotzdem nicht runter, weil Sie angeblich schon geschlossen sind??
[DEBUG] 18:40:44: Motion ist sicher
[DEBUG] 18:41:46: Motion ausgelöst wurde ausgelöst
[DEBUG] 18:41:46: PresentState = Abwesend
[DEBUG] 18:41:46: Rolladen sind bereits geschlossen
[DEBUG] 18:42:09: Motion ist sicher
Versuch es noch einmal damit
--[[
%% properties
yy value
%% globals
--]]
--- ### Schleifen Schutz ### ---
if (fibaro:countScenes()>1) then
fibaro:abort();
fibaro:debug("Doppelte Szene abgebrochen");
end
--# Funktionen #--
---- ### Debug Funktion ### ----
function debug(message)
if (vardebug) then fibaro:debug(message); end
end
--- ### Debugger-Status ### ---
vardebug = true
---------------------- ### Code ### ----------------------
local rolladen = xx
local motion = yy
--- ### Motion ausgelöst ### ---
if tonumber(fibaro:getValue(motion, "value")) ~= 0 then
debug("Motion ausgelöst wurde ausgelöst");
--- ### Status Abwesend ### ---
if (fibaro:getGlobalValue("PresentState") == "Away") then
debug("PresentState = Abwesend");
--- ### Rolladen ist offen ### ---
if tonumber(fibaro:getValue(rolladen, "value")) ~= 0 then
fibaro:call(rolladen, "close")
debug("Rolladen wurde geschlossen");
--- ### Rolladen ist zu ### ---
else
debug("Rolladen sind bereits geschlossen");
end
--- ### Status Anwesend ### ---
else
debug("PresentState = Anwesend");
end
--- ### Motion sicher ### ---
else
debug("Motion ist sicher");
end
Hallo nevv
habe den Code eingefügt, erhalte genau die gleiche Meldung. Rolladen sind schon unten???
Hallo Sascha,
bist du sicher, dass du den code richtig kopiert und die korrekten ID’s angepasst hast!?
Bei mir klappt es einwandfrei.
Hallo,
ja habe die ID´s eingetragen. Jetzt erhalte ich im Debug komischerweise, nachdem ich nochmal schauen wollte.
" Rolladen wurden geschlossen ", das wäre ja schon mal richtig, jedoch fährt keine runter ???
Gruß Sascha
OK, hab mal einen Neustart gemacht, weil das Webinterface total langsam war, jetzt geht es mit einer Rollade.
Wie kann ich denn jetzt die 4 Rolladen ansprechen.
so
local rolladen = 26,28,30,32
oder so?
local rolladen = {26,28,30,32}
Hi,
die zweite Variante ist richtig, das wäre dann ein Array.
zum Ababeiten sähe das so aus:
for i = 1,#rolladen do
fibaro:call(rolladen[i],"close")
fibaro:debug("Aktuelle Dev ID: "..rolladen[i])
end
VG Hoggle
Hallo Hoggle,
wo muss ich das denn einfügen? Sorry, ich versteh zwar ein wenig wie das LUA abläuft, aber wie und wo in welchen Abständen usw. was hin gehört weiß ich leider nicht.
Wenn ich den Code wie oben einfüge und bei local rolladen = {26,28,30,32} einfüge, dann geht nur die ID26 runter??
…oder es gibt eher eine Fehlermeldung.
Die vier Zeilen fügst du statt “fibaro:call(rolladen, “close”)” ein.
OK, jetzt habe ich das eingefügt.
Es fährt diesmal die ID 30 runter?? Sorry für Euch ist das bestimmt total easy aber ich verzweifel langsam.
[DEBUG] 14:23:15: Motion ist sicher
[DEBUG] 14:23:19: Motion ausgelöst wurde ausgelöst
[DEBUG] 14:23:19: PresentState = Abwesend
[DEBUG] 14:23:19: line 111: attempt to concatenate local ‘deviceId’ (a table value)
[DEBUG] 14:23:26: Motion ist sicher
--[[
%% properties
120 value
%% globals
--]]
--- ### Schleifen Schutz ### ---
if (fibaro:countScenes()>1) then
fibaro:abort();
fibaro:debug("Doppelte Szene abgebrochen");
end
--# Funktionen #--
---- ### Debug Funktion ### ----
function debug(message)
if (vardebug) then fibaro:debug(message); end
end
--- ### Debugger-Status ### ---
vardebug = true
---------------------- ### Code ### ----------------------
local rolladen = {26,28,30,32}
local motion = 120
--- ### Motion ausgelöst ### ---
if tonumber(fibaro:getValue(motion, "value")) ~= 0 then
debug("Motion ausgelöst wurde ausgelöst");
--- ### Status Abwesend ### ---
if (fibaro:getGlobalValue("PresentState") == "Away") then
debug("PresentState = Abwesend");
--- ### Rolladen ist offen ### ---
if tonumber(fibaro:getValue(rolladen, "value")) ~= 0 then
for i = 1,#rolladen do
fibaro:call(rolladen[i],"close")
fibaro:debug("Aktuelle Dev ID: "..rolladen[i])
debug("Rolladen wurde geschlossen");
end
--- ### Rolladen ist zu ### ---
else
debug("Rolladen sind bereits geschlossen");
end
--- ### Status Anwesend ### ---
else
debug("PresentState = Anwesend");
end
--- ### Motion sicher ### ---
else
debug("Motion ist sicher");
end
Hi,
das das oben das ganze Script?
Weil “[DEBUG] 14:23:19: line 111: attempt to concatenate local ‚deviceId‘ (a table value)” -
eine Zeile 111 ist nicht dabei.
Ja eigentlich gibt es die Zeile nicht?
Ist denn der Rest ok?
grundsätzlich ja.
Aber der Debug passt nicht zu dem Script und auch die nicht erwähnte Variable deviceId.
Versteh das auch nicht, hab keine Zeile 111???
Ok habe mich jetzt mal an Daniels Anleitung gehalten, damit geht es sofort mit dem Scipt Bewegung im Raum erkennen.
Nur dort triggert die Szene dann immer weiter, obwohl die Rolladen schon runter sind. Wie könnte man das lösen?
--[[
%% properties
120 value
%% globals
--]]
local sensors = {120}
local delay = 0
local debug = false
function actionsMotion()
fibaro:debug('Führe Aktionen bei Bewegungserkennung aus')
if (fibaro:getGlobal('PresentState') == 'Away') then
fibaro:debug('ACHTUNG! Status Away')
fibaro:call(26, "close");
fibaro:call(32, "close");
fibaro:call(28, "close");
fibaro:call(30, "close");
else
fibaro:debug('Status != Away')
end
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
–Test Rolladen runter mit https://www.siio.de/connected-home/kleine-lua-scripte-teil-5-bewegung-im-raum-erkennen/
Hallo Sascha,
der Code aus deinem Post https://www.siio.de/board/thema/rolladen-bei-bewegung-runter/#post-55791 klappt nicht, weil du in Zeile 37 versuchst den value aus dem Array zu ziehen. Daher die Fehlermeldung…
Damit das klappt müsstest vorher mit einer Funktion abfragen ob die Rollos noch offen oder bereits geschlossen sind und dann eine variable setzen.
Als Code würde das ganze so aussehen:
function checkRollo (array)
fibaro:debug("Status der Rollos...");
local countID = 4
for j=1, countID do
JalouItems = rolladen[j]
status = fibaro:getValue(JalouItems, "value")
if status == "0" then
local sensorname = fibaro:getName(rolladen[j])
fibaro:debug("Jalousie: " ..sensorname .. " geschlossen.");
RolloOpen = false; break
elseif status ~= "0" then
local sensorname = fibaro:getName(rolladen[j])
fibaro:debug("Jalousie: " ..sensorname .. " geöffnet.");
RolloOpen = true;
end
end
end
Hier der ganze (ungetestete) Code:
--[[
%% properties
120 value
%% globals
--]]
local rolladen = {26,28,30,32}
local motion = 120
---- ### Debug Funktion ### ----
function debug(message)
if (vardebug) then fibaro:debug(message); end
end
--- ### Debugger-Status ### ---
vardebug = true
function checkRollo (array)
fibaro:debug("Status der Rollos...");
local countID = 4
for j=1, countID do
JalouItems = rolladen[j]
status = fibaro:getValue(JalouItems, "value")
if status == "0" then
local sensorname = fibaro:getName(rolladen[j])
fibaro:debug("Jalousie: " ..sensorname .. " geschlossen.");
RolloOpen = false; break
elseif status ~= "0" then
local sensorname = fibaro:getName(rolladen[j])
fibaro:debug("Jalousie: " ..sensorname .. " geöffnet.");
RolloOpen = true;
end
end
end
---------------------- ### Code ### ----------------------
--- ### Motion ausgelöst ### ---
if tonumber(fibaro:getValue(motion, "value")) ~= 0 then
debug("Motion ausgelöst wurde ausgelöst");
--- ### Status Abwesend ### ---
if (fibaro:getGlobalValue("PresentState") == "Away") then
debug("PresentState = Abwesend");
checkRollo()
--- ### Rolladen ist offen ### ---
if RolloOpen then
for i, v in ipairs(rolladen) do
fibaro:call(rolladen[i], "close")
debug("Rolladen wurde geschlossen");
end
--- ### Rolladen ist zu ### ---
else
debug("Mindestens ein Rolladen ist geschlossen");
end
--- ### Status Anwesend ### ---
else
debug("PresentState = Anwesend");
end
--- ### Motion sicher ### ---
else
debug("Motion ist sicher");
end
Hallo Nevv,
vielen Dank für Deine Antwort. Läuft jetzt wunderbar. Schade das das Scipt von der ersten Seite nicht läuft.
Gruß