https://forum.fibaro.com/topic/31180-tu ... ent-model/
Några här på forumet är bekanta med GEA, och ER har likheter och olikheter.
- Man skriver regler som triggar på tider och/eller när sensorer/lampor/globals etc ändrar status
- Man kan lätt integrera sina egna Lua funktioner i reglerna
- När sensorer/lampor/globals ändrar status genereras 'events' som reglerna triggar på. Man kan också posta egna events och ha regler som triggar på dessa. På det sättet slipper man att alltid använda fibaro globals för att trigga regler.
- ER scener kan skicka events mellan varandra, och på så sätt trigga regler i andra ER scener.
- ER har designats för att scener ska kunna kodas och testas offline på en PC/Mac före man flyttar över dem till HC2:an
Disclaimer: Tanken med reglerna är att det ska vara lätt (och kompakt) att skriva hemmaautomatiseringsregler. Tyvärr innebär hemmaautomatiseringsregler att uttrycka logiska samband mellan asynkrona events. Så även om det är lätt att skriva regler är det inte alltid lätt att få det att fungera som man vill.
Liksom GE så består ER av många rader kod (1000+) men det är i början av scenen, inom funktionen main(), som man definerar sina regler. Resten ska man inte behöva bekymra sig om.
För att komma igång.
Gå till https://raw.githubusercontent.com/janga ... Runner.lua
och kopiera den koden till en scen i HC2:an.
Sätt scenens "Max. running instances:" till 10 och "Run scene:" till "Automatic"
Kör scenen. Det finns en fördefinerad regel i main() som om allt fungerar skriver "Ding", och "Dong!" i scen-loggen var 5:e sekund.
Om det funkar kan vi gå vidare och titta på hur regler ser ut.
Code: Select all
function main()
local rule,define = Rule.eval, Util.defvar
lampa1 = 88
sensor = 89
lampa2 = 90
rule("@sunset-00:15 => lampa1:on")
rule("@sunrise+00:15 => lampa1:off")
rule("sensor:breached => lampa2:on")
end -- main
Vår första regel ha villkoret "@sunset-00:15".
'@' definerar ett klockslag då regeln ska utföras.
'sunset' och 'sunrise' är konstanter för soluppgåg och solnedgång.
Man kan också använda tidskonstanter som "15:00" eller "17:10:30" etc.
Alla tidskonstanter omräknas till sekunder internt och våra regler tillåter aritmetiska operationer (+,-,*,/) så vi kan skriva en regel som "@sunset-00:15 => lampa1:on" som triggas vid solnedgång minus 15 minuter.
Oftast will vi ha en regel per klockslag men vi kan skriva "@{sunset-00:15, 15:00} => lampa1:on" om vi vill slå på samma lampa på 2 tider på dagen.
Högersidan har kommandot "lampa1:on". 'lampa1' definerade vi utanför regeln till 88 som en global lua variabel så den kan vi använda inuti regeln. Vi kan inte använda lokala lua variabler (local var) men vi ska se senare hur vi kan ta in definitioner från en HomeTable.
Så kommandot blir 88:on. 88 är ett deviceID, och ':on' är ett kommando som slår på deviceID 88 i det här fallet. Det översätts internt till ett 'fibaro:call(88,"turnOn")'. Många kommandon har formatet <deviceID>:<kommando> och formatet har valts mest för att det är ett kompakt format.
De vanligaste kommandona är:
':on' - slå på device ("turnOn").
':isOn' - returnera sant om device är på.
':off' - slå av device ("turnOff")
':isOff' - returnera sant om device är av
':safe' - returnera sant om sensor är av (samma som :isOff)
':breached' - returnera sant om sensor är triggad (samma som :isOn)
':value' - returnera device 'value' (fibaro:getValue(device,'value'))
Fibaro's globala variabler skrivs som namnet med ett '$' före.
Vänstersidan för ett kommando kan också vara en lista/tabell av flera deviceID, och det fungerar som man tänker sig att det borde:
Code: Select all
lampor={44,45,46}
sensorer={33,34,335}
rule("sensorer:breached => lampor:on") -- om någon sensor triggas, slå på alla lamporna.
Code: Select all
rule("@sunrise-00:30 & $HomeStatus=='home' => lampa1:on; lampa2:on")
AND, OR, NOT skrivs som '&', '|','!'
Högersidan har en sekvens av kommandon seprarerade med ';'
Andra bra funktioner är tidsintervall och dag tester
Code: Select all
rule("sensorer:breached & 23:00..07:00 & wday('fri-sun') => 99:value=30")
Om vi vill att ett villkor ska vara sant en viss tid innan vi utför kommandon så används 'for'
Code: Select all
rule("for(00:05,sensorer:safe) & 09:00-15:00 & wday('mon-fri') => lampor:off")
Den klassiska scenen tänd lampa när sensor triggas och släck när den är säker för en tid blir
Code: Select all
rule("sensorer:breached => lampor:on")
rule("for(00:05,sensorer:safe) => lampor:off")
Det finns många funktioner som går att använda i regler - jag kommer att posta några "best practices" och tricks, men tillsvidare finns det ganska bra information i de här inläggen i Fibaro's forum.
Tidsregler - https://forum.fibaro.com/topic/31180-tu ... ent=157463
Trigger regler - https://forum.fibaro.com/topic/31180-tu ... ent=159638
Syntax och funktioner: https://forum.fibaro.com/topic/31180-tu ... ent=159939
En viktig sak är att externa triggers; sensorer/lampor/globals som regler ska trigga på måste deklareras i scenhuvudet precis som vanliga scener. Annars triggas inte scenen.
EventRunner har en mängd finesser, det är lätt att integrera med Philips Hue, node-red, det finns en pub/sub mekanism mellan scener - och framförallt det går att utveckla och testa scenerna offline (stega sig igenom koden när scenen kör och inspektera variabler, använder ZeroBrane IDE).
jompa har ett tidigare inlägg där han har en exempelscen med ER viewtopic.php?p=21734#p21734
Återkommer med inlägg om det men ni får gärna fråga i forumet hur man skriver regler för att åstadkomma olika saker.
Dessutom gärna feedback på det här inlägget, felaktigheter, stavfel, eller om det bara är svårt att förstå...
P.S Uppdateringar till EventRunner.lua (och andra filer) görs löpande på mitt GitHub https://github.com/jangabrielsson/EventRunner