EventRunner

User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
10
Location: Västerås

jang wrote: 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'
        ]])
 
Fungerar kanon :)
Supertack för snabba svar varje gång jag har en fråga. Måste få tiden att räcka till så jag kan migrera allt från GEA till ER. Jag tycker personligen att ER svarar snabbare än vad GEA gör :)
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
MastrUsr
Medlem
Posts: 202
Joined: 25 Apr 2017, 07:24
6

Detta funkar naturligtvis klockrent.. Men jag fattar inte hur den sista funktionen (vilken jag valde att använda) vet vilken enhet den ska skriva parametrarna till? jag antar att det är deviceID som i detta fallet är enhet med id 208... Jag har inte deklarerat något mer än det sista exemplet du skrev @jang.

jang wrote: 26 Mar 2019, 18:53 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/"..deviceID,data) end
rule("@15:00 => updateDevice(deviceID,{id=19,size=1,value=0})")
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1192
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

"Rule.eval" eller bara "rule"?
I de exempel jag hittar och använder står det ibland "rule" och ibland "Rule.eval", men vad är skillnaden?
I dokumentation jag hittar står det oftast "Rule.eval".
Jag använder båda metoderna och märker ingen skillnad, men det finns väl en anledning till två olika kommandon?

Code: Select all

Rule.eval("@06:45 => sovrum.lampa:off")
eller
rule("@06:45 => sovrum.lampa:off")
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
10
Location: Västerås

Detta finns i koden på ER misstänker det inte fanns från början utan det kommit med tiden av uppdateringar

Code: Select all

function main()
  local rule,define = Rule.eval, Util.defvar
RH_Dreambox wrote: 27 Mar 2019, 10:19 "Rule.eval" eller bara "rule"?
I de exempel jag hittar och använder står det ibland "rule" och ibland "Rule.eval", men vad är skillnaden?
I dokumentation jag hittar står det oftast "Rule.eval".
Jag använder båda metoderna och märker ingen skillnad, men det finns väl en anledning till två olika kommandon?

Code: Select all

Rule.eval("@06:45 => sovrum.lampa:off")
eller
rule("@06:45 => sovrum.lampa:off")
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: 27 Mar 2019, 13:39 Detta finns i koden på ER misstänker det inte fanns från början utan det kommit med tiden av uppdateringar

Code: Select all

function main()
  local rule,define = Rule.eval, Util.defvar
RH_Dreambox wrote: 27 Mar 2019, 10:19 "Rule.eval" eller bara "rule"?
I de exempel jag hittar och använder står det ibland "rule" och ibland "Rule.eval", men vad är skillnaden?
I dokumentation jag hittar står det oftast "Rule.eval".
Jag använder båda metoderna och märker ingen skillnad, men det finns väl en anledning till två olika kommandon?

Code: Select all

Rule.eval("@06:45 => sovrum.lampa:off")
eller
rule("@06:45 => sovrum.lampa:off")
Ja, funktionen är Rule.eval(..) men det är jobbigt att skriva så man definierar
local rule = Rule.eval
och använder rule istället.
ER består av många funktioner så jag har grupperat de flesta så att de inte ska krocka med användarens egna funktioner.
Event.*
Util.*
Rule.*
Hue.*
är de stora grupperna i ER av funktioner.
maxxar
Medlem
Posts: 126
Joined: 06 Sep 2012, 13:30
11

Jag håller på att testa ER och gillar det hittills, grymt jobb av dig jang. Har testat lite liknande scener genom åren såsom GEA och Lua scheduler m.fl.
Men denna känns ganska enkel för en som inte har jättebra programmeringskills.
Tänkte faktiskt börja flytta in allt i ER och se hur det funkar.

Men behöver lite tips på hur jag löser att en notis skickas till min telefon om kylskåpsdörren stått öppen i 3 min och repetera detta var tredje minut tills kylen stängs.

Code: Select all

rule("for(00:03,kok.kylen:breached) => telefon.daniel:msg=('Kylen har stått öppen i 3min') ; log('Notis skickad!')")
Denna funkar skapligt dock repeteras inte notisen var tredje minut
Så får inte riktigt till det, hur löser jag det?
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

