Warnung bei zu lange geöffneten Fenster

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Jens
Beiträge: 7
Registriert: 16. Jan 2020 21:35
Answers: 0

Warnung bei zu lange geöffneten Fenster

Beitrag 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?
von udo1toni » 18. Jan 2020 19:47
Das erklärt es sofort. Ein String ist ein String. Ein Status ist ein Status. Ich behaupte mal, (ohne homematic selbst zu nutzen), dass Du den Channel mit einem Contact Item verlinken müsstest. Falls das nicht funktionieren sollte (und nur dann!) kannst Du auch weiterhin das String Item verwenden und nun aber die Abfrage anpassen:

Code: Alles auswählen

if(OF_CD_01_STATE.state != "CLOSED") {
Begründung: Das Contact Item ist der korrekte Itemtyp für einen Boolean Wert (vor allem, wenn er sich auf einen Tür- oder Fensterkontakt bezieht).
Ansonsten ist ein Status normalerweise ein Status und kein String, aber in diesem Fall beinhaltet das String Item tatsächlich einen String als Status und eben kein Datum vom Typ OpenClosedType, also muss man auch mit einem String vergleichen.
Dass die Meldung zweimal ausgegeben wird, rührt daher, dass ein zweiter Timer angelegt wird, dabei wird der Zeiger auf den ersten Timer mit dem neuen Timer überschrieben, der erste Timer wird dabei nicht gelöscht!.
Gehe zur vollständigen Antwort

Benutzeravatar
udo1toni
Beiträge: 15248
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Warnung bei zu lange geöffneten Fenster

Beitrag 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.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Jens
Beiträge: 7
Registriert: 16. Jan 2020 21:35
Answers: 0

Re: Warnung bei zu lange geöffneten Fenster

Beitrag 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

Jens
Beiträge: 7
Registriert: 16. Jan 2020 21:35
Answers: 0

Re: Warnung bei zu lange geöffneten Fenster

Beitrag 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


Benutzeravatar
udo1toni
Beiträge: 15248
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Warnung bei zu lange geöffneten Fenster

Beitrag 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).
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
KellerK1nd
Beiträge: 432
Registriert: 17. Jun 2019 16:45
Answers: 1
Wohnort: Griesheim

Re: Warnung bei zu lange geöffneten Fenster

Beitrag von KellerK1nd »

WindowTimer = createTimer(now.plusMinutes(10),
Da fehlt ne Klammer:

Code: Alles auswählen

  WindowTimer = createTimer(now.plusMinutes(10)), 
Betriebssystem: Proxmox 7.3-4
openHAB Container: debian11 LXC
openHAB Version: 3.4
Hardware: HomeServer Eigenbau mit einem Intel i5 9600K
Smarthome-Equipment:
- Rasperrymatic
- deConz
- HUE
- Shellys
- Mosquitto
- AVM Fritz!Box

Benutzeravatar
udo1toni
Beiträge: 15248
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Warnung bei zu lange geöffneten Fenster

Beitrag von udo1toni »

Nein, die Klammer steht nur an anderer Stelle.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Benutzeravatar
KellerK1nd
Beiträge: 432
Registriert: 17. Jun 2019 16:45
Answers: 1
Wohnort: Griesheim

Re: Warnung bei zu lange geöffneten Fenster

Beitrag von KellerK1nd »

Ach. Ok. Stimmt.
Betriebssystem: Proxmox 7.3-4
openHAB Container: debian11 LXC
openHAB Version: 3.4
Hardware: HomeServer Eigenbau mit einem Intel i5 9600K
Smarthome-Equipment:
- Rasperrymatic
- deConz
- HUE
- Shellys
- Mosquitto
- AVM Fritz!Box

eiGelbGeek
Beiträge: 226
Registriert: 11. Aug 2019 06:39
Answers: 4

Re: Warnung bei zu lange geöffneten Fenster

Beitrag 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

Benutzeravatar
KellerK1nd
Beiträge: 432
Registriert: 17. Jun 2019 16:45
Answers: 1
Wohnort: Griesheim

Re: Warnung bei zu lange geöffneten Fenster

Beitrag 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

Betriebssystem: Proxmox 7.3-4
openHAB Container: debian11 LXC
openHAB Version: 3.4
Hardware: HomeServer Eigenbau mit einem Intel i5 9600K
Smarthome-Equipment:
- Rasperrymatic
- deConz
- HUE
- Shellys
- Mosquitto
- AVM Fritz!Box

Antworten