Dimmra från 1% till 100% på angiven tid

Post Reply
Speedkiller
Ny medlem
Posts: 9
Joined: 02 Aug 2016, 01:15

09 Oct 2019, 17:35

Hej,

Jag har bekymmer att hitta något sätt att få sovrumslampan att dimmra upp på angiven tid och dag.
Har ni hittat ett vettig och simpel lösning eller är det LUA som gäller i detta fallet?

Om så, har någon möjligtvis tid att hjälpa mig med ett script i LUA som skulle kunna fungera?

Det jag önskar för funktioner är:
Aktiveringstid: 05:30.
Aktiveringsdag: Mån-Fre.
Tid för den att dimmra upp 20 min.
En enhet skall styras.
Kl 07:00 släcker den om inte det skett innan via brytaren.
Fibaro HC 2
* 4st FGS-222.
* 1st FGS-212
* 2st FGD-212
* 1st FGWPx-10x
* 5st Scener

Litet men någon stans måste man börja ;)
jang
Medlem
Posts: 149
Joined: 05 Jan 2014, 00:44
Location: Stockholm

09 Oct 2019, 22:42

Det går att göra på lite olika sätt. Bl.a med EventRunner scenen som vi har en tråd i forumet om. Dock kräver den lite Lua kunskaper.
Tänkte istället slå ett slag för en Timer scen som jag har laddat upp på Fibaro forumet.
https://forum.fibaro.com/topic/47720-sc ... e-trigger/
Där lägger man till en %% time header i sina Lua scener och så kallas scenen på dessa tider.
Här lägger vi upp 20 tider mellan 05:30 och 05:50 och skickar med en 'tag' med det värde som dimmer ska dimma till.
07:00 sätter vi den till 0
För att den ska fungera måste du ladda ner Timer.lua v2.2 som finns i länken ovan och köra igång den på din HC2.
Även om du släcker före 05:50 så kommer den att fortsätta att dimma upp til 05:50. Det går att stoppa det med en extra test.

Code: Select all

--[[
%% properties
%% events
%% globals
%% time
05:30 weekdays 2
05:31 weekdays 5
05:32 weekdays 10
05:33 weekdays 15
05:34 weekdays 20
05:35 weekdays 25
05:36 weekdays 30
05:37 weekdays 35
05:38 weekdays 40
05:39 weekdays 45
05:40 weekdays 50
05:41 weekdays 55
05:42 weekdays 60
05:43 weekdays 65
05:44 weekdays 70
05:45 weekdays 75
05:46 weekdays 80
05:47 weekdays 85
05:48 weekdays 90
05:49 weekdays 95
05:50 weekdays 99
07:00 weekdays 0
--]]

DIMMER = 109

do local a,b=fibaro;b=a.getSourceTrigger;function a:getSourceTrigger()local c=b(a)local d=a:args()if type(d)=='table'and d[1]and type(d[1])=='table'then if d[1].type~= nil then return d[1]end end;return c end end

local st=fibaro:getSourceTrigger()

if st.type=='time' and st.time then
  fibaro:debug(string.format("Triggered:%s, tag:'%s'",st.time,st.tag))
  fibaro:call(DIMMER,"setValue",tonumber(st.tag))
end

if st.type=='time' and st.tag=='error' then
  fibaro:debug("Time error:"..st.log) 
end  
RH_Dreambox
Proffsmedlem
Posts: 970
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

10 Oct 2019, 08:53

Eller så kan man använda en Dawn Simulator scen.
I den ställer man in hur lång tid ljuset skall tona upp, samt efter vilken kurva det skall ske.
Simulatorn har följande kurvor:
linear
inQuad
inExpo
outExpo
inOutQuad
inOutExpo
outInExpo

viewtopic.php?f=38&t=6355&hilit=dawn+simulator
2 st HC2 4.560 - EventRunner 3
jang
Medlem
Posts: 149
Joined: 05 Jan 2014, 00:44
Location: Stockholm

10 Oct 2019, 15:35

RH_Dreambox wrote:
10 Oct 2019, 08:53
Eller så kan man använda en Dawn Simulator scen.
viewtopic.php?f=38&t=6355&hilit=dawn+simulator
Yep, hade glömt bort att den fanns. Dock måste man ha en scheduler för att starta scenen och exkludera helger (Exempelvis Time %% scenen)

