Een simpele drukknop gebruiken voor een dimmer

Stel, je hebt een drukknop die niet elektrisch gekoppeld is aan een dimmende lamp. Nu wil je die drukknop gebruiken om die lamp toch te laten aan gaan, vervolgens in 4 stappen door de dimmer te gaan en weer uit te gaan. Onderstaand vind je de LUA code hiervoor.
Vul de waarde voor id1 met het ID van de drukknop en id2 met het ID van de schakelaar en vervang {{id1}} door het ID van de drukknop.

--[[
%% properties
{{id1}} value
%% events
%% globals
--]]
local id1=xx
local id2=xx
fibaro:debug('Change detected in '..fibaro:getName(id1)..' with id '..id1..'. New Value: '..fibaro:getValue(id1,'value'))
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

Een drukknop gebruiken om een contact aan en uit te doen

Stel, je hebt een drukknop die niet elektrisch gekoppeld is aan een lamp. Nu wil je die drukknop gebruiken om die lamp toch te laten aan en weer uit gaan. Onderstaand vind je de LUA code hiervoor.
Vul de waarde voor id1 met het ID van de drukknop en id2 met het ID van de schakelaar en vervang {{id1}} door het ID van de drukknop.

--[[
%% properties
{{id1}} value
%% events
%% globals
--]]
local id1=xx
local id2=xx
fibaro:debug('Change detected in '..fibaro:getName(id1)..' with id '..id1..'. New Value: '..fibaro:getValue(id1,'value'))
local currentstate = fibaro:getValue(id2, 'value')
fibaro:debug('Current state of switch '..fibaro:getName(id2)..' : '..currentstate)
if ((currentstate == "0") and (fibaro:getValue(id1,'value')=="1")) then
fibaro:call(id2, "turnOn")
fibaro:debug("Turning ON switch "..fibaro:getName(id2))
else
fibaro:call(id2, "turnOff")
fibaro:debug("Turning OFF switch "..fibaro:getName(id2))
end

Een simpele drukknop met 2 functies (2 x 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.

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

1. Globale Variabelen

Maak er 3 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

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
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(id2)

3. LUA script voor de schakeling

--[[
%% properties
%% events
%% globals
--]]
local id1=37 -- de schakelaar
local id2=34 -- module 1 - enkele klik
local id3=48 -- module 2 - dubbele klik
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 ((d10)) 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)
--basis drukknop routine bij single click
local currentstate = fibaro:getValue(id2, 'value')
fibaro:debug('Current state of switch '..fibaro:getName(id2)..' : '..currentstate)
if ((currentstate == "0") and (fibaro:getValue(id1,'value')=="1")) then
fibaro:call(id2, "turnOn")
fibaro:debug("Turning ON switch "..fibaro:getName(id2))
else
fibaro:call(id2, "turnOff")
fibaro:debug("Turning OFF switch "..fibaro:getName(id2))
end
else
fibaro:setGlobal("Push"..id1.."_1",0)
fibaro:setGlobal("Push"..id1.."_2",0)
fibaro:setGlobal("Push"..id1.."_3",0)
end

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 simpele drukknop voor dimmer met betere spreiding

Stel, je hebt een drukknop die niet elektrisch gekoppeld is aan een dimmende lamp. Nu wil je die drukknop gebruiken om die lamp toch te laten aan gaan, vervolgens in een paar stappen door de dimmer te gaan en weer uit te gaan.In de vorige post hierover vond je een wiskundige spreiding voor de dimwaarden (per 25%). Nu is dit met de meeste lampen niet logisch omdat die naarmate je meer bij de 100% komt niet veel harder branden. Vandaar heb ik hier geprobeerd om wat waarden te pakken die beter uitkomen.

Onderstaand vind je de LUA code hiervoor.
Vul de waarde voor id1 met het ID van de drukknop en id2 met het ID van de schakelaar en vervang {{id1}} door het ID van de drukknop.

--[[

%% properties

{{id1}} value

%% events

%% globals

--]]

local id1=xx

local id2=xx

fibaro:debug('Change detected in '..fibaro:getName(id1)..' with id '..id1..'. New Value: '..fibaro:getValue(id1,'value'))

local currentstate = tonumber(fibaro:getValue(id2, 'value'))

fibaro:debug('Current state of dimmer'..fibaro:getName(id2)..' : '..currentstate)

  local oldpush=fibaro:getGlobal("Push"..id1.."_1")

  local newpush=tonumber(os.time())

  fibaro:setGlobal("Push"..id1.."_1",newpush)

  fibaro:debug('first push: '..oldpush..' second push: '..newpush..' delta: '..newpush-oldpush) 

if (currentstate == 0) then

currentstate=35

elseif (currentstate == 35) then

currentstate=55

elseif (currentstate == 55) then

currentstate=70

elseif (currentstate == 70) then

currentstate=100

elseif (currentstate >90) then

currentstate=0

fibaro:call(id2, "turnOff")

fibaro:debug("Setting dimmer "..fibaro:getName(id2).." to OFF")

