EventRunner

jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Regeln går också att skriva med intervall-test (om det inte är så att du använder armed för något annat)

Code: Select all

  rule("sensor.garage_door:breached & 22:40..06:00 & $SleepState == 'Sover' => larm.Siren:on")
  rule("for(00:00:05,sensor.garage_door:safe) => larm.Siren:off")
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Mitt dörrlås har en förmåga att "Dö" lite sporadiskt, finns det något sätt att väcka enheten innan dörren ska låsas?
Regeln idag är så här enkel

Code: Select all

 rule("@21:30 => frontdoor.doorlock:secure")
Har prövat åtskilliga gånger att göra om nätet men det vill sig inte ändå.
Finns möjligheten till "wakeUpDeadDevice" i ER?
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

sonnyboy wrote: 23 Jun 2019, 16:43 Mitt dörrlås har en förmåga att "Dö" lite sporadiskt, finns det något sätt att väcka enheten innan dörren ska låsas?
Regeln idag är så här enkel

Code: Select all

 rule("@21:30 => frontdoor.doorlock:secure")
Har prövat åtskilliga gånger att göra om nätet men det vill sig inte ändå.
Finns möjligheten till "wakeUpDeadDevice" i ER?
Ok, laddat upp en ny version B58 med support för wakeup.
id:wake är samma som fibaro:call(id,"wakeUpDeadDevice")

Code: Select all

 
 -- wakeup, wait 10s to give time for device to wakeup, and then secure lock
 rule("@21:30 => frontdoor.doorlock:wake; wait(00:00:10); frontdoor.doorlock:secure")
 
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

@jang Fungerar klockrent :)
Supertack för snabb hjälp.

Får dock detta i loggen
[DEBUG] 21:58:20: New ER version, v:2.0, fix:B57
Kör B58 som du nyss la upp.

[DEBUG] 21:58:18: Villa Söderberg Axelsson - EventRunner v2.0 B58
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

sonnyboy wrote: 23 Jun 2019, 22:06 @jang Fungerar klockrent :)
Supertack för snabb hjälp.

Får dock detta i loggen
[DEBUG] 21:58:20: New ER version, v:2.0, fix:B57
Kör B58 som du nyss la upp.

[DEBUG] 21:58:18: Villa Söderberg Axelsson - EventRunner v2.0 B58
Sorry, glömde att uppdatera versions filen. Borde inte klaga nu.
jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
12
Location: Hofors

Code: Select all

[DEBUG] 15:45:41: Posting {"type":"poll","index":8} at Mon Jun 24 15:46:26

[DEBUG] 15:45:42: Sending {"ios":true,"state":"allaway","type":"presence"} to scene 413

[DEBUG] 15:45:43: Sending {"ios":true,"state":"allaway","type":"presence"} to scene 464

[DEBUG] 15:46:26: Posting {"type":"getIOSdevices","pwd":"xxxx","user":"xxxx@outlook.com","name":"Jonny"} at Mon Jun 24 15:46:26

[DEBUG] 15:46:26: Posting {"type":"poll","index":9} at Mon Jun 24 15:47:11

[DEBUG] 15:46:27: Sending {"who":"Jonny","ios":true,"state":"home","type":"presence"} to scene 413

[DEBUG] 15:46:27: Sending {"who":"Jonny","ios":true,"state":"home","type":"presence"} to scene 464

@jang
Ser ut som det postas state=allaway, fastän jag är hemma, mitt larm går bananas :D
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

jompa68 wrote: 24 Jun 2019, 15:50

Code: Select all

[DEBUG] 15:45:41: Posting {"type":"poll","index":8} at Mon Jun 24 15:46:26

[DEBUG] 15:45:42: Sending {"ios":true,"state":"allaway","type":"presence"} to scene 413

[DEBUG] 15:45:43: Sending {"ios":true,"state":"allaway","type":"presence"} to scene 464

[DEBUG] 15:46:26: Posting {"type":"getIOSdevices","pwd":"xxxx","user":"xxxx@outlook.com","name":"Jonny"} at Mon Jun 24 15:46:26

[DEBUG] 15:46:26: Posting {"type":"poll","index":9} at Mon Jun 24 15:47:11

[DEBUG] 15:46:27: Sending {"who":"Jonny","ios":true,"state":"home","type":"presence"} to scene 413

