EventRunner

RH_Dreambox
Proffsmedlem
Posts: 970
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

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.
2 st HC2 4.560 - EventRunner 3
jang
Medlem
Posts: 149
Joined: 05 Jan 2014, 00:44
Location: Stockholm

22 Mar 2019, 18:00

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.
RH_Dreambox
Proffsmedlem
Posts: 970
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

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
2 st HC2 4.560 - EventRunner 3
jang
Medlem
Posts: 149
Joined: 05 Jan 2014, 00:44
Location: Stockholm

23 Mar 2019, 10:17

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
RH_Dreambox
Proffsmedlem
Posts: 970
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

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'") 
2 st HC2 4.560 - EventRunner 3
jang
Medlem
Posts: 149
Joined: 05 Jan 2014, 00:44
Location: Stockholm

23 Mar 2019, 11:14

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.
RH_Dreambox
Proffsmedlem
Posts: 970
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

23 Mar 2019, 12:08

Tack, nu funkar det även i Windows. Vi får skylla detta på Bill Gates :lol:
2 st HC2 4.560 - EventRunner 3
sonnyboy
Proffsmedlem
Posts: 642
Joined: 26 Sep 2013, 08:05
Location: Västerås

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"
Fibaro HomeCenter 2
Fw 4.550
BeyondMeasure 1.10
EventRunner
RH_Dreambox
Proffsmedlem
Posts: 970
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

26 Mar 2019, 13:54

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'")
2 st HC2 4.560 - EventRunner 3
jang
Medlem
Posts: 149
Joined: 05 Jan 2014, 00:44
Location: Stockholm

26 Mar 2019, 14:07

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: 149
Joined: 05 Jan 2014, 00:44
Location: Stockholm

26 Mar 2019, 14:20

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')")
RH_Dreambox
Proffsmedlem
Posts: 970
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

26 Mar 2019, 16:21

@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: '
2 st HC2 4.560 - EventRunner 3
jang
Medlem
Posts: 149
Joined: 05 Jan 2014, 00:44
Location: Stockholm

26 Mar 2019, 17:09

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.
RH_Dreambox
Proffsmedlem
Posts: 970
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

26 Mar 2019, 17:19

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)")
2 st HC2 4.560 - EventRunner 3
jang
Medlem
Posts: 149
Joined: 05 Jan 2014, 00:44
Location: Stockholm

26 Mar 2019, 17:49

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...
RH_Dreambox
Proffsmedlem
Posts: 970
Joined: 03 Jan 2015, 16:49
Location: Vegby
Contact:

26 Mar 2019, 18:01

Tack för lektionen med catchup :idea:
Och tack för en utmärkt DEBUG i ER.
2 st HC2 4.560 - EventRunner 3
jang
Medlem
Posts: 149
Joined: 05 Jan 2014, 00:44
Location: Stockholm

26 Mar 2019, 18:15

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: 121
Joined: 25 Apr 2017, 07:24

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?
jang
Medlem
Posts: 149
Joined: 05 Jan 2014, 00:44
Location: Stockholm

26 Mar 2019, 18:53

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: 121
Joined: 25 Apr 2017, 07:24

26 Mar 2019, 19:26

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

Skickat från min SM-N960F via Tapatalk

Post Reply