Rolladen bei Bewegung runter

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ß