[DEBUG] 15:46:27: Sending {"who":"Jonny","ios":true,"state":"home","type":"presence"} to scene 464

@jang
Ser ut som det postas state=allaway, fastän jag är hemma, mitt larm går bananas :D
Fixed. B9. Har testat och det verkar ok nu.
jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
12
Location: Hofors

Yes sir, nu är det ok igen. Tack :)
Systemfel
Medlem
Posts: 384
Joined: 14 Jan 2015, 01:02
9

Riktigt bra är denna eventrunner :) kör sakta över allt men fattar inte hur jag ändrar en Globol tex time of day. har ett time of day script jag kör men får något fel i bland och tänkte föra in detta i event runner :) tack för ett super script :)
kör Hc3 och det fungerar bättre och bätttre sakta men säkert :D
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Systemfel wrote: 15 Jul 2019, 00:04 Riktigt bra är denna eventrunner :) kör sakta över allt men fattar inte hur jag ändrar en Globol tex time of day. har ett time of day script jag kör men får något fel i bland och tänkte föra in detta i event runner :) tack för ett super script :)
Hittade Detta på det officiella forumet gällande TOD, där kanske du kan hitta lite tips.
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Finns många sätt att åstadkomma det. Den länk som sonnyboy gav använder inte fibaro globals utan uppdaterar bara en lokal variabel i scriptet. Att sätta en fibaro global kan vara ok om en annan scen också ska agera på timeofday.
Ex. med global TOD som i skriptet refereras som $TOD

Code: Select all

  Rule.eval("07:00..10:00-1 => $TOD='Morning'").start()
  Rule.eval("10:00..18:00-1 => $TOD='Day'").start()
  Rule.eval("18:00..23:30-1 => $TOD='Evening'").start()
  Rule.eval("23:30..07:00-1 => $TOD='Night'").start()
En regel med 07.00..10:00 till vänster om '=>' triggas två ggr, först kl. 07.00 och sedan 10:00:01. Exakt varför beror på att det behövs för att få komplexa regler att funka men viktigast här är att den returnerar true om klockan är mellan 07:00 och 10:00 inklusive.
Så klockan 07:00 triggas första regeln och sätter TOD till 'Morning'. Kl. 10:00 triggar andra regeln och sätter TOD till 'Day' etc.

Vi drar bort en sekund från den sista tiden så intervall inte överlappar. Första blir egentligen 07:00..09:59:59.

Första regeln triggar också 09:59:59+1 dvs. 10:00 men det är utanför intervallet och blir falskt så att andra regel sätter variabeln istället.

Rule.eval(<rule>) returnerar en table som representerar regeln med ett antal funktioner. bl.a. .start() som kör regeln direkt utan att den behöver bli triggad. Det kan behövas ibland för att få regler att komma i rätt "tillstånd" när scriptet startar.
Här kör vi igång alla regler vid uppstart så att TOD sätts rätt oavsett när skriptet startas upp eller startas om.

Så det är basic. Sedan kan man lägga på fler villkor. ex. för helger.

Code: Select all

  Rule.eval("07:00..10:00-1 & wday('mon-fri') => $TOD='Morning'").start()
  Rule.eval("10:00..18:00-1 & wday('mon-fri') => $TOD='Day'").start()
  Rule.eval("18:00..23:30-1 & wday('mon-fri')=> $TOD='Evening'").start()
  Rule.eval("23:30..07:00-1 & wday('mon-fri') => $TOD='Night'").start()

  Rule.eval("09:00..11:00-1 & wday('sat-sun') => $TOD='Morning'").start()
  Rule.eval("11:00..17:00-1 & wday('sat-sun') => $TOD='Day'").start()
  Rule.eval("17:00..01:00-1 & wday('sat-sun')=> $TOD='Evening'").start()
  Rule.eval("01:00..09:00-1 & wday('sat-sun') => $TOD='Night'").start()
 
Ibland vill man uppdatera TOD mer flexibelt. 'Morning' sätts här kl. 07:00 eller när någon rör sig i köket.
Evening blir det när det mörknar på eftermiddagen.

Code: Select all

  rule("lux:lux < 100 & 16:00..18:00 => $TOD='Evening'").start()-- Evening when lux < 100 before 18:00 (but after 16:00)
  rule("sensor:breached & 05:00..07:00 => $TOD='Morning'").start() -- Morning when movements 05:00 to 07:00
  rule("07:00..10:00-1 => $TOD='Morning'})").start()
  rule("10:00..18:00-1 => $TOD='Day'").start()
  rule("18:00..23:30-1 => $TOD='Evening'").start()
  rule("23:30..07:00-1 => $TOD='Night'").start()
  
  rule("$TOD=='Morning' => ... speak greating")
  