Jag fortsätter med Time%% exemplet.
En test om scenes startas upp efter 05:30 och lampan är av så insisterar den inte att fortsätta att dimmra (om ngn har vaknat och släckt lampan)
Dessutom tas start tiden från en fibaro global 'MORGON' som bör sättas till "05:30". Text från fibaro global kan substitueras in i Time%% regler med syntaxen <GLOBAL-NAME>
Kanke inte lika elegant som Dawn Simulator då man får handkoda dimm-kurvan. Å andra sidan kan man sätta den till blinkande ;)

Code: Select all

--[[
%% properties
%% events
%% globals
%% time
<MORGON>+00:00 weekdays 2
<MORGON>+00:01 weekdays 5
<MORGON>+00:02 weekdays 10
<MORGON>+00:03 weekdays 15
<MORGON>+00:04 weekdays 20
<MORGON>+00:05 weekdays 25
<MORGON>+00:06 weekdays 30
<MORGON>+00:07 weekdays 35
<MORGON>+00:08 weekdays 40
<MORGON>+00:09 weekdays 45
<MORGON>+00:10 weekdays 50
<MORGON>+00:11 weekdays 55
<MORGON>+00:12 weekdays 60
<MORGON>+00:13 weekdays 65
<MORGON>+00:14 weekdays 70
<MORGON>+00:15 weekdays 75
<MORGON>+00:16 weekdays 80
<MORGON>+00:17 weekdays 85
<MORGON>+00:18 weekdays 90
<MORGON>+00:19 weekdays 95
<MORGON>+00:20 weekdays 99
07:00 weekdays 0
--]]

DIMMER = 109

do local a,b=fibaro;b=a.getSourceTrigger;function a:getSourceTrigger()local c=b(a)local d=a:args()if type(d)=='table'and d[1]and type(d[1])=='table'then if d[1].type~= nil then return d[1]end end;return c end end

local st=fibaro:getSourceTrigger()

if os.date("%H:%M) > fibaro:getGlobalValue("MORGON") and fibaro:getValue(DIMMER,"value") == "0" then
 	fibaro:abort() -- Someone may have turned off the lights after we started to dim... just exit.
end

if st.type=='time' and st.time then
  fibaro:debug(string.format("Triggered:%s, tag:'%s'",st.time,st.tag))
  fibaro:call(DIMMER,"setValue",tonumber(st.tag))
end

if st.type=='time' and st.tag=='error' then
  fibaro:debug("Time error:"..st.log) 
end 
Speedkiller
Ny medlem
Posts: 9
Joined: 02 Aug 2016, 01:15

10 Oct 2019, 16:17

Tack för alla snabba och konsekventa svar.

Jag hittade igenom er en förenklad variant av det jag sökte,
kände mig mycket dum när jag inte hittade de i forumet tidigare vid sökningar :oops:

Denna såg verkligen simpel ut, och vid testande så fick jag den att fungera utan bekymmer hitintills.
Hittar ni något som inte är bra eller önödigt i den så får ni gärna komma med input :?

viewtopic.php?f=21&t=4081&p=9857&hilit=wakeup#p9857
Fibaro HC 2
* 4st FGS-222.
* 1st FGS-212
* 2st FGD-212
* 1st FGWPx-10x
* 5st Scener

Litet men någon stans måste man börja ;)
jang
Medlem
Posts: 149
Joined: 05 Jan 2014, 00:44
Location: Stockholm

11 Oct 2019, 15:33

Ok, bra att du hittade en lösning.

För att avsluta så kan jag visa hur det skulle se ut i ER med kurvorna från Dawn simulatorn. Här avbryts dimningen om ngn ändra värdet manuellt, ex. genom att släcka eller tända lampan under tiden den dimmar.

Code: Select all

