[SOLVED] Send Message when State doesn´t change for X minutes

Hi there,

i want to build up a rule for my Homematic windowcontacts.
It should send me a whatsapp message via yowsup when the window stays open for more than X minutes.

As i´m not really into the rules, i need some help.
I already found a thread about a similar problem with timers.

items:

Contact itmFenster_Badezimmer "Fenster Badezimmer [MAP(windowcontact.map):%s]" <contact> (Badezimmer) {homematic="address=MEQ1726970, channel=1, parameter=STATE"}
Number itmHeizung_Kueche_SOLL "Küche Soll Temperatur [%.1f °C]" <heating> (Kueche) {homematic="address=MEQ0056036, channel=4, parameter=SET_TEMPERATURE"}

windowcontact.rules

import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*

import org.joda.time.*

var Timer timerFenster = null

rule "Warnung für Fensterkontakt"
when
    Item itmFenster_Badezimmer changed  from CLOSED to OPEN
then
    if(previousState!=OPEN && previousState!=CLOSED) { //don't create a message if openHAB just started
        // for OH1 uninitialized state would be Uninitialized, for OH2 it will be null
        return(false) //abort rule
    }

    if(timerFenster!=null) {
        timerFesnter.cancel
        timerFenster=null
    }

    timerFenster = createTimer(now.plusMinutes(60), [|	
        if (itmFenster_Badezimmer.state == OPEN)
            exec=">sudo yowsup-cli demos -s 49XXX "Achtung, das Fenster im Badezimmer ist seit 1 Stunde geöffnet" -c config.yowsup"
        else
            timerFenster=null
    ] )
end

Now i have the following questions/problems:

  1. Would it work like this ?
  2. What about the part about the uninitialized state ? I don´t know what it means.
  3. How could openhab execute the commandline with sudo ?
  4. How to correctly refer to the config file ? [/home/pi/config.yowsup]

Cheers
Michael

  1. I’m not sure if there are some changes in OH2 but as written this would not work in OH 1.

In particular the “exec” line makes no sense. To execute a command line you would use val String results = executeCommandLine("sudo yowsup-cli ...", 5000)

Furthermore, you need to escape the quotes.

“sudo yowsup-cli demos -s 49XXX “Achtung, …” -c config.yowsup”

  1. If you do not have persistence setup with restoreOnStartup, when openHAB starts or reloads the Items files the state of those Items gets initialized to Uninitialized. If you do have persistence setup with restoreOnStartup the Item gets initialized to the most recent value in the database.

  2. See my comment to 1. In addition, you have to add the openhab user to the sudoers and configured so it is not required to enter a password to execute that command. Search online for a good tutorial on how to configure sudo.

  3. Use the full path like you do in your question: /home/pi/config.yowsup.

Hi Rich,

thanks for your help.

  1. I´m using the rrd4j persistence with restoreOnStartup and everyChange.

  2. I searched in the OH community and found a post from you about this.
    So i added this line to my sudoers.d and tried to execute yowsup with sudo and it works :slight_smile:

pi ALL=(ALL) NOPASSWD: /usr/local/bin/yowsup-cli
  1. done
import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*

import org.joda.time.*

var Timer timerFenster = null

rule "Warnung für Fensterkontakt"
when
    Item itmFenster_Badezimmer changed from CLOSED to OPEN
then
    if(previousState!=OPEN && previousState!=CLOSED) { //don't create a message if openHAB just started
        // for OH1 uninitialized state would be Uninitialized, for OH2 it will be null
        return(false) //abort rule
    }

    if(timerFenster!=null) {
        timerFesnter.cancel
        timerFenster=null
    }

    timerFenster = createTimer(now.plusMinutes(60), [|    
        if (itmFenster_Badezimmer.state == OPEN)
            val String results = executeCommandLine("sudo yowsup-cli demos -s 49XXX \"Achtung, das Fenster im Badezimmer ist seit 1 Stunde geöffnet\" -c /home/pi/config.yowsup", 5000)
        else
            timerFenster=null
    ] )
end

So it should work now ?

Cheers
Michael

Ok it´s not working.
I did a small test and changed the createTimer to plusSeconds(60).
The rule started when changing the state from closed to open.

2016-07-08 18:05:27.209 [DEBUG] [m.r.internal.engine.RuleEngine] - Executing rule 'Warnung f?r Fensterkontakt'

But crashed after 60 seconds.