Systemfel
Medlem
Posts: 384
Joined: 14 Jan 2015, 01:02
9

Tack för snabbt svar. Ska testa detta så fort jag får lite mer tid. Men tror jag förstår hur man ska skriver det nu :)
jang wrote: 15 Jul 2019, 13:00 Finns många sätt att åstadkomma det. Den länk som sonnyboy gav använder inte fibaro globals utan uppdaterar bara en lokal variabel i scriptet. Att sätta en fibaro global kan vara ok om en annan scen också ska agera på timeofday.
Ex. med global TOD som i skriptet refereras som $TOD

Code: Select all

  Rule.eval("07:00..10:00-1 => $TOD='Morning'").start()
  Rule.eval("10:00..18:00-1 => $TOD='Day'").start()
  Rule.eval("18:00..23:30-1 => $TOD='Evening'").start()
  Rule.eval("23:30..07:00-1 => $TOD='Night'").start()
En regel med 07.00..10:00 till vänster om '=>' triggas två ggr, först kl. 07.00 och sedan 10:00:01. Exakt varför beror på att det behövs för att få komplexa regler att funka men viktigast här är att den returnerar true om klockan är mellan 07:00 och 10:00 inklusive.
Så klockan 07:00 triggas första regeln och sätter TOD till 'Morning'. Kl. 10:00 triggar andra regeln och sätter TOD till 'Day' etc.

Vi drar bort en sekund från den sista tiden så intervall inte överlappar. Första blir egentligen 07:00..09:59:59.

Första regeln triggar också 09:59:59+1 dvs. 10:00 men det är utanför intervallet och blir falskt så att andra regel sätter variabeln istället.

Rule.eval(<rule>) returnerar en table som representerar regeln med ett antal funktioner. bl.a. .start() som kör regeln direkt utan att den behöver bli triggad. Det kan behövas ibland för att få regler att komma i rätt "tillstånd" när scriptet startar.
Här kör vi igång alla regler vid uppstart så att TOD sätts rätt oavsett när skriptet startas upp eller startas om.

Så det är basic. Sedan kan man lägga på fler villkor. ex. för helger.

Code: Select all

  Rule.eval("07:00..10:00-1 & wday('mon-fri') => $TOD='Morning'").start()
  Rule.eval("10:00..18:00-1 & wday('mon-fri') => $TOD='Day'").start()
  Rule.eval("18:00..23:30-1 & wday('mon-fri')=> $TOD='Evening'").start()
  Rule.eval("23:30..07:00-1 & wday('mon-fri') => $TOD='Night'").start()

  Rule.eval("09:00..11:00-1 & wday('sat-sun') => $TOD='Morning'").start()
  Rule.eval("11:00..17:00-1 & wday('sat-sun') => $TOD='Day'").start()
  Rule.eval("17:00..01:00-1 & wday('sat-sun')=> $TOD='Evening'").start()
  Rule.eval("01:00..09:00-1 & wday('sat-sun') => $TOD='Night'").start()
 
Ibland vill man uppdatera TOD mer flexibelt. 'Morning' sätts här kl. 07:00 eller när någon rör sig i köket.
Evening blir det när det mörknar på eftermiddagen.

Code: Select all

  rule("lux:lux < 100 & 16:00..18:00 => $TOD='Evening'").start()-- Evening when lux < 100 before 18:00 (but after 16:00)
  rule("sensor:breached & 05:00..07:00 => $TOD='Morning'").start() -- Morning when movements 05:00 to 07:00
  rule("07:00..10:00-1 => $TOD='Morning'})").start()
  rule("10:00..18:00-1 => $TOD='Day'").start()
  rule("18:00..23:30-1 => $TOD='Evening'").start()
  rule("23:30..07:00-1 => $TOD='Night'").start()
  
  rule("$TOD=='Morning' => ... speak greating")
  
kör Hc3 och det fungerar bättre och bätttre sakta men säkert :D
PeterM5
Medlem
Posts: 64
Joined: 13 Jul 2016, 10:55
8

