Page 19 of 25

Re: EventRunner

Posted: 25 Feb 2020, 16:56
by jang
RH_Dreambox wrote: 25 Feb 2020, 14:28 @PeterM5 Kolla du också för säkerhets skull, men när jag testade så blev det bara ett blink på de inställda 30 sekunderna. Men kanske har jag missat något?
Vi sparar lampans 'state' före 1s vilan, sedan kollar vi om dess 'state' ändrats efter vilan, om så har ngn klickat på knappen, och isåfall avslutar vi loopen.
@jang Är jag helt ute och reser om jag säger att efter 1 sek paus så ändras ju statusen av regeln och villkoret för att stänga av uppfylls?
Du har rätt, det är ngt skumt med det här - jag återkommer....

Re: EventRunner

Posted: 25 Feb 2020, 17:23
by jang
jang wrote: 25 Feb 2020, 16:56
RH_Dreambox wrote: 25 Feb 2020, 14:28 @PeterM5 Kolla du också för säkerhets skull, men när jag testade så blev det bara ett blink på de inställda 30 sekunderna. Men kanske har jag missat något?
Vi sparar lampans 'state' före 1s vilan, sedan kollar vi om dess 'state' ändrats efter vilan, om så har ngn klickat på knappen, och isåfall avslutar vi loopen.
@jang Är jag helt ute och reser om jag säger att efter 1 sek paus så ändras ju statusen av regeln och villkoret för att stänga av uppfylls?
Du har rätt, det är ngt skumt med det här - jag återkommer....
Ok, jag har en wall-plug, och det visar sig att om man om man läser värdet, slår på pluggen och sedan läser värdet igen så hinner inte HC2:an uppdatera värdet. ER är för snabb ;-) Här har jag en åsikt att Fibaro borde optimistiskt uppdatera värdet och sedan om det visade sig vara fel så sätta tillbaka det till gamla värdet - men jag kan förstå att det här var enklare.
Så om man testar:

Code: Select all

print(fibaro.getValue(17,"value"))
fibaro.call(17,"turnOn")
print(fibaro.getValue(17,"value"))
blir det samma värde även om vi tänt. I vårt fall så togglar vi värdet men principen är densamma. Vad vi kan göra är att låta lampan få lite tid på sig att uppdatera sitt värde, dvs vi läser det före vi togglar. Testen blir då "state==lampa:value", dvs vår toggel hade ingen verkan för ngn switchade tillbaka värdet.

Den här koden funkar för mig med min wall plug.

Code: Select all

  rule([[sensor.garage_pir:breached => 
    local lampa,state =  garage.lampa,nil;
    repeat state=lampa:value; lampa:toggle; wait(1) until sensor.garage_pir:safe | state==lampa:value; 
    lampa:off]])

Re: EventRunner

Posted: 25 Feb 2020, 17:36
by RH_Dreambox
Den här koden funkar för mig med min wall plug.
CODE: SELECT ALL

rule([[sensor.garage_pir:breached =>
local lampa,state = garage.lampa,nil;
repeat state=lampa:value; lampa:toggle; wait(1) until sensor.garage_pir:safe | state==lampa:value;
lampa:off]])
Ja den koden fungerade bättre, så nu borde även @PeterM5 bli nöjd :-)

Re: EventRunner

Posted: 25 Feb 2020, 23:52
by PeterM5
RH_Dreambox wrote: 25 Feb 2020, 17:36
Den här koden funkar för mig med min wall plug.
CODE: SELECT ALL

rule([[sensor.garage_pir:breached =>
local lampa,state = garage.lampa,nil;
repeat state=lampa:value; lampa:toggle; wait(1) until sensor.garage_pir:safe | state==lampa:value;
lampa:off]])
Ja den koden fungerade bättre, så nu borde även @PeterM5 bli nöjd :-)
Det fungerar som tänkt när jag testar :)
Men när jag ska lägga till min lampa i hallen och sensorn i garaget får jag felmeddelande.
Hur ska koden se ut med mina device?

Code: Select all

--[[
%% properties
298 value
381 value
--]]



HT = 
{ 
	hall = {lampa = 298},
	bilplats = {sensor = 381},
}

rule([[HT.bilplats.sensor:breached => 
   		 HT.hall.lampa,state = HT.hall.lampa,nil;
   		 repeat state=HT.hall.lampa:value; HT.hall.lampa:toggle; wait(1) until HT.bilplats.sensor:safe | state==HT.hall.lampa:value; 
  		 HT.hall.lampa:off]])