maxxar wrote: 30 Mar 2019, 00:13 Jag håller på att testa ER och gillar det hittills, grymt jobb av dig jang. Har testat lite liknande scener genom åren såsom GEA och Lua scheduler m.fl.
Men denna känns ganska enkel för en som inte har jättebra programmeringskills.
Tänkte faktiskt börja flytta in allt i ER och se hur det funkar.

Men behöver lite tips på hur jag löser att en notis skickas till min telefon om kylskåpsdörren stått öppen i 3 min och repetera detta var tredje minut tills kylen stängs.

Code: Select all

rule("for(00:03,kok.kylen:breached) => telefon.daniel:msg=('Kylen har stått öppen i 3min') ; log('Notis skickad!')")
Denna funkar skapligt dock repeteras inte notisen var tredje minut
Så får inte riktigt till det, hur löser jag det?
Det är kommandot 'repeat()' som man använder på högra sidan av regeln och som "triggar om" timern som 'for' startar. Det är inte viktigt vart på höger-sidan repeat() står, så länge den körs. Och notera att hela höger-sidan körs oavsett var repeat() står, så i exemplet nedan körs även 'log' som ligger efter repeat().

Code: Select all

  rule("for(00:03,kok.kylen:breached) => telefon.daniel:msg='Kylen har stått öppen i 3min' ; repeat(); log('Notis skickad!')")

repeat() returnerar också hur många ggr den har repeterat. Det gör att vi kan skriva

Code: Select all

  rule("for(00:03,kok.kylen:breached) => telefon.daniel:msg=frm('Kylen har stått öppen i %smin',3*repeat()); log('Notis skickad!')")

...och vi får meddelandet att den stått öppen i 3,6,9,12,... minuter. 'frm(...)' är som Lua's string.format och tar samma argument.
Slutligen kan repeat() ta ett argument, repeat(n), hur många ggr det max ska repetera.

Code: Select all

  rule("for(00:03,kok.kylen:breached) => telefon.daniel:msg=frm('Kylen har stått öppen i %smin',3*repeat(5)); log('Notis skickad!')")

...och vi får 5 påminnelser, efter 3,6,9,12,15min

Jag är inte en specialist på GEA, men jag är övertygad att allt i GEA går att översätta till ER.
Last edited by jang on 30 Mar 2019, 08:49, edited 1 time in total.
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Så vissa av er har erfarenhet av GEA. Normalt körs GEA's regler var 30:e sekund (går att ställa om) eller så reagerar de på direkt på triggers (-1).
En GEA regel som ska göra något om en dörr stått öppen i 5min, kollar regeln var 30:e sekund och efter 10*30s då villkoret varit sant så kör den höger-sidan av regeln.
ER är annorlunda här och det kan vara bra att förstå. 'for' är konstruktionen för att se om ett villkor varit sant en viss tid.

Code: Select all

rule("for(<tid>,<villkor>) => <commandon>")
Vad ER gör är att när regeln definieras så inspekteras <villkor> för att se vilka "potentiella" triggers som det innehåller. Om det är en test av en fibaro global, eller status på en device eller ngt annat. Ex.

Code: Select all

rule("for(00:05,77:isOn & $Home=='away' & 10:00..11:00) => log('Hupp")")
Regeln ovan anropas när deviceID 77 ändrar status, fibaro global 'Home' ändrar status, när kl. blir 10:00, och när kl. blir 11:00:01.
Vid varje anrop så kommer 'for' att beräkna villkoret (77:isOn & $Home=='away' & 10:00..11:00) och om det är sant starta en timer för 5min. Om det är falskt så stoppas timern. Om en timer är redan startad, men det har inte gått 5min än så görs inget.
Det viktiga här är att regeln reagerar på triggers, inte testas med jämna intervall som i GEA. Oftast gör det ingen skillnad. Notera dock att man måste definiera 77, och 'Home' i scen headern annars får vi ingen trigger. I GEA behövs det inte eftersom de hämtar värdena själv var 30:e sekund.
Fördelen med ER är att om 77 och Home inte ändrar värden så behöver regeln inte köras (förutom kl. 10.00 och 11.00.01).
En annan skillnad är att man bör tänka på vad som ska hända när en ER scen startar upp. Regler körs inte automatiskt vid startup utan när de får en trigger (interval och tidsregler @ och @@, körs men de får 'tids-triggers' av ER)

