Blog Licht an solange Bewegung

Dann habe ich das Problem aber noch nicht gelöst wenn ich den Aktor über die App auf 1 setze.

Hi.

Die frage ist, was soll passieren wenn du das Licht über die APP anschaltest. Wenn du möchtest dass es dann an bleibt ist das kein Problem.

Stefan

Wenn ich das richtig verstanden habe bleibt das Licht nur an wenn die Globale Variable gesetzt wird alle anderen Aktionen werden nach Zeit wieder auf 0 gesetzt.

Zur Erläuterung mein Anwendungsfall:
Auf meinem Gartenhaus habe ich 3 Strahler und einen Bewegungsmelder installiert, damit die Kamera im Dunkeln den ganzen Bereich abdecken kann soll über Bewegungsmelder das Licht eingeschaltet werden und nach 5 Minuten wieder aus. Will ich aber in Ruhe davor sitzen und ein Bier trinken sollte das Licht anbleiben egal ob über Schalter, Fernbedienung oder Einschaltung über App.
Ausschaltung auch wieder manuell. Hat da jemand eine gute Lösung?

Liebe Freunde der Programmierlogik!

Ich bin hier noch neu und habe in den Skripten meines Erachtens in folgenden Zeilen einen Fehler gefunden:

-- SCHALTE LICHT EIN & AUS (wenn nicht nacht)
if (tonumber(fibaro:getValue(motion, "value")) > 0 ) and tonumber(fibaro:getValue(licht, "value")) > lichtwert and (tonumber(os.date("%H%M")) >= nachtstart or tonumber(os.date("%H%M")) <= nachtende) then -- hier fehlt noch "und schalter aus"

Dabei beziehe ich mich auf die Abfrage zum “lichtwert” (z.B. mit “5” definiert). Danach würde das Licht immer dann einschalten, wenn der Lichsensor (“licht”) GRÖßER 5 Lux ist - das ist doch falsch/“Blödsinn”! Es soll doch UNTER 5 Lux einschalten - wenn es dunkel ist; demnach müsste es doch … tonumber(fibaro:getValue(licht, “value”)) < lichtwert … heißen - oder bin ich auf dem Holzweg?
Übrigens hat “rk-design” es weiter oben auch so umgebaut.

Bitte klärt mich auf: ich bin doch nicht der erste, dem das aufgefallen ist - oder?

Gruß Monti

Moin Monti!

Ich hatte da auch so meine Schwierigkeiten damit. Aber ich denke, der Wert soll die Grenze markieren, ab wann die Szene das Licht “Zeit steuert”! Sprich: Lichtwert beispielsweise unter 10, es ist aber 11.00 Uhr morgens (wir haben gerade einen Sonnenfinsternis ;-)),…dann soll die Szene, obwohl sie sich außerhalb ihren “Zeitfensters” befindet, bei Bewegung, das Licht anschalten!

@all: Liege ich richtig?

Viele Grüße

Christian

Hallo Christian,
das mit der Zeit verstehe ich. Woran ich scheitere ist die Abfrage zur Helligkeit - und im Kommentar steht auch noch “[grenze zum nachtmodus (nur ausführen, wenn licht größer als)]”.
Angenommen, der Lichtwert ist mit 5 festgelegt, dann schaltet das Licht demnach nur ein, wenn das gegenwärtige Licht heller ist als 5 (ich nehme an Lux). Das ist doch unlogisch - die Klammer müsste “< lichtwert” sein. Ich brauche doch kein Licht, wenn es heller wird!
Allerdings frage ich mich warum es funktioniert!?

Verzweifelte Grüße
Monti

Alles klar! Das Licht soll ja nachts NICHT angehen! Das war der Wald vor lauter Bäumen!
Gruß Monti

Moin Monti!

Ich denke ja, der Lichtwert soll die Grenze festlegen, ab wann das Licht nicht mehr angehen soll. Z.B. Es ist 14.00 Uhr und die Szene ist ausserhalb der “Nachtgrenze”. Jetzt fällt der Lichtwert unter den eingestellten. Dann soll das Licht, weil es ja wegen der Sonnenfinsternis dunkel ist, trotzdem angehen…

Aber vielleicht verstehe ICH ja auch die Logik nicht… :smiley:

Viele Grüße

Christian

Tja, es war wohl mein Problem, weil ich von der “Licht-an-Situation” ausgegangen bin und nicht von der “Licht-NICHT-an-Situation”! Aber nun stellt sich ein anderes Problem:

Ich verwende für das Script in diesem Blog zwei Fibaro Motion-Sensoren, die sich (manchmal) irgendwie unterschiedlich verhalten! Der Aufwachintervall (entspricht hoffentlich dem Aktualisierungsintervall?) steht auf 1 Stunde (3600), da ein häufigeres Abfragen auf die Batterie geht.
Beim Vergleich der beiden Senoren-Einstellungen ist mir jetzt aber aufgefallen, dass es gerade in Bezug auf “Aufwachintervall”/“Abfrage Zeitintervall” Unterschiede gibt (siehe Anhänge).

Sind es tatsächlich unterschiedliche Sensoren mit unterschiedlichen Merkmalen?
So enthält der “nornmale” Motion Sensor den Parameter “Aufwachintervall (s)” und der Motion Sensor (EU) den Parameter Abfrage Zeitintervall mit den Alternativen “mit Gerät wird nicht allgemein abgefragt”; “Gerät verwendet allgemeine Abfragereihe”; “Gerät wird in regelmäßigen Intervallen abgefragt”.

Kennt jemand die Eigenschaften dieser Alternativen/wo gibt es eine Beschreibung?

Gruß Monti

Sensor1.jpg

Sensor2.jpg

Ich habe bei mir im Wohnzimmer ein Script laufen, damit eine Led Leiste angeht wenn ich z.b. abends den Fernseher ausschalte und vom Sofa aufstehe nicht im dunklen stehe.
Eigentlich funktioniert das auch ganz gut, aber manchmal geht die Led leiste auch an wenn ich mich nur etwas aufm Sofa bewege, obwohl eben der Fernseher oder noch ne andere Lampe an ist. Ich hab schon versucht den Lux Wert ab dem das Script auslösen soll runter zu stellen. Aber entweder ist es dann trotzdem noch zu dunkel, oder manchmal scheint es mir als wäre der Helligkeitssensor zu träge (kann das sein?).
Da der Tv aber an einem Zwischenstecker hängt und ich beim fernsehen meist eine Hue Lampe an habe, soll einfach abgefragt werden ob eine Lampe oder der Tv an ist. Was ja eigentlich recht simpel klingt. Aber wenn ich das bei mir ins Scrip mit einfüge läuft es gar nicht mehr.
Mein Script sieht aber anders aus ans das was hier im Thread steht. Vielleicht ist auch mein Code an und für sich schon falsch, aber abgesehen von den Fehlstarts läuft es ja eigentlich.
Aktuell ist es so:

if tonumber(fibaro:getValue(40, “value”)) > 0
and tonumber(fibaro:getValue(42, “value”)) < 3
then fibaro:call(27, “turnOn”);
elseif tonumber(fibaro:getValue(40, “value”)) == 0
then fibaro:call(27, “turnOff”);
end

40 ist der Bewegungssensor und 42 der Helligkeitssensor.

An welcher Stelle müsste ich denn jetzt die Abfrage für den Zwischenstecker oder die Hues einsetzten, oder klappt das mit meinem Code nicht? Weil irgendwie klappt es nicht so richtig.

Hi Monti,

das Aufwachintervall ist der Zeitraum, in dem die Geräte neue Einstellungen beim HC abfragen.
Das unterschiedliche Verhalten wird eher durch die Parameter gesteuert.
Vergleich mal die Parameter der Module (da wird das Reporting neuer Werte und die Intervalle bestimmt).

VG Hoggle

Hallo,

Super Skript. Ein Problem habe ich jedoch mit dem Originsl-Skript (Variante 2 mit Aus-Schalter) aus dem Blog: Wenn ich das Licht per Schalter ausschalte, geht es sofort wieder an. Ich habe lediglich die IDs geändert und den Timer auf 180s reduziert. Debug-Meldung ist ganz normal “Schalte Licht ein”. Nach 3 min geht das Licht korrekt aus, sofern keine Bewegung erkannt wird. Hat jemand eine Idee?

Tausend Dank!

Faszinierend! Vielen Dank.

Was ich aber absolut nicht verstehe, warum soll die Szene nur ausgeführt werden, wenn der LUX-Wert einen Wert überschreitet? Wäre es nicht sinnvoller, wenn die Aktion ausgeführt würde, wenn ein Wert unterschritten wird und dann auch unabhängig von der Nachtzeit? Also wenn z.B. mittags schwere Wolken das Licht im Raum so verdunkeln, dass es ohne Licht einfach zu dunkel wird.

Hallo,

ich möchte mehrere Lampen schalten und es soll auf 2 Motion Sensoren reagiert werden.

Wenn ich es so mache dann schaltet es nur die ID 126 ein.

-- VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene = 114 -- ID dieser Szene
local motion = 748 -- ID des Bewegungssensors
local switch = 160 -- ID des Relay Switches
local switch = 126 -- ID des Relay Switches

Und wie muss ich den 2 Sensor eintragen?

Nimm das Skript der perfekten Lichtsteuerung. Du müsstest hier die Schleifen umbauen.

http://www.siio.de/lichtschatten/die-perfekte-lichtsteuerung-mit-fibaro-lua-update-1/

Hallo Oliver,

für den Fall, dass dein Problem noch nicht gelöst ist, findest du hier meine Szene um mehrere Sensoren (Motion oder Tür/Fenster) einzubinden die mehrere Lichter zu schalten.

Es wird eine Globale-Variable “TOD” (Time Of Day) mit “Abend” und “Nacht” benötigt damit die Lichter nur Abends bzw. Nachts eingeschaltet werden.

--[[
%% properties
30 value
27 value
%% globals
--]]

------------------------- 
--- ### Variablen ### --- 
------------------------- 
local lightID = {9,7,5,11,38}
local motionID = {13,18}
local offTimeout = 30

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

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

function extradebug(message) 
if (varextradebug) then fibaro:debug(message); end 
end 

--------------------------- 
--- ### Debug-Modus ### --- 
--------------------------- 
vardebug = true
varextradebug = true

motionCheck = function()
for i,n in ipairs(motionID) do 
if (tonumber(fibaro:getValue(n, "value")) == 0) then 
return true; end 
return false; end
end

lightCheck = function()
for i,n in ipairs(lightID) do 
if (tonumber(fibaro:getValue(n, "value")) == 0) then 
return 0; end 
return 1; end
end

--------------- ### Code ### ----------------------

--- ### Sensor ausgelöst ### --- 
if tonumber(fibaro:getValue(trigger['deviceID'], "value")) > 0 then
extradebug(" ".. name .. " wurde ausgelöst"); 
	
	if (fibaro:getGlobalValue("TOD") == "Abend" or fibaro:getGlobalValue("TOD") == "Nacht") then
	  if (lightCheck() == 0) then
          debug(os.date("Licht um %H:%M Uhr eingeschaltet. (%d.%m.%Y)"));
            for i, v in ipairs(lightID) do
 	    fibaro:call(lightID[i], 'turnOn')
	    end
    	  else extradebug("Lichter sind bereits eingeschaltet"); end
	else extradebug("Lichter werden Tagsüber nicht eingeschaltet"); end

--- ### Sensor sicher ### --- 
elseif fibaro:getGlobalValue("TOD") == "Abend" or fibaro:getGlobalValue("TOD") == "Nacht" then
extradebug("Sensor " .. name .. ": " .. " ist sicher aber wartet noch " .. offTimeout .. " Sekunden bis zum Ausschalten." )
fibaro:sleep(offTimeout*1000)
extradebug("Check ob alle Sensoren sicher sind...")

 --- ### Prüfung auf weitere Bewegungen ### ---
  if motionCheck() then
  extradebug("Alle Bewegungsmelder sind sicher")

     --- ### Wenn Lichter AN sind und KEINE Bewegung mehr festgestellt wurde: wird das Licht ausgeschaltet ### ---
    if (lightCheck() == 1) then
	for i, v in ipairs(lightID) do
 	fibaro:call(lightID[i], 'turnOff')
	end
	debug(os.date("Licht um %H:%M Uhr ausgeschaltet. (%d.%m.%Y)"));
    	debug("------------###------------")
        fibaro:sleep(1000)
    elseif (lightCheck() == 0) then extradebug("Lichter sind bereits ausgeschaltet.") end			
  else extradebug("Ausschalten wird verzögert.") end
else extradebug("Sicher. Tagsüber muss nichts gemacht werden.") end

Bei mir läuft es nicht so wie gewünscht… Es scheint als ob die Funktion “checkMotion” nicht sauber abgefragt wird. deshalb noch einmal die Szene ohne array wo der Status der Motionsensoren abgefragt wird

PS: ich würde ja einfach meinen o.g. Beitrag bearbeiten aber das klappt leider nicht.

--[[
%% properties
30 value
27 value
%% globals
--]]

------------------------- 
--- ### Variablen ### --- 
------------------------- 
local light2check = 9
local lightID = {9,7,5,11,38}
local offTimeout = 30
local motion1 = 30
local motion2 = 27

local instances = tonumber(fibaro:countScenes());
local trigger = fibaro:getSourceTrigger();
local sensorID = tonumber(trigger['deviceID']);
local name = fibaro:getName(sensorID); 
local room = fibaro:getRoomNameByDeviceID(sensorID)

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

function extradebug(message) 
if (varextradebug) then fibaro:debug(message); end 
end 

--------------------------- 
--- ### Debug-Modus ### --- 
--------------------------- 
vardebug = true
varextradebug = false

--------------- ### Code ### ----------------------

--- ### Sensor ausgelöst ### --- 
if tonumber(fibaro:getValue(trigger['deviceID'], "value")) > 0 then
extradebug(" ".. name .. " wurde ausgelöst"); 
	
	if (fibaro:getGlobalValue("TOD") == "Abend" or fibaro:getGlobalValue("TOD") == "Nacht") then
	  if (instances > 2) then fibaro:abort(); fibaro:debug("Doppelte Szene abgebrochen"); end
		if tonumber(fibaro:getValue(light2check, "value")) == 0 then 
                debug(os.date("Licht um %H:%M Uhr eingeschaltet. (%d.%m.%Y)"));
		for i, v in ipairs(lightID) do
 		fibaro:call(lightID[i], 'turnOn')
		end
    	else extradebug("Lichter sind bereits eingeschaltet") end
	else extradebug("Lichter werden Tagsüber nicht eingeschaltet") end

--- ### Sensor sicher ### --- 
elseif fibaro:getGlobalValue("TOD") == "Abend" or fibaro:getGlobalValue("TOD") == "Nacht" then
extradebug("Sensor " .. name .. ": " .. "wartet noch " .. offTimeout .. " Sekunden bis zum Ausschalten." )
fibaro:sleep(offTimeout*1000)
extradebug("Prüfung ob beide Sensoren sicher sind...")
 --- ### Prüfung auf weitere Bewegungen ### ---
  if (tonumber(fibaro:getValue(motion1, "value")) == 0 and tonumber(fibaro:getValue(motion2, "value")) == 0 ) then
  extradebug("Tür und Bewegungsmelder sind sicher")
   		--- ### Wenn Lichter AN sind und KEINE Bewegung mehr fesstgestellt wurde: wird das Licht ausgeschaltet ### ---
		local lightStatus = tonumber(fibaro:getValue(light2check, "value"))
    	        if lightStatus >= 1 then
		for i, v in ipairs(lightID) do
 		fibaro:call(lightID[i], 'turnOff')
		end
    		debug(os.date("Licht um %H:%M Uhr ausgeschaltet. (%d.%m.%Y)"));
    		debug("------------###------------")
   			fibaro:sleep(1000)
		elseif lightStatus == 0 then extradebug("Lichter sind bereits ausgeschaltet.") end			
  else extradebug("Ausschalten wird verzögert.") end
else extradebug("Sicher. Tagsüber muss nichts gemacht werden.") end

Ich hole dieses “Skript” mal wieder hoch…
Hab auch direkt ne Frage:
if (tonumber(fibaro:getValue(motion, “value”)) > 0 ) and tonumber(fibaro:getValue(licht, “value”)) > lichtwert and (tonumber(os.date("%H%M")) >= nachtstart or tonumber(os.date("%H%M")) <= nachtende) then – hier fehlt noch “und schalter aus”
Wie baue ich denn hier die Abfrage ein, ob “Schalter” ein- ist bzw ausgeschaltet ist?
muss ich die Formel um
and (tonumber(fibaro:getValue(switch, “value”)) = 0 )
vor dem “then” einfach ergänzen?

Sorry, für euch wahrscheinlich ein Klaks, für mich absolutes Neuland, aber ich freu mich drauf :slight_smile:

Danke und Gruß
Rik


Hallo zusammen,

ich mache auch grad meine ersten Versuche mit LUA mit meinem neuen HC2 und brauche kurz euren Rat:

Hier ist ein abgewandeltes Script von Seite 1, welches das Licht im Bad steuern soll. Ich habe noch einen zweiten Schalter eingebaut und oben noch eine Abfrage, ob das Licht schon AN war, dann soll das Script einfach nichts machen und sich beenden.

Das Problem ist nun, dass das Script wie vorgesehen startet, wenn kein Licht an ist und die Lichter einschaltet. Dann aber sieht man im Debug das nach kurzer Zeit / wenige Sekunden wieder die erste Abfrage durchlaufen wird die prüft, ob das Licht schon an ist und dann natürlich abbricht. Irgendwie startet das Script wohl irgendwo neu, obwohl der Timer noch gar nicht durchlaufen wurde. Man sieht auch keinerlei Debug-Meldungen des Timers… an welcher Stelle liegt der Fehler? Ich komme einfach nicht drauf… danke euch!

--[[ 
%% properties
29 value
%% globals 
--]]
-- VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene = 9 -- ID dieser Szene
local motion = 29 -- ID des Bewegungssensors
local switch = 26 -- ID des Relay Switches
local switch2 = 27 -- ID des Relay Switches2
local starttimer = 60 -- Timer in Sekunden
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:debug("Instanz läuft bereits, beende Script");
fibaro:abort();
end
-- Prüfe, ob Licht bereits an ist
if (tonumber(fibaro:getValue(motion, "value"))) > 0 and (tonumber(fibaro:getValue(switch, "value"))) > 0 or (tonumber(fibaro:getValue(switch2, "value"))) > 0 then
fibaro:debug("Licht bereits an, exit");
fibaro:abort();
end
-- SCHALTE LICHT EIN & AUS
if (tonumber(fibaro:getValue(motion, "value"))) > 0 and (tonumber(fibaro:getValue(switch, "value"))) < 1 and (tonumber(fibaro:getValue(switch2, "value"))) < 1 then
fibaro:call(switch, "turnOn");
fibaro:call(switch2, "turnOn");
fibaro:debug("Bewegung erkannt, schalte Licht ein");
end
-- Verzögerung in Sekunden nach der letzten erkannten Bewegung, bevor das Licht ausgeschaltet wird
if (tonumber(fibaro:getValue(switch, "value"))) > 0 and (tonumber(fibaro:getValue(switch2, "value"))) > 0 then
local timer = starttimer;
fibaro:debug("Starte Timer");

repeat
fibaro:sleep(1000);
-- Schalte Licht aus, wenn Schalter manuell betätigt wird und warte 5 Sekunden, um ein 
-- versehentliches (erneutes) Aktivieren der Szene zu verhindern
if (tonumber(fibaro:getValue(switch, "value"))) < 1 and (tonumber(fibaro:getValue(switch2, "value"))) < 1 then
timer=1;
fibaro:call(switch, "turnOff");
fibaro:call(switch2, "turnOff");
fibaro:debug("Licht wurde durch Schalter ausgeschaltet");
fibaro:sleep(5000);
break
end
timer=timer-1;
-- Timer zurücksetzen, wenn neue Bewegung erkannt wird innherhalb der Verzögerungszeit
if (tonumber(fibaro:getValue(motion, "value"))) > 0 then
timer=starttimer;
fibaro:debug("Resette Time, Bewegung erkannt bzw. Motionsensor sendet noch nicht (vgl. Parameter 6)");
end
until (timer<1)
-- Schalte Licht aus, wenn Timer vollständig abgelaufen ist
fibaro:call(switch, "turnOff");
fibaro:call(switch2, "turnOff");
fibaro:debug("Timer abgelaufen, schalte Licht aus");
fibaro:killScenes(scene);
end