EventRunner tutorial

Post Reply
svante
Medlem
Posts: 76
Joined: 14 Dec 2011, 10:08

31 Oct 2019, 12:19

Hej på er,
Jag är sjukt sugen på att komma igång med EventRunner, men har inte rikigt tiden att läsa mig igenom allt material.
Finns det någon vänlig själ som kan göra en kortfattad tutorial för personer som inte är LUA-kodare...?

Är så trött på de 40-talet blockscener jag har i mitt system just nu. Det är otroligt förvirrande när man ska göra några ändringar....
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1074
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

31 Oct 2019, 14:39

Du behöver inte skriva en enda rad LUA-kod, för det har jang redan gjort åt dig.
Det som du behöver göra är att skriva regler som talar om när dina lampor skall tändas eller släckas.
Och det finns tyvärr ingen genväg, utan du måste läsa vad jang och andra har skrivit om ER.
Tråden om Event Runner (ER) innehåller massor av tips och idéer om hur dessa regler kan se ut.

När du har laddat ned Event Runner 3 och kopierat in koden i en tom scen så är det två saker som du måste göra för att använda Event Runner
Det ena är att deklarera dina lampor, dvs ge dem ett namn och ange dess ID. Det andra är att skriva regler för din belysning.
Det finns redan lite exempel i koden du laddar hem, men dessa tar du bort.

Här är några exempel på enheter som jag har deklarerat...

Code: Select all

  local HT =  -- Definiera dina deviceID här för lampor som ska tändas / släckas
  
{     sovrum = {lampa = 46, dim_lampa = 156},
      arbetsrum = {rh_dim = 135, yh_lampa = 85},
      hall = {lampa = 181},
      v_rum = {TV_lampa = 23, barlampa = 7},
      kok = {lampa = 15},
      bodega = {lampa = 17},
      sensor = {hall_pir = 193, garage_pir = 110},
    }
Och här är några exempel på regler som jag använder, som du ser så är det inga konstigheter med att skriva dessa.

Code: Select all

-- SOVRUM #######################################
  rule("@06:46 => sovrum.lampa:on")  -- Tänd i sovrummet kl. 06:46
  rule("@{catch,sunrise} => sovrum.lampa:off")  -- Släck då solen går upp

  rule("@sunset => sovrum.lampa:on")  -- Tänd när solen går ned
  rule("@22:30 => sovrum.lampa:off")  -- Släck kl. 22:30 på kvällen

-- ARBETSRUM ##################################
  rule("@06:30 => arbetsrum.rh_dim:value = 50")  -- Tänd 06:30 på morgonen
  rule("@sunrise => arbetsrum.rh_dim:off")  -- Släck arbetsrummet då solen går upp

-- HALL #######################################  
  rule("@07:00 & sunrise > 07:00 => hall.lampa:on")  -- Tänd 07:00 på morgonen men inte om solen redan gått upp
  rule("@sunrise => hall.lampa:off")  -- Släck då solen går upp