I det tidigare exemplet när en push notis skulle sändas om ett kylskåp varit öppet i 3min, 'for' regeln triggas när kylskåpet öppnas.

Code: Select all

rule("for(00:03,kok.kylen:breached) => telefon.daniel:msg='Kylen har stått öppen i 3min' ; log('Notis skickad!')")
men vi har ett potentiellt problem. Om kylskåpsdörren redan är öppen när vi startar ER scenen, så får regeln ingen trigger (inget nytt händer).
Vi skulle egentligen vilja att regler kördes en gång vid startup. Tyvärr orsakar det andra problem i det generella fallet (jag kan återkomma varför i en annan post), men vi skulle behöva ngt sätt att sparka på vissa regler när scenen startas upp.
För de flesta regler kan vi göra det (i en ny version av EventRunner som jag just laddade upp till GitHub)

Code: Select all

rule("for(00:03,kok.kylen:breached) => telefon.daniel:msg='Kylen har stått öppen i 3min' ; log('Notis skickad!')").start()
rule(<regel>) returnerar ett Lua objekt som representerar regeln. Det objektet har 3 metoder; enable(), disable(), och start().
Den sistnämnda, 'start()', kör regeln direkt utan att vänta på en trigger, och är vad vi behöver här. Om kylskåpsdörren är stängd händer inget, och om den är öppen så startas timern.
Ett annat exempel är om vi ska göra ngt beroende på en fibaro global

Code: Select all

rule("$HomeStatus=='away' & alarm:isOff => alarm:on").start()
den här regeln vill vi förmodligen också köra när scenen startar upp, och vi testar att larmet är av så vi inte startar det 2 ggr på varandra.

Inget av det här är ett problem när scenen väl kör men vid startup bör vi tänka igenom vad som ska hända. För tidsregler finns också 'catch' flaggan som kör en regel vid startup även om tiden har passerat.
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1192
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

Sommartid igen, och inte en enda lampa har rätt status.
Hur har ni andra löst detta? Gick ni upp mitt i natten och bootade om Fibaron eller kan man fixa det via 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

RH_Dreambox wrote: 31 Mar 2019, 07:55 Sommartid igen, och inte en enda lampa har rätt status.
Hur har ni andra löst detta? Gick ni upp mitt i natten och bootade om Fibaron eller kan man fixa det via ER?
Well, det kanske var sista gången vi behöver ställa om, eller är det 2021?
Har man många olika scener som schedulerar tid så är nog enklast att antingen starta om scenerna eller hela burken.
Man borde kunna starta om HC2:an med en sådan här regel

Code: Select all

SWdates = {["03/31/19"]=true,["03/29/20"]=true,["03/28/21"]=true,["10/27/19"]=true,["10/25/20"]=true,["10/31/21"]=true}
rule("@00:02 & SWdates[osdate('%x')] => HomeCenter.SystemService.reboot()")
...men det känns alltid drastiskt att behöva boota om den...
Det finns en hjälp scen till ER som heter Supervisor.lua. Dess jobb är att pinga alla ER scener och om de inte svarar starta om dem.
På så sätt kan man om man vill göra en regel som gör fibaro:abort just efter sommar/vintertidsomställning. Scenen kommer då att starta om när Supervisor upptäcker att den är död. Det kan vara en lösning om man har allt samlat i ER.

Men allt det sagt, så startade jag om min autolights ER scene i morse för hand :)
Last edited by jang on 31 Mar 2019, 13:28, edited 1 time in total.
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1192
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

Ja vi får väll hoppas att sommartiden försvinner, dygnet blir ju lika långt ändå :-)
Men för säkerhets skull kommer jag att skriva om reglerna med "catchup", så behöver man bara starta om scenen.
Tack för att den möjligheten finns :-)

Code: Select all

  rule("@{catch,06:46 & sunrise > 06:46} => sovrum.lampa:on")
  rule("@{catch,sunrise} => sovrum.lampa:off")
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
maxxar
Medlem
Posts: 126
Joined: 06 Sep 2012, 13:30
11