function main()
 :
 :
  do -- Dawn simulator code 
    equations = {
      linear = function(t, b, c, d) return c * t / d + b; end,
      inQuad = function(t, b, c, d) t = t / d; return c * math.pow(t, 2) + b; end,
      inOutQuad = function(t, b, c, d) t = t / d * 2; return t < 1 and c / 2 * math.pow(t, 2) + b or -c / 2 * ((t - 1) * (t - 3) - 1) + b end,
      outInExpo = function(t, b, c, d) return t < d / 2 and equations.outExpo(t * 2, b, c / 2, d) or equations.inExpo((t * 2) - d, b + c / 2, c / 2, d) end,
      inExpo = function(t, b, c, d) return t == 0 and b or c * math.pow(2, 10 * (t / d - 1)) + b - c * 0.001 end,
      outExpo = function(t, b, c, d) return t == d and  b + c or c * 1.001 * (-math.pow(2, -10 * t / d) + 1) + b end,
      inOutExpo = function(t, b, c, d)
        if t == 0 then return b elseif t == d then return b + c end
        t = t / d * 2
        if t < 1 then return c / 2 * math.pow(2, 10 * (t - 1)) + b - c * 0.0005 else t = t - 1; return c / 2 * 1.0005 * (-math.pow(2, -10 * t) + 2) + b end
      end,
    }

    Event.event({type='dimLight'},function(env)
        local e,f = env.event,equations[env.event.curve] or equations['linear']
        e.dir,e.start = e.dir or 1,e.start or 0
        e.t = e.t or e.dir==1 and 0 or e.duration
        local currV = tonumber(fibaro:getValue(e.id,"value"))
        if e.v and currV ~= e.v then return end -- Someone changed the lightning, stop dimming
        e.v = math.floor(f(e.t,e.start,e.stop,e.duration)+0.5)
        fibaro:call(e.id,"setValue",e.v)
        e.t=e.t+e.dir*e.interval
        if 0 <= e.t and  e.t <= e.duration then Event.post(e,os.time()+e.interval) end
      end)
  end

  rule("lampID=199")
  -- Ex. Dimma upp 05:30, dimma i 20min, stega med 1 minut. släck 07:00, vardagar
  rule("@05:30 & wday('mon-fri') => post(#dimLight{id=lampID,start=0,stop=99,duration=00:20,interval=00:01,curve='outInExpo'})")
  rule("@07:00 => lampID:off")
 
  --Ex. Dimma ned (dir = -1)
  rule("@22:00 & wday('mon-fri') => post(#dimLight{id=lampID,dir=-1,start=0,stop=99,duration=00:20,interval=00:01,curve='outInExpo'})")
 
 end -- en main()
  
sonnyboy
Proffsmedlem
Posts: 642
Joined: 26 Sep 2013, 08:05
Location: Västerås

11 Oct 2019, 15:46

Denna nyper jag direkt när jag kommer hem :)
Tack @Jang för du delar med dig :)
jang wrote:
11 Oct 2019, 15:33
Ok, bra att du hittade en lösning.

För att avsluta så kan jag visa hur det skulle se ut i ER med kurvorna från Dawn simulatorn. Här avbryts dimningen om ngn ändra värdet manuellt, ex. genom att släcka eller tända lampan under tiden den dimmar.

Code: Select all

function main()
 :
 :
  do -- Dawn simulator code 
    equations = {
      linear = function(t, b, c, d) return c * t / d + b; end,
      inQuad = function(t, b, c, d) t = t / d; return c * math.pow(t, 2) + b; end,
      inOutQuad = function(t, b, c, d) t = t / d * 2; return t < 1 and c / 2 * math.pow(t, 2) + b or -c / 2 * ((t - 1) * (t - 3) - 1) + b end,
      outInExpo = function(t, b, c, d) return t < d / 2 and equations.outExpo(t * 2, b, c / 2, d) or equations.inExpo((t * 2) - d, b + c / 2, c / 2, d) end,
      inExpo = function(t, b, c, d) return t == 0 and b or c * math.pow(2, 10 * (t / d - 1)) + b - c * 0.001 end,
      outExpo = function(t, b, c, d) return t == d and  b + c or c * 1.001 * (-math.pow(2, -10 * t / d) + 1) + b end,
      inOutExpo = function(t, b, c, d)
        if t == 0 then return b elseif t == d then return b + c end
        t = t / d * 2
        if t < 1 then return c / 2 * math.pow(2, 10 * (t - 1)) + b - c * 0.0005 else t = t - 1; return c / 2 * 1.0005 * (-math.pow(2, -10 * t) + 2) + b end
      end,
    }

    Event.event({type='dimLight'},function(env)
        local e,f = env.event,equations[env.event.curve] or equations['linear']
        e.dir,e.start = e.dir or 1,e.start or 0
        e.t = e.t or e.dir==1 and 0 or e.duration
        local currV = tonumber(fibaro:getValue(e.id,"value"))
        if e.v and currV ~= e.v then return end -- Someone changed the lightning, stop dimming
        e.v = math.floor(f(e.t,e.start,e.stop,e.duration)+0.5)
        fibaro:call(e.id,"setValue",e.v)
        e.t=e.t+e.dir*e.interval
        if 0 <= e.t and  e.t <= e.duration then Event.post(e,os.time()+e.interval) end
      end)
  end

  rule("lampID=199")
  -- Ex. Dimma upp 05:30, dimma i 20min, stega med 1 minut. släck 07:00, vardagar
  rule("@05:30 & wday('mon-fri') => post(#dimLight{id=lampID,start=0,stop=99,duration=00:20,interval=00:01,curve='outInExpo'})")
  rule("@07:00 => lampID:off")
 
  --Ex. Dimma ned (dir = -1)
  rule("@22:00 & wday('mon-fri') => post(#dimLight{id=lampID,dir=-1,start=0,stop=99,duration=00:20,interval=00:01,curve='outInExpo'})")
 
 end -- en main()
  
