From a488a6bf8052ac2739edde388066a1e478dd91c2 Mon Sep 17 00:00:00 2001 From: Guy Martin Date: Sun, 15 Nov 2015 21:32:57 -0800 Subject: [PATCH 1/7] Unschedule Timers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change puts in logic to unschedule delayed off if the state being tested for (true or false) is reached. This is most useful for things like ‘delay off after n minutes and motion stopped.’ --- .gitignore | 2 ++ Rule | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a97fa56 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +*.swp diff --git a/Rule b/Rule index ced80ca..dfe61bd 100644 --- a/Rule +++ b/Rule @@ -566,6 +566,7 @@ def runRule() { def success = eval() if(success != state.success) { if(success) { + if(delayedOffFalse) unschedule("delayOffFalse") if(onSwitchTrue) onSwitchTrue.on() if(offSwitchTrue) offSwitchTrue.off() if(delayedOffTrue) runIn(delayMinutesTrue * 60, delayOffTrue) @@ -578,6 +579,7 @@ def runRule() { if(pushTrue) sendPush(msgTrue ?: "Rule $app.label True") if(phoneTrue) sendSms(phoneTrue, msgTrue ?: "Rule $app.label True") } else { + if(delayedOffTrue) unschedule("delayOffTrue") if(onSwitchFalse) onSwitchFalse.on() if(offSwitchFalse) offSwitchFalse.off() if(delayedOffFalse) runIn(delayMinutesFalse * 60, delayOffFalse) From 879cce493491bb7663e79f4956dcb9fb666c2819 Mon Sep 17 00:00:00 2001 From: Guy Martin Date: Mon, 16 Nov 2015 18:04:59 -0800 Subject: [PATCH 2/7] Ignore .old files --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index a97fa56..738de5a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ *.swp + +*.old From 3edcef7a77a2f8aeb7d8af854a7402494ca0c2e3 Mon Sep 17 00:00:00 2001 From: Guy Martin Date: Wed, 18 Nov 2015 16:56:08 -0800 Subject: [PATCH 3/7] Manual Switch Override of Rule Automation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a rough cut at logic to allow switches used in the ‘Actions when True’ section to override rule processing until a manual switch off occurs. --- Rule | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/Rule b/Rule index b93d1b0..ff91b76 100644 --- a/Rule +++ b/Rule @@ -49,6 +49,11 @@ def selectRule() { href "selectActionsTrue", title: "Select the Actions for True", description: state.actsTrue ? state.actsTrue : "Tap to set", state: state.actsTrue ? "complete" : null href "selectActionsFalse", title: "Select the Actions for False", description: state.actsFalse ? state.actsFalse : "Tap to set", state: state.actsFalse ? "complete" : null } + section ("Overrides") { + paragraph "Manual ON disables rule evaluation. Manual OFF re-enables rule evaluation." + input "physicalOverride", "bool", title: "Physical override?", required: true, defaultValue: false + paragraph "" + } section() {mode(title: "Restrict to specific mode(s)")} } } @@ -502,7 +507,12 @@ def initialize() { else if(capab == "Power meter") subscribe((settings.find{it.key == "rDev$i"}).value, "power", allHandler) else subscribe((settings.find{it.key == "rDev$i"}).value, capab.toLowerCase(), allHandler) } + if (physicalOverride) { + subscribe(onSwitchTrue, "switch.on", switchHandler) + subscribe(onSwitchTrue, "switch.off", switchHandler) + } state.success = null + state.override = false runRule(false) } @@ -653,6 +663,8 @@ def doDelay(time, success) { } def runRule(delay) { + if(!state.override) { + log.info ("$app.label is rule processing NORMALLY") state.token = 0 def success = eval() if((success != state.success) || delay) { @@ -690,7 +702,24 @@ def runRule(delay) { } state.success = success log.info (success ? "$app.label is True" : "$app.label is False") - } + } + } else { + log.info ("$app.label is Overridden - no rule processing...") + } +} + +def switchHandler(evt) { + if (evt.isPhysical()) { + if (evt.value == "on") { + log.debug "switchHandler(isPhysical()): $evt.name: $evt.value" + state.override = true + unschedule() + } else if (evt.value == "off") { + state.override = false + log.debug "switchHandler(isPhysical()): $evt.name: $evt.value" + } + runRule() + } } def allHandler(evt) { From c291130d2b78bada84640e08ffbc85f2dcf27f7b Mon Sep 17 00:00:00 2001 From: Guy Martin Date: Wed, 18 Nov 2015 22:09:59 -0800 Subject: [PATCH 4/7] Backup version of Rule --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 738de5a..0acc6e7 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ *.swp *.old + +Rule.1.106.O From 9d2325c35177ae782a8c9d6eb9a9600c6af4ee36 Mon Sep 17 00:00:00 2001 From: Guy Martin Date: Wed, 18 Nov 2015 22:23:42 -0800 Subject: [PATCH 5/7] All Off Now Re-enables Automation All off events on switch now re-enable automation. --- Rule | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Rule b/Rule index ff91b76..bc65efc 100644 --- a/Rule +++ b/Rule @@ -50,7 +50,7 @@ def selectRule() { href "selectActionsFalse", title: "Select the Actions for False", description: state.actsFalse ? state.actsFalse : "Tap to set", state: state.actsFalse ? "complete" : null } section ("Overrides") { - paragraph "Manual ON disables rule evaluation. Manual OFF re-enables rule evaluation." + paragraph "Manual ON disables rule evaluation. ANY OFF re-enables rule evaluation." input "physicalOverride", "bool", title: "Physical override?", required: true, defaultValue: false paragraph "" } @@ -714,12 +714,14 @@ def switchHandler(evt) { log.debug "switchHandler(isPhysical()): $evt.name: $evt.value" state.override = true unschedule() - } else if (evt.value == "off") { - state.override = false - log.debug "switchHandler(isPhysical()): $evt.name: $evt.value" - } - runRule() + } + } + + if (evt.value == "off") { + state.override = false + log.debug "switchHandler(isPhysical()): $evt.name: $evt.value" } + runRule() } def allHandler(evt) { From 4968d78354f6399c459ca7fc269db6cfb4e6b31f Mon Sep 17 00:00:00 2001 From: Guy Martin Date: Wed, 18 Nov 2015 22:27:45 -0800 Subject: [PATCH 6/7] Change in runRule method signature --- Rule | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Rule b/Rule index bc65efc..44e3c8c 100644 --- a/Rule +++ b/Rule @@ -721,7 +721,7 @@ def switchHandler(evt) { state.override = false log.debug "switchHandler(isPhysical()): $evt.name: $evt.value" } - runRule() + runRule(false) } def allHandler(evt) { From e095bcfe5c6fbcef5905359864ea009ed97e5d29 Mon Sep 17 00:00:00 2001 From: Guy Martin Date: Sun, 22 Nov 2015 22:35:29 -0800 Subject: [PATCH 7/7] ignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 0acc6e7..c14912c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,5 @@ *.old Rule.1.106.O + +Rule.1.1.14