Seite 1 von 2

Warnung bei zu lange geöffneten Fenster

Verfasst: 16. Jan 2020 22:04
von Jens
Guten Abend,
ich bin noch neu in der OH2 Welt und baue mir gerade eine eigene Umgebung.
Aktuelle scheitere ich an einer Regel die mir eine Nachricht übermittelt wenn ein Fenster zu lange offen ist. Wahrscheinlich ist es nur ein Denkfehler aber ich kann den Fehler nicht sehen. Ich bekomme zwar eine Meldung wenn das Fenster 10 Minuten geöffnet ist aber der Timer bricht nicht ab wenn ich das Fenster vorher schließe und ich bekomme die Meldung trotzdem.
Außerdem bekomme ich die Meldung ein zweites mal um die Zeit verzögert seit dem schließen des Fensters.

Hier der Code:

Code: Alles auswählen

var Timer WindowTimer = null                                             

rule "Balkontür Büro Status"
when                                          
    Item OF_CD_01_STATE changed                        
then          
    if(OF_CD_01_STATE.state != CLOSED)                                 
    {        
        WindowTimer = createTimer(now.plusMinutes(10), 
        [|              
            sendBroadcastNotification("Balkontür im Büro seit 10 min offen!")
            WindowTimer = null 
        ])                                                             
    } 
    else                                                               
    {                                                   
        if(WindowTimer !== null)                                       
        {                                     
            WindowTimer.cancel                                      
            WindowTimer = null 
            sendBroadcastNotification("Balkontür im Büro wurde geschlossen!")
        }
    }
end
Hat jemand eine Idee?

Re: Warnung bei zu lange geöffneten Fenster

Verfasst: 16. Jan 2020 22:26
von udo1toni
Hast Du Dir mal das events.log angeschaut, zum Zeitpunkt des Fenster öffnens (und schließens)? Für mich hört es sich so an, als spränge das Item wieder auf etwas anderes als CLOSED zurück.

Re: Warnung bei zu lange geöffneten Fenster

Verfasst: 16. Jan 2020 22:35
von Jens
Hallo hier der Auszug aus dem Eventlog:

Code: Alles auswählen

2020-01-16 22:32:16.498 [vent.ItemStateChangedEvent] - OF_CD_01_STATE changed from CLOSED to OPEN

2020-01-16 22:32:16.917 [vent.ItemStateChangedEvent] - OF_HT_01_SETPOINTTEMPERATURE changed from 17.00 °C to 12.00 °C

2020-01-16 22:32:30.041 [vent.ItemStateChangedEvent] - OF_CD_01_STATE changed from OPEN to CLOSED

Re: Warnung bei zu lange geöffneten Fenster

Verfasst: 16. Jan 2020 22:46
von Jens
Ich habe gerade im Log gesehen das er dort jetzt einen Fehler ausgibt. Kann es Sein das der Broadcast nicht im Timer möglich ist ?

Code: Alles auswählen

2020-01-16 22:42:16.740 [ERROR] [org.quartz.core.JobRunShell         ] - Job DEFAULT.Timer 42 2020-01-16T22:42:16.735+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

  sendBroadcastNotification(<XStringLiteralImpl>)

  <null>.WindowTimer = <XNullLiteralImplCustom>

} ] threw an unhandled Exception: 

java.lang.IllegalStateException: Cannot resolve proxy: windows_test.rules#/1

	at org.eclipse.xtext.common.types.util.JavaReflectAccess.getRawType(JavaReflectAccess.java:108) ~[?:?]

	at org.eclipse.xtext.common.types.util.JavaReflectAccess.getField(JavaReflectAccess.java:57) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._assignValueTo(XbaseInterpreter.java:1337) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter._assignValueTo(ScriptInterpreter.java:211) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.assignValueTo(XbaseInterpreter.java:1310) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:1302) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:201) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]

	at com.sun.proxy.$Proxy369.apply(Unknown Source) ~[?:?]

	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:48) ~[?:?]

	at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [bundleFile:?]

	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [bundleFile:?]

2020-01-16 22:42:16.783 [ERROR] [org.quartz.core.ErrorLogger         ] - Job (DEFAULT.Timer 42 2020-01-16T22:42:16.735+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

  sendBroadcastNotification(<XStringLiteralImpl>)

  <null>.WindowTimer = <XNullLiteralImplCustom>

} ] threw an exception.

org.quartz.SchedulerException: Job threw an unhandled exception.

	at org.quartz.core.JobRunShell.run(JobRunShell.java:213) [bundleFile:?]

	at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [bundleFile:?]

Caused by: java.lang.IllegalStateException: Cannot resolve proxy: windows_test.rules#/1

	at org.eclipse.xtext.common.types.util.JavaReflectAccess.getRawType(JavaReflectAccess.java:108) ~[?:?]

	at org.eclipse.xtext.common.types.util.JavaReflectAccess.getField(JavaReflectAccess.java:57) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._assignValueTo(XbaseInterpreter.java:1337) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter._assignValueTo(ScriptInterpreter.java:211) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.assignValueTo(XbaseInterpreter.java:1310) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:1302) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:201) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]

	at com.sun.proxy.$Proxy369.apply(Unknown Source) ~[?:?]

	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:48) ~[?:?]

	at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[?:?]

	... 1 more


Re: Warnung bei zu lange geöffneten Fenster

Verfasst: 16. Jan 2020 23:05
von udo1toni
Ich schätze mal, Du hast die rules Datei zwischendurch bearbeitet. Dabei werden Variablen neu initialisiert. Der Timer bleibt aber bestehen, nur ist er jetzt verwaist, so dass er nicht mehr beendet werden kann. Starte openHAB mal durch, bevor Du die Rule testest. der Code sieht eigntlich gut aus, vielleicht abgesehen von der etwas ungewohnten Formatierung (das ist aber Geschmackssache).

Re: Warnung bei zu lange geöffneten Fenster

Verfasst: 17. Jan 2020 09:27
von KellerK1nd
WindowTimer = createTimer(now.plusMinutes(10),
Da fehlt ne Klammer:

Code: Alles auswählen

  WindowTimer = createTimer(now.plusMinutes(10)), 

Re: Warnung bei zu lange geöffneten Fenster

Verfasst: 17. Jan 2020 11:09
von udo1toni
Nein, die Klammer steht nur an anderer Stelle.

Re: Warnung bei zu lange geöffneten Fenster

Verfasst: 17. Jan 2020 13:18
von KellerK1nd
Ach. Ok. Stimmt.

Re: Warnung bei zu lange geöffneten Fenster

Verfasst: 17. Jan 2020 14:06
von eiGelbGeek
Aber kleine Fehler hat die Rule trotzdem oder ist es gewollt, das die Meldung "Balkontür im Büro wurde geschlossen!" nur kommt wenn ein Timer aktiv ist? Sprich die Meldung kommt nicht wenn die Tür nach 11 Minuten geschlossen wird.

Ich persönlich würde die Meldung, das die Tür geschlossen wurde, nur auslösen lassen wenn sie schon länger als 10 Minuten geöffnet ist und nicht umgekehrt.

Dafür muss man nur bisschen was am Code ändern :mrgreen:

z.b. mit einer Hilfsvariable :?:

Code: Alles auswählen

var Timer WindowTimer = null                                             
var hilfsVariable = null

rule "Balkontür Büro Status"
when                                          
  Item OF_CD_01_STATE changed                        
then          
  if(OF_CD_01_STATE.state != CLOSED) {
      WindowTimer = createTimer(now.plusMinutes(10), [|              
        sendBroadcastNotification("Balkontür im Büro seit 10 min offen!")
        WindowTimer = null
        hilfsVariable = 1
      ])                                                             
  } else {
      if (OF_CD_01_STATE.state == CLOSED) {
        if(WindowTimer !== null) {                                     
          WindowTimer.cancel                                      
          WindowTimer = null
        }
        if (hilfsVariable == 1) {
          sendBroadcastNotification("Balkontür im Büro wurde geschlossen!")
          hilfsVariable = null
        }
      }  
    }
end

Re: Warnung bei zu lange geöffneten Fenster

Verfasst: 17. Jan 2020 14:40
von KellerK1nd
Ich hab das so gelöst:

Code: Alles auswählen

var Timer nFabianLueften = null
rule "Fabian lüften"
when
    Item FabianBalkontuerOpen changed
then
    switch (newState) {
        case OPEN   :   {
                        logInfo("Balkontür.Fabian", "Status geändert: {}",FabianBalkontuerOpen.state)
                        nFabianLueften?.cancel
                        if(Heizung_Auto_Manu_Fabian.state == ON){
                            logInfo("Balkontür.Fabian", "Lüftungstimer 10 Minuten gestartet.")
                            nFabianLueften = createTimer(now.plusMinutes(10))[|
                                if(FabianBalkontuerOpen.state == OPEN){
                                    sendTelegram("Bot", "Fabian's Balkontür kann wieder geschlossen werden, 10 Minuten wurden gelüftet.")
                                   gAlexaTTS.sendCommand("Bei Fabian wurden jetzt 10 Minuten gelüftet. Die Balkontür kann wieder geschlossen werden.")
                                    }
                                nFabianLueften = null
                            ]
                        }
                        }
        case CLOSED :   {
                        nFabianLueften?.cancel
                        logInfo("Balkontür.Fabian", "Status geändert: {}, Eventueller Lüftungstimer abgebrochen.",FabianBalkontuerOpen.state)
                        }
    }
end