Salü zusammen,
ich habe in meinem Keller einen Single Switch 2 (FGS-213) verbaut. Aktuell möchte ich da noch nicht auf einen Bewegungssensor setzen, weswegen ich folgende Idee hatte.
Durch 1-maliges Klicken des Schalters (kein Taster), wird das Licht normal angemacht und es beginnt ein Timer zu laufen, welcher nach einer gewissen Zeit das Licht wieder abschaltet.
Durch 2-maliges Klicken des Schalters, soll kein Timer gestartet werden, stattdessen soll das Licht so lange brennen, bis man es ganz normal wieder durch 1-maliges Klicken wieder abschaltet.
LUA technisch sehe ich da keine Probleme, allerdings fehlt mir etwas die Erfahrung mit den Z-Wave Parametern und welche Device ID’s ich verwenden soll.
Evt. hat mir da ja jemand einen Tipp, welchen Parameter und welchen Header ich dann in der LUA Szene setzen muss.
Zur Umgebung:
An S1 des Switches hängt der Schalter. An S2 ist nichts angehängt.
Die Parameter sind alle auf ihren Defaultwerten.
Der Schalter (das untergeordnete Gerät), hat die ID 94, das übergeordnete Gerät die ID 91.
Unabhängig von den Parametern etc wird ein Doppelklick mit dem Schalter ggf nicht immer fehlerfrei registriert.
Die untergeordneten Module sind entscheidend.
Und die Parameter müsste ich wie folgt (siehe Anhang) anpassen?
Muss ich noch andere Parameter als Parameter 28 anpassen und wird dadurch verhindert, dass ein Drücken auf den Schalter das Licht anmacht?
Hi,
Durch den Parameter wird nicht verhindert, dass das Licht geschaltet wird. Hier wird nur die Szenenaktivierung aktiviert.
Bei dem Roller Shutter gibt es eine Option, wodurch das manuelle Betätigen keine Aktion auslöst (gesperrt). Ich weiß aber nicht, wie die hieß (such hier mal im Forum) und ob das Relais das auch hat/kann. Habe gerade keine Anleitung hier.
Per Parameter musst Du das Modul noch auf Schalter setzen.
Salü,
danke mal soweit.
Mit besagten Parametern geschaltet, funktioniert folgendes Testscript soweit mal ok.
--[[
%% properties
%% events
93 CentralSceneEvent
%% globals
--]]
-- id 92 seems also to work (S2?)
local trigger = fibaro:getSourceTrigger();
if (trigger["type"] ~= "other") then
local pressSource = fibaro:getSourceTrigger()["event"]["data"];
fibaro:debug(json.encode(pressSource));
if (tostring(pressSource["keyId"]) == "1") then
fibaro:debug("S1 tapped!");
end
end
Nun muss ich nur noch rausfinden (falls überhaupt möglich), wie ich verhindern kann, dass ein manuelles Betätigen eine Aktion auslöst (ausser die Szene zu aktivieren).
local mainSwitchId = 94;
local sceneControllerId = 93;
local trigger = fibaro:getSourceTrigger()
if ( trigger[„type“] ~= „other“ ) then
local pressSource = fibaro:getSourceTrigger()[„event“][„data“]
local action = tostring(pressSource[„keyAttribute“]);
if ( action == "Pressed" ) then
-- toggle off
if ( fibaro:getValue(mainSwitchId, "value") >= "1" ) then
fibaro:debug("Turning light off.");
fibaro:call(mainSwitchId, "turnOff");
else
-- toggle on
fibaro:debug("Turning light on.");
fibaro:call(mainSwitchId, "turnOn");
end
elseif ( action == "Pressed2" ) then
-- do some fanzy things ...
fibaro:debug("Double tapped!");
end
end
Ausgabe:
<blockquote>
[DEBUG] 12:04:02: Turning light on.
[DEBUG] 12:04:10: Turning light off.
[DEBUG] 12:04:14: Double tapped!
</blockquote>
</li>
</ol>
Das wärs wohl :)
Viel Spass damit,
Grüsse
Mario
Und hier noch das vollständige Script mit der genannten Zeitfunktion.
=> Normales Klicken des Schalters schaltet das Licht für eine gewisse Zeitdauer ein.
=> Doppeltes Klicken des Schalters schaltet das Licht für unbestimmte Zeit ein.
=> Doppeltes Klicken des Schalters, sofern das Licht bereits läuft, deaktiviert etwaige Timer und lässt das Licht auf unbestimmte Zeit brennen.
sceneControllerId ist die ID des Szenenkontrollers für den Single Switch. mainSwitchId ist die ID des S1 Schalters des Single Switch. sceneId ist die ID der Szene selbst. timeTillTurnOutLights ist die Zeit in Sekunden, nach denen das Licht abgeschaltet wird, sofern der Schalter mit einfachem Klicken betätigt wird.
--[[
%% properties
%% events
93 CentralSceneEvent
%% globals
--]]
local mainSwitchId = 94;
local sceneControllerId = 93;
local sceneId = 10;
local timeTillTurnOutLights = 15*60; -- in seconds
-- more than 2 scenes (in this case) are bad ...
if ( fibaro:countScenes() > 2 ) then
fibaro:abort();
end
local trigger = fibaro:getSourceTrigger()
-- returns whether the main switch is on or not
function isSwitchOff()
return fibaro:getValue(mainSwitchId, "value") < "1";
end
-- kills all instances of this scene
function killScenes()
fibaro:killScenes(sceneId)
end
if ( trigger["type"] ~= "other" ) then
local action = tostring(fibaro:getSourceTrigger()["event"]["data"]["keyAttribute"])
if ( action == "Pressed" ) then
if ( isSwitchOff() ) then
-- toggle on
fibaro:debug("Turning light on for " .. timeTillTurnOutLights .. "s.");
fibaro:call(mainSwitchId, "turnOn");
-- sleep till it's time to turn out the lights
fibaro:sleep(timeTillTurnOutLights * 1000);
-- finally turn out lights
fibaro:debug("Time's up, turning off light.");
fibaro:call(mainSwitchId, "turnOff");
else
-- toggle off
fibaro:debug("Turning light off.");
fibaro:call(mainSwitchId, "turnOff");
-- kill all scenes, there may be a timed scene left
killScenes();
end
elseif ( action == "Pressed2" ) then
if ( isSwitchOff() ) then
fibaro:debug("Turning light on.");
fibaro:call(mainSwitchId, "turnOn");
else
-- switch may be in timed mode
-- better kill all remaining scenes
fibaro:debug("Light is already on. Removing remaining timer ...");
killScenes();
end
else
fibaro:debug("Nothing to do ...");
end
end
Anmerkung: Mir ist bewusst, dass man anstelle von fibaro:sleep(timeTillTurnOutLights * 1000) auch eine Schleife inkl. ein paar Logausgaben verwenden könnte. Doch für meine Bedürfnisse genügt das Sleep vollkommen.