2016-07-08 18:06:27.478 [DEBUG] [.s.i.actions.TimerExecutionJob] - Executing timer 'DEFAULT.2016-07-08T18:06:27.466+02:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: org.eclipse.xtext.xbase.impl.XClosureImplCustom@e80fb6 (explicitSyntax: true)'
2016-07-08 18:06:27.605 [ERROR] [org.quartz.core.JobRunShell   ] - Job DEFAULT.2016-07-08T18:06:27.466+02:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: org.eclipse.xtext.xbase.impl.XClosureImplCustom@e80fb6 (explicitSyntax: true) threw an unhandled Exception: 
java.lang.IllegalStateException: Ambiguous methods [protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateAssignment(org.eclipse.xtext.xbase.XAssignment,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateBlockExpression(org.eclipse.xtext.xbase.XBlockExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateBooleanLiteral(org.eclipse.xtext.xbase.XBooleanLiteral,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateCastedExpression(org.eclipse.xtext.xbase.XCastedExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateClosure(org.eclipse.xtext.xbase.XClosure,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateConstructorCall(org.eclipse.xtext.xbase.XConstructorCall,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected org.eclipse.xtext.xbase.interpreter.IEvaluationResult org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateDoWhileExpression(org.eclipse.xtext.xbase.XDoWhileExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateForLoopExpression(org.eclipse.xtext.xbase.XForLoopExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateIfExpression(org.eclipse.xtext.xbase.XIfExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateInstanceOf(org.eclipse.xtext.xbase.XInstanceOfExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateMemberFeatureCall(org.eclipse.xtext.xbase.XMemberFeatureCall,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateNullLiteral(org.eclipse.xtext.xbase.XNullLiteral,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateNumberLiteral(org.eclipse.xtext.xbase.XNumberLiteral,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateReturnExpression(org.eclipse.xtext.xbase.XReturnExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateStringLiteral(org.eclipse.xtext.xbase.XStringLiteral,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateSwitchExpression(org.eclipse.xtext.xbase.XSwitchExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateThrowExpression(org.eclipse.xtext.xbase.XThrowExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateTryCatchFinallyExpression(org.eclipse.xtext.xbase.XTryCatchFinallyExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateTypeLiteral(org.eclipse.xtext.xbase.XTypeLiteral,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateVariableDeclaration(org.eclipse.xtext.xbase.XVariableDeclaration,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateWhileExpression(org.eclipse.xtext.xbase.XWhileExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator)] for params [null, org.eclipse.xtext.xbase.interpreter.impl.DefaultEvaluationContext@1d990ab, org.eclipse.xtext.util.CancelIndicator$1@1d11635]
    at org.eclipse.xtext.util.PolymorphicDispatcher.handleAmbigousMethods(PolymorphicDispatcher.java:308) ~[na:na]
    at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:283) ~[na:na]
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:218) ~[na:na]
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateIfExpression(XbaseInterpreter.java:329) ~[na:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_65]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_65]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_65]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_65]
    at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291) ~[na:na]
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:218) ~[na:na]
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateBlockExpression(XbaseInterpreter.java:321) ~[na:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_65]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_65]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_65]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_65]
    at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291) ~[na:na]
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:218) ~[na:na]
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:204) ~[na:na]
    at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[na:na]
    at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:28) ~[na:na]
    at com.sun.proxy.$Proxy82.apply(Unknown Source) ~[na:na]
    at org.openhab.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:44) ~[na:na]
    at org.quartz.core.JobRunShell.run(JobRunShell.java:213) ~[quartz-all-2.1.7.jar:na]
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557) [quartz-all-2.1.7.jar:na]
2016-07-08 18:06:27.621 [ERROR] [org.quartz.core.ErrorLogger   ] - Job (DEFAULT.2016-07-08T18:06:27.466+02:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: org.eclipse.xtext.xbase.impl.XClosureImplCustom@e80fb6 (explicitSyntax: true) threw an exception.
org.quartz.SchedulerException: Job threw an unhandled exception.
    at org.quartz.core.JobRunShell.run(JobRunShell.java:224) ~[quartz-all-2.1.7.jar:na]
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557) [quartz-all-2.1.7.jar:na]
Caused by: java.lang.IllegalStateException: Ambiguous methods [protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateAssignment(org.eclipse.xtext.xbase.XAssignment,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateBlockExpression(org.eclipse.xtext.xbase.XBlockExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateBooleanLiteral(org.eclipse.xtext.xbase.XBooleanLiteral,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateCastedExpression(org.eclipse.xtext.xbase.XCastedExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateClosure(org.eclipse.xtext.xbase.XClosure,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateConstructorCall(org.eclipse.xtext.xbase.XConstructorCall,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected org.eclipse.xtext.xbase.interpreter.IEvaluationResult org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateDoWhileExpression(org.eclipse.xtext.xbase.XDoWhileExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateForLoopExpression(org.eclipse.xtext.xbase.XForLoopExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateIfExpression(org.eclipse.xtext.xbase.XIfExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateInstanceOf(org.eclipse.xtext.xbase.XInstanceOfExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateMemberFeatureCall(org.eclipse.xtext.xbase.XMemberFeatureCall,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateNullLiteral(org.eclipse.xtext.xbase.XNullLiteral,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateNumberLiteral(org.eclipse.xtext.xbase.XNumberLiteral,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateReturnExpression(org.eclipse.xtext.xbase.XReturnExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateStringLiteral(org.eclipse.xtext.xbase.XStringLiteral,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateSwitchExpression(org.eclipse.xtext.xbase.XSwitchExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateThrowExpression(org.eclipse.xtext.xbase.XThrowExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateTryCatchFinallyExpression(org.eclipse.xtext.xbase.XTryCatchFinallyExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateTypeLiteral(org.eclipse.xtext.xbase.XTypeLiteral,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateVariableDeclaration(org.eclipse.xtext.xbase.XVariableDeclaration,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator), protected java.lang.Object org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateWhileExpression(org.eclipse.xtext.xbase.XWhileExpression,org.eclipse.xtext.xbase.interpreter.IEvaluationContext,org.eclipse.xtext.util.CancelIndicator)] for params [null, org.eclipse.xtext.xbase.interpreter.impl.DefaultEvaluationContext@1d990ab, org.eclipse.xtext.util.CancelIndicator$1@1d11635]
    at org.eclipse.xtext.util.PolymorphicDispatcher.handleAmbigousMethods(PolymorphicDispatcher.java:308) ~[na:na]
    at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:283) ~[na:na]
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:218) ~[na:na]
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateIfExpression(XbaseInterpreter.java:329) ~[na:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_65]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_65]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_65]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_65]
    at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291) ~[na:na]
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:218) ~[na:na]
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._evaluateBlockExpression(XbaseInterpreter.java:321) ~[na:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_65]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_65]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_65]
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_65]
    at org.eclipse.xtext.util.PolymorphicDispatcher.invoke(PolymorphicDispatcher.java:291) ~[na:na]
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:218) ~[na:na]
    at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:204) ~[na:na]
    at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[na:na]
    at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:28) ~[na:na]
    at com.sun.proxy.$Proxy82.apply(Unknown Source) ~[na:na]
    at org.openhab.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:44) ~[na:na]
    at org.quartz.core.JobRunShell.run(JobRunShell.java:213) ~[quartz-all-2.1.7.jar:na]
    ... 1 common frames omitted

Any ideas ?

Cheers
Michael

You need to add the openhab user to sudoers.d, not pi. Unless you manually installed openHAB rather than using apt-get (in which case I strongly recommend going back and installing using apt-get), openHAB is running under the openhab user so it needs the sudo permissions.

That is an odd error and without further narrowing down to which line is causing problems I have no suggestions. You can either comment out sections of code and gradually add them back in until the error reappears or add a bunch of logInfo statements to narrow the error down to a specific line.

Ah sorry, i copied the wrong line from sudoers.d
I added pi to test it and openhab for the rule.
So sudo isn’t a problem.

I think there’s something wrong with the timer …

Cheers
Michael

I don’t think so. I’ve probably seen every exception that can be thrown by a Timer, and this isn’t one of them. This is something more fundamental to the syntax of your rule.

Ok i ´ve written the rule in Atom and not in the OH Designer.
As i checked the Designer i got some errors:

    timerFenster = createTimer(now.plusMinutes(60), [|
/* - Couldn't resolve reference to JvmIdentifiableElement 'plusMinutes'.
   - Couldn't resolve reference to JvmIdentifiableElement 'now'. */
        if (itmFenster_Badezimmer.state == OPEN)
            val String results = executeCommandLine("sudo yowsup-cli demos -s 49XXX \"Achtung, das Fenster im Badezimmer ist seit 1 Stunde geöffnet\" -c /home/pi/config.yowsup", 5000)
/* no viable alternative at input 'val' 
   The value of the local variable results is not used */
        else
/* mismatched input 'else' expecting ']' */
            timerFenster=null
/* missing ')' at 'timerFenster' */
    ] )
/* mismatched input ']' expecting 'end' */
end

As i said, i´m not familiar with the OH rules and i need help to learn and understand it.

Cheers
Michael

Found the problem.
It was your code:

val String results = 

Now i´m using:

import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*

import org.joda.time.*

var Timer timerFenster = null

rule "Warnung Badezimmer Fensterkontakt"
when
    Item itmFenster_Badezimmer changed from CLOSED to OPEN
then
    if(previousState!=OPEN && previousState!=CLOSED) { //don't create a message if openHAB just started
        // for OH1 uninitialized state would be Uninitialized, for OH2 it will be null
        return(false) //abort rule
    }

    if(timerFenster!=null) {
        timerFenster.cancel
        timerFenster=null
    }

    timerFenster = createTimer(now.plusMinutes(60), [|
        if (itmFenster_Badezimmer.state == OPEN)
            executeCommandLine("sudo yowsup-cli demos -s 49XXX \"Achtung, das Fenster im Badezimmer ist seit 1 Stunde offen!\" -c /home/pi/config.yowsup", 5000)
        else
            timerFenster=null
            ] )
end

It works fine, but there is still something to wonder about.
The " will be send with the message :slight_smile:

Cheers
Michael

That is odd because there is nothing wrong with the "val String results = " part. I have that all over the place in my rules. One of those “errors” in the above was just a warning saying that you are not using the variable “results” which is true. Typically I log results out (guess I forgot to add that as I typed in the above).

I’ve no idea why taking that out fixed the other errors though.

Hi,

another approach, which I usually use to check my doors, windows etc. It notifies me, when the garagedoor is left open and no one has left it open to work inside:

rule "Cron each minute"
  when
    Time cron "0 * * * * ?"
  then
    if (garagedor.state == ON && !garagedor.changedSince(now.minusMinutes(15)) && pir_garage_inside.state == OFF) {
      //notify me
    }
end

Of course this only works if garagedor is persisted. I use rrd4j.persist.

Just finished my rule with some extras.

  1. Checks if the item is initialized => return(false)
  2. Checks if the Month is between March and October => return(false)
  3. Checks if the window was opened again => set timer to null
import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*

import org.joda.time.*

var Timer timerFenster = null

rule "Warnung Badezimmer Fensterkontakt"

when

    Item itmFenster_Badezimmer changed from CLOSED to OPEN

then

// Prüfung ob der item state initialisiert ist
    if(previousState!=OPEN && previousState!=CLOSED)
    {
        logInfo("RuleFensterBadezimmer", "Regel wird abgebrochen, die Items sind nicht initialisiert.")
        return(false)
    }

// Prüfung ob der aktuelle Monat zwischen März und Oktober liegt
    if(now.getMonthOfYear() >3 && now.getMonthOfYear() <10)
    {
        logInfo("RuleFensterBadezimmer", "Die Regel wird abgebrochen, es ist Sommer.")
        return (false)
    }

// Abbruch des Timers wenn das Fenster erneut geöffnet wird
    if(timerFenster!=null)
    {
        logInfo("RuleFensterBadezimmer", "Die Regel wird neugestartet, das Fenster wurde erneut geöffnet.")
        timerFenster.cancel
        timerFenster=null
    }

// Erstellen eines Timers für 60 Minuten und anschließenden Versenden einer Whatsapp Nachricht
    timerFenster = createTimer
    (
        now.plusMinutes(60), 
        [|
            if (itmFenster_Badezimmer.state == OPEN)
            {
                executeCommandLine("sudo yowsup-cli demos -s XXX 'Achtung, das Fenster im Badezimmer ist seit 1 Stunde offen!' -c /home/pi/config.yowsup", 5000)
                logInfo("RuleFensterBadezimmer", "Die Regel wurde erfolgreich ausgeführt.")
            }
            else
                timerFenster=null
        ]
    )
end

You´re free to use this rule for your personal setups.

Cheers
Michael