EDIT.. En kvarglömd parentes "}" är borttagen, sorry :-(
Last edited by RH_Dreambox on 01 Nov 2019, 11:51, edited 2 times in total.
HC3 med ER4 , 2 st HC2 4.600 med ER 3
jang
Medlem
Posts: 289
Joined: 05 Jan 2014, 00:44
Location: Stockholm

01 Nov 2019, 09:01

Kort guide.
Ladda ner EventRunner3.lua från GitHub.
https://github.com/jangabrielsson/EventRunner
Om man klickar på filen och i GitHub och sedan klickar på knappen ”raw” (https://raw.githubusercontent.com/janga ... unner3.lua)
så visas filen så man kan göra en ”copy all” och klistra in den i scen editorn på sin HC2:a.

Början på EventRunner.lua innehåller en del Lua kod men strukturen är

Code: Select all

--[[
%% properties
%% autostart
--]]

< inledande deklarationer >

---------- Main ------------ Here goes your rules ----------------
function main()

   < kod för att sätta upp dina variabler för enheter och annat >

  < dina regler >

end

------------------- EventModel - Don't change! --------------------
Det är många rader kod efter ”Don’t change!” kommentaren (~2000) men de ska inte röras

Det finns också många rader som är bortkommenterade i den inledande koden. De startar med dubbel-streck i Lua. Men de är bra att ha för mer avancerade saker i framtiden. (mina kommentarer i den här texten är mellan < >, men ska inte skrivas i scenen)

Inledande deklarationer kan man ignorera, de används för mer avancerad integration med Philips Hue ,NodeRed, and Telegram. Dock kan en variabel vara bra att ändra i inledningen och det är

Code: Select all

local _sceneName   = "Demo"   
Sätt den till namnet på din ”smarta” scen. T.ex.

Code: Select all

local _sceneName   = "Mitt smarta hus"  

När scenen startas så skrivs det ut i loggen. Man kan ha flera ER scener körandes på sin HC2:a. Ibland vill man dela upp sina regler, ex. belysning i en och alarm i en annan. Då kan det vara bra att de heter olika så man får en feedback vilken scen man startar upp.

Allt det intressanta händer sedan mellan ”function main()” och ”end”

Man bör sätta upp en tabell med sina enheter. Det finns ett exempel i ER men ett bra exempel är i RH_Dreambox förra post. Vi kallar tabellen HT som i Home Table

Efter det bör man anropa 2 funktioner,

Code: Select all

  Util.defvars(HT)            -- Make HomeTable variables available in EventScript
  Util.reverseMapDef(HT)      -- Make HomeTable variable names available for logger
Dessa gör definitionerna vi gjort tillgängliga för våra regler och logg-utskrifter.
Var uppmärksam på att i koden som kommer med ER så deklareras enheterna i en gren av HT som blir HT.dev och att vi gör Util.defvars(HT.dev) - men i vårt exempel här deklarerar vi de direkt under HT och därför anropar vi Util.defvars(HT)

Så nu har vi

Code: Select all

--[[
%% properties
%% autostart 
--]] 

local _version,_fix = "3.0","B77"  -- Oct 24, 2019  

local _sceneName   = "Mitt smarta hus"    -- Set to scene/script name

< mer inledande deklarationer >

---------- 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
  
{     sovrum = {lampa = 46, dim_lampa = 156},
      arbetsrum = {rh_dim = 135, yh_lampa = 85},
      hall = {lampa = 181},
      v_rum = {TV_lampa = 23, barlampa = 7},
      kok = {lampa = 15},
      bodega = {lampa = 17},
      sensor = {hall_pir = 193, garage_pir = 110},
 }

  Util.defvars(HT)                   -- Make HomeTable variables available in EventScript
  Util.reverseMapDef(HT)      -- Make HomeTable variable names available for logger

  rule("@@00:00:05 => f=!f; || f >> log('Ding!') || true >> log('Dong!')") -- example rule logging ding/dong every 5 second

end
Här av vi ”avkommenterat” en regel som kommer med ER och som skriver Ding! Och Dong! var 5:e sekund i loggen efter att scenen har startat.

I HC2 så skapar du en ny Lua scen. Klistrar in koden med de ändringar vi gjort ovan (HT tabell och avkommentera ding/dong regeln)
I ”general” fliken av scen editorn så bör du sätta ”Max running instances:” till 10 och sätta ”Run scene:” till ”Automatic”.

Prova sedan att starta igång scenen. Om du får Ding!/Dong! utskrivet i scen-loggen så funkar det.
Isåfall tar du bort Ding/Dong regeln och lägger in dina riktiga.
Jag kan återkomma med en enkel guide till regler. En start är att modifiera RH_Dreamboxs regler i föregående post.
jang
Medlem
Posts: 289
Joined: 05 Jan 2014, 00:44
Location: Stockholm

02 Nov 2019, 18:02

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.

Code: Select all

rule(”<villkor> => <kommandon>”)
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

Code: Select all

rule(”lampa=55”)
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.

Code: Select all

rule(”log(’Test’)”)
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.

Code: Select all

rule(”55:on”)
Det flesta kommandon för enheter är av typ <enhetsID>:<kommando>.
:on slår på lampor/switchar

Code: Select all

rule(”{55,66}:on”)
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

Code: Select all

rule(“lampor = {a.b, c.d}”)
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>”)
Post Reply