Fibaro HomeCenter 2
Fw 4.550
BeyondMeasure 1.10
EventRunner
sonnyboy
Proffsmedlem
Posts: 642
Joined: 26 Sep 2013, 08:05
Location: Västerås

11 Oct 2019, 17:37

Är det något mera som man ska tänka på för att fungera?
får detta i loggen men inget händer.

Code: Select all

[DEBUG] 17:33:00: [true]>>'Rule:40[@17:33 & wday('mon-fri') => post(#dimLight{id=lampID,start=0,stop=99,duration=00...]'
Har bara ändrat tiden allt annat är som i ditt förslag.
Fibaro HomeCenter 2
Fw 4.550
BeyondMeasure 1.10
EventRunner
jang
Medlem
Posts: 149
Joined: 05 Jan 2014, 00:44
Location: Stockholm

11 Oct 2019, 17:56

sonnyboy wrote:
11 Oct 2019, 17:37
Är det något mera som man ska tänka på för att fungera?
får detta i loggen men inget händer.

Code: Select all

[DEBUG] 17:33:00: [true]>>'Rule:40[@17:33 & wday('mon-fri') => post(#dimLight{id=lampID,start=0,stop=99,duration=00...]'
Har bara ändrat tiden allt annat är som i ditt förslag.
Är det en dimmbar lampa?

Ser det ut såhär?

Code: Select all

function main()
 :
 :
  do -- Dawn simulator code 
    equations = {
      linear = function(t, b, c, d) return c * t / d + b; end,
      inQuad = function(t, b, c, d) t = t / d; return c * math.pow(t, 2) + b; end,
      inOutQuad = function(t, b, c, d) t = t / d * 2; return t < 1 and c / 2 * math.pow(t, 2) + b or -c / 2 * ((t - 1) * (t - 3) - 1) + b end,
      outInExpo = function(t, b, c, d) return t < d / 2 and equations.outExpo(t * 2, b, c / 2, d) or equations.inExpo((t * 2) - d, b + c / 2, c / 2, d) end,
      inExpo = function(t, b, c, d) return t == 0 and b or c * math.pow(2, 10 * (t / d - 1)) + b - c * 0.001 end,
      outExpo = function(t, b, c, d) return t == d and  b + c or c * 1.001 * (-math.pow(2, -10 * t / d) + 1) + b end,
      inOutExpo = function(t, b, c, d)
        if t == 0 then return b elseif t == d then return b + c end
        t = t / d * 2
        if t < 1 then return c / 2 * math.pow(2, 10 * (t - 1)) + b - c * 0.0005 else t = t - 1; return c / 2 * 1.0005 * (-math.pow(2, -10 * t) + 2) + b end
      end,
    }

    Event.event({type='dimLight'},function(env)
        local e,f = env.event,equations[env.event.curve] or equations['linear']
        e.dir,e.start = e.dir or 1,e.start or 0
        e.t = e.t or e.dir==1 and 0 or e.duration
        local currV = tonumber(fibaro:getValue(e.id,"value"))
        if e.v and currV ~= e.v then return end -- Someone changed the lightning, stop dimming
        e.v = math.floor(f(e.t,e.start,e.stop,e.duration)+0.5)
        fibaro:call(e.id,"setValue",e.v)
        e.t=e.t+e.dir*e.interval
        if 0 <= e.t and  e.t <= e.duration then Event.post(e,os.time()+e.interval) end
      end)
  end

 rule("@17:33 & wday('mon-fri') => post(#dimLight{id=lampID,start=0,stop=99,duration=00:20,interval=00:01,curve='outInExpo'})")