Jag har provat med att skriva en scen med block för att se om det kan funka om mobilen är hemma eller inte, får det inte att fungera.
Jag kör med Eventrunner, fått utebelysningen och en del andra lampor att fungera.
Dörrlåset IDLock 150 ska låsa om allas mobiler är borta, är det någon som kan förklara vad jag börjar med?
Använder Home Assistant till min hemautomation, väldigt nöjd med det valet :D
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Det finns ganska många försök till lösningar på det. HC2:an har en inbyggd geofence funktion som många verkar klaga på - den beror på appen för att skicka position och det strular en del. Jag har själv inte använt den då mina familjemedlemmar inte använder fibaro appen (och jag väldigt sällan). Om man använder den så måsta man förmodligen tracka om ngn är hemma eller alla är borta då den bara ger events per användare.

Andra använder 3rd parts geofence appar som via HC2:ans API sätter en variabel som scener kan trigga på (eller pollar appen).
Andra har använt IFTT med viss framgång verkar det - men jag vet inte vilken tjänst de kopplat till IFTT. Bluetooth trackers har också använts.

Vi är en iPhone familj så jag använder en ER scen 'iOSLocator' som gör det ganska enkelt att tracka telefonerna, var de är och om någon är hemma.
Tyvärr fungerar den inte med Android då den beror av Apple's iCloud service. Om ni har iPhones så kan jag lägga upp en tutorial här.

Oavsett, så kan det vara bra att kombinera mobilposition med att ingen rör sig i huset för att bestämma om det är tomt.
Ett sätt är att om det rör sig i huset och alla dörrar är stängda så finns det någon garanterat hemma tills någon dörr öppnas igen.
Då kan man undvika falsklarm på natten då alla sover och ibland även mobiler.

Code: Select all

local rule = Rule.eval
rule("doors={hall.door,garage.door,altan.door}") -- define doors in/out of the house
rule("sensor={hall.motion,bedroom.motion,kitchen.motion}") -- define all motion sensors in the house

rule("sensors:breached & doors:safe => _homeSense=true") -- Any sensor breached while doors closed -> someone at home
rule("doors:breached => _homeSense=false") -- Any door open -> we don't know if someone home
'_homeSense' variabeln har ett '_' som prefix vilket gör att den triggar andra regler när den ändrar värden.

Det här ger oss bara om någon är hemma men inte om huset är tomt. Till det behövs ngn form av geofence, gärna kombinerat med andra regler.
Anta att vi har en fibaro global variabel 'homeGeo' som sätts till true/false beroende på om geofence tycker att ngn är hemma. Om geofence tycker att alla är borta men vår sensor har flaggat att ngn är hemma så ignorerar vi geofence.

Code: Select all