Re: EventRunner

Posted: 26 Feb 2020, 12:54
by RH_Dreambox
Så här skall din regel se ut.
Vill du inte ha tidsintervallet så tar du bort detta ( & 23:00..06:00 ).

Code: Select all

  rule([[bilplats.sensor:breached & 23:00..06:00 =>
  local lampa,state =  hall.lampa,nil;
  repeat state=lampa:value; lampa:toggle; wait(1) until bilplats.sensor:safe | state==lampa:value; 
  lampa:off]])

Re: EventRunner

Posted: 26 Feb 2020, 13:08
by jang
RH_Dreambox wrote: 26 Feb 2020, 12:54 Så här skall din regel se ut.
Vill du inte ha tidsintervallet så tar du bort detta ( & 23:00..06:00 ).

Code: Select all

  rule([[bilplats.sensor:breached & 23:00..06:00 =>
  local lampa,state =  hall.lampa,nil;
  repeat state=lampa:value; lampa:toggle; wait(1) until bilplats.sensor:safe | state==lampa:value; 
  lampa:off]])
dvs om du gjort

Code: Select all

Util.defvars(HT)

Re: EventRunner

Posted: 26 Feb 2020, 22:03
by PeterM5
jang wrote: 26 Feb 2020, 13:08
RH_Dreambox wrote: 26 Feb 2020, 12:54 Så här skall din regel se ut.
Vill du inte ha tidsintervallet så tar du bort detta ( & 23:00..06:00 ).

Code: Select all

  rule([[bilplats.sensor:breached & 23:00..06:00 =>
  local lampa,state =  hall.lampa,nil;
  repeat state=lampa:value; lampa:toggle; wait(1) until bilplats.sensor:safe | state==lampa:value; 
  lampa:off]])
dvs om du gjort

Code: Select all

Util.defvars(HT)

Code: Select all

 rule([[HT.bilplats.sensor:breached | HT.outserverroom.sensor:breached  & $TOD=='Sleep' =>
  local lampa,state = HT.kontor.lampa,nil;
  repeat state=lampa:value; lampa:toggle; wait(1) until trueFor(00:02:00,HT.bilplats.sensor:safe) | state==lampa:value; 
  lampa:off]])
Tack, nu funkar det.
Går det att använda en global variabel också, jag får inte detta att fungera?

Re: EventRunner

Posted: 26 Feb 2020, 22:13
by PeterM5
PeterM5 wrote: 26 Feb 2020, 22:03
jang wrote: 26 Feb 2020, 13:08
RH_Dreambox wrote: 26 Feb 2020, 12:54 Så här skall din regel se ut.
Vill du inte ha tidsintervallet så tar du bort detta ( & 23:00..06:00 ).

Code: Select all

  rule([[bilplats.sensor:breached & 23:00..06:00 =>
  local lampa,state =  hall.lampa,nil;
  repeat state=lampa:value; lampa:toggle; wait(1) until bilplats.sensor:safe | state==lampa:value; 
  lampa:off]])
dvs om du gjort

Code: Select all

Util.defvars(HT)

Code: Select all

 rule([[HT.bilplats.sensor:breached | HT.outserverroom.sensor:breached  & $TOD=='Sleep' =>
  local lampa,state = HT.kontor.lampa,nil;
  repeat state=lampa:value; lampa:toggle; wait(1) until trueFor(00:02:00,HT.bilplats.sensor:safe) | state==lampa:value; 
  lampa:off]])
Tack, nu funkar det.
Går det att använda en global variabel också, jag får inte detta att fungera?

Code: Select all

rule([[$TOD=='Sleep' & HT.bilplats.sensor:breached | HT.outserverroom.sensor:breached =>
  	local lampa,state = HT.kontor.lampa,nil;
  	repeat state=lampa:value; lampa:toggle; wait(1) until trueFor(00:02:00,HT.bilplats.sensor:safe) | state==lampa:value; 
 	 lampa:off]])
Nu verkar det funka, tack för all hjälp :)

Re: EventRunner

Posted: 27 Feb 2020, 08:15
by jang
PeterM5 wrote: 26 Feb 2020, 22:13
PeterM5 wrote: 26 Feb 2020, 22:03
Tack, nu funkar det.
Går det att använda en global variabel också, jag får inte detta att fungera?

Code: Select all

rule([[$TOD=='Sleep' & HT.bilplats.sensor:breached | HT.outserverroom.sensor:breached =>
  	local lampa,state = HT.kontor.lampa,nil;
  	repeat state=lampa:value; lampa:toggle; wait(1) until trueFor(00:02:00,HT.bilplats.sensor:safe) | state==lampa:value; 
 	 lampa:off]])
Nu verkar det funka, tack för all hjälp :)
Du kan inte använda trueFor inuti en while loop sådär. trueFor får endast användas på vänstersidan av '=>*.
Dessutom har '&' högre prioritet än '|'.
Jag tror du måste skriva

Code: Select all

rule([[$TOD=='Sleep' & (HT.bilplats.sensor:breached | HT.outserverroom.sensor:breached) =>
  	local lampa, sensor, state = HT.kontor.lampa, HT.bilplats.sensor, nil;
  	repeat state=lampa:value; lampa:toggle; wait(1) until (sensor:safe & sensor:last > 00:02) | state==lampa:value; 
 	 lampa:off]])
 
Jag grupperade breached enheterna med () så att det tolkas (sleep & (bilplats | outserverroom)) - utan parenteser tolkades det som ((sleep & bilplats) | outserverroom)

I repeat loopen testar vi om sensorn är safe och om :last (vilket är tiden sedan sista förändringen) är större an 2min. Nu kommer den att blinka 2min+(sensorns tid för återställning efter den varit breached) efter den blir breached.

Re: EventRunner

Posted: 27 Feb 2020, 22:06
by PeterM5
jang wrote: 27 Feb 2020, 08:15
PeterM5 wrote: 26 Feb 2020, 22:13
PeterM5 wrote: 26 Feb 2020, 22:03
Tack, nu funkar det.
Går det att använda en global variabel också, jag får inte detta att fungera?

Code: Select all

rule([[$TOD=='Sleep' & HT.bilplats.sensor:breached | HT.outserverroom.sensor:breached =>
  	local lampa,state = HT.kontor.lampa,nil;
  	repeat state=lampa:value; lampa:toggle; wait(1) until trueFor(00:02:00,HT.bilplats.sensor:safe) | state==lampa:value; 
 	 lampa:off]])
Nu verkar det funka, tack för all hjälp :)
Du kan inte använda trueFor inuti en while loop sådär. trueFor får endast användas på vänstersidan av '=>*.
Dessutom har '&' högre prioritet än '|'.
Jag tror du måste skriva

Code: Select all

rule([[$TOD=='Sleep' & (HT.bilplats.sensor:breached | HT.outserverroom.sensor:breached) =>
  	local lampa, sensor, state = HT.kontor.lampa, HT.bilplats.sensor, nil;
  	repeat state=lampa:value; lampa:toggle; wait(1) until (sensor:safe & sensor:last > 00:02) | state==lampa:value; 
 	 lampa:off]])
 
Jag grupperade breached enheterna med () så att det tolkas (sleep & (bilplats | outserverroom)) - utan parenteser tolkades det som ((sleep & bilplats) | outserverroom)

I repeat loopen testar vi om sensorn är safe och om :last (vilket är tiden sedan sista förändringen) är större an 2min. Nu kommer den att blinka 2min+(sensorns tid för återställning efter den varit breached) efter den blir breached.
Jag har testat nu, men lampan tänds bara en eller två ggr efter det inget.
Det som jag sa funkade igår, verkade blinka som det skulle förutom att jag inte hade testat sensorn outserverroom.

Re: EventRunner

Posted: 28 Feb 2020, 12:04
by jang
PeterM5 wrote: 27 Feb 2020, 22:06 Jag har testat nu, men lampan tänds bara en eller två ggr efter det inget.
Det som jag sa funkade igår, verkade blinka som det skulle förutom att jag inte hade testat sensorn outserverroom.
Det är väl 2 olika sensorer vi pratar om?
Jag skulle dela upp det i 2 regler för tydlighetens skull

Code: Select all

rule([[$TOD=='Sleep' & HT.bilplats.sensor:breached  =>
  	local lampa, sensor, state = HT.kontor.lampa, HT.bilplats.sensor, nil;
  	repeat state=lampa:value; lampa:toggle; wait(1) until (sensor:safe & sensor:last > 00:02) | state==lampa:value; 
 	 lampa:off]])

rule([[$TOD=='Sleep' & HT.outserverroom.sensor:breached =>
  	local lampa, sensor, state = HT.kontor.lampa, HT.outserverroom.sensor, nil;
  	repeat state=lampa:value; lampa:toggle; wait(1) until (sensor:safe & sensor:last > 00:02) | state==lampa:value; 
 	 lampa:off]])
en kombinerad variant, lite mer komplex

Code: Select all

larmSensors = { HT.bilplats.sensor, HT.outserverroom.sensor}
rule([[$TOD=='Sleep' & larmSensors:breached =>
  	local lampa, state = HT.kontor.lampa, nil;
  	repeat state=lampa:value; lampa:toggle; wait(1) until (larmSensors:safe & min(larmSensors:last) > 00:02) | state==lampa:value; 
 	 lampa:off]])

Re: EventRunner

Posted: 29 Feb 2020, 19:39
by PeterM5
jang wrote: 28 Feb 2020, 12:04
PeterM5 wrote: 27 Feb 2020, 22:06 Jag har testat nu, men lampan tänds bara en eller två ggr efter det inget.
Det som jag sa funkade igår, verkade blinka som det skulle förutom att jag inte hade testat sensorn outserverroom.
Det är väl 2 olika sensorer vi pratar om?
Jag skulle dela upp det i 2 regler för tydlighetens skull

Code: Select all

rule([[$TOD=='Sleep' & HT.bilplats.sensor:breached  =>
  	local lampa, sensor, state = HT.kontor.lampa, HT.bilplats.sensor, nil;
  	repeat state=lampa:value; lampa:toggle; wait(1) until (sensor:safe & sensor:last > 00:02) | state==lampa:value; 
 	 lampa:off]])

rule([[$TOD=='Sleep' & HT.outserverroom.sensor:breached =>
  	local lampa, sensor, state = HT.kontor.lampa, HT.outserverroom.sensor, nil;
  	repeat state=lampa:value; lampa:toggle; wait(1) until (sensor:safe & sensor:last > 00:02) | state==lampa:value; 
 	 lampa:off]])
en kombinerad variant, lite mer komplex

Code: Select all

larmSensors = { HT.bilplats.sensor, HT.outserverroom.sensor}
rule([[$TOD=='Sleep' & larmSensors:breached =>
  	local lampa, state = HT.kontor.lampa, nil;
  	repeat state=lampa:value; lampa:toggle; wait(1) until (larmSensors:safe & min(sensor:last) > 00:02) | state==lampa:value; 
 	 lampa:off]])
Jag har testat båda nu.
Funkar bra förutom att det slutar blinka när sensorn är safe, jag får det inte att funka med 2 minuters väntetid.

Re: EventRunner

Posted: 01 Mar 2020, 13:31
by jang
PeterM5 wrote: 29 Feb 2020, 19:39 Jag har testat båda nu.
Funkar bra förutom att det slutar blinka när sensorn är safe, jag får det inte att funka med 2 minuters väntetid.
Ok, det var en liten bug i den sista varianten, den kombinerade, ska testa mot larmSensors i 'until' testet. Jag har ändrat i min post.
Jag förstår inte varför den slår av efter 2 blink. verkar som "last modified" inte blir rätt på sensorn?

Kan du prova den här varianten

Code: Select all

rule([[$TOD=='Sleep' & HT.bilplats.sensor:breached  =>
  	local lampa, sensor, state = HT.kontor.lampa, HT.bilplats.sensor, nil;
  	LBBD=now+00:02;
  	repeat state=lampa:value; lampa:toggle; wait(1) until (sensor:safe & now > LBBD) | state==lampa:value; 
 	 lampa:off]])
LBBD = Last Breached Bilplats Delay :-)

Re: EventRunner

Posted: 02 Mar 2020, 21:22
by PeterM5
jang wrote: 01 Mar 2020, 13:31
PeterM5 wrote: 29 Feb 2020, 19:39 Jag har testat båda nu.
Funkar bra förutom att det slutar blinka när sensorn är safe, jag får det inte att funka med 2 minuters väntetid.
Ok, det var en liten bug i den sista varianten, den kombinerade, ska testa mot larmSensors i 'until' testet. Jag har ändrat i min post.
Jag förstår inte varför den slår av efter 2 blink. verkar som "last modified" inte blir rätt på sensorn?

Kan du prova den här varianten

Code: Select all

rule([[$TOD=='Sleep' & HT.bilplats.sensor:breached  =>
  	local lampa, sensor, state = HT.kontor.lampa, HT.bilplats.sensor, nil;
  	LBBD=now+00:02;
  	repeat state=lampa:value; lampa:toggle; wait(1) until (sensor:safe & now > LBBD) | state==lampa:value; 
 	 lampa:off]])
LBBD = Last Breached Bilplats Delay :-)
Tack, nu har jag testat.
Jag testade med en lampa, Dimmer2 och den strulade först.
Parameter 34 var satt till 1 och jag satte den till 0 istället, jag fick för mig att den inte hann stänga av riktigt innan den skulle tändas igen.
Kan det stämma, nu fungerar det som tänkt iallafall.
Tack för hjälpen :D
"Parameter 34
Soft-Start functionality
Time required to warm up the filament of halogen bulb.
0 - no soft-start
1 - short soft-start (0,1s)
Standardvärde
2 - long soft-start (0,5s)"

Re: EventRunner

Posted: 08 Mar 2020, 13:54
by RH_Dreambox
Jag försöker skriva en regel som med hjälp av temperaturen skall tala om för mig när det är dax att ställa ut eller ta in växterna från växthuset.
Men jag tänker fel någonstans, för inte ens dessa enkla regler fungerar.

Code: Select all

  rule("@sensor.temp_golv >= 15 => $TTS = 'Nu kan du ställa ut växterna.&vol=12'")
  rule("@sensor.temp_golv <= 10 => $TTS = 'Nu är det dax att ta in växterna.&vol=12'")
Testar jag med klockslag fungerar det , men inte med temperaturen som trigger. (tempsensorn finns med i headern)
Nästa karamell är att det får inte bli tjatiga upprepningar vid en temperaturförändring, utan jag skall bara påminnas en eller högst två gånger.
"once" har jag sett någonstans, men jag hittar inte hur det används. Nollställs "once" en gång per dygn eller hur funkar det?

Re: EventRunner

Posted: 08 Mar 2020, 14:45
by sonnyboy
Ska det verkligen vara ett @ innan sensor?

Re: EventRunner

Posted: 08 Mar 2020, 18:33
by RH_Dreambox
sonnyboy wrote: 08 Mar 2020, 14:45 Ska det verkligen vara ett @ innan sensor?
Jag antar det, för tar jag bort @ så får jag ett felmeddelande :-(

Re: EventRunner

Posted: 08 Mar 2020, 18:50
by jang
Om sensor.temp_golv är en device (en integer) så ska regeln se ut som

Code: Select all

rule("sensor.temp_golv:temp >= 15 => $TTS = 'Nu kan du ställa ut växterna.&vol=12'")
:temp hämtar temperaturen (vilket är samma som :value)
Om du bara vill ha en gång

Code: Select all

rule("once(sensor.temp_golv:temp >= 15) => $TTS = 'Nu kan du ställa ut växterna.&vol=12'")
Då måste den gå under 15 för att trigga igen. (dvs villkoret måste bli falskt innan det kan bli sant igen)
Det finns lite hyss för att återställa den varje dygn om du behöver det - hör av dig isåfall.

@ tolkar värdet efter som en tid vilket kan bli mycket konstigt...

Re: EventRunner

Posted: 09 Mar 2020, 11:50
by RH_Dreambox
Tack @jang !
Jag kompletterade koden med några tider också, så att man inte väcks mitt i natten om temperaturen skulle stämma.
Men om jag behöver göra reset på "once", kan jag inte då bara skriva en regel som jag triggar tex. kl. 08:00 att "sensor.temp_golv:temp == 0"?

Code: Select all

  -- UTERUM ##################################
  rule([[
      once(sensor.temp_golv:temp >= 15) & 08:00..20:00 =>
      $TTS = 'Meddelande från växthuset! Växterna kan ställas ut, nu!&vol=12'
    ]])

  rule([[
      once(sensor.temp_golv:temp <= 10) & 08:00..20:00 =>
      $TTS = 'Meddelande från växthuset! Nu är det dax, ta in växterna, nu!&vol=12'
    ]])
Din property :temp förklarar också varför några andra av mina regler inte fungerar :oops: :oops:
Och nu hittade jag också fler propertys i det du skrivit om property functions.
Men,
är :power och :lux detsamma som :value? Kan man använda vilket som?

Re: EventRunner

Posted: 09 Mar 2020, 18:27
by Texan
Går det att tända och släcka lampor efter lux värde på en eller flera sensorer mellan 09:00 och 18:00.
Skulle vilja tända lampor när det blir mulet på dagen och släcka ifall det blir ljust igen.