end

  if ((newpush-oldpush>30) and (currentstate~=10)) then

    currentstate=0

    fibaro:call(id2, "turnOff")

    fibaro:debug("Setting dimmer "..fibaro:getName(id2).." to OFF")

    if (fibaro:getValue(id1,"value")=="1") then

      fibaro:setGlobal("Correct"..id1,"1")

      fibaro:call(id1,"turnOff")

    end

  end

if (currentstate~=0) then

fibaro:call(id2, "setValue",currentstate)

fibaro:debug("Setting dimmer "..fibaro:getName(id2).." to level "..currentstate.." %")

end

Versie 2 MET correctie van de indicator van de schakelaar.

Indien u een schakelaar die een indicator heeft gebruikt, zal de indicatie bij de standaard procedure niet meer kloppen. Om dit te corrigeren onderstaande. Hiervoor moet u in het “Variables Panel” een globale variabele aanmaken.

Globale variabele

    • Correct{{id1}}

LUA Scene

--[[

%% properties

{{id1}} value

%% events

%% globals

--]]

local id1=xx

local id2=xx

fibaro:debug('Change detected in '..fibaro:getName(id1)..' with id '..id1..'. New Value: '..fibaro:getValue(id1,'value'))

local currentstate = tonumber(fibaro:getValue(id2, 'value'))

if (fibaro:getGlobalValue("Correct"..id1)=="0") then

fibaro:debug('Current state of dimmer'..fibaro:getName(id2)..' : '..currentstate)

  local oldpush=fibaro:getGlobal("Push"..id1.."_1")

  local newpush=tonumber(os.time())

  fibaro:setGlobal("Push"..id1.."_1",newpush)

  fibaro:debug('first push: '..oldpush..' second push: '..newpush..' delta: '..newpush-oldpush) 

if (currentstate == 0) then

currentstate=35

elseif (currentstate == 35) then

currentstate=55

elseif (currentstate == 55) then

currentstate=70

elseif (currentstate == 70) then

currentstate=100

elseif (currentstate >90) then

currentstate=0

fibaro:call(id2, "turnOff")

fibaro:debug("Setting dimmer "..fibaro:getName(id2).." to OFF")

if (fibaro:getValue(id1,"value")=="1") then

fibaro:setGlobal("Correct"..id1,"1")

fibaro:call(id1,"turnOff")

end

end

  if ((newpush-oldpush>30) and (currentstate~=10)) then

    currentstate=0

    fibaro:call(id2, "turnOff")

    fibaro:debug("Setting dimmer "..fibaro:getName(id2).." to OFF")

    if (fibaro:getValue(id1,"value")=="1") then

      fibaro:setGlobal("Correct"..id1,"1")

      fibaro:call(id1,"turnOff")

    end

  end

if (currentstate~=0) then

fibaro:call(id2, "setValue",currentstate)

fibaro:debug("Setting dimmer "..fibaro:getName(id2).." to level "..currentstate.." %")

if (fibaro:getValue(id1,"value")=="0") then

fibaro:setGlobal("Correct"..id1,"1")

fibaro:call(id1,"turnOn")

end

end

else

fibaro:setGlobal("Correct"..id1,"0")

end

Universele Tijd Sturing

Onderstaande LUA scene kan je gebruiken als tijdssturing. Vermits ik voor zonsopgang en zonsondergang met globale variabelen wil werken, moeten deze op voorhand wel gedefinieerd zijn:

  • G_ZonStatus

Hierbij de code. Je kan in de “timeEventMatrix” gewoon je tijdsgetriggerde scenes toevoegen als array (de eerste moet je laten staan):

“op welke dagen”,”startuur”,”startminuut”,”op te roepen sceneID”,”tekst voor debug”,”0″

--[[

%% autostart

%% properties

%% events

%% globals

--]]



-- "day", "hour", "minute"

-- day "zondag"=0 ; "maandag"=1 ; ... ; "zaterdag"=6 ; "all"=7

local timeEventMatrix={

  {"7","0","1","special","Sun Change","0"}, --default event to update sunrise and sunset time

  {"1","10","44","24","TimeScene","0"}

  }



local timeEvents=#timeEventMatrix



local sr_Hour=0

local sr_Minute=0

local ss_Hour=0

local ss_Minute=0



function FN_Event(day,hour,minute)

  fibaro:debug("Running Event at day "..day.." hour "..hour..":"..minute)

  if ((tonumber(hour)==0) and (tonumber(minute)==1)) then

    local ss=fibaro:getValue(1, "sunsetHour")

    ss_Hour=tonumber(string.sub(ss, 1 , 2))

    ss_Minute=tonumber(string.sub(ss,4) )

--    fibaro:debug("sunset hour: "..ss_Hour.." minute: "..ss_Minute)

    local sr=fibaro:getValue(1, "sunriseHour")

    sr_Hour=tonumber(string.sub(sr, 1 , 2))

    sr_Minute=tonumber(string.sub(sr,4) )

--    fibaro:debug("sunset hour: "..sr_Hour.." minute: "..sr_Minute)

	for i = 2,timeEvents do

