EventRunner

User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1203
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

Ja det där med solens uppgång var ju inte så svårt (när man kan det) :-)
Och det var ju bra att man kan använda catchup, det hade jag missat. Men det vore väl bra om även scener kunde använda catchup, men jag nöjer mig med detta så länge.
Det är mycket info att ta in när man börjar med något nytt och annorlunda än det man kört i flera år. Det gäller bara att läsa på allt man kan hitta om ER, så kanske lösningen finns där.
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
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

RH_Dreambox wrote: 22 Mar 2019, 16:48 Ja det där med solens uppgång var ju inte så svårt (när man kan det) :-)
Och det var ju bra att man kan använda catchup, det hade jag missat. Men det vore väl bra om även scener kunde använda catchup, men jag nöjer mig med detta så länge.
Det är mycket info att ta in när man börjar med något nytt och annorlunda än det man kört i flera år. Det gäller bara att läsa på allt man kan hitta om ER, så kanske lösningen finns där.
Luascheduler är en ren tids-schedulerare och då kan det funka att hela scenen försöker göra catchup. I ER mixas det ibland med trigger villkor i reglerna och då blir det svårt generellt. Jag försökte vara smart tidigare men det gav oönskade effekter, så nu får man markera tidsregler med catchup om man behöver det. Också som i exemplet att man kan begränsa det till ett tidsintervall.
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1203
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

Det var rätt kul det här!
Men nu försöker jag få till att min tablet i hallen skall tala om när jag skall ställa ut soptunnan (skicka texten till en global variabel TTS).
Jag tycker koden ser korrekt ut men jag får ändå ett felmeddelande. Vad kan jag ha missat?

Code: Select all

rule("@08:44 & wday('sat') & wnum%2 == 0 => $TTS = 'Idag skall du ställa fram soptunnan.&vol=12'")
Felmeddelandet

Code: Select all