Har även lagt på lite catch'up på mina tidsstyrda regler, men det blev lite strul med catch påslaget på båda regler nedan men det beror på vilken ordning de ligger i
Kan ha det på ena men inte på båda? Hur löser jag det?

Code: Select all

  rule("@{catch,sunset+00:10} => garage.fasadbak:on")
  rule("@{catch,sunrise-00:10} => garage.fasadbak:off")
  
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

maxxar wrote: 01 Apr 2019, 00:28 Har även lagt på lite catch'up på mina tidsstyrda regler, men det blev lite strul med catch påslaget på båda regler nedan men det beror på vilken ordning de ligger i
Kan ha det på ena men inte på båda? Hur löser jag det?

Code: Select all

  rule("@{catch,sunset+00:10} => garage.fasadbak:on")
  rule("@{catch,sunrise-00:10} => garage.fasadbak:off")
  
Om du startar scenen efter sunset (men före midnatt) så kommer båda reglerna ha hänt, och med catchup kommer båda reglerna att köra.
Regler körs i ordning de är deklarerade så om lampan slutar i läge av eller på beror på det.
Vad man kan göra är att villkora regeln med ett tidsintervall då det är vettigt att köra catchup. I det här fallet är dygnet uppdelat på 2 perioder, en då lampan ska vara på och en då den ska vara av, så det är ganska enkelt.

Code: Select all

  rule("@{catch,sunset+00:10} & sunset+00:10..sunrise-00:10 => garage.fasadbak:on")
  rule("@{catch,sunrise-00:10} & sunrise-00:10..sunset+00:10 => garage.fasadbak:off")
  
Egentligen behöver du bara villkora sunrise regeln, för problemet är att om scenen startar efter sunset körs catchup på sunrise - men för symmetrin...
Om du startar om scenen exakt sunset+00:10:00 eller sunrise-00:10:00 så är båda reglerna sanna (för intervallen överlappar) och det blir ett problem, så ett mer korrekt sätt är att ange intervallen

Code: Select all

  rule("@{catch,sunset+00:10} & sunset+00:10..sunrise-00:09:59 => garage.fasadbak:on")
  rule("@{catch,sunrise-00:10} & sunrise-00:10..sunset+00:09:59 => garage.fasadbak:off")
  
Rent allmänt kan det vara bra att lägga till ett tidsintervall till regler med catchup då det är vettigt att köra regeln. Om man tänder en morgonbelysning (vilket jag gör på vintern) så villkorar jag den med ett tidsintervall som slutar när lampan ska släckas. Ingen poäng att den catchup:en körs på kvällen.

Som man ser så får sådana här regler ett specifikt mönster
"@{catch,<time1>} & <time1>..<time2> => <action>"
Eftersom regler bara är Lua strängar kan vi definiera Lua funktioner som definierar regler åt oss.

Code: Select all

function atInterval(time1,time2,action)
   return rule(string.format("@{catch,%s} & %s..(%s-00:00:01) => %s",time1,time1,time2,action))
end

atInterval("sunset+00:10","sunrise-00:10","garage.fasadbak:on")
atInterval("sunrise-00:10","sunset+00:10","garage.fasadbak:off")
eller om vi har lampor som ska vara på vissa perioder av dygnet

Code: Select all

function onAtInterval(time1,time2,device)
   rule(string.format("@{catch,%s} & %s..(%s-00:00:01) => %s:on",time1,time1,time2,device))
   rule(string.format("@{catch,%s} & %s..(%s-00:00:01) => %s:off",time2,time2,time1,device))
end

onAtInterval("sunset+00:10","sunrise-00:10","garage.fasadbak")
Vilket kan vara vettigt att definiera om man har många regler av den typen. Också användbart för andra repetitiva regler.
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

MastrUsr wrote: 26 Mar 2019, 22:25 Detta funkar naturligtvis klockrent.. Men jag fattar inte hur den sista funktionen (vilken jag valde att använda) vet vilken enhet den ska skriva parametrarna till? jag antar att det är deviceID som i detta fallet är enhet med id 208... Jag har inte deklarerat något mer än det sista exemplet du skrev @jang.

