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:
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
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