EventRunner

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

13 Jan 2020, 15:04

Kan du ersätta raden i början på ER

Code: Select all

local _version,_fix = "3.0","B87"  -- Jan 9, 2020  
med raden

Code: Select all

_version,_fix = "3.0","B87"  -- Jan 9, 2020  
Dvs ta bort 'local' i början, spara så scenen startar om och se vad log-meddelandet säger.
ER's log('...') kan inte komma åt lokala variabler som t.ex _version från regler, därför loggades inget för Old ER version...
MastrUsr
Medlem
Posts: 164
Joined: 25 Apr 2017, 07:24

13 Jan 2020, 15:12

Min variabel heter av någon anledning ER_version,.... Spelar det någon roll?

Code: Select all

[DEBUG] 14:13:19: ER3 - EventRunner vnil B87

[DEBUG] 14:13:19: Fibaro software version: 4.570

[DEBUG] 14:13:19: HC2 uptime: 139 hours

[DEBUG] 14:13:19: Sunrise 08:35, Sunset 15:58

[DEBUG] 14:13:19:

[DEBUG] 14:13:19: Loading rules

[DEBUG] 14:13:19: Rule:1[@@05:00:00 => f=!f; || f >> log('Ding!') || true >> log('Dong!')] = OK

[DEBUG] 14:13:19: Rule:2[@23:30:00 & wday('sun-thu') => lamporundervåning:off; lamporövervåning:off; h...] = OK

[DEBUG] 14:13:19: Rule:3[@09:00 & wday('mon-fri') => lamporundervåning:off; lamporövervåning:off; hall...] = OK

[DEBUG] 14:13:19: Rule:4[@sunrise+00:15 => baksida.trädgårdsbelysning:off; framsida.ytterbelysning:off] = OK

[DEBUG] 14:13:19: Rule:5[@sunset-00:15 => baksida.trädgårdsbelysning:on; framsida.ytterbelysning:on] = OK

[DEBUG] 14:13:19: Rule:6[@23:00:00 => belysningsVD:btn=4; log('pressed button 4')] = OK

[DEBUG] 14:13:19: Catching up:Rule:7[@{06:00,catch} => Util.checkVersion()]

[DEBUG] 14:13:19: Rule:7[@{06:00,catch} => Util.checkVersion()] = OK

[DEBUG] 14:13:19: Rule:8[#ER_version => ...] = OK

[DEBUG] 14:13:19: Rule:9[#ER_version => log('...patching scene'); Util.patchEventRunner()] = OK

[DEBUG] 14:13:19:

[DEBUG] 14:13:19: Scene running

[DEBUG] 14:13:19: Ding!

[DEBUG] 14:13:20: Old ER version, v:%s, fix:%s

[DEBUG] 14:13:20: New ER version, v:3.0, fix:B87

[DEBUG] 14:13:20: fibaro:call(telefon.eric,"sendPush","New ER version, v:3.0, fix:B87")

[DEBUG] 14:13:20: ...patching scene

[DEBUG] 14:13:21: Patching scene to latest version

[DEBUG] 14:13:22: Incoming event:{"type":"%%SUB%%","_from":92,"event":[{"type":"ERLog"}]}

[DEBUG] 14:13:25: Incoming event:{"type":"%%PING%%","_from":92}

Edit:
Döpte om variablen till _version,.... Nu verkar det funka som det ska! Har den variabeln någonsin hetat ER_version eller är det jag som strulat till det vid någon copy / paste?
jang
Medlem
Posts: 228
Joined: 05 Jan 2014, 00:44
Location: Stockholm

13 Jan 2020, 15:23

MastrUsr wrote:
13 Jan 2020, 15:12
Edit:
Döpte om variablen till _version,.... Nu verkar det funka som det ska! Har den variabeln någonsin hetat ER_version eller är det jag som strulat till det vid någon copy / paste?
Den måste heta _version (och _fix) annars missar koden som checkar om det finns en ny version och tycker alltid att det finns en ny version.. :-)
Systemfel
Medlem
Posts: 223
Joined: 14 Jan 2015, 01:02

03 Feb 2020, 22:16

Hej alla har ett litet problem vet faktist inte om man kan koda så här ..
Men har en strömknapp och den kan man släcka hela huset med. Men då min sambo av misstag trycker på denna trots märkning mm så släcker hon huset.. i tid och oh tid scenen jag försöker få till är att knappen ska bara funka vid vissa tider och trycker man av misstag ska den skicka ett msg till telefonern att du kan inte släcka nu bla bla jag har gjort så här.

GCsceneID1 = 401
Mob ={709,777,710}
rule("786:scene== S2.click & 06:00..09:30 | 21:00..23:30 => GCsceneID1:start")
rule("786:scene== S2.click & 09:30..21:00 | 23:30..06:00 => Mob:msg='Kan bara släcka från sovrummet mellan 06:00-09:30 och 21:00-23:30'")

Till nu själva problemet och det är att den kör detta av sig själv vid start tiden 06:00 och 21:00 delvis den släcker huset utan någon har tryckt på knappen. inte så optimalt.. Man ska kanske göra detta med veriabler i stället ? på något sätt... eller borde det funka eller ?

ha en god Kväll tack för er hjälp :)
Börjat pilla lite på min Fibaro home center 2 ( och det går bra )
jang
Medlem
Posts: 228
Joined: 05 Jan 2014, 00:44
Location: Stockholm

