Hilfe bei {Array}

Hallo zusammen
Wer kann mir helfen meine Lichtsteuerung zu optimieren? Die Szene funktioniert einwandfrei, möchte aber die ganze Programmierung optimieren und vereinfachen. Gerne möchte ich die Bewegungssensoren zusammenfassen in einen „Array“ was mir leider ohne Fehler nicht gelingt. Bin für eure Hilfe sehr dankbar…!
Freundliche Grüsse fastsnake

--[[
%% properties
101 value
134 value
165 value
%% globals
Sonnenstand
--]]

 local scene= 77 -- ID dieser Szene
 local motion1= 101 -- ID des Bewegungssensors
 local motion2= 134 -- ID des Bewegungssensors
 local motion3= 165 -- ID des Bewegungssensors
 local Licht= 128
 local tuere_freisitz = 87
 local starttimer = 1800;
 local timer = (starttimer);
 local currentDate = os.date("*t");
 local sourceTrigger = fibaro:getSourceTrigger();
 local SunSet= fibaro:getValue(1, "sunsetHour")
 local Sunrise= fibaro:getValue(1, "sunriseHour")
 

    Debug = function ( color, message ) fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")) end

 --Lösche doppelte Szene(n)
 if (fibaro:countScenes() >1) 
 
then
    fibaro:debug("Es läuft mehr als eine Instanz");
    fibaro:abort(); 
end

 -- Prüfe Tageszeit
if  fibaro:getGlobalValue("Sonnenstand") == "Sonnenaufgang"

then
if  (tonumber(fibaro:getValue(Licht, "value"))) > 0 
 
then
    fibaro:debug("------------------------------------------------------------------------------------------");      
    fibaro:debug("Prüfe Tageszeit");
    fibaro:debug(os.date("Es ist der (%d.%m.%Y) %H:%M Uhr"));   
    Debug("orange",("Die Sonne ist um " ..Sunrise.. " Uhr aufgegangen"));
    Debug("yellow",("Licht ist noch eingeschaltet...!"));
    Debug("gray",("Licht wurde ausgeschaltet...!"));
    Debug("orange",(os.date("Sonnenuntergang heute um " ..SunSet.. " Uhr")));
    fibaro:debug("Szene angehalten...!");
    fibaro:debug("------------------------------------------------------------------------------------------");      
    fibaro:call(Licht, "turnOff");
    fibaro:abort();
    fibaro:killScenes(77);
end
end

 -- Schalte bei Sonnenuntergang Licht ein / aus
if  fibaro:getGlobalValue("Sonnenstand") == "Sonnenuntergang"
and (tonumber(fibaro:getValue(motion1, "value"))) > 0 
and (tonumber(fibaro:getValue(Licht, "value"))) < 1
  
or  fibaro:getGlobalValue("Sonnenstand") == "Sonnenuntergang"
and (tonumber(fibaro:getValue(motion2, "value"))) > 0 
and (tonumber(fibaro:getValue(Licht, "value"))) < 1

or  fibaro:getGlobalValue("Sonnenstand") == "Sonnenuntergang"
and (tonumber(fibaro:getValue(motion3, "value"))) > 0 
and (tonumber(fibaro:getValue(Licht, "value"))) < 1

then
    fibaro:call(Licht, "turnOn");
    timer = (starttimer);
    fibaro:debug("------------------------------------------------------------------------------------------");         
    Debug("white",("Schalte Licht ein..."));
    Debug("yellow",(os.date("(%d.%m.%Y) Licht um %H:%M Uhr eingeschaltet!."))); 
    fibaro:debug("------------------------------------------------------------------------------------------");         
end

 -- Verzögerung in Minuten nach der letzten erkannten Bewegung, bevor das Licht ausgeschaltet wird
if  (tonumber(fibaro:getValue(Licht, "value"))) > 0
     
then 
    timer = (starttimer);
    fibaro:debug("------------------------------------------------------------------------------------------");         
    fibaro:debug("Starte Timer");
    Debug("red",(os.date("Ab %H:%M Uhr / " ..timer /60 .." Minuten bis zum ausschalten...!")))
    fibaro:debug("------------------------------------------------------------------------------------------");          
    
repeat 
    fibaro:sleep(1000);
    
 -- Schalte Licht aus, wenn Schalter manuell betätigt wird und warte 15 Minuten, um ein 
 -- versehentliches (erneutes) aktivieren der Szene zu verhindern
if  (tonumber(fibaro:getValue(Licht, "value"))) < 1 
      
then 
    fibaro:debug("------------------------------------------------------------------------------------------");       
    Debug("gray",(os.date("(%d.%m.%Y) Licht um %H:%M Uhr manuel ausgeschaltet...!")));       
    Debug("red",(os.date("Sensoren für 15 Minuten deaktiviert....!"))); 
    fibaro:debug("------------------------------------------------------------------------------------------");      
    fibaro:sleep(900000);
    fibaro:debug("------------------------------------------------------------------------------------------");       
    Debug("green",(os.date("%H:%M Uhr / Timer (Licht manuel aus) abgelaufen, Sensoren wieder aktiviert....!"))); 
    fibaro:debug("------------------------------------------------------------------------------------------");       
    fibaro:abort(); 
else
        
if  (tonumber(fibaro:getValue(tuere_freisitz, "value"))) > 0 
and (tonumber(fibaro:getValue(Licht, "value"))) > 0      
 
then 
    fibaro:debug("------------------------------------------------------------------------------------------");       
    Debug("orange",("Türe Freisitz wurde geöffnet...!"));       
    Debug("red",(os.date("%H:%M Uhr / Sensoren für 4 Stunden deaktiviert....!"))); 
    fibaro:debug("------------------------------------------------------------------------------------------");      
    fibaro:sleep(14400000);
    fibaro:debug("------------------------------------------------------------------------------------------");       
    Debug("green",(os.date("%H:%M Uhr / Timer Türe Freisitz abgelaufen, Sensoren wieder aktiviert....!"))); 
    fibaro:debug("------------------------------------------------------------------------------------------");         
    fibaro:abort();         
break 
end
end       
    timer=timer-1;
    
 -- Timer zurücksetzen, wenn neue Bewegung erkannt wird innherhalb der Verzögerungszeit
if  fibaro:getGlobalValue("Sonnenstand") == "Sonnenuntergang"
and (tonumber(fibaro:getValue(motion1, "value"))) > 0 
or  fibaro:getGlobalValue("Sonnenstand") == "Sonnenuntergang"      
and (tonumber(fibaro:getValue(motion2, "value"))) > 0
or  fibaro:getGlobalValue("Sonnenstand") == "Sonnenuntergang"     
and (tonumber(fibaro:getValue(motion3, "value"))) > 0
 
then
    timer=starttimer;
    fibaro:debug("------------------------------------------------------------------------------------------");      
    fibaro:debug(os.date("%H:%M Uhr / Bewegung erkannt, Licht bereits eingeschaltet!"));       
    Debug("green",(" Timer auf " ..timer /60 .. " Minuten zurückgestellt!"))
    fibaro:debug("------------------------------------------------------------------------------------------");              
end 
    
until (timer <1) 
  
 -- Schalte Licht aus, wenn Timer vollständig abgelaufen ist
    fibaro:call(Licht, "turnOff");
    fibaro:debug("------------------------------------------------------------------------------------------");         
    Debug("gray",("Timer abgelaufen, Licht wird ausgeschaltet..."));
    Debug("gray",(os.date("(%d.%m.%Y) Licht um %H:%M Uhr ausgeschaltet!.")));
    Debug("red",("Szene angehalten"));
    fibaro:debug("------------------------------------------------------------------------------------------");         
    fibaro:abort(); 
end


Hi,

ohne Dir zu Nahe treten wollen finde ich das Vorhaben in diesem Fall als nicht angebracht. Es würde das Script noch mehr aufblähen. Wenn die MS in einem Arry haben willst, dann musst Du ja den Index abfragen und dann dessen Wert vergleichen. Die Anzahl der Abfragen bleibt also gleich.
In meinen Augen so unötig wie Zahnweh :wink:
Und es macht überhaupt keinen Sinn die Anfrage/Script doppelt unter anderem Namen zu posten.

Ist der gleiche User, aber dennoch richtig. Den anderen Thread habe ich gelöscht.

Gruß

Hi zusammen
Das mit den doppelten Thread war keine böse Absicht! Konnte den falsch gewählten Titel nachträglich nicht mehr ändern :frowning: Danke für’s löschen.
Könnte mir trotzdem jemand aufzeigen was zu machen wäre, wenn ich die Sensoren in einem Array zusammenfassen möchte.
Habe schon einiges probiert, gibt aber jedes mal eine Fehlermeldung. Danke für euer Engagement! Gruss fastsnake

https://www.siio.de/kleine-lua-scripte-teil-5-bewegung-im-raum-erkennen/

Hallo boomx
Vielen Dank für den beigefügten Link. Natürlich habe ich mich vor meiner Anfrage ebenfalls umgesehen und diese LUA Szene gefunden und versucht diese zu verstehen!
Nur mit diesem Teil local sensors = {43,76}in die Szene einzufügen ist sicherlich nicht getan. Leider kann ich in dieser Szene nicht erkennen was ich
alles übernehmen müsste damit die Sensoren in meiner Lichtsteuerung in einem Array zusammengefasst werden könnten.
Ich möchte mich bei den LUA Profis für die langweiligen Anfängerfragen entschuldigen, was für euch Schnee von gestern und selbstverständlich ist, löst
bei uns Beginner oft Unverständnis und Schweisstropfen aus. In diesem Sinne ist auch einmal ein “Dankeschön” angebracht für die tägliche Beantwortung unzähliger
Fragen im Bezug auf die LUA Programmierung. Meine Anfragen basieren nicht auf Bequemlichkeit oder Faulheit, sondern weil ich einen entsprechenden Zusammenhang noch nicht
verstehen kann. Vielen Dank für euren unermüdlichen Einsatz!! Gruss fastsnake

Neben der lokalen Variable sensors musst du dir folgendes anschauen:

function getSensorStatus()
for i,n in ipairs(sensors) do
 if (tonumber(fibaro:getValue(n, "value")) > 0) then
  return 1;
 end
end
 return 0;
end

und

if (fibaro:getSourceTriggerType() == 'property' and getSensorStatus() == 1) then

Damit erfolgt die Prüfung, ob ein Sensor aus dem Array ausgelöst wurde.

Gruß

Vielen Dank boomx, das bringt mich einige riesige Schritte vorwärts! Gruss fastsnake