--    fibaro:debug("reset event runstats")

      timeEventMatrix[i][6]="0"

    end

  end

  if ((tonumber(hour)==sr_Hour) and (tonumber(minute)==sr_Minute)) then

    fibaro:debug("Sunrise Event - setting G_Zonstatus")

    FN_SunriseEvent()

  elseif ((tonumber(hour)==ss_Hour) and (tonumber(minute)==ss_Minute)) then

    fibaro:debug("Sunset Event - setting G_Zonstatus")

    FN_SunsetEvent()

  end  

  for i = 2,timeEvents do

	if ((day==timeEventMatrix[i][1]) and (hour==timeEventMatrix[i][2]) and (minute==timeEventMatrix[i][3]) and (timeEventMatrix[i][6]~="1")) then

      fibaro:debug("Event "..i.." executing scene: "..timeEventMatrix[i][5])

      fibaro:startScene(timeEventMatrix[i][4])

      timeEventMatrix[i][6]="1"

    end

  end

end



function FN_SunriseEvent()

  fibaro:setGlobal("G_ZonStatus","1")

end



function FN_minToSunrise(time_hour,time_minute)

  if (time_hour*60+time_minute)<=(sr_Hour*60+sr_Minute) then

    return ((sr_Hour*60+sr_Minute)-(time_hour*60+time_minute))

  else

    return ((sr_Hour*60+sr_Minute)+(24*60)-(time_hour*60+time_minute))

  end  

end



function FN_SunsetEvent()

  fibaro:setGlobal("G_ZonStatus","0")

end



function FN_minToSunset(time_hour,time_minute)

  if (time_hour*60+time_minute)<=(ss_Hour*60+ss_Minute) then

    return ((ss_Hour*60+ss_Minute)-(time_hour*60+time_minute))

  else

    return ((24*60)-(time_hour*60+time_minute)+(ss_Hour*60+ss_Minute))

  end  

end



function FN_timeDiff(fromDay,fromHour,fromMinute,toDay,toHour,toMinute)

--  fibaro:debug("timediff between "..fromDay.." - "..fromHour..":"..fromMinute.." to "..toDay.." - "..toHour..":"..toMinute)

  if (toDay==7) then

    if (fromHour*60+fromMinute)<=(toHour*60+toMinute) then

      return ((toHour*60+toMinute)-(fromHour*60+fromMinute))

    else

      return ((24*60)-(fromHour*60+fromMinute)+(toHour*60+toMinute))

    end

  end

  if (fromDay==toDay) then

    if (fromHour*60+fromMinute)<=(toHour*60+toMinute) then

      return ((toHour*60+toMinute)-(fromHour*60+fromMinute))

    else

      return ((24*60*7)+(24*60)-(fromHour*60+fromMinute)+(toHour*60+toMinute))

    end

  elseif ((fromDay<toDay) and (toDay~=7)) then return ((24*60)-(fromHour*60+fromMinute)+(toDay-fromDay-1)*(24*60)+(toHour*60+toMinute)) elseif (fromDay>toDay) then

    return ((24*60)-(fromHour*60+fromMinute)+(24*60*(6-fromDay+toDay))+(toHour*60+toMinute))

  end

end  



function calcSleep(time_day,time_hour,time_minute)

  local sleepToSunset=FN_minToSunset(tonumber(time_hour),tonumber(time_minute))

--  fibaro:debug("Time to Sunset: "..sleepToSunset.." min")

  local idevent="SunSet"

  local sleepToSunrise=FN_minToSunrise(tonumber(time_hour),tonumber(time_minute))

--  fibaro:debug("Time to Sunrise: "..sleepToSunrise.." min")

  local minsleep=sleepToSunset

  if (sleepToSunrise<minsleep) then 

    minsleep=sleepToSunrise 

    idevent="SunRise"

  end

  for i = 1,timeEvents do

    local es=FN_timeDiff(tonumber(time_day),tonumber(time_hour),tonumber(time_minute),tonumber(timeEventMatrix[i][1]),tonumber(timeEventMatrix[i][2]),tonumber(timeEventMatrix[i][3]))

--    fibaro:debug("Sleep to event "..i.." : "..es.." min")

    if (es<minsleep) then minsleep=es idevent=timeEventMatrix[i][2]..":"..timeEventMatrix[i][3] end end fibaro:debug("Selected Event at "..idevent.." sleeptime: "..minsleep.." min") return minsleep end FN_Event("7","0","1") while true do local sleepNow=calcSleep(os.date("%w"),os.date("%H"),os.date("%M"))*60*1000 -- fibaro:debug("Sleeptime to nearest Event: "..sleepNow) if (sleepNow>=60000) then

    sleepNow=sleepNow-30000

  	fibaro:debug("Sleeping for: "..sleepNow.." milliseconds")

    fibaro:sleep(sleepNow)

  else

    FN_Event(os.date("%w"),os.date("%H"),os.date("%M"))

    fibaro:debug("Sleeping for: 60000 milliseconds")

    fibaro:sleep(60000)

  end  

end