För mig tuffar den på och ändrar dim 1 gång i minuten i 20min.
rule("@17:33 & wday('mon-fri') => post(#dimLight{id=lampID,start=0,stop=99,duration=00:00:20,interval=00:00:01,curve='outInExpo'})")
Kör den på 20s med 1s steps.

Tips, om man vill testa en tidsregel direkt kan man skriva
rule("@now+2 & wday('mon-fri') => post(#dimLight...
så startar den 2 sekunder efter att scenen startat.
jang
Medlem
Posts: 149
Joined: 05 Jan 2014, 00:44
Location: Stockholm

11 Oct 2019, 18:08

En gång i minuten så borde du få en logg om _debugFlags.post är true.
jang
Medlem
Posts: 149
Joined: 05 Jan 2014, 00:44
Location: Stockholm

11 Oct 2019, 19:14

Jag har lagt in 'dim' som en standard feature i ER v3 B67.

Code: Select all

fibaro:call(199,'dim',20,'up',1,'outExpo',0,99)
--dimmar upp device 199 under 20s, med 1s steg, funktion 'outExpo' och start 0 och stop 99
fibaro:call(199,'dim',20)
--dimmar upp device 199 under 20s, med 1s steg, funktion 'linear' och start 0 och stop 99
med EventScript regler blir det

Code: Select all

rule("@05:30 => 199:dim={20,'up',1,'outExpo',0,99}")
-- eller
rule("@05:30 => 199:dim={20,'up'}") -- defaults to linear
RH_Dreambox
Proffsmedlem
Posts: 970
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

12 Oct 2019, 11:18

Ja, vad mer kan man säga än att "Gud hör bön" :D
En liten kort regel, och det fungerar strålande bra! Nu kan jag skippa scenen Dawn Simulator!
EDIT:
@jang, den där steg-parametern (tex. 1 s) är väl onödig?
Kan man inte bara ta och dela dim-tiden med skillnaden för start och stopp?
Med start 0 och stopp 99 och dim-tid 300 sek så delas 300 upp i 100 dim-steg?
2 st HC2 4.560 - EventRunner 3
jang
Medlem
Posts: 149
Joined: 05 Jan 2014, 00:44
Location: Stockholm

12 Oct 2019, 13:41

RH_Dreambox wrote:
12 Oct 2019, 11:18
@jang, den där steg-parametern (tex. 1 s) är väl onödig?
Kan man inte bara ta och dela dim-tiden med skillnaden för start och stopp?
Med start 0 och stopp 99 och dim-tid 300 sek så delas 300 upp i 100 dim-steg?
Det är lite knepigt. Om vi beräknar 100 punkter på kurvan, vilka punkter är intressanta? Om vi fördelar de jämt över intervallet så kanske vi får många punkter som är samma (på flacka partier) och få där det är intressant (ex. branta partier). Det blir ännu större problem om vi drar ut de 100 punkterna över ett större tidsintervall, ex 1 timme. Har vi en linjär kurva spelar det inte så stor roll.
Iden med steglängd definerad i tid är att man kan anpassa själv lite. Tid istället för antal steg kändes mer intuitivt men det kan vara feltänkt.
Med 1s steglängd på 300s så beräknar vi 300 värden på en kurva från 0-99 och kanske vi plockar upp intressanta partierna i kurvan. Man skulle kunna sätta steglängd alltid till 1s, vilket också är default.

I nästa version så gör jag inget fibaro:call om värdet är samma som föregående för att minska på trafiken lite, så många små steglängder borde inte göra så mycket.
Post Reply