jang wrote: 26 Mar 2019, 18:53 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/"..deviceID,data) end
rule("@15:00 => updateDevice(deviceID,{id=19,size=1,value=0})")
Hade missat den här frågan. Jag hade gjort fel i andra exemplet. Parametern var 'id' men jag använde 'deviceID'. Anledningen till at det fungerade måste vara att du hade en global Lua variable 'deviceID' som hade rätt värde? Även första exemplet behöver få 'deviceID' från någonstans.
P.S. Jag inte sett api.put("/api/devices/"..deviceID,{id=19,size=1,value=0}) anrop tidigare. Vad gör det?
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

Lite sent för Earth hour nu, men såhär ser det ut i EventScript

Code: Select all

lights={88,99} -- eller hämta värden från HomeTable
rule("earthDates={2019/3/30/20:30,2020/3/28/20:30}")
rule("dolist(v,earthDates,log(osdate('Earth hour %c',v)) & post(#earthHour,v))")
rule("#earthHour => states = lights:value; lights:off; wait(01:00); lights:value = states")
Några nya saker.

-Datum har vi tills nu använt typ 10:00, men vi kan också lägga till år/månad/dag i ett 'långt format', typ '2020/3/28/20:30' (fungerar inte med '@' regler som är 'dagliga')

-dolist är en funktion som loopar över en lista och binder en variabel ('v' i det här fallet) till varje element. Vi postar ett event (#earthHour) vid dessa tidpunkter.

-Regeln för #earthHour börjar med att spara undan alla lampornas 'value', släcker lamporna, väntar en timme, och återställer lampornas värden som vi sparat i variabeln 'states'
MastrUsr
Medlem
Posts: 202
Joined: 25 Apr 2017, 07:24
6


jang wrote: Hade missat den här frågan. Jag hade gjort fel i andra exemplet. Parametern var 'id' men jag använde 'deviceID'. Anledningen till at det fungerade måste vara att du hade en global Lua variable 'deviceID' som hade rätt värde? Även första exemplet behöver få 'deviceID' från någonstans.
P.S. Jag inte sett api.put("/api/devices/"..deviceID,{id=19,size=1,value=0}) anrop tidigare. Vad gör det?
Jag tänkte I min ensamhet att du som så snällt svarar på allas inlägg tycker inte om mig ;)

Jag tänkte att det var så, men grejen är att jag har inte någon global variabel med namnet "deviceID". Det enda jag kan komma på är om koden har hämtat all info från HC2 och där fått med sig något i den VD som jag tidigare använt?



Det jag använder det "api.put..." till är att sätta parameter 19 på en fibaro dimmer 2 till 1, och sen sätta tillbaka den till 0 i en ny rule direkt efter.

Längre förklaring:
Anledningen är att jag vill att när jag tänder lamporna efter tex. 10:00 ska de tändas med 1% styrka.
Jag låter knapparna styra dimmer helt och hållet och inte någon scen som I sin tur styr lamporna.. Kör jag en scen som triggas upptill så får lamporna först sitt senaste värde och sen 1% (störigt).
Parameter 19 sätter ett specifikt värde som måste användas. Om lampan är släckt och parameter 19 sätter till 1 och sen till 0 kommer den tro att "senast tända värdet" var 1%.
Kanske finns någon smartare lösning?



Tack igen för ditt jobb, Älskar det!

Skickat från min SM-N960F via Tapatalk

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

MastrUsr wrote: 01 Apr 2019, 20:55
jang wrote: Hade missat den här frågan. Jag hade gjort fel i andra exemplet. Parametern var 'id' men jag använde 'deviceID'. Anledningen till at det fungerade måste vara att du hade en global Lua variable 'deviceID' som hade rätt värde? Även första exemplet behöver få 'deviceID' från någonstans.
P.S. Jag inte sett api.put("/api/devices/"..deviceID,{id=19,size=1,value=0}) anrop tidigare. Vad gör det?
Jag tänkte I min ensamhet att du som så snällt svarar på allas inlägg tycker inte om mig ;)

Jag tänkte att det var så, men grejen är att jag har inte någon global variabel med namnet "deviceID". Det enda jag kan komma på är om koden har hämtat all info från HC2 och där fått med sig något i den VD som jag tidigare använt?

Det jag använder det "api.put..." till är att sätta parameter 19 på en fibaro dimmer 2 till 1, och sen sätta tillbaka den till 0 i en ny rule direkt efter.