rule("$homeGeo=='true'  => _homeState=true") -- Geo says that someone at home, then someone is at home
rule("$homeGeo=='false'  & _homeSense => _homeState=true"") -- Geo says that all are away, but sensors says otherwise
rule("$homeGeo=='false'  & !_homeSense => _homeState=false"") -- Geo says that all are away, and no one moved since doors opened
Sedan kan vi agera beroende på _homeState

Code: Select all

rule(_homeState==false  => locks:close") 
rule(_homeState==true  => locks:open") 
Ex. om man har iPhones och satt upp iOSlocator så kan man sätta homeGeo variabeln såhär så här

Code: Select all

rule("subscribe(#presence{ios=true})")
rule("#presence{state='allaway',ios=true} => $homeGeo='false'")
rule("#presence{state='home',ios=true} => $homeGeo='true'")
Även med dessa regler kan det bli fel ibland. Geofence kan strula, telefoner glöms hemma, eller dörrar lämnas öppna. Man kan då lägga till lite meddelanden.

Code: Select all

rule("$homeGeo=='false' & doors:breached => my phone:msg='Warning: phones away but door opened!'")
rule("!_homeSense & for(01:00,sensors:safe) => 'my phone:msg='Note: No motion for 1hour since door last opened. Away?'")")
och sedan ha ngt sätt att remote manuellt sätta _homeState.

Det här är ett exempel och det är svårt att ge ett generellt "bästa exempel". Ibland kan man utnyttja familjevanor som t.ex skol och arbetstider för att ytterligare ge hjälp till de regler som ska avgöra om någon är hemma.
PeterM5
Medlem
Posts: 64
Joined: 13 Jul 2016, 10:55
8

Tack för snabbt svar.
Vi har android, men det blir ju svårt ändå.
Det blir ju samma problem om man glömmer mobilen hemma, men går det att göra något med wifi om man kommer utanför området?

Jag har lagt in autolock av/på efter våra arbetstider, men det är lätt att glömma låsa när vi åker bort.
Det är nu på semestern då jag ändrade tiderna som vi har glömt att låsa några ggr, men vi blir bättre på
att komma ihåg när vi märker att vi glömt.

Jag funderar på att använda en strömbrytare vid dörren för larm av/på.
Använder Home Assistant till min hemautomation, väldigt nöjd med det valet :D
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Att råka låsa när någon är hemma är kanske inte så farligt (värre att sätt på larmet).
Tidigare hade jag en regel typ nedan.

Code: Select all

local rule = Rule.eval
rule("doors={hall.door,garage.door,altan.door}") -- define doors in/out of the house
rule("sensors={hall.motion,bedroom.motion,kitchen.motion}") -- define all motion sensors in the house

function between(a,b,c) return a <= b and b <= c end
-- Ex . door safe at 08:00:20 and last sensor safe at 08:00:40, sensor-door = 20s
rule("for(00:20,doors:safe & sensors:safe & between(0,max(sensors:safe)-max(doors:safe),30)) => locks:secure")
Iden är att om dörrar och rörelsesensorer har varit 'safe' i 20min så lås dörren om den sista rörelsesensorn blev safe inom 30s efter den sista dörren stängdes. Jag har en rörelsesensor som sitter i närheten av dörren och som det är omöjligt att inte trigga om man går ut genom dörren. Så om någon går ut genom dörren och alla sensorer blir 'safe' inom 30s och sedan är safe i 20min så antar jag att den sista lämnat huset. Perioden 30s beror på hur rörelsesensorn är konfigurerad, dvs hur fort den blir safe efter rörelse.

Om någon ligger och sover och man lämnar hemmet så kommer den att låsa efter 20min men det är ofta ok och det man vill göra.
Man kan "säkra upp" regeln med tidsintervall, t.ex att bara gälla 07:30..10:00 vardagar då familjen normalt lämnar hemmet för att se till att det blir låst.

Code: Select all

rule("for(00:20,doors:safe & sensors:safe & between(0,max(sensors:safe)-max(doors:safe),30)) & 07:30..11:00 & wday('mon-fri') => locks:secure")
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Hittade denna fina kodsnutt på Fibaros forum

Code: Select all

rule("@15:00 & wday('sun') & wnum % 2 == 1 => log('15:00 on a Sunday in an odd week')")
Jag funderar på att använda den och skicka push till telefonerna när det är dags för EX bokbussen som vi alltid glömmer bort (vi har bokbuss ute på landet ) Men jag förstår inte hur jag ska modifiera koden så jag får den att använda jämna veckor, byta dag misstänker jag bara är att ändra ('sun')) till ('mon').
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
jompa68
Proffsmedlem
Posts: 735
Joined: 12 Aug 2012, 08:53
12
Location: Hofors

sonnyboy wrote: 06 Aug 2019, 08:48 Hittade denna fina kodsnutt på Fibaros forum

Code: Select all

rule("@15:00 & wday('sun') & wnum % 2 == 1 => log('15:00 on a Sunday in an odd week')")
Jag funderar på att använda den och skicka push till telefonerna när det är dags för EX bokbussen som vi alltid glömmer bort (vi har bokbuss ute på landet ) Men jag förstår inte hur jag ska modifiera koden så jag får den att använda jämna veckor, byta dag misstänker jag bara är att ändra ('sun')) till ('mon').

Code: Select all

  rule("@09:00 & wday('wed') & wnum % 2 == 0 => log('Jämn vecka')")
  rule("@09:00 & wday('wed') & wnum % 2 == 1 => log('Ojämn vecka')")
  
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

jompa68 wrote: 06 Aug 2019, 09:32

Code: Select all

  rule("@09:00 & wday('wed') & wnum % 2 == 0 => log('Jämn vecka')")
  rule("@09:00 & wday('wed') & wnum % 2 == 1 => log('Ojämn vecka')")
Tackar :D :D
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Finns det något sätt att starta en scen från ER, Jag har läst både här och på Fibaros forum men hittar inget.
Scenen som ska starta är så att Google calender uppdateras i Hc:2
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
Post Reply