[20:1][DEBUG] 08:44:00: [31mSat Mar 23: Error in '@08:44 & wday('sat') & wnum%2 == 0 => $TTS = 'Idag skall du ställa fram soptunnan.'': Event Runner/EventRunner.lua:1164: Event Runner/EventRunner.lua:1036: attempt to perform arithmetic on local 'b' (a nil value)[0m
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
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

RH_Dreambox wrote: 23 Mar 2019, 09:56 Det var rätt kul det här!
Men nu försöker jag få till att min tablet i hallen skall tala om när jag skall ställa ut soptunnan (skicka texten till en global variabel TTS).
Jag tycker koden ser korrekt ut men jag får ändå ett felmeddelande. Vad kan jag ha missat?

Code: Select all

rule("@08:44 & wday('sat') & wnum%2 == 0 => $TTS = 'Idag skall du ställa fram soptunnan.&vol=12'")
Felmeddelandet

Code: Select all

[20:1][DEBUG] 08:44:00: [31mSat Mar 23: Error in '@08:44 & wday('sat') & wnum%2 == 0 => $TTS = 'Idag skall du ställa fram soptunnan.'': Event Runner/EventRunner.lua:1164: Event Runner/EventRunner.lua:1036: attempt to perform arithmetic on local 'b' (a nil value)[0m
Har du Mac eller Windows? Ifallet Windows, vilket OS? Jag använder bara Mac så jag har lite dålig koll på Windows.
Det ser ut som wnum returnerar nil, och sättet att få veckonummer i Lua är med os.date("%V"), och det kan vara strul med Windows
Kan du prova att köra det här i ZBS (behöver inte vara en scen)
print( os.date("%W") )
print( os.date("%V") )
print(os.getenv('OS')) -- För att se vilket OS som rapporteras.

och se vilket som fungerar?

Om os.date("%V") fungerar kan du använda

Code: Select all

rule("@08:44 & wday('sat') & osdate('%V')%2 == 0 => $TTS = 'Idag skall du ställa fram soptunnan.&vol=12'")
tills jag pushar en fix
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1203
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

print( os.date("%W") ) ger resultatet 11och print( os.date("%V") ) ger ett blankt svar.
Men det är ju vecka 12 nu, så varför 11 som svar?

Glömde...
Windows 10.

EDIT
Körd i ZeroBrane. Den här fungerade, men en etta i koden betyder väl udda vecka, nu är det ju jämn vecka.

Code: Select all

 rule("@09:50 & wday('sat') & osdate('%W')%2 == 1 => $TTS = 'Idag skall du ställa fram soptunnan.&vol=12'")
Och den här raden fungerade i HC2

Code: Select all

  rule("@10:04 & wday('sat') & wnum%2 == 0 => $TTS = 'Viktigt meddelande. Idag skall du ställa fram soptunnan.&vol=12'") 
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
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

RH_Dreambox wrote: 23 Mar 2019, 10:40 print( os.date("%W") ) ger resultatet 11och print( os.date("%V") ) ger ett blankt svar.
Men det är ju vecka 12 nu, så varför 11 som svar?

Glömde...
Windows 10.

EDIT
Körd i ZeroBrane. Den här fungerade, men en etta i koden betyder väl udda vecka, nu är det ju jämn vecka.

Code: Select all

 rule("@09:50 & wday('sat') & osdate('%W')%2 == 1 => $TTS = 'Idag skall du ställa fram soptunnan.&vol=12'")
Och den här raden fungerade i HC2

Code: Select all

  rule("@10:04 & wday('sat') & wnum%2 == 0 => $TTS = 'Viktigt meddelande. Idag skall du ställa fram soptunnan.&vol=12'") 
Det ska vara 12 enligt ISO standard. 11 är veckonummer som startar på 0.
Ok, jag har pushat en ny version av EventRunner (v2.0 fix B7) med en egen version av week number - kan inte lita på Lua :-)
Nu borde det funka... för alla.
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1203
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

Tack, nu funkar det även i Windows. Vi får skylla detta på Bill Gates :lol:
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
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
11
Location: Västerås

Är i behov av lite hjälp, jag har en fördefinerad variabel som heter "Month"
Kan man få ER att uppdatera den variabeln men rätt värde den 1 i varje månad?
Så nu när vi rullar över i April så uppdateras variabeln med "April"
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1203
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

Den här fungerar för mig.
Jag är bara lite osäker på var funktionen montName skall placeras.
Jag lade den under function main().

Code: Select all

    function monthName() return ({"Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"})[osDate("*m").month] end

Code: Select all

-- Uppdatera variabeln Month vid midnatt den första dagen i månaden
  Rule.eval("@00:00 & day('1') => $Month = 'monthName'")
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
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

sonnyboy wrote: 26 Mar 2019, 11:11 Är i behov av lite hjälp, jag har en fördefinerad variabel som heter "Month"
Kan man få ER att uppdatera den variabeln men rätt värde den 1 i varje månad?
Så nu när vi rullar över i April så uppdateras variabeln med "April"

Code: Select all

  months={"Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"}
  rule("$Month=months[osdate('*t').month]") -- set when scene starts up
  rule("@00:00 & day('1') => $Month=months[osdate('*t').month]") --- ... and every midnight
  rule("$Month => log('Month:%s',$Month)")
Kan vara bra att göra en tilldelning när scenen startar upp också (eller en catchup)
alt som RH_Dreambox. Måste vara funktionsanrop ex. monthName()

Code: Select all

  function monthName()
     return ({"Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"})[osDate("*t").month]
  end
  rule("$Month=monthName()")
  rule("@00:00 & day('1') => $Month=monthName()")
  rule("$Month => log('Month:%s',$Month)")
Svensk variant av årstider

Code: Select all

rule([[@00:00 & day('1') =>
          month('nov-mar') => $Season='Vinter'
          month('apr-may') => $Season='Vår'
          month('jun-jul') => $Season='Sommar'
          month('aug-oct') => $Season='Höst'
        ]])
 
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

day(...) är en ganska flexibel funktion.

Code: Select all

rule("@08:00 & day('1') => log('kl 8.00 första dagen i månaden')")
rule("@08:00 & day('last') => log('kl 8.00 sista dagen i månaden')")
rule("@08:00 & day('lastw') => log('kl 8.00 första dagen i sista veckan i månaden')")
rule("@08:00 & day('lastw-last') & wday('mon') => log('kl 8.00 sista måndagen I veckan')")
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1203
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

@jang, ditt exempel med months utan någon funktion fungerade bra.
Men jag får inte till ditt exempel men Season, inte heller mitt exempel nedan för WeekDay.
Kan du ge mig en liten hint om vad jag har gjort fel?
Debug visar att det fungerar, men ... Skall det bli ett ensamt tecken i slutet på debug-stycket?

Code: Select all

  -- WEEKDAY #######################################
  days={"Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag","Söndag"}
  rule("$WeekDay=days[osdate('*t').wday]") -- set when scene starts up
  rule("@15:10 & day('26') => $WeekDay=days[osdate('*t').wday]") --- ... and every midnight
  rule("$WeekDay => log('WeekDay:%s',$WeekDay)")
-- SEASON #######################################
  rule([[@15:11 & day('26') =>
          month('nov-mar') => $Season = 'Vinter'
          month('apr-may') => $Season = 'Vår'
          month('jun-jul') => $Season = 'Sommar'
          month('aug-oct') => $Season = 'Höst'
        ]])

Code: Select all

[DEBUG] 15:10:00: [true]>>'@15:10 & day('26') => $WeekDay=days[osdate('*t').wday]'

[DEBUG] 15:11:00: [true]>>'@15:11 & day('26') =>
[DEBUG] 15:11:00: month('nov-mar') => $Season = 'Vinter'
[DEBUG] 15:11:00: month('apr-may') => $Season = 'Vår'
[DEBUG] 15:11:00: month('jun-jul') => $Season = 'Sommar'
[DEBUG] 15:11:00: month('aug-oct') => $Season = 'Höst'
[DEBUG] 15:11:00: '
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
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Code: Select all

rule([[@00:00 & day('1') =>
          || month('nov-mar') >> $Season='Vinter'
          || month('apr-may') >> $Season='Vår'
          || month('jun-jul') >> $Season='Sommar'
          || month('aug-oct') >> $Season='Höst'
        ]])
Hjärnsläpp, det ska vara ’|| test >> action’ syntax.
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1203
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

Ja den fungerade mycket bättre :-)
Men hann du titta på den andra koden som jag inte får till?
Månader funkade bra, men inte veckodagar.

EDIT
Jag kom på vad felet var...
Veckan skall ju börja med Söndag :o :D

EDIT
Och det skall ju ske varje dag, inte första dagen i månaden :oops: :oops: :oops:

Code: Select all

  -- WEEKDAY #######################################
  
  days={"Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"}
  rule("$WeekDay=days[osdate('*t').wday]") -- set when scene starts up
  rule("@00:00 => $WeekDay=days[osdate('*t').wday]") --- ... and every midnight
  rule("$WeekDay => log('WeekDay:%s',$WeekDay)")
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
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

RH_Dreambox wrote: 26 Mar 2019, 17:19 EDIT
Och det skall ju ske varje dag, inte första dagen i månaden :oops: :oops: :oops:

Code: Select all

  -- WEEKDAY #######################################
  
  days={"Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"}
  rule("$WeekDay=days[osdate('*t').wday]") -- set when scene starts up
  rule("@00:00 => $WeekDay=days[osdate('*t').wday]") --- ... and every midnight
  rule("$WeekDay => log('WeekDay:%s',$WeekDay)")
:D
Här funkar även catchup så man slipper uppstartsregeln

Code: Select all

days={"Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"}
rule("@{catch,00:00} => $WeekDay=days[osdate('*t').wday]") --- run at startup and every midnight
rule("$WeekDay => log('WeekDay:%s',$WeekDay)")
du körs den också vid uppstart. Inte helt nöjd med syntaxen för catchup, borde gå att göra snyggare...
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1203
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

Tack för lektionen med catchup :idea:
Och tack för en utmärkt DEBUG i ER.
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
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Om man vill sätta lite dag/tid variabler så kan man kombinera det i en regel som körs vid midnatt varje dag

Code: Select all

days={"Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"}
months={"Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"}
rule([[@{catch,00:00} => 
             $WeekDay=days[osdate('*t').wday];
             $Month=months[osdate('*t').month];
            || month('nov-mar') >> $Season='Vinter'
            || month('apr-may') >> $Season='Vår'
            || month('jun-jul') >> $Season='Sommar'
            || month('aug-oct') >> $Season='Höst']])
En till finess i ER är att vi kan ha sektioner av regler som vi kan aktivera/avaktivera med andra regler

Code: Select all

Event.SECTION='Winter'      -- Winter rules

Rule.eval("@sunset => xmasTree:on")      

Event.SECTION='Summer'     -- Summer rules

Rule.eval("@sunset => lamp:on")      

Event.SECTION=nil     -- rest of rules doesn't belong to any section

Rule.eval([[@{catch,00:00} =>       
	|| month('dec-jan') >> enable('Winter'); disable('Summer')
	|| month('jun-aug') >> enable('Summer'); disable('Winter')
	]])
Alla regler startar aktiverade så vi måste ha någon regel som slår på/av de andra. I exemplet ovan är det för olika säsonger men jag har funnit att det är ganska bra för arbetsdagar vs. lediga dagar. På så sätt slipper man massa extra tester i alla regler beroende på vilken typ av dag det är och man kan fokusera på funktionaliteten.
Ex.

Code: Select all

Event.SECTION='Weekend'      

Rule.eval("sensor:breached =>lamp:on")       -- Weekend, turn on lamp when someone moves

Event.SECTION='Weekday'      

Rule.eval("@06:30 => lamp:on")  -- Working days, turn on lamp at 6:30, always

Event.SECTION=nil   -- rest of rules doesn't belong to any section

Rule.eval([[@{catch,00:00} =>       
	|| wday('sat-sun') >> enable('Weekend'); disable('Weekday')
	|| wday('mon-fri') >> enable('Weekday'); disable('Weekend')
	]])
MastrUsr
Medlem
Posts: 202
Joined: 25 Apr 2017, 07:24
7

Hej!
Finns det möjlighet att använda rest-api't?

Jag vill göra detta:

Code: Select all

deviceID = "208" -- Example room ID
data = '{"properties": {"parameters":[{"id":19,"size":1,"value":0}]}}'
HOST = Net.FHttp("127.0.0.1",11111);
local response ,status, err = HOST:PUT('/api/devices/'..deviceID, data);
fibaro:debug(' Error code: ' .. err)
if (tonumber(status)==200) then
  fibaro:debug('Funkade :)')
else
  fibaro:debug('Funkade inte :(')
end

Om inte så kanske jag att jag kan kalla på "ett tryck" på en VD?
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

MastrUsr wrote: 26 Mar 2019, 18:24 Hej!
Finns det möjlighet att använda rest-api't?

Jag vill göra detta:

Code: Select all

deviceID = "208" -- Example room ID
data = '{"properties": {"parameters":[{"id":19,"size":1,"value":0}]}}'
HOST = Net.FHttp("127.0.0.1",11111);
local response ,status, err = HOST:PUT('/api/devices/'..deviceID, data);
fibaro:debug(' Error code: ' .. err)
if (tonumber(status)==200) then
  fibaro:debug('Funkade :)')
else
  fibaro:debug('Funkade inte :(')
end
Om inte så kanske jag att jag kan kalla på "ett tryck" på en VD?
Tryck på VD funkar alltid.
Net.FHttp är en VD funktion som inte finns i scener.
I scener finns api.put/get/post(url, data) som funkar att anropa från regler också

Code: Select all

rule("@15:00 => api.put(frm('/api/devices/%s',deviceID),{id=19,size=1,value=0})")
Det finns ingen strängkonkatenering i EventScript så man måste använda format funktionen 'frm'
Alternativt definiera en Lua funktion

Code: Select all

function updateDevice(id, data) api.put("/api/devices/"..id,data) end
rule("@15:00 => updateDevice(deviceID,{id=19,size=1,value=0})")
Last edited by jang on 01 Apr 2019, 04:29, edited 1 time in total.
MastrUsr
Medlem
Posts: 202
Joined: 25 Apr 2017, 07:24
7

Grymt, tack @jang! Ska prova ikväll :)

Skickat från min SM-N960F via Tapatalk

Post Reply