Lua kod för att styra lampor beroende på veckor?
Hej,
Undrar ifall någon kan hjälpa mig att göra en lua kod för att tända och släcka olika lampor en speciell tid på udda veckor och andra tider på jämna veckor. Om möjligt också att enkelt kunna ändra tider. Tanken är att den ska tända då man börjar jobba tidigare och sedan tända annan tid då man börjar senare.
Tack på förhand
Undrar ifall någon kan hjälpa mig att göra en lua kod för att tända och släcka olika lampor en speciell tid på udda veckor och andra tider på jämna veckor. Om möjligt också att enkelt kunna ändra tider. Tanken är att den ska tända då man börjar jobba tidigare och sedan tända annan tid då man börjar senare.
Tack på förhand
- RH_Dreambox
- Z-Wave Kung
- Posts: 1192
- Joined: 03 Jan 2015, 16:49
- 9
- Location: Vegby
- Contact:
Om du vill få ut det mesta möjliga av din HC2 så rekommenderar jag starkt att du installerar EventRunner.
Där kan du enkelt lägga in dina enheter och styra dem precis som du vill
Ett exempel på hur det kan se ut ser du här nedan. Annars finns det massor av exempel här på forumet.
Inlägg om EventRunner hittar du här: viewtopic.php?f=38&t=6878
EventRunner laddar du ned här: https://github.com/jangabrielsson/EventRunner
Deklaration av dina lampor
Och så här kan dina regler se ut
Där kan du enkelt lägga in dina enheter och styra dem precis som du vill
Ett exempel på hur det kan se ut ser du här nedan. Annars finns det massor av exempel här på forumet.
Inlägg om EventRunner hittar du här: viewtopic.php?f=38&t=6878
EventRunner laddar du ned här: https://github.com/jangabrielsson/EventRunner
Deklaration av dina lampor
Code: Select all
local HT = -- Example of in-line "home table"
{
dev =
{ sovrum = {lampa = 46},
hall = {lampa = 81},
},
other = "other"
}
Code: Select all
-- Tänd och släck udda veckor ( Udda vecka = 1 )
rule("@06:30 & wday('mon-fri') & wnum%2 == 1 => sovrum.lampa:on") -- Tänd Mån - Fre, udda vecka
rule("@07:30 & wday('mon-fri') & wnum%2 == 1 => sovrum.lampa:off")
rule("@06:00 & wday('mon-fri') & wnum%2 == 1 => hall.lampa:on")
rule("@07:30 & wday('mon-fri') & wnum%2 == 1 => hall.lampa:off")
-- Tänd och släck jämna veckor ( Jämn vecka = 0 )
rule("@05:30 & wday('mon-fri') & wnum%2 == 0 => sovrum.lampa:on") -- Tänd Mån - Fre, jämn vecka
rule("@06:30 & wday('mon-fri') & wnum%2 == 0 => sovrum.lampa:off")
rule("@05:00 & wday('mon-fri') & wnum%2 == 0 => hall.lampa:on")
rule("@06:30 & wday('mon-fri') & wnum%2 == 0 => hall.lampa:off")
-- Tänd och släck på helger
rule("@07:30 & sunrise > 07:30 & wday('sat-sun') => sovrum.lampa:on") Tänd 07:30 men inte om solen redan gått upp
rule("@sunrise & wday('sat-sun') => sovrum.lampa:off") -- Släck då solen går upp
rule("@07:00 & wday('sat-sun') => hall.lampa:on")
rule("@08:30 & wday('sat-sun') => hall.lampa:off")
Min gamla ombyggda HC2 har fått ett nytt liv och min HC3 är nu nedkopplad.
HC2 med Home Assistant har blivit en riktig Game Changer och nu har jag hemautomatik på riktigt.
https://www.zwaveforum.se/viewtopic.php?t=7087
HC2 med Home Assistant har blivit en riktig Game Changer och nu har jag hemautomatik på riktigt.
https://www.zwaveforum.se/viewtopic.php?t=7087
RH_Dreambox wrote: ↑13 Sep 2019, 11:46
EventRunner laddar du ned här: https://github.com/jangabrielsson/EventRunner
Ursäkta dum fråga, är det EventRunner3.lua som man ska ta hem, eller är det flera?
- RH_Dreambox
- Z-Wave Kung
- Posts: 1192
- Joined: 03 Jan 2015, 16:49
- 9
- Location: Vegby
- Contact:
EventRunner3.lua är det enda du behöver.
Filen innehåller redan lite konfigureringar som exempel, men de skall du ta bort och ersätta med dina egna.
Men rör inget under den här raden: ------------------- EventModel - Don't change! --------------------
Om du läser tråden från början så hittar du säkert svar på många av dina frågor. Om inte, så är vi många som kan hjälpa dig att komma igång.
Och om du aktiverar den här raden
dvs. tar bort de inledande minustecknen så ser du om skriptet fungerar.
Då skrivs Ding, Dong regelbundet i loggfilen. Inaktivera raden igen när du ser att allt funkar.
Filen innehåller redan lite konfigureringar som exempel, men de skall du ta bort och ersätta med dina egna.
Men rör inget under den här raden: ------------------- EventModel - Don't change! --------------------
Om du läser tråden från början så hittar du säkert svar på många av dina frågor. Om inte, så är vi många som kan hjälpa dig att komma igång.
Och om du aktiverar den här raden
Code: Select all
-- rule("@@00:00:05 => f=!f; || f >> log('Ding!') || true >> log('Dong!')") -- example rule logging ding/dong every 5 second
Då skrivs Ding, Dong regelbundet i loggfilen. Inaktivera raden igen när du ser att allt funkar.
Min gamla ombyggda HC2 har fått ett nytt liv och min HC3 är nu nedkopplad.
HC2 med Home Assistant har blivit en riktig Game Changer och nu har jag hemautomatik på riktigt.
https://www.zwaveforum.se/viewtopic.php?t=7087
HC2 med Home Assistant har blivit en riktig Game Changer och nu har jag hemautomatik på riktigt.
https://www.zwaveforum.se/viewtopic.php?t=7087
Ding, dong fungerar
Om jag har en lampa som jag vill sätt dimmern till 30%, hur görs det?
Var lägger jag in min regel?
Och behöver jag ändra något i början?
--[[
%% properties
17 value
55 value
56 value
57 value
88 value
%% events
5 CentralSceneEvent
22 GeofenceEvent
%% globals
TimeOfDay
Test
%% autostart
--]]
Om jag har en lampa som jag vill sätt dimmern till 30%, hur görs det?
Var lägger jag in min regel?
Och behöver jag ändra något i början?
--[[
%% properties
17 value
55 value
56 value
57 value
88 value
%% events
5 CentralSceneEvent
22 GeofenceEvent
%% globals
TimeOfDay
Test
%% autostart
--]]
En "clean" start på ER kan se ut såhär
Sätt gärna upp HT variabeln som i koden nedan. Sedan kan man också lagra den i en global men det är inte strikt nödvändigt.
Finns en del bra tips i den här posten - men jag svarar gärna på frågor här också.
https://forum.fibaro.com/topic/31180-tu ... ent=159939
Sätt gärna upp HT variabeln som i koden nedan. Sedan kan man också lagra den i en global men det är inte strikt nödvändigt.
Code: Select all
--[[
%% properties
%% events
%% globals
%% autostart
--]]
if dofile and not _EMULATED then _EMULATED={name="EventRunner",id=99,maxtime=24} dofile("HC2.lua") end -- For HC2 emulator
local _version,_fix = "3.0","B64" -- Sep 12, 2019
local _sceneName = "Texan smart hem" -- Set to scene/script name
-- debug flags for various subsystems (global)
_debugFlags = {
post=true,invoke=false,triggers=true,dailys=false,rule=false,ruleTrue=false,
fcall=true, fglobal=false, fget=false, fother=false, hue=false, telegram=false, nodered=false,
}
-- options for various subsystems (global)
_options=_options or {}
---------- Main ------------ Here goes your rules ----------------
function main()
local rule,define = Rule.eval, Util.defvar
local HT = -- Definiera dina deviceID här för lampor som ska tändas / släckas
{ bedroom = {lampaTak = 88, lampaBed = 99},
kitchen = {lampaBord = 66, lampaTak = 77},
}
Util.defvars(HT) -- Make HomeTable variables available in EventScript
Util.reverseMapDef(HT) -- Make HomeTable variable names available for logger
-- Dina regler
rule("@sunset-00:10 & wnum % 2 == 1 => bedroom.lampaTak:value=30") -- Sätt till 30%, udda veckor, solnedgång-10min
rule("@sunrise-00:10 & wnum % 2 == 0 => bedroom.lampaTak:value=40") -- Sätt till 40%, jämna veckor, soluppgång-10min
rule("@sunrise-00:10 & wday('mon-fri') & wnum % 2 == 0 => bedroom.lampaTak:value=40") -- Sätt till 40%, jämna veckor, mån-fre, soluppgång-10min
-- Regler kan bli långa så man kan använda Lua strängar över flera rader som definieras med [[ ]] och identera de lite snyggare
-- Sätt till 40%, jämna veckor, sista fredagen i månaden , soluppgång-10min
rule([[@sunrise-00:10 & wday('fri') day('lastw-last') & wnum % 2 == 0
=> bedroom.lampaTak:value=40]])
-- Ger meddelande när ny version av ER finns
rule("@{06:00,catch} => Util.checkVersion()") -- Check for new version every morning at 6:00
rule("#ER_version => log('New ER version, v:%s, fix:%s',env.event.version,env.event.fix)")
--rule("#ER_version => log('...patching scene'); Util.patchEventRunner()") -- Auto patch new versions...
end
------------------- EventModel - Don't change! --------------------
https://forum.fibaro.com/topic/31180-tu ... ent=159939
Last edited by jang on 24 Sep 2019, 07:10, edited 1 time in total.
Code: Select all
sensor = 66
lampa = 77
rule(”sensor:breached & 22:00..07:00 => lampa:value=10”)
rule(”sensor:breached & 07:00..22:00 => lampa:value=100”)
Och släcka om sensorn inte sett ngt på 10minjang wrote: ↑21 Sep 2019, 19:06Glöm inte att deklarera sensorn i headern under %% properties så att den triggarCode: Select all
sensor = 66 lampa = 77 rule(”sensor:breached & 22:00..07:00 => lampa:value=10”) rule(”sensor:breached & 07:00..22:00 => lampa:value=100”)
rule(”trueFor(00:10,sensor:safe) => lampa:off”)
Något som jag inte gör rätt
[DEBUG] 10:53:31: Error in 'trueFor(00:10,sensor:safe) => lampaBad:off': /opt/fibaro/scenes/208.lua:1649: no triggers found in header-[[
Är detta rätt? (339 är min rörelse sensor)
%% properties
339 value
%% event
%% globals
%% autostart
--]]
[DEBUG] 10:53:31: Error in 'trueFor(00:10,sensor:safe) => lampaBad:off': /opt/fibaro/scenes/208.lua:1649: no triggers found in header-[[
Är detta rätt? (339 är min rörelse sensor)
%% properties
339 value
%% event
%% globals
%% autostart
--]]
I exemplet så måste du sätta en lua variabel 'sensor' till 339 (och 'lampaBad' till din lamp ID)Texan wrote: ↑22 Sep 2019, 10:58 Något som jag inte gör rätt
[DEBUG] 10:53:31: Error in 'trueFor(00:10,sensor:safe) => lampaBad:off': /opt/fibaro/scenes/208.lua:1649: no triggers found in header-[[
Är detta rätt? (339 är min rörelse sensor)
%% properties
339 value
%% event
%% globals
%% autostart
--]]
Code: Select all
sensor=339
lampaBad=400
rule("trueFor(00:10,sensor:safe) => lampaBad:off'")
Och de måste vara globala, det hade inte fungerat om vi skrivit
Code: Select all
local sensor = 339
Ex.
Code: Select all
home = {
bed = {lamp=88, sensor =99},
bad = {lamp=400, sensor=339}
}
rule("trueFor(00:10,home.bad.sensor:safe) => home.bad.lamp:off'")
Alternativt kan vi tala om för ER att vi använder en tabell som variabler med.
Code: Select all
home = {
bed = {lamp=88, sensor =99},
bad = {lamp=400, sensor=339}
}
Util.defvars(home)
rule("trueFor(00:10,bad.sensor:safe) => bad.lamp:off'")
Vi kan ytterligare lägga till
Code: Select all
Util.reverseMapDef(home)
Ex.
Code: Select all
Debug: fibaro:call(bedroom.lamp,"turnOn")
Code: Select all
rule("trueFor(00:10,339:safe) => 400:off'")
Code: Select all
rule("sensor=339")
rule("lampaBad=400")
rule("trueFor(00:10,sensor:safe) => lampaBad:off'")
Code: Select all
sensor1 = 339
sensor2 = 340
rule("trueFor(00:10,{sensor1,sensor2}:safe) => lampaBad:off'")
Code: Select all
sensors = {339,340}
rule("trueFor(00:10,sensors:safe) => lampaBad:off'")
<list>:safe är sann när alla enheter i listan är safe.
<list>:breached är sann när en enhet i listan är aktiverad.
Du kan använda samma för att aktivera lampan.
Code: Select all
sensors = {339,340}
lampa = 77
rule(”sensors:breached & 22:00..07:00 => lampa:value=10”)
rule(”sensors:breached & 07:00..22:00 => lampa:value=100”)
Jag såg i din ursprungliga post att du enkelt ville kunna ändra tiderna också.
Ett sätt är att använda variabler i reglerna för tiderna.
När ER stöder på en tid på formatet HH:MM:SS i en regel så omvandlas det till sekunder, ett tal.
Om vi hade skrivit
rule("vaknaUdda='07:00'"), dvs satt 07:00 inom fnuttar så hade det tolkats som en sträng och inte fungerat.
Vi kan också lagra tiden i en fibaro global
Här lagrar vi tiderna som strängar i de globala variablerna (vi hade också kunnat lagra antal sekunder).
Det fiffiga är att när vi hämtar värdet från en global så konverteras den automatiskt till antal sekunder om det ser ut som en tid.
Det är ingen ide att göra som i exemplet (lagra i fibaro globals och använda i samma scen).
Men det här gör att vi kan ändra tiderna från en annan scen (eller VD) genom att andra fibaro globalen.
Ett sätt är att använda variabler i reglerna för tiderna.
Code: Select all
rule("vaknaUdda=07:00")
rule("vaknaJämna=sunrise+00:10")
rule("@vaknaUdda & wnum%2==1 => log('Dags att vakna!')")
rule("@vaknaJämna & wnum%2==1 => log('Dags att vakna!')")
Om vi hade skrivit
rule("vaknaUdda='07:00'"), dvs satt 07:00 inom fnuttar så hade det tolkats som en sträng och inte fungerat.
Vi kan också lagra tiden i en fibaro global
Code: Select all
rule("$vaknaUdda='07:00'")
rule("$vaknaJamna='sunrise+00:10'")
rule("@$vaknaUdda & wnum%2==1 => log('Dags att vakna!')")
rule("@$vaknaJamna & wnum%2==1 => log('Dags att vakna!')")
Det fiffiga är att när vi hämtar värdet från en global så konverteras den automatiskt till antal sekunder om det ser ut som en tid.
Det är ingen ide att göra som i exemplet (lagra i fibaro globals och använda i samma scen).
Men det här gör att vi kan ändra tiderna från en annan scen (eller VD) genom att andra fibaro globalen.
Det här låter intressant.jang wrote: ↑25 Sep 2019, 18:00 Jag såg i din ursprungliga post att du enkelt ville kunna ändra tiderna också.
Ett sätt är att använda variabler i reglerna för tiderna.
När ER stöder på en tid på formatet HH:MM:SS i en regel så omvandlas det till sekunder, ett tal.Code: Select all
rule("vaknaUdda=07:00") rule("vaknaJämna=sunrise+00:10") rule("@vaknaUdda & wnum%2==1 => log('Dags att vakna!')") rule("@vaknaJämna & wnum%2==1 => log('Dags att vakna!')")
Om vi hade skrivit
rule("vaknaUdda='07:00'"), dvs satt 07:00 inom fnuttar så hade det tolkats som en sträng och inte fungerat.
Vi kan också lagra tiden i en fibaro globalHär lagrar vi tiderna som strängar i de globala variablerna (vi hade också kunnat lagra antal sekunder).Code: Select all
rule("$vaknaUdda='07:00'") rule("$vaknaJamna='sunrise+00:10'") rule("@$vaknaUdda & wnum%2==1 => log('Dags att vakna!')") rule("@$vaknaJamna & wnum%2==1 => log('Dags att vakna!')")
Det fiffiga är att när vi hämtar värdet från en global så konverteras den automatiskt till antal sekunder om det ser ut som en tid.
Det är ingen ide att göra som i exemplet (lagra i fibaro globals och använda i samma scen).
Men det här gör att vi kan ändra tiderna från en annan scen (eller VD) genom att andra fibaro globalen.
Så jag måste skapa en Variabel i Variabelpanelen och sedan göra en VD med knappar där man styr/väljer tidigt/sen?
Skulle behöva lite mera hjälp hur att skapa detta, med lite mera utförlig exempel så jag förstår mera vad jag gör
Man kan i princip använda alla typer av VDs som sätter en fibaro global med en tid. Jompa har en AlarmClock VD som borde fungera.
En finess i ER som inte har använts så mycket är att man kan skapa en VD inifrån ER. Fördelen är att man kan hantera knapptryck etc med funktioner definierade i ER.
Så här skulle man kunna göra (inkluderas i main())
funktionen setUpTimerVD skapar en VD när ER startar upp (och om den redan finns så återanvänds den befintliga)
Den tar en tabell myTimerVars där man definierar upp fibaro globaler (name) och en beskrivning (descr)
I VDn kan man flippa mellan variabler och sätta tid, dagar och om den ska vara aktiv.
Man måste också klicka på update för att värdet ska sparas i fibaro global variablen.
Om man har satt variablen bedtime i VD så kommer den globala variabeln att ha värde
(tiden spars som sekunder efter midnatt, i det här falle 01:00, det interna tidsformatet i ER)
Man kan utnyttja det i ER regler genom att då skriva
Den regeln schedulerar en timer till den tid som finns i $bedtime.time, den kollar dessutom att timern är aktiv ($bedtime.active) och den kollar att det är en giltig dag med wday($bedtime.days)
Det kan vara ngt jag förbisett i det här exemplet men prova gärna.
Obs, reglerna måste definieras efter att setUpTimerVD har anropats.
En finess i ER som inte har använts så mycket är att man kan skapa en VD inifrån ER. Fördelen är att man kan hantera knapptryck etc med funktioner definierade i ER.
Så här skulle man kunna göra (inkluderas i main())
Code: Select all
local myTimerVars = {
{name='bedtime', descr="Läggdags"},
{name='garbage', descr="Soptunna ut"},
{name='excercise', descr="Träna"},
}
function setUpTimerVD(vars,vers)
local controllerDef =
{
{'label',{"Variabel:","VAR",""}},
{'button',{"<<","BKW"},{">>","FW"}},
{'label',{"Tid","TIME","--:--"}},
{'button',{"+H","PH"},{"-H","MH"},{"+M","PM"},{"-M","MM"}},
{'slider',{"Tid","TS"}},
{'label',{"Dagar:","DAYS",""}},
{'button',{"Må","DAY2"},{"Ti","DAY3"},{"On","DAY4"},{"To","DAY5"},{"Fr","DAY6"}},
{'button',{"Lördag","DAY7"},{"Söndag","DAY1"}},
{'label',{"Aktiverad","ACTIVATED","Ja"}},
{'button',{"Aktivera / Deaktivera","ACT"}},
{'button',{"Updatera","UPDATE"}},
}
ctrl = VDev.define("Tidsvariabler","contrl",vers,controllerDef)
for i=1,#vars do -- update and create missing variables
local v = vars[i]
v.time = v.time or os.time()
v.days = v.days or "sun,mon,tue,wed,thu,fri,sat"
local vv,tt = fibaro:getGlobal(v.name)
if tt == nil then
api.post("/globalVariables/",{name=v.name,value=json.encode(v)})
else
vars[i]=json.decode(fibaro:getGlobalValue(v.name))
end
end
local DayMap={'sun','mon','tue','wed','thu','fri','sat'}
local function t2str(t) return string.format("%02d:%02d",t/3600,(t % 3600)/60) end
local function limit(t) local m = 24*60*60; if t < 0 then return t+m elseif t > m then return t-m else return t end end
local function current()
local v = ctrl.getValue("VAR")
for i=1,#vars do if v==vars[1].descr then return i end end
return 1
end
local curr = current()
local function update() -- update all fields in VD
vars[curr].time = vars[curr].time or 0
vars[curr].days = vars[curr].days or ""
ctrl.setValue("VAR",vars[curr].descr)
ctrl.setValue("TIME",t2str(vars[curr].time))
ctrl.setValue("DAYS",vars[curr].days)
ctrl.setValue("ACTIVATED",vars[curr].active and "Ja" or "Nej")
end
update()
Event.event({type='VD',label='BKW'},
function(env) curr=curr-1 if curr < 1 then curr=#vars end update() end)
Event.event({type='VD',label='FW'},
function(env) curr = curr+1; if curr > #vars then curr=1 end update() end)
Event.event({type='VD',label='PH'},
function(env) vars[curr].time = limit(vars[curr].time+60*60) update() end)
Event.event({type='VD',label='MH'},
function(env) vars[curr].time = limit(vars[curr].time-60*60) update() end)
Event.event({type='VD',label='PM'},
function(env) vars[curr].time = limit(vars[curr].time+60) update() end)
Event.event({type='VD',label='MM'},
function(env) vars[curr].time = limit(vars[curr].time-60) update() end)
Event.event({type='VD',label='TS'},
function(env) vars[curr].time = math.floor(24*60*60*env.event.value/100) update() end)
Event.event({type='VD',label='$d==DAY%d'},
function(env)
local d = DayMap[tonumber(env.p.d:sub(4))]
local s = split(vars[curr].days or "",",")
local r1,r2 = {},{}; for _,dd in ipairs(s) do r1[dd]=true end
r1[d]= not r1[d]
for _,dd in ipairs(DayMap) do if r1[dd] then r2[#r2+1]=dd end end
vars[curr].days=table.concat(r2,",")
update()
end)
Event.event({type='VD',label='ACT'}, function(env) vars[curr].active = not vars[curr].active update() end)
Event.event({type='VD',label='UPDATE'}, function(env) fibaro:setGlobal(vars[curr].name,json.encode(vars[curr])) end)
end
setUpTimerVD(myTimerVars,10)
rule("@$bedtime.time & $bedtime.active & wday($bedtime.days) => log('HUPP')")
Den tar en tabell myTimerVars där man definierar upp fibaro globaler (name) och en beskrivning (descr)
I VDn kan man flippa mellan variabler och sätta tid, dagar och om den ska vara aktiv.
Man måste också klicka på update för att värdet ska sparas i fibaro global variablen.
Om man har satt variablen bedtime i VD så kommer den globala variabeln att ha värde
Code: Select all
{time=3600, descr="Läggdags", active=true, days="sun,mon,tue,wed,thu,fri,sat"}
Man kan utnyttja det i ER regler genom att då skriva
Code: Select all
rule("@$bedtime.time & $bedtime.active & wday($bedtime.days) => log('HUPP')")
Det kan vara ngt jag förbisett i det här exemplet men prova gärna.
Obs, reglerna måste definieras efter att setUpTimerVD har anropats.
Japp,
Code: Select all
rule("@{06:00,catch} => Util.checkVersion()") -- Check for new version every morning at 6:00 and at restart
rule("#ER_version => log('New ER version, v:%s, fix:%s',env.event.version,env.event.fix)")
rule("#ER_version => log('...patching scene'); Util.patchEventRunner()") -- Auto patch new versions...
En variant är att bara skicka en push notis till mobilen när det finns en ny version och isåfall gå in och avkommentera sista regeln som patchar, och starta om scenen manuellt.
Code: Select all
rule("myPhoneID=198")
rule("@{06:00,catch} => Util.checkVersion()") -- Check for new version every morning at 6:00 and at restart
rule("#ER_version => myPhoneID:msg=log('New ER version, v:%s, fix:%s',env.event.version,env.event.fix)")
--rule("#ER_version => log('...patching scene'); Util.patchEventRunner()") -- Auto patch new versions...