04 Feb 2020, 08:08

Systemfel wrote:
03 Feb 2020, 22:16
GCsceneID1 = 401
Mob ={709,777,710}
rule("786:scene== S2.click & 06:00..09:30 | 21:00..23:30 => GCsceneID1:start")
rule("786:scene== S2.click & 09:30..21:00 | 23:30..06:00 => Mob:msg='Kan bara släcka från sovrummet mellan 06:00-09:30 och 21:00-23:30'")
Till nu själva problemet och det är att den kör detta av sig själv vid start tiden 06:00 och 21:00 delvis den släcker huset utan någon har tryckt på knappen. inte så optimalt.. Man ska kanske göra detta med veriabler i stället ? på något sätt... eller borde det funka eller ?
Ibland måste man förstå lite hur ER "tänker" för att det ska bli rätt :-)

Det är allmänt lite knepigt att använda OR (|) i huvudet på en regel (vänster om pilen).
I ditt fall är problemet att i ER har AND (&) högre prioritet än OR (|), så din regel ser ut som

Code: Select all

 rule(" ( 786:scene== S2.click & 06:00..09:30 ) | 21:00..23:30 => GCsceneID1:start")
Det andra problemet är att tidsintervalluttryck i regel-huvudet av typ X..Y triggar regeln vid tidpunkt X (samt Y+1sekund, men det blir alltid falskt) - vilket nästan alltid är vad man vill ha - men inte i det här fallet.

Så vad som händer är att 786:scene == S2.click gör att regeln triggas när du klickar på 786.S2, men den fortsätter att vara sant tills man klickar på någon annan knapp på 786 (786:scene returnerar alltid senaste scen-knappen som trycktes).
...så kl 06:00 triggas scenen igen, och eftersom 786:scene == S2.click fortfarande är sann exekveras regeln.
...och sedan 21:00 triggas regeln igen, och eftersom det inte finns några andra villkor körs den igen.

Lösningen i det här fallet är att flytta tidsintervall testerna till höger om pilen - för uttryck höger om pilen triggar inte regeln.

Code: Select all

 rule("786:scene== S2.click => (06:00..09:30 | 21:00..23:30) & GCsceneID1:start")
 rule("786:scene== S2.click => (09:30..21:00 | 23:30..06:00) & Mob:msg='Kan bara släcka från sovrummet mellan 06:00-09:30 och 21:00-23:30'")
ER har if-then-else sedan en tid tillbaka så din regel går också att skriva som

Code: Select all

 
 rule([[786:scene== S2.click => 
            if 06:00..09:30 | 21:00..23:30 then  
                GCsceneID1:start
            else
               Mob:msg='Kan bara släcka från sovrummet mellan 06:00-09:30 och 21:00-23:30'
            end]])
Edit: Du skulle kanske kunna testa mot S2.double så är det kanske mindre risk för att det släcks oavsiktligt?
Systemfel
Medlem
Posts: 223
Joined: 14 Jan 2015, 01:02

04 Feb 2020, 09:04

jang wrote:
04 Feb 2020, 08:08
Systemfel wrote:
03 Feb 2020, 22:16
GCsceneID1 = 401
Mob ={709,777,710}
rule("786:scene== S2.click & 06:00..09:30 | 21:00..23:30 => GCsceneID1:start")
rule("786:scene== S2.click & 09:30..21:00 | 23:30..06:00 => Mob:msg='Kan bara släcka från sovrummet mellan 06:00-09:30 och 21:00-23:30'")
Till nu själva problemet och det är att den kör detta av sig själv vid start tiden 06:00 och 21:00 delvis den släcker huset utan någon har tryckt på knappen. inte så optimalt.. Man ska kanske göra detta med veriabler i stället ? på något sätt... eller borde det funka eller ?
Ibland måste man förstå lite hur ER "tänker" för att det ska bli rätt :-)

Det är allmänt lite knepigt att använda OR (|) i huvudet på en regel (vänster om pilen).
I ditt fall är problemet att i ER har AND (&) högre prioritet än OR (|), så din regel ser ut som

Code: Select all

 rule(" ( 786:scene== S2.click & 06:00..09:30 ) | 21:00..23:30 => GCsceneID1:start")
Det andra problemet är att tidsintervalluttryck i regel-huvudet av typ X..Y triggar regeln vid tidpunkt X (samt Y+1sekund, men det blir alltid falskt) - vilket nästan alltid är vad man vill ha - men inte i det här fallet.

Så vad som händer är att 786:scene == S2.click gör att regeln triggas när du klickar på 786.S2, men den fortsätter att vara sant tills man klickar på någon annan knapp på 786 (786:scene returnerar alltid senaste scen-knappen som trycktes).
...så kl 06:00 triggas scenen igen, och eftersom 786:scene == S2.click fortfarande är sann exekveras regeln.
...och sedan 21:00 triggas regeln igen, och eftersom det inte finns några andra villkor körs den igen.

Lösningen i det här fallet är att flytta tidsintervall testerna till höger om pilen - för uttryck höger om pilen triggar inte regeln.

Code: Select all

 rule("786:scene== S2.click => (06:00..09:30 | 21:00..23:30) & GCsceneID1:start")
 rule("786:scene== S2.click => (09:30..21:00 | 23:30..06:00) & Mob:msg='Kan bara släcka från sovrummet mellan 06:00-09:30 och 21:00-23:30'")
ER har if-then-else sedan en tid tillbaka så din regel går också att skriva som

Code: Select all

 
 rule([[786:scene== S2.click => 
            if 06:00..09:30 | 21:00..23:30 then  
                GCsceneID1:start
            else
               Mob:msg='Kan bara släcka från sovrummet mellan 06:00-09:30 och 21:00-23:30'
            end]])
Edit: Du skulle kanske kunna testa mot S2.double så är det kanske mindre risk för att det släcks oavsiktligt?
Ohhh så man kan sätta tidsreglen efter.. ahh bra att veta att man kan använda if sats :) ska pröva detta när jag kommer hem tack för hjälpen..
Börjat pilla lite på min Fibaro home center 2 ( och det går bra )
jang
Medlem
Posts: 228
Joined: 05 Jan 2014, 00:44
Location: Stockholm

04 Feb 2020, 10:15

Att flytta tidsintervalltestet till höger funkar i det här fallet, men oftast vill man ha den på vänster sida.
Ex.

Code: Select all

rule("lampa:isOn & 07:00..08:00 => log('Lampa på')")
1. Här kan lampan tändas 06:55 och regeln triggas, regeln är ännu inte sann eftersom intervallet inte är uppfyllt.
2. Klockan 07:00 och regeln triggas igen, lampan är fortfarande tänd, och regeln exekveras.

Hade vi flyttat tidsintervalltestet till höger om pilen

Code: Select all

rule("lampa:isOn => 07:00..08:00  & log('Lampa på')")
hade den triggats när lampan tändes, testet had varit falskt för kl är bara 06:55 , och sedan kl. 07:00 hade inte regeln triggats.
Systemfel
Medlem
Posts: 223
Joined: 14 Jan 2015, 01:02

04 Feb 2020, 18:12

jang wrote:
04 Feb 2020, 10:15
Att flytta tidsintervalltestet till höger funkar i det här fallet, men oftast vill man ha den på vänster sida.
Ex.

Code: Select all

rule("lampa:isOn & 07:00..08:00 => log('Lampa på')")
1. Här kan lampan tändas 06:55 och regeln triggas, regeln är ännu inte sann eftersom intervallet inte är uppfyllt.
2. Klockan 07:00 och regeln triggas igen, lampan är fortfarande tänd, och regeln exekveras.

Hade vi flyttat tidsintervalltestet till höger om pilen

Code: Select all

rule("lampa:isOn => 07:00..08:00  & log('Lampa på')")
hade den triggats när lampan tändes, testet had varit falskt för kl är bara 06:55 , och sedan kl. 07:00 hade inte regeln triggats.
Tack så mycket för hjälpen :) din er scen bara rullar på helt underbart :)
Börjat pilla lite på min Fibaro home center 2 ( och det går bra )
PeterM5
Medlem
Posts: 37
Joined: 13 Jul 2016, 10:55

11 Feb 2020, 22:41

Jag tänker använda en Fibaro Smart Implant som larm till bergvärmepumpen.
Går det att få ett meddelande i mobilen om ingång 1 är sluten, NO?
Hur skriver man det i Eventrunner?

DeviceId:343
"input1": "binarySensorNO",
"input1AnalogId": "348",
"input1BinaryId": "346",
"input2": "binarySensorNO",
"input2AnalogId": "349",
"input2BinaryId": "347",
jang
Medlem
Posts: 228
Joined: 05 Jan 2014, 00:44
Location: Stockholm

12 Feb 2020, 11:23

PeterM5 wrote:
11 Feb 2020, 22:41
Jag tänker använda en Fibaro Smart Implant som larm till bergvärmepumpen.
Går det att få ett meddelande i mobilen om ingång 1 är sluten, NO?
Hur skriver man det i Eventrunner?

DeviceId:343
"input1": "binarySensorNO",
"input1AnalogId": "348",
"input1BinaryId": "346",
"input2": "binarySensorNO",
"input2AnalogId": "349",
"input2BinaryId": "347",
Jag har inte sett ngn smart implant så jag vet inte riktigt hur de beter sig.
Om du skriver en testscen:

Code: Select all

--[[
%% autostart
343 value
348 value
346 value
349 value
347 value
--]]
fibaro:debug(json.encode(fibaro:getSourceTrigger()))
och sätter den till 'automatic' - vad händer om du sluter ingång 1?
om du får en source trigger som ser ut som {type='property' deviceID=346, value=1} så borde en regel typ

Code: Select all

Rule.eval("346:isOn => log('ingång 1 sluten')")
Rule.eval("346:isOff => log('ingång 1 öppen')")
funka (eller om det är tvärtom med öppen/sluten).
Om det är ngn mer komplicerad source trigger kan vi fixa det också men jag måste se hur de ser ut.
Last edited by jang on 12 Feb 2020, 18:59, edited 1 time in total.
PeterM5
Medlem
Posts: 37
Joined: 13 Jul 2016, 10:55

12 Feb 2020, 18:39

Händer inget.

Code: Select all

[DEBUG] 17:33:15: 2020-02-12 17:33:15.154018 [ fatal] Unknown exception: /opt/fibaro/scenes/96.lua:14: attempt to index global 'Fibaro' (a nil value)
jang
Medlem
Posts: 228
Joined: 05 Jan 2014, 00:44
Location: Stockholm

12 Feb 2020, 19:01

PeterM5 wrote:
12 Feb 2020, 18:39
Händer inget.

Code: Select all

[DEBUG] 17:33:15: 2020-02-12 17:33:15.154018 [ fatal] Unknown exception: /opt/fibaro/scenes/96.lua:14: attempt to index global 'Fibaro' (a nil value)
IPhone vill att jag börjar kod med stor bokstav :)
Om du ändrar Fibaro till fibaro i koden ovan (jag har ändrat i inlägget) borde det funka.
PeterM5
Medlem
Posts: 37
Joined: 13 Jul 2016, 10:55

12 Feb 2020, 19:19

Det står autostart när scenen startar automatiskt..
Inget händer när jag sluter ingången.
Jag har kollat utgången, den sätts när jag sluter ingången (default)

Code: Select all

 [DEBUG] 20:37:17: {"type":"autostart"}
PeterM5
Medlem
Posts: 37
Joined: 13 Jul 2016, 10:55

12 Feb 2020, 21:59

Detta händer när jag la till den i properties.

Code: Select all

    "input1": "binarySensorNO",
    "input1AnalogId": "359",
    "input1BinaryId": "357",
    "input2": "keyMonostable",
    "input2AnalogId": "360",
    "input2BinaryId": "358",
    

Code: Select all

--[[
%% autostart
357 value
%% properties
357 value
--]]
fibaro:debug(json.encode(fibaro:getSourceTrigger()))

Code: Select all

[DEBUG] 20:51:00: {"type":"autostart"}
[DEBUG] 20:51:36: {"deviceID":357,"propertyName":"value","type":"property"}
[DEBUG] 20:51:43: {"propertyName":"value","deviceID":357,"type":"property"}
PeterM5
Medlem
Posts: 37
Joined: 13 Jul 2016, 10:55

12 Feb 2020, 22:26

Code: Select all

--[[
%% autostart
%% properties
357 value
--]]
--fibaro:debug(json.encode(fibaro:getSourceTrigger()))


fibaro:debug('Value = ' .. fibaro:getValue(357, "value"))

[DEBUG] 21:21:11: Value = 1
[DEBUG] 21:21:12: Value = 0
Går det att få till det med någon regel?

Code: Select all

--[[
%% autostart
%% properties
357 value
--]]
--fibaro:debug(json.encode(fibaro:getSourceTrigger()))


--fibaro:debug('Value = ' .. fibaro:getValue(357, "value"))

rule("357:value == '1' => log('ingång 1 sluten')")
rule("357:value == '0' => log('ingång 1 öppen')")

 [DEBUG] 21:22:03: 2020-02-12 21:22:03.576430 [ fatal] Unknown exception: /opt/fibaro/scenes/96.lua:11
: attempt to call global 'rule' (a nil value)
jang
Medlem
Posts: 228
Joined: 05 Jan 2014, 00:44
Location: Stockholm

12 Feb 2020, 22:30

PeterM5 wrote:
12 Feb 2020, 22:26

Code: Select all

--[[
%% autostart
%% properties
357 value
--]]
--fibaro:debug(json.encode(fibaro:getSourceTrigger()))


fibaro:debug('Value = ' .. fibaro:getValue(357, "value"))

[DEBUG] 21:21:11: Value = 1
[DEBUG] 21:21:12: Value = 0
Går det att få till det med någon regel?

Code: Select all

--[[
%% autostart
%% properties
357 value
--]]
--fibaro:debug(json.encode(fibaro:getSourceTrigger()))


--fibaro:debug('Value = ' .. fibaro:getValue(357, "value"))

rule("357:value == '1' => log('ingång 1 sluten')")
rule("357:value == '0' => log('ingång 1 öppen')")

 [DEBUG] 21:22:03: 2020-02-12 21:22:03.576430 [ fatal] Unknown exception: /opt/fibaro/scenes/96.lua:11
: attempt to call global 'rule' (a nil value)
Absolut - men du måste inkludera hela ER framework. (därför klagar den på att rule är odefinierad)
Reglerna blir

Code: Select all

rule("357:isOn => log('ingång 1 sluten')")
rule("357:isOff => log('ingång 1 öppen')")
istället för log kan du starta scener, skicka meddelande etc.
PeterM5
Medlem
Posts: 37
Joined: 13 Jul 2016, 10:55

12 Feb 2020, 23:55

jang wrote:
12 Feb 2020, 22:30

Absolut - men du måste inkludera hela ER framework. (därför klagar den på att rule är odefinierad)
Reglerna blir

Code: Select all

rule("357:isOn => log('ingång 1 sluten')")
rule("357:isOff => log('ingång 1 öppen')")
istället för log kan du starta scener, skicka meddelande etc.
Tack!, det funkar perfekt :)
PeterM5
Medlem
Posts: 37
Joined: 13 Jul 2016, 10:55

20 Feb 2020, 21:25

Jag har en Fibaro Single Switch 2
Hur kan en regel se ut om jag vill styra Switch 2 trådlöst när jag klickar en gång på Switch 1?

Switch 1 = 389
Switch 2 = 326
jang
Medlem
Posts: 228
Joined: 05 Jan 2014, 00:44
Location: Stockholm

20 Feb 2020, 22:31

PeterM5 wrote:
20 Feb 2020, 21:25
Jag har en Fibaro Single Switch 2
Hur kan en regel se ut om jag vill styra Switch 2 trådlöst när jag klickar en gång på Switch 1?

Switch 1 = 389
Switch 2 = 326
När man slår på switch1 så slås switch 2 på och när man slår av 1 så slås 2 av?

Code: Select all

Rule.eval("389:value => 326:value=389:value")
När 389 ändrar värde så sätts 326's värde till 389's värde.
PeterM5
Medlem
Posts: 37
Joined: 13 Jul 2016, 10:55

20 Feb 2020, 23:12

När man slår på switch1 så slås switch 2 på och när man slår av 1 så slås 2 av?

Code: Select all

Rule.eval("389:value => 326:value=389:value")
När 389 ändrar värde så sätts 326's värde till 389's värde.
Tack :)
Det fungerar jättebra.
Post Reply