EventRunner

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

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

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]])
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1192
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

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 :-)
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
PeterM5
Medlem
Posts: 64
Joined: 13 Jul 2016, 10:55
7

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]])


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

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]])
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 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)
PeterM5
Medlem
Posts: 64
Joined: 13 Jul 2016, 10:55
7

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?
PeterM5
Medlem
Posts: 64
Joined: 13 Jul 2016, 10:55
7

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

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.
PeterM5
Medlem
Posts: 64
Joined: 13 Jul 2016, 10:55
7

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

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]])
Last edited by jang on 01 Mar 2020, 13:04, edited 1 time in total.
PeterM5
Medlem
Posts: 64
Joined: 13 Jul 2016, 10:55
7

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

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 :-)
PeterM5
Medlem
Posts: 64
Joined: 13 Jul 2016, 10:55
7

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)"
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1192
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

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?
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

Ska det verkligen vara ett @ innan sensor?
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1192
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

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 :-(
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 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...
User avatar
RH_Dreambox
Z-Wave Kung
Posts: 1192
Joined: 03 Jan 2015, 16:49
9
Location: Vegby
Contact:

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?
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
Texan
Medlem
Posts: 169
Joined: 25 Dec 2015, 15:07
8

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.
Post Reply