Längre förklaring:
Anledningen är att jag vill att när jag tänder lamporna efter tex. 10:00 ska de tändas med 1% styrka.
Jag låter knapparna styra dimmer helt och hållet och inte någon scen som I sin tur styr lamporna.. Kör jag en scen som triggas upptill så får lamporna först sitt senaste värde och sen 1% (störigt).
Parameter 19 sätter ett specifikt värde som måste användas. Om lampan är släckt och parameter 19 sätter till 1 och sen till 0 kommer den tro att "senast tända värdet" var 1%.
Kanske finns någon smartare lösning?

Tack igen för ditt jobb, Älskar det!

Skickat från min SM-N960F via Tapatalk
Ok, det är ett litet mysterium, men på ngt sätt måste deviceID ha blivit definerad tidigare i din kod.
Jag inser att jag dessutom skrev ett till fel. api.get/put/post ska inte börja på "/api". Anropet ska se ut som

Code: Select all

api.put("/devices/",{id=19,size=1,value=0})
Jag har faktiskt inte registrerat att man kan sätta device parametrar på det här sättet. Bra att veta.
Känner inte till ngt annat sätt att åstadkomma det du vill. Nattbelysning styrs av en sensor hos mig så hag kan starta på det värde jag vill.
Hue lampor has samma problem, startar alltid i maxläge när man tänder de med strömbrytare, men i en av de senaste firmware releaserna så går det att sätta ett startup värde om man trixar lite.
MastrUsr
Medlem
Posts: 202
Joined: 25 Apr 2017, 07:24
6

jang wrote: 02 Apr 2019, 07:23 Ok, det är ett litet mysterium, men på ngt sätt måste deviceID ha blivit definerad tidigare i din kod.
Jag inser att jag dessutom skrev ett till fel. api.get/put/post ska inte börja på "/api". Anropet ska se ut som

Code: Select all

api.put("/devices/",{id=19,size=1,value=0})
Jag har faktiskt inte registrerat att man kan sätta device parametrar på det här sättet. Bra att veta.
Känner inte till ngt annat sätt att åstadkomma det du vill. Nattbelysning styrs av en sensor hos mig så hag kan starta på det värde jag vill.
Hue lampor has samma problem, startar alltid i maxläge när man tänder de med strömbrytare, men i en av de senaste firmware releaserna så går det att sätta ett startup värde om man trixar lite.

Hej igen! Ledsen att komma dragandes med detta men jag får det inte att fungera HUR JAG ÄN GÖR ?!

Jag har dragit det så långt så att jag har gjort en egen scen i HC2an bara föra att testa att det funkar, men det gör det inte.....

Detta funkar alltså inte:

Code: Select all

id = '208'
data = '{"properties": {"parameters":[{"id":19,"size":1,"value":1}]}}'
function updateDevice(id, data) api.put("/devices/"..id,data) end

updateDevice(id,data)
Denna VD'n funkar:

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

Varför funkade det när jag testade första gången??? Hopplöst...

Hur skriver jag i ER för att trycka på de två knapparna i min vd?
jang
Medlem
Posts: 388
Joined: 05 Jan 2014, 00:44
10
Location: Stockholm

MastrUsr wrote: 03 Apr 2019, 20:40
jang wrote: 02 Apr 2019, 07:23 Ok, det är ett litet mysterium, men på ngt sätt måste deviceID ha blivit definerad tidigare i din kod.
Jag inser att jag dessutom skrev ett till fel. api.get/put/post ska inte börja på "/api". Anropet ska se ut som

Code: Select all

api.put("/devices/",{id=19,size=1,value=0})
Jag har faktiskt inte registrerat att man kan sätta device parametrar på det här sättet. Bra att veta.
Känner inte till ngt annat sätt att åstadkomma det du vill. Nattbelysning styrs av en sensor hos mig så hag kan starta på det värde jag vill.
Hue lampor has samma problem, startar alltid i maxläge när man tänder de med strömbrytare, men i en av de senaste firmware releaserna så går det att sätta ett startup värde om man trixar lite.

Hej igen! Ledsen att komma dragandes med detta men jag får det inte att fungera HUR JAG ÄN GÖR ?!

Jag har dragit det så långt så att jag har gjort en egen scen i HC2an bara föra att testa att det funkar, men det gör det inte.....

Detta funkar alltså inte:

Code: Select all

id = '208'
data = '{"properties": {"parameters":[{"id":19,"size":1,"value":1}]}}'
function updateDevice(id, data) api.put("/devices/"..id,data) end

updateDevice(id,data)
Denna VD'n funkar:

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

Varför funkade det när jag testade första gången??? Hopplöst...

Hur skriver jag i ER för att trycka på de två knapparna i min vd?
Data ska inte vara en sträng utan en Lua tabell.

Code: Select all

id = 208
data = {id=208, properties =  { parameters = [{id=19 ,size=1, value=1}]}}
function updateDevice(id, data) api.put("/devices/"..id,data) end
updateDevice(id,data)
Har inte uppdaterat parameter själv såhär men det verkar användbart - om man vet vat man gör. Petergebruers på fibaroforum har en post med kod just för en scen. Han har en del försiktighetsåtgärder inbyggd i sin kod.
https://forum.fibaro.com/topic/29975-lu ... ent-148182
Någon i den tråden använder det för att sätta parametrar i sitt IDLock lås för slå av/på auto lås.

För att trycka på VD knappar från ER

Code: Select all

vdID = 32
rule("@07:00 => vdID:btn=2") -- press button 2 on VD with ID 32 at 07:00 in the morning...
MastrUsr
Medlem
Posts: 202
Joined: 25 Apr 2017, 07:24
6

jang wrote: 04 Apr 2019, 10:07
MastrUsr wrote: 03 Apr 2019, 20:40
jang wrote: 02 Apr 2019, 07:23 Ok, det är ett litet mysterium, men på ngt sätt måste deviceID ha blivit definerad tidigare i din kod.
Jag inser att jag dessutom skrev ett till fel. api.get/put/post ska inte börja på "/api". Anropet ska se ut som

Code: Select all

api.put("/devices/",{id=19,size=1,value=0})
Jag har faktiskt inte registrerat att man kan sätta device parametrar på det här sättet. Bra att veta.
Känner inte till ngt annat sätt att åstadkomma det du vill. Nattbelysning styrs av en sensor hos mig så hag kan starta på det värde jag vill.
Hue lampor has samma problem, startar alltid i maxläge när man tänder de med strömbrytare, men i en av de senaste firmware releaserna så går det att sätta ett startup värde om man trixar lite.

Hej igen! Ledsen att komma dragandes med detta men jag får det inte att fungera HUR JAG ÄN GÖR ?!

Jag har dragit det så långt så att jag har gjort en egen scen i HC2an bara föra att testa att det funkar, men det gör det inte.....

Detta funkar alltså inte:

Code: Select all

id = '208'
data = '{"properties": {"parameters":[{"id":19,"size":1,"value":1}]}}'
function updateDevice(id, data) api.put("/devices/"..id,data) end

updateDevice(id,data)
Denna VD'n funkar:

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

Varför funkade det när jag testade första gången??? Hopplöst...

Hur skriver jag i ER för att trycka på de två knapparna i min vd?
Data ska inte vara en sträng utan en Lua tabell.

Code: Select all

id = 208
data = {id=208, properties =  { parameters = [{id=19 ,size=1, value=1}]}}
function updateDevice(id, data) api.put("/devices/"..id,data) end
updateDevice(id,data)
Har inte uppdaterat parameter själv såhär men det verkar användbart - om man vet vat man gör. Petergebruers på fibaroforum har en post med kod just för en scen. Han har en del försiktighetsåtgärder inbyggd i sin kod.
https://forum.fibaro.com/topic/29975-lu ... ent-148182
Någon i den tråden använder det för att sätta parametrar i sitt IDLock lås för slå av/på auto lås.

För att trycka på VD knappar från ER

Code: Select all

vdID = 32
rule("@07:00 => vdID:btn=2") -- press button 2 on VD with ID 32 at 07:00 in the morning...
Tack! Ska prova igen ikväll.

När väl z-wave fungerar utan att dra ur batteriet på mitt IDLOCK150 ska jag använda samma metod för att larma på när jag aktiverar "borta läge" på låset. :)
Post Reply