EventRunner låter oss definiera regler som triggas av tid, enheter som ändrar status, samt egen definierade events (mer om dessa senare)
En regel är en textsträng inom ”” (eller ’’) och består av ett villkor, under vilka förutsättningar en regel ska aktiveras, och kommandon som ska utföras om villkoret är sant.
Lua funktion rule(<textsträng>) är den funktion som definierar regeln åt oss.
Villkor och kommandon separeras av ”=>” och är en signal till ER att det här ska lagras som en regel. Om man utelämnar ”=>” så körs kommandot direkt. Det kan vara bra om man t.ex vill deklarera en regel-variabel
Här deklarerar vi en variabel ’lampa’ som vi kan använda i nästföljande regler.
Notera att regeln man ger till funktionen rule() är en Lua sträng omgärdat av ”” eller ’’. Det kan innebära att man får problem om man har en regel som i sin tur hanterar en textsträng.
Ex.
Här anropar vi funktionen log() med en sträng ”Test”. Vi kan tyvärr inte använda ”” för strängen inuti regeln eftersom regeln i sig är definierad med ””. Vi kan då använda ’’. Det är nästan standard i ER regler att vi använder ’’ för strängar inuti regler.
Regler finns i några typer.
• Tidsregler, som körs vid vissa tidpunkter. Ex. tänd lampa vid soluppgång
• Intervallregler, som körs vid vissa intervall. Ex. slå på fläkt varje timme
• Trigger-regler, som körs när vissa enheter ändrar status. Ex. när sensor triggas så tänd lampa i hallen.
• Event-regler, som körs när en annan regel skickar ett användardefinierat event. Ex. när dörrsensor triggas och status==’bortrest’ skicka event #alarm, och alla regler som triggar på #alarm kör igång (ex. starta siren).
Kommandon.
Vi börjar att titta på några kommandon, eftersom alla regeltyper avslutas med att man vill köra några kommandon. Ex. tända en lampa etc.
Det flesta kommandon för enheter är av typ <enhetsID>:<kommando>.
:on slår på lampor/switchar
De flesta kommandon går dessutom att applicera på en lista av enheter och exekverar då kommandot på varje enhet i listan
Code: Select all
rule(”lampor = {55,66}”)
rule(”lampor:on”)
Vi kan tilldela en variabel en lista av enheter och applicera kommandot på den
En lista kan använda värden hämtade från en homeTable.
Andra vanliga kommandon
Code: Select all
rule(“lampor :off”) – slår av enhet/enheter
rule(“lampor :toggle”) – slår av enhet/enheter om de är på och på om de är av. Var uppmärksam på om det appliceras på en lista av enheter så togglas varje enhet för sig.
rule(“lampor :value=50”) – Sätter värdet för en enhet/enheter. För dimmbara lampor är det ”dimm-värdet”
Sedan finns det ett antal kommandon som testar tillståndet på enhet/enheter
Code: Select all
rule(“lampor :isOn”) – Returnerar sant om någon av lamporna är på, annars falskt
rule(“lampor :isOff”) – Returnerar sant om all lamporna är av, annars falskt
rule(“lampor :safe”) – samma som :isOff, men mer beskrivande för sensorer
rule(“lampor :breached”) – samma som :isOn, men mer beskrivande för sensorer
rule(“lampor :value”) – Returnerar en enhet/enheters värde. För dimmbara lampor är det ”dimm-värdet”
Utöver det här finns en mängd kommandon för enheter som jag listar i en annan post.
Tidsregler
En tidsregel startar med ett ’@’ och en eller flera tider som regeln ska köra på-
Code: Select all
rule(”@<tid> & <extra villkor> => <kommandon>”)
Code: Select all
rule(“@07:00 => lampor:on”) -- varje dag kl. 07.00 slå på lampor
rule(“@{07:00, 14:00} => lampor:on”) -- varje dag kl. 07.00 och 14.00 slå på lampor
rule(“@07:00 & wday(‘mon’) => lampor:on”) – varje måndag kl. 07.00 slå på lamporna
rule(“@07:00 & wday(‘mon,tue,fri-sun’) => lampor:on”) – varje måndag,tisdag,fredag,lördag,söndag kl. 07.00 slå på lamporna
wday(<textsträng>) är en funktion som vi använder som <extra villkor> så att våra regler bara exekverar vissa dagar.
Regeln kommer att köra igång varje dag kl. 07.00 men wday villkoret kommer att vara falskt om det inte är rätt dag.
day(<textsträng>) används för dag i månaden. month(<textsträng>) för månader på liknande sätt som wday(<textsträng>).
Code: Select all
rule(“@07:00 & day(‘1,7’) => lampor:on”) – kl. 07.00 den första och sjunde i månaden.
rule(“@07:00 & day(‘last’) => lampor:on”) – kl. 07.00 den sista dagen i månaden.
rule(“@07:00 & day(‘lastw’) => lampor:on”) – kl. 07.00 den första dagen i sista veckan i månaden (egentligen samma som last-6).
rule(“@07:00 & day(‘lastw-last’) & wday(’mon’) => lampor:on”) – kl. 07.00 den sista måndagen i månaden.
Vi kan också använda ’sunset’, ’sunrise’, ’dusk’, och ’dawn’ som värden för @ regler
Code: Select all
rule(“@sunset-00:10 => lampor :on”)
Alla tidskonstanter Ex. 07:00 eller sunrise omvandlas i regler till antal sekunder sedan midnatt. Så 07:00 är samma som 25200 (7*60*60) och därför kan vi fritt använda aritmetiska operationer med tidskonstanter. I regeln ovan subtraherar vi 10min (600s) från solnedgången vilket blir den tid som regeln kör.
Det finns en inbyggd slumptalsfunktion rnd() som antingen tar ett max värde, eller ett min och ett maxvärde och returnera att slumptal i det intervallet.
Om vi vill tända lampor slumpmässigt i ett intervall +/- 10min runt solnedgången så blir det
Code: Select all
rule(“@sunset+rnd(-00:10,00:10) => lampor:on”)
Om vi har en tid largad i en fibaro global som en textsträng ex. global "Vattna" med värdet "10:00" så kan vi använda den i en regel som $Vattna
Code: Select all
rule("@$Vattna => sprinkler:on; wait(00:30); sprinkler:off")
Intervallregler
Code: Select all
rule(”@@<tid> & <extra villkor> => <kommandon>”)
Intervallregler är som tidsregler men regeln kommer att repetera med den tidsintervall som anges.
Code: Select all
rule(”@@00:45 & 08:00..sunset & wday(’mon-fri’) => fläkt:on; wait(00:15); fläkt:off”)
Startar fläkten varje 45 min mellan 8 och solnedgång på vardagar, väntar 15min och släcker sedan fläkten. Testet <tid1>..<tid2> är sant om tiden nu är mellan dessa tider.
Trigger-regler
Om en regel inte börjar på @ eller @@ så anses det vara en trigger-regel (event-regler är specialfall av trigger-regler, mer om det senare).
En trigger-regel har ett villkor som är någon form av test av olika enheters tillstånd.
Ex.
Code: Select all
rule(”sensor=55; lampa=67”)
rule(”sensor:breached => lampa:on”)
Regeln säger att om enhet 55 är triggad så tänd lampa 67.
För att ER ska upptäcka att 55 är triggad så måste man deklarera den högst i scene headern av ER scenen
Code: Select all
--[[
%% properties
55 value
%% autostart
--]]
annars kommer inte regeln att triggas. Vi kan kombinera villkoret med flera tester
Code: Select all
rule(”sensor:breached & 08:00..11:00 & wday(‘mon’) => lampa:on”)
Tänder bara lampan på måndagar mellan 8.00 och 11.00 om sensorn triggas
Anta att vi har en lampa som ska tändas till 50% på natten och 100% övrig tid
Code: Select all
rule(”sensor:breached & sunrise..23:00 => lampa:value=99”)
rule(”sensor:breached & 23:00..sunrise => lampa:value=50”)
Om vi har flera sensorer i ett rum så kan vi utnyttja att vi kan applicera :breached på en lista med enheter.
Code: Select all
rule(”sensors={77,97,63}”)
rule(”sensors:breached => siren:on”)
:breached returnerar sant om minst en enhet är triggad.
Viktigt här är att alla enheter i sensors-listan är deklarerade under %% properties i scen-headern.
En annan bra funktion är ’trueFor(<tid>,<villkor>)’. Det testar om <villkor> har varit sant under tiden <tid>.
Exempelvis kan vi testa om en sensor varit ’safe’ under en viss tid och isåfall släcka en lampa.
Code: Select all
rule(”sensor:breached => lampa:on”) – tänd lampa om sensor triggad
rule(“trueFor(00:10,sensor:safe) => lampa:off”) – slack lampa om sensor ‘safe’ i 10min
Återkommer och editerar den här posten med event-regler
Event-regler
Code: Select all
rule(#<event> & <extra villkor> => <kommandon>”)