Een simpele drukknop met 2 functies (dimmen en schakelen)

Om een simpele drukknop te gebruiken om 2 toestellen aan te sturen moet je een onderscheid kunnen maken tussen een “Single Click” = éénmaal drukken en een “Double Click” = tweemaal kort achtereen drukken.

Indien de simpele drukknop geen twee of meer aparte profielen ondersteunt (zoals bvb de NodOn Soft Remote wel doet) kan je met wat programmeren in LUA toch wel zo iets benaderen.

Deze iets ingewikkeldere opstelling laat toe om met enkele druk op de knop het dimniveau te wisselen tussen 0=OFF ; 25% ; 50% ; 75% ; 100%. Wanneer je dubbel drukt op de knop wordt het andere toestel aan- of uitgeschakeld.

Hiertoe moet je 4 globale variabelen declareren (in het “Variables Panel”) per schakelaar en 2 LUA scenes maken.

1. Globale Variabelen

Maak er 4 aan; voor de naamgeving heb ik hier een conventie gebruikt om ze later gemakkelijk te identificeren. Vervang {{id1}} door het ID van de schakelaar/drukknop, {{id2}} door het ID van de eerste module die je wil schakelen met een enkele druk en {{id3}} door het ID van de derde module die je met dubbel drukken wil schakelen.

  • Push{{id1}}_1
  • Push{{id1}}_2
  • Push{{id1}}_3
  • Correct{{id1}}

2. LUA script voor het druk-event
AdvDrukknop{{id1}}_DRUK

--[[
%% properties
{{id1}} value
%% events
%% globals
--]]
local id1={{id1}} --schakelaar
local id2={{id2}} --advanced drukknop scene
local correct=fibaro:getGlobalValue("Correct"..id1)
if (correct=="0") then
fibaro:debug("Button Push Time: "..tonumber(os.time()))
fibaro:setGlobal("Push"..id1.."_3",fibaro:getGlobalValue("Push"..id1.."_2"))
fibaro:setGlobal("Push"..id1.."_2",fibaro:getGlobalValue("Push"..id1.."_1"))
fibaro:setGlobal("Push"..id1.."_1",tonumber(os.time()))
fibaro:sleep(200)
fibaro:startScene(13)
else
fibaro:setGlobal("Correct"..id1,"0")
end

3. LUA script voor de schakeling

--[[
%% properties
%% events
%% globals
--]]
local id1={{id1}} -- de schakelaar
local id2={{id2}} -- module 1 - dimmodule
local id3={{id3}} -- module 2 - schakelmodule
local correctStateOnDim=1 --correctie van de indicator op de schakelaar nodig ?
local p3=fibaro:getGlobalValue("Push"..id1.."_3")
local p2=fibaro:getGlobalValue("Push"..id1.."_2")
local p1=fibaro:getGlobalValue("Push"..id1.."_1")
fibaro:debug('Change detected in '..fibaro:getName(id1)..' with id '..id1)
local db=10
local d1=p1-p2
local d2=p2-p3
fibaro:debug('Delta 1: '..d1..' Delta 2: '..d2)
if ((d1<db) and (d2>0)) then
fibaro:debug("Double click on "..fibaro:getName(id1).." detected ")
fibaro:setGlobal("Push"..id1.."_1",0)
fibaro:setGlobal("Push"..id1.."_2",0)
fibaro:setGlobal("Push"..id1.."_3",0)
--basis drukknop routine bij double click (enkel toggle, geen overeenkomst met indicator)
local currentstate = fibaro:getValue(id3, 'value')
fibaro:debug('Current state of switch '..fibaro:getName(id3)..' : '..currentstate)
if (currentstate == "0") then
fibaro:call(id3, "turnOn")
fibaro:debug("Turning ON switch "..fibaro:getName(id3))
else
fibaro:call(id3, "turnOff")
fibaro:debug("Turning OFF switch "..fibaro:getName(id3))
end
elseif ((d1>=db) and (d2==0)) then
fibaro:debug("Single click on "..fibaro:getName(id1).." detected ")
fibaro:setGlobal("Push"..id1.."_1",0)
fibaro:setGlobal("Push"..id1.."_2",0)
fibaro:setGlobal("Push"..id1.."_3",0)
--simpele dimmer drukknop routine bij single click
local currentstate = tonumber(fibaro:getValue(id2, 'value'))
fibaro:debug('Current state of dimmer'..fibaro:getName(id2)..' : '..currentstate)
if (currentstate <= 90) then
currentstate=currentstate+25
fibaro:call(id2, "setValue",currentstate)
fibaro:debug("Setting dimmer "..fibaro:getName(id2).." to level "..currentstate.." %")
else currentstate=0
fibaro:call(id2, "turnOff")
fibaro:debug("Setting dimmer "..fibaro:getName(id2).." to OFF")
end
if (correctStateOnDim==1) then
if ((currentstate==0) and (fibaro:getValue(id1,"value")=="1")) then
fibaro:setGlobal("Correct"..id1,"1")
fibaro:call(id1,"turnOff")
elseif ((currentstate~=0) and (fibaro:getValue(id1,"value")=="0")) then
fibaro:setGlobal("Correct"..id1,"1")
fibaro:call(id1,"turnOn")
end
end
else
fibaro:setGlobal("Push"..id1.."_1",0)
fibaro:setGlobal("Push"..id1.."_2",0)
fibaro:setGlobal("Push"..id1.."_3",0)
end

Een reactie achterlaten

Je e-mailadres zal niet getoond worden. Vereiste velden zijn gemarkeerd met *

Deze website gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.

Translate »