Single Switch 2 (FGS-213) zur Szenensteuerung

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.

Für eure Hilfe bin ich auf jeden Fall dankbar :slight_smile:

Grüsse aus der Schweiz,
Mario

Hi,

Unabhängig von den Parametern etc wird ein Doppelklick mit dem Schalter ggf nicht immer fehlerfrei registriert.
Die untergeordneten Module sind entscheidend.

Viele Grüße Hoggle

@Hoggle: Wie meinst du, dass die untergeordneten Module entscheidend sind?

Wegen Deiner Frage, welche IDs du nehmen sollst.

Ok, wenn ich das richtig verstehe, müsste das Ganze etwa wie folgt ausschauen.

LUA:


--[[
%% properties
94 sceneActivation
%% globals
--]]

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?

Grüsse
Mario

parameter.png

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.

Viele Grüße Hoggle

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 

Ausgabe:

[DEBUG] 11:00:45: {"keyId":1,"deviceId":93,"keyAttribute":"Pressed","icon":{}} [DEBUG] 11:00:45: S1 tapped!

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).

Gruss
Mario

Salü :slight_smile:
Ok, ich habe es geschafft.
Hier für alle interessierten noch die Vorgehensweise.

  1. Für S1 und S2 folgende Z-Wave Parameter selektieren:
  2. Den Schalter nicht an S1 hängen, sondern an S2!
  3. Eine LUA Szene erstellen (hier eine, welche die Basisfunktionalität des Schalters beinhaltet): ```

    –[[
    %% properties
    %% events
    93 CentralSceneEvent
    %% globals
    –]]

    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.

Grüsse
Mario