Lichtsteuerung

Hallo zusammen
Bin neu hier im Forum und habe versucht die LUA Lichtsteuerung auf meine Bedürfnisse anzupassen.
Habe drei Bewegungsmelder und zwei Zwischenstecker. Möchte dass das Licht nur nach Sonnenuntergang angeht und von jeweils einem der
drei BM gesteuert wird. Momentan schaltet bei Sonnenuntergang das Licht ein (ohne dass jemand den BM auslöst)und löscht erst wenn einer der BM auslöst (nicht gut wenn niemand zu Hause ist) Vielleich könnte mir jemand von euch Spezialisten einen Tipp geben wo ich den Fehler eingebaut habe.
Vielen Dank im Voraus, Gruss Willi

–[[
%% properties
109 value
101 value
96 value
10 value
14 value
%% globals
Sonnenstand
–]]
– VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene= 77 – ID dieser Szene
local motion1= 109 – ID des Bewegungssensors
local motion2= 101 – ID des Bewegungssensors
local motion3= 96 – ID des Bewegungssensors
local switch1= 10 – ID des Relay Switches
local switch2= 14 – ID des Relay Switches

– Lösche doppelte Szene(n)
if (fibaro:countScenes()>1)

then
fibaro:abort();
end

– Tageszeit prüfen / Licht aus
if (fibaro:getGlobalValue(“Sonnenstand”) == “Sonnenaufgang”)
and(tonumber(fibaro:getValue(switch1, “value”))) > 0
or (tonumber(fibaro:getValue(switch2, “value”))) > 0

then
timer=1;
fibaro:call(switch1, “turnOff”);
fibaro:call(switch2, “turnOff”);
fibaro:debug(“Prüfe Tageszeit”);
fibaro:debug(“Es ist (Sonnenaufgang), Licht ausgeschaltet!”);
timer=timer-1;
fibaro:sleep(10000);
fibaro:abort();
fibaro:killScenes(scene);

– Tageszeit prüfen
elseif
(fibaro:getGlobalValue(“Sonnenstand”) == “Sonnenaufgang”)

then
fibaro:debug(“Prüfe Tageszeit”);
fibaro:debug(“Es ist (Sonnenaufgang), Szene angehalten!”);
fibaro:abort();
fibaro:killScenes(scene);
else

– Schalte bei Sonnenuntergang Licht ein / aus
if (tonumber(fibaro:getValue(motion1, “value”)) > 0 ) and (tonumber(fibaro:getValue(switch1, “value”))) < 1 or (tonumber(fibaro:getValue(switch2, “value”))) < 1
or (tonumber(fibaro:getValue(motion2, “value”)) > 0 ) and (tonumber(fibaro:getValue(switch1, “value”))) < 1 or (tonumber(fibaro:getValue(switch2, “value”))) < 1
or (tonumber(fibaro:getValue(motion3, “value”)) > 0 ) and (tonumber(fibaro:getValue(switch1, “value”))) < 1 or (tonumber(fibaro:getValue(switch2, “value”))) < 1

then
fibaro:call(switch1, “turnOn”);
fibaro:call(switch2, “turnOn”);
local timer = (starttimer);
fibaro:debug(“Schalte Licht ein”);
end

– Verzögerung in Sekunden nach der letzten erkannten Bewegung, bevor das Licht ausgeschaltet wird
if (tonumber(fibaro:getValue(switch1, “value”))) > 0
or (tonumber(fibaro:getValue(switch2, “value”))) > 0

then
local starttimer = 900;
local timer = (starttimer);
fibaro:debug(“Starte Timer”);

repeat
fibaro:sleep(1000);

– Schalte Licht aus, wenn Schalter manuell betätigt wird und warte 10 Sekunden, um ein
– versehentliches (erneutes) Aktivieren der Szene zu verhindern
if (tonumber(fibaro:getValue(switch1, “value”))) < 1
or (tonumber(fibaro:getValue(switch2, “value”))) < 1

then
timer=1;
fibaro:call(switch1, “turnOff”);
fibaro:call(switch2, “turnOff”);
fibaro:sleep(10000);
break
end
timer=timer-1;

– Timer zurücksetzen, wenn neue Bewegung erkannt wird innherhalb der Verzögerungszeit
if (tonumber(fibaro:getValue(motion1, “value”))) > 0
or (tonumber(fibaro:getValue(motion2, “value”))) > 0
or (tonumber(fibaro:getValue(motion3, “value”))) > 0

then
timer=starttimer;
fibaro:debug(“Bewegung erkannt, Timer zurückgestellt!”);
end

until (timer<1)

– Schalte Licht aus, wenn Timer vollständig abgelaufen ist
fibaro:call(switch1, “turnOff”);
fibaro:call(switch2, “turnOff”);
fibaro:debug(“Timer abgelaufen/Schalte Licht aus”);
fibaro:killScenes(scene);
end
end

Hi,

Deine Szeve wird durch alle Trigger (Zustandsänderung von Modulen und Variablen) in Header gestartet.

Bei Dir wird die Szene durch jede Änderung von “Sonnenstand” sowie den Switches gestartet.
Die kannst du aus dem Header löschen.

Viele Grüße Hoggle

https://www.siio.de/fibaro-homecenter-einsteigerguide-teil-2-getriggerte-szenen/

Hallo Willi,

die flogende Szene macht das was du suchst:
https://www.siio.de/board/thema/tuersensor-licht-an-mit-fehlern/#post-59195

Hallo zusammen, super schnelle Antworten. Vielen Dank, werde die Steuerung entsprechend euren Angaben ändern. Bin gespannt auf das Resultat. Gruss Willi

Vielen Dank nevv für die bereitgestellte Szene, als Beginner habe ich ein bisschen Mühe die Szene auf meine Sensoren anzupassen. Scheint im
Moment ein bisschen zu hoch für mich, werde aber nicht aufgeben :slight_smile: Danke noch einmal für eure Bemühungen. Gruss Willi

Hi Willi,

es ist ganz simpel:

Du musst nur im Header die IDs deiner Motion Sensoren eintragen.
Laut deinem oben geposteten script würde das so aussehen:

--[[
%% properties
109 value
101 value
96 value
%% globals
--]]

und als zweites musst du nur noch einmal die IDs der “Steckdosen/Lichter” und noch einmal die Bewegungsmelder eintragen:

lights2Check = {10,14};     --- Lichter die geschaltet werden sollen
motion2Check = {109,101,96}; --- Sensoren die die Szene auslösen bzw geprüft werden sollen

Achso, wichtigt ist, dass du noch eine “Globale Variable” angelegt hast über die abgefragt wird welche Tageszeit (Morgen, Mittag, Abend, Nacht etc) wir aktuell haben.
Wie das geht findest du hier:
https://www.siio.de/connected-home/lichtsteuerung-teil-2-fibaro-tageszeiten-variable-via-lua-setzen/

Hi nevv
Vielen, vielen Dank für Deinen Einsatz!! Das hilft mir jetzt schon viel weiter, werde diese Szene versuchen zum laufen zu bringen! Freue mich
bereits jetzt auf ein tolles Resultat…
Gruss Willi

Hallo nevv
Habe Variable entsprechend angelegt, leider erscheint noch folgender Fehler

[DEBUG] 14:14:05: line 24: Assertion failed: Expected number

22 trigger = fibaro:getSourceTrigger();
23 sensorID = tonumber(trigger[‘deviceID’]);
24 name = fibaro:getName(sensorID);

Vielleicht weisst Du was ich vergessen habe… Danke schon mal / Gruss Willi

Hier noch die ganze Szene, sieht man vielleicht den Fehler besser :slight_smile:

–[[
%% properties
96 value
101 value
109 value
%% globals
–]]


— ### Variablen ### —

lights2Check = {10,14}; — Lichter die geschaltet werden sollen
motion2Check = {96,101,109}; — Sensoren die die Szene auslösen bzw geprüft werden sollen
offTimeout = 20 — delay in sekunden

vardebug = true
varextradebug = true
varspecialdebug = true

22)trigger = fibaro:getSourceTrigger();
23)sensorID = tonumber(trigger[‘deviceID’]);
24)name = fibaro:getName(sensorID); <---- Hier ist der Fehler [DEBUG] 14:14:05: line 24: Assertion failed: Expected number

---- ### Debug Funktionen ### ----
function debug(message)
if (vardebug) then fibaro:debug(message); end
end

function extradebug(color, message)
if (varextradebug) then fibaro:debug(string.format(’<%s style=“color:%s;”>%s<!–%s–>’, “span”, color, message, “span”)); end
end

function specialdebug(color, message)
if (varspecialdebug) then fibaro:debug(string.format(’<%s style=“color:%s;”>%s<!–%s–>’, “span”, color, message, “span”)); end
end

---- ### checkMotion Funktion ### ----
function checkMotion(array)
specialdebug(“grey”, “Status der Sensoren…”);

for j=1, #motion2Check do
status = fibaro:getValue(motion2Check[j], "value")
sensorname = fibaro:getName(motion2Check[j])
	if status == "0" then
	specialdebug("yellowgreen", "" ..sensorname .. " sicher.");
  	motionOff = true; 
	elseif status == "1" then
  	specialdebug("tomato","" ..sensorname .. " ist noch ausgelöst.");
  	motionOff = false; break
  	end
end

end

---- ### checkLights Funktion ### ----
function checkLights(array)
specialdebug(“grey”, “Status der Lichter…”);

for j=1, #lights2Check do
status = fibaro:getValue(lights2Check[j], "value")
sensorname = fibaro:getName(lights2Check[j])
	if status == "0" then
	specialdebug("yellowgreen", "Licht: " ..sensorname .. " ausgeschaltet.");
  	lightsOff = true;
	elseif status == "1" then
  	specialdebug("tomato","" ..sensorname .. " ist noch eingeschaltet.");
	lightsOff = false; break
  	end
end

end
--------------- ### Code ### ----------------------

— ### Sensor ausgelöst ### —
if tonumber(fibaro:getValue(trigger[‘deviceID’], “value”)) > 0 then
–extradebug(“gold”,"Sensor: “…name … " wurde ausgelöst”);

if (fibaro:getGlobalValue("TOD") == "Abend" or fibaro:getGlobalValue("TOD") == "Nacht") then
debug("Szene wurde durch: "..name .. " ausgelöst");
checkLights()

	if lightsOff then
   		for i, v in ipairs(lights2Check) do
    	fibaro:call(lights2Check[i], 'turnOn');
    	end
  		debug(os.date("Licht um %H:%M Uhr eingeschaltet. (%d.%m.%Y)"));
	else extradebug("firebrick","Lichter sind bereits eingeschaltet"); fibaro:abort(); end

else specialdebug("lightgrey",""..name .. "  ausgelöst aber ≠ Abend/Nacht."); fibaro:abort(); end

— ### Sensor sicher ### —
elseif fibaro:getGlobalValue(“TOD”) == “Abend” or fibaro:getGlobalValue(“TOD”) == “Nacht” then
extradebug(“yellowgreen”,“Sensor: " …name … " ist sicher. Noch " …offTimeout … " Sekunden bis zum Ausschalten.”)
fibaro:sleep(offTimeout*1000)
extradebug(“grey”,“Check der Sensoren…”);
checkMotion();

— ### Prüfung auf weitere Bewegungen ### —
if motionOff then
extradebug(“goldenrod”,“Alle Sensoren sicher”)
extradebug(“grey”,“Check der Lichter…”);
checkLights();
— ### Wenn Lichter AN sind und KEINE Bewegung mehr festgestellt wurde: wird das Licht ausgeschaltet ### —
if (lightsOff == false) then
extradebug(“goldenrod”,“Lichter werden ausgeschaltet.”)
for i, v in ipairs(lights2Check) do
fibaro:call(lights2Check[i], ‘turnOff’)
end
debug(os.date(“Licht um %H:%M Uhr ausgeschaltet. (%d.%m.%Y)”));
debug("--------------- ###+## ---------------")
elseif lightsOff then extradebug(“yellowgreen”,“Lichter sind bereits ausgeschaltet.”); fibaro:abort(); end
else extradebug(“lightcoral”,“Mindestens ein Sensor ist noch ausgelöst. Ausschalten wird verzögert.”) end
else specialdebug(“grey”,"" …name … " ist Sicher aber ≠ Abend/Nacht."); fibaro:abort(); end

Kann sein, das es ein Copy & Paste Fehler ist.

22)trigger = fibaro:getSourceTrigger();
23)sensorID = tonumber(trigger[‚deviceID‘]);
24)name = fibaro:getName(sensorID); <—- Hier ist der Fehler [DEBUG] 14:14:05: line 24: Assertion failed: Expected number

Versuche mal die Zeilen


trigger = fibaro:getSourceTrigger();
sensorID = tonumber(trigger['deviceID']);
name = fibaro:getName(sensorID); 


Generell ist es leichter den Code zu lesen wenn Du Ihn als Code postest!
Somit können Zeichenfehler leichter gefunden werden.

Hi Willi,

kann es sein, dass du manuell auf “Start” geklickt hast!?
Wenn ja, dann löse die Szene aus in dem der Bewegungsmelder ausgelöst wird = am MS vorbei laufen :slight_smile:

Hallo nevv

Perfekt, vielen Dank! Super dass man als “Beginner” in diesem Forum soviel Unterstützung bekommt!!
Vielen Dank für Deinen Einsatz…
Gruss Willi

Der Fehler war, ich habe tatsächlich manuell ausgelöst :frowning:
Vielen Dank nochmal.

Hi zusammen
Das muss ich noch loswerden, die Lichtsteuerung ist der Hammer und arbeitet perfekt!
Vielen Dank für die Zeitaufwändige Programmierung!!
Wünsche allen eine tolle Woche…
Gruss Willi

Hallo Willi,

schön zu hören, dass es nun klappt!
Auch vielen dank für eine positive Rückmeldung. Ich habe mich sehr darüber gefreut.
Dankbare User wie du sind der Grund warum ich gerne meine Skripte teile und Unterstützung anbiete.

Viele Grüße

Hallo zusammen,

meine Szene läuft nicht richtig.
Das ein und ausschalten der Lampen funktioniert einwandfrei, allerdings spricht der Dimmer nicht an.
Habe jetzt die Szene bis auf den Dimmer gekürzt.
Jetzt kommt immer die Meldung -> No Lights set for Day / Night je nach dem was angesprochen wird.

lightsDay = {id=122, setValue="80", onTime=30};

Id passt soweit ich das erkennen kann:

Modulart:com.fibaro.FGD212
Hersteller:Fibargroup
Version:3.5
Konfiguration:Modul konfiguriert
ID:122