wo eine Szene beschrieben ist die durch Bewegung einen Switch schaltet und dieser erst aus geht wenn keine Bewegung mehr festgestell wurde.
Läuft 1A und ist soweit so gut ganz praktisch aber jetzt bräuchte ich zwei Modifikationen die ich nicht hin bekomme (bin leider kein Programmierer)
und zwar möchte ich anstatt “einen” switch hätte ich gern zwei geschalten und dazu kommt noch das dies nur in einem bestimmten Zeitfenster passiert z.B. von 19.00Uhr - 6.30Uhr
könnt ihr mir helfen und hier ein verändertes script posten?
Hier mal der Code für die Zeitregel. http://pastebin.com/qG3bemy1
Wenn du mehr switches willst, kannst du diese im code duplizieren. Wenn du möchtest, schreibe ich dafür auch noch ein codeschnipsel.
Hier mit Zeit und mit Lichtwerten. Ich denke, es ist weitestgehend selbsterklärend, ansonsten fragen
gruß daniel
--[[
%% properties
49 value
%% globals
--]]
-- VARIABLEN Konfiguration (Bewegungsmelder muss oben unter %% properties aufgeführt sein) löst die szene aus
-----------------------------------------------------------------------------------------------------------------------------------------
local scene = 10-- ID dieser Szene
local motion = 49 -- ID des Bewegungssensors
local licht = 51 -- ID Lichtsensor
local switch = 6 -- ID der Lampe
local nachtstart = 1700 --22:00 = 2200
local nachtende = 0100 -- 07:00 = 0700
local starttimer = 10 -- licht an zeit (+ zeit des bewegungssensors - par. 6)
local lichtwert = 5 -- grenze zum nachtmodus (nur ausführen, wenn licht größer als)
-----------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------
---------------------Script-----------------
fibaro:debug("start1")
if (fibaro:countScenes()>1) then
fibaro:debug("stop scene");
fibaro:abort();
end
-- 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"
fibaro:debug("ausgelöst");
--led auf wert einstellen
fibaro:call(switch, "turnOn");
-- timer start und einstellen
timer = os.time();
while os.time() - timer < starttimer do
fibaro:sleep(1000);
-- Timer zurücksetzen, wenn neue Bewegung erkannt wird innherhalb der Verzögerungszeit
if (tonumber(fibaro:getValue(motion, "value"))) > 0 then
timer = os.time();
end
end
-- Schalte Licht aus, wenn Timer vollständig abgelaufen ist
fibaro:call(switch, "turnOff");
end
fibaro:debug("ende1");
fibaro:killScenes(scene);
ja, wie du es beschrieben hast. Der Lux Wert wird ja in den devices angezeigt, damit musst du experimentieren. Bei -1 wird die Szene immer ausgelöst (logisch,denn der lux wert kann nicht unter 0 sinken.)
Zu LUA Script gibt es sicher genug Tutorials. Man sollte es einfach am Anfang nicht überschätzen. Ein bisschen experimentieren und man steckt da sehr schnell drinnen. Wir haben in der 10 klasse unsere Taschenrechner mit ähnlichem Syntax programmiert, nicht jeder ist gleich Informatiker geworden Fibaro dokumentiert ansonsten auch jede der eigenen Funktionen.
So! Nach dem Löschen diverser Leerzeichen läuft´s jetzt problemlos und ist der Hammer!
Hier die Vorlage von Daniel:
--[[
%% properties
154 value
%% globals
--]]
-- VARIABLEN Konfiguration (Bewegungsmelder muss oben unter %% properties aufgeführt sein) löst die szene aus
-----------------------------------------------------------------------------------------------------------------------------------------
local scene = 26 -- ID dieser Szene
local motion = 154 -- ID des Bewegungssensors
local licht = 156 -- ID Lichtsensor
local switch = 43 -- ID der Lampe
local nachtstart = 1700 --22:00 = 2200
local nachtende = 0100 -- 07:00 = 0700
local starttimer = 10 -- licht an zeit (+ zeit des bewegungssensors - par. 6)
local lichtwert = 5 -- grenze zum nachtmodus (nur ausführen, wenn licht größer als)
-----------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------
---------------------Script-----------------
fibaro:debug("start1")
if (fibaro:countScenes()>1) then
fibaro:debug("stop scene");
fibaro:abort();
end
-- 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"
fibaro:debug("ausgelöst");
--led auf wert einstellen
fibaro:call(switch, "turnOn");
-- timer start und einstellen
timer = os.time();
while os.time() - timer < starttimer do
fibaro:sleep(1000);
-- Timer zurücksetzen, wenn neue Bewegung erkannt wird innherhalb der Verzögerungszeit
if (tonumber(fibaro:getValue(motion, "value"))) > 0 then
timer = os.time();
end
end
-- Schalte Licht aus, wenn Timer vollständig abgelaufen ist
fibaro:call(switch, "turnOff");
end
fibaro:debug("ende1");
fibaro:killScenes(scene);
Vielen Dank nochmals Daniel!
Eine Frage habe ich allerdings noch. Wenn man z.B. nachts mal für kleine Mädchen muß, dann wird man ja von dem Licht völlig erschlagen.
Kann ich es auch SO steuern, das die Scene z.B. von 17.00 Uhr bis 00.00 Uhr auf Bewegung reagiert und von null, bis sagen wir mal vier Uhr nicht?
Viele Grüße
Christian
P.S. in den zeilen, in denen Du die Zeit definierst,…warum steht da z.B. bei nachtende " = 0100 --"? Ist das ein LUA-Code, oder hast Du Dich da nur vertippt und es müßte da 2200 stehen( um das Zeitfenster zu definieren)?
local nachtstart = 1700 --22:00 = 2200
local nachtende = 0100 – 07:00 = 0700
Hey,
cool das es geht! Und schade, dass es sich nicht richtig kopieren ließ
Zu meiner Notiz: 1. habe ich sie einfach vergessen zu löschen, aber 2. meine ich damit wirklich etwas: Die Szene darf eigentlich nicht ausgeführt werden, wenn das licht schon an ist. Wenn du per Wandschalter das licht einschaltest und dann das script per Bewegung startest, geht das licht nach dem timeout aus.
An sich kein Thema, denn schalterstatus abfragen geht via getValue. Aktuell gibt es aber einen bug in meiner fibaro firmware und der schalter bringt immer 0.
Hi Daniel,
Weißt du ob man über die Table Funktion mehrere Sensoren in einer variablen unterbringen kann?
Local Sensoren {id1, id2}
Habe die Befürchtung das nicht unterschieden werden kann welcher Sensor ausgelöst hat und welcher nicht.
Hatte schon diverse Sachen ausprobiert aber entweder bekommen ich eine Fehlermeldung oder es passiert nichts.
Mich würde ebenfalls die Steuerung unter der Bedingung von Luxwerten interessieren. ich kenne mich mit programmieren gar nicht aus. Gibt es auch die Möglichkeit das Ganze über die grafische Darstellung mit dem HC2 einzurichten?
Vielen Dank bereits im Voraus!
Marco
Hallo,
mit der Grafischen Oberfläche kenne ich mich nicht aus. Vielleicht hat crissxcross da eine Idee.
Zum Problem von Alex: fibaro stellt die Funktion getsourcetrigger zur Verfügung. Diese ließt aus, welcher trigger das script gestartet hat.
In die properties müssen dann alle Bewegungssensoren
in den kopf irgendwo dann in etwa so
local trigger = fibaro:getSourceTrigger() --source trigger variable beschreiben
local motion = tonumber(trigger['deviceID']) --motion wird mit dem jeweiligen sensor versehen
wenn noch andere trigger außer Bewegungssensoren im spiel sind, wird es natürlich nicht mehr auf diesem Weg gehen. (machbar wäre es trotzdem)
Grafisch sollte das so klappen, siehe Bild.
Den Licht Sensor auswählen und im grünen Feld den gewünschten LUX Wert eintragen, anschließend das Licht o.ä. auswählen.
Daniel hatte mir mal ein Script geschrieben um mein LED Stripe hinter dem Treppengeländer bei Bewegung, solange Bewegung einzuschalten.
das coole ist, er speichert die Farbe welche der LED Stripe vor der Szene hatte, führt die Szene aus und setzt eine definierte Farbe und Helligkeit. Danach setzt er die Farbe des LED Stripe wieder zurück.
Hier das Script:
--[[
%% properties
222 value
%% globals
--]]
-- VARIABLEN Konfiguration (Bewegungsmelder muss oben unter %% properties aufgeführt sein) löst die szene aus
-----------------------------------------------------------------------------------------------------------------------------------------
local scene = 192-- ID dieser Szene
local motion = 222 -- ID des Bewegungssensors
local licht = 224 -- ID Lichtsensor
local switch = 155 -- ID der LED Leiste
local nachtstart = 2100 --22:00 = 2200
local nachtende = 0700 -- 07:00 = 0700
local starttimer = 10 -- licht an zeit
local lichtwert = -5 -- grenze zum nachtmodus (nur ausführen, wenn licht größer als)
-----------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------
---------------------Script-----------------
fibaro:debug("start1")
if (fibaro:countScenes()>1) then
fibaro:debug("stop scene")
fibaro:abort()
end
-- 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"
fibaro:debug("ausgelöst")
--sichern der Usereinstellung der LEDs
local colorSet = fibaro:getValue(switch, "lastColorSet");
local RGBWTable= {};
local i = 1;
for value in string.gmatch(colorSet,"(%d+)") do
RGBWTable[i] = value;
i = i + 1;
end
--led auf wert einstellen
fibaro:call(switch, "setColor", "25", "15", "1", "0")
-- timer start und einstellen
timer = starttimer
repeat
fibaro:sleep(1000)
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
end
until (timer < 1)
-- Schalte Licht aus, wenn Timer vollständig abgelaufen ist
fibaro:call(switch, "turnOff")
fibaro:sleep(2000)
fibaro:call(switch, "setColor", RGBWTable[1], RGBWTable[2], RGBWTable[3], RGBWTable[4])
fibaro:call(switch, "turnOff")
fibaro:debug("Timer abgelaufen/Schalte Licht aus")
end
fibaro:debug("ende1")
fibaro:killScenes(scene)
kopiere bitte vollständig dieses Script hier LINK
und erstetze es mit deinen Variablen.
Das Script im Blog ist noch falsch formatiert - ergo hast du es falsch übernommen.
Btte wie gesagt das von hier aus dem Forum 1:1 übernehmen und Variablen ersetzen - die hattest du soweit korrekt eingetragen
--[[
%% properties
30 value
%% globals
--]]
-- VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene = 1 -- ID dieser Szene
local motion = 30 -- ID des Bewegungssensors
local switch = 9 -- ID des Relay Switches
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:abort();
end
-- SCHALTE LICHT EIN & AUS
if (tonumber(fibaro:getValue(motion, "value")) > 0 ) and (tonumber(fibaro:getValue(switch, "value"))) < 1 then
fibaro:call(switch, "turnOn");
fibaro:debug("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 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(switch, "value"))) < 1 then
timer=1;
fibaro:call(switch, "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(motion, "value"))) > 0 then
timer=starttimer;
fibaro:debug("Resete 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:debug("Timer abgelaufen/Schalte Licht aus");
fibaro:killScenes(scene);
end