Exit aus While Schleife funkt nicht

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Zacki
Beiträge: 43
Registriert: 26. Jan 2019 13:27
Answers: 0

Exit aus While Schleife funkt nicht

Beitrag von Zacki »

Hallo

Ich bin gerade dabei einen Sonnenaufgang zu simulieren.
Würde soweit funktionieren, ich möchte jedoch die Möglichkeit haben, diese Simulation vorzeitig zu beenden.
Doch irgendwie komme ich aus der Whileschleife nicht raus

Sobald ich den Switch SchlafzimmerSunrise betätige (ON), bekommt auch der Switch Schlafzimmerlighpower ein ON
und die Simulation startet. Mein Ziel ist es, sobald ich den Switch Schlafzimmerpower abschalte (OFF) soll sich die Lampe einfach abschalten.
Dacht ich kann das mit:
while ((i=i+1) < 120 || Schlafzimmerlightpower == ON) {
umsetzen, doch die Lampe schlatet sich kurz aus und macht dann gleich wieder weiter.

rule "Sonnenaufgang Schlafzimmer"
when
Item SchlafzimmerSunrise received command ON
then
var DecimalType H = new DecimalType(355)
var PercentType S = new PercentType(0)
var PercentType B = new PercentType(1)
var HSBType Licht = new HSBType(H,S,B)
SchlafzimmerlightColor.sendCommand(Licht)
Schlafzimmerlightpower.sendCommand(ON)
var i = 1
var b = 1
Thread::sleep(3000)
while ((i=i+1) < 120 || Schlafzimmerlightpower == ON) {
(b=b+1)
var DecimalType H = new DecimalType(355)
var PercentType S = new PercentType(0)
var PercentType B = new PercentType(b)
var HSBType Licht = new HSBType(H,S,B)
SchlafzimmerlightColor.sendCommand(Licht)
Thread::sleep(3000)
}
end

rule "Sonnenaufgang Schlafzimmer aus"
when
Item SchlafzimmerSunrise received command OFF
then
Schlafzimmerlightpower.sendCommand(OFF)
var DecimalType H = new DecimalType(355)
var PercentType S = new PercentType(0)
var PercentType B = new PercentType(0)
var HSBType Licht = new HSBType(H,S,B)
SchlafzimmerlightColor.sendCommand(Licht)
end

Wie kann ich das lösen?

Danke

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

Re: Exit aus While Schleife funkt nicht

Beitrag von udo1toni »

Es ist keine gute Idee, Thread::sleep() mit hohen Werten zu verwenden. Was Du willst, ist ein Timer:

Code: Alles auswählen

var Timer tSunrise = null
var Number nCount = 0
rule "Sonnenaufgang Schlafzimmer"
when
    Item SchlafzimmerSunrise received command
then
    if(receivedCommand == ON) {
        if(tSunrise !== null) return;
        nCount = 0
        tSunrise = createTimer(now, [|
            nCount += 1
            SchlafzimmerlightColor.sendCommand(new HSBType(355,0,nCount))
            if(nCount < 100)
                tSunrise.reschedule(now.plusSeconds(3))
            else
                tSunrise = null
        ])
    } else {
        tSunrise?.cancel
        tSunrise = null
        SchlafzimmerlightColor.sendCommand(new HSBType(355,0,0))
    }
end
Falls das empfangene Kommando ON lautet, prüft die Rule, ob bereits ein Timer läuft. Ist das nicht der Fall, wird der Counter initialisiert und ein Timer erzeugt, der unmittelbar ausgeführt wird.
Im Timer wird der Counter hochgezählt, die Farbe gesetzt, anschließend geprüft, ob der Counter schon bei 100 angekommen ist, falls nein, wird der Counter erneut geplant, falls ja, wird der Timer gelöscht.
Wenn der empfangene Befehl OFF lautet, wird der Timer sofort beendet, gelöscht und das Licht ausgeschaltet.

Der grundsätzliche Unterschied zu Deinem Code ist, dass diese Rule nur wenige Millisekunden läuft. auch jeder einzelne Timerdurchlauf braucht nur wenige Millisekunden. Deine Rule blockiert einen Thread, bis die Abbruchbedingung erreicht ist. Weiterhin kann Deine Rule beliebig oft gestartet werden, potenziell kommt sie sich dabei selbst in die Quere. Mein Ansatz kann zwar auch beliebig oft gestartet werden, wird sich aber nicht in die Quere kommen (Prüfung, ob der Timer schon existiert).
openHAB5.0.0 stable in einem Debian-Container (bookworm) (Proxmox 9.0.3, LXC)

Zacki
Beiträge: 43
Registriert: 26. Jan 2019 13:27
Answers: 0

Re: Exit aus While Schleife funkt nicht

Beitrag von Zacki »

ok, vielen Dank

Ich bekomme jedoch bei dieser Zeile eine Fehlermeldung:

var Timer tSunrise = null

2019-03-02 14:31:52.344 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'light.rules' has errors, therefore ignoring it: [102,1]: missing EOF at 'var'

Zacki
Beiträge: 43
Registriert: 26. Jan 2019 13:27
Answers: 0

Re: Exit aus While Schleife funkt nicht

Beitrag von Zacki »

ok ich hab jz eine neue Rules Datei erstellt.
Jz kommt zwar nicht mehr dieser Fehler, dafür...

2019-03-02 15:03:31.042 [ERROR] [org.quartz.core.JobRunShell ] - Job DEFAULT.2019-03-02T15:03:31.036+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

<XFeatureCallImplCustom> += <XNumberLiteralImpl>

<XFeatureCallImplCustom>.sendCommand(<XConstructorCallImplCustom>)

org.eclipse.xtext.xbase.impl.XIfExpressionImpl@1babe75

} ] threw an unhandled Exception:

java.lang.IllegalArgumentException: Cannot convert number literal to typeorg.eclipse.smarthome.core.library.types.DecimalType

at org.eclipse.xtext.xbase.typesystem.computation.NumberLiterals.numberValue(NumberLiterals.java:161) ~[?:?]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.$Proxy175.apply(Unknown Source) ~[?:?]

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

at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh240]

at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh240]

2019-03-02 15:03:31.109 [ERROR] [org.quartz.core.ErrorLogger ] - Job (DEFAULT.2019-03-02T15:03:31.036+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

<XFeatureCallImplCustom> += <XNumberLiteralImpl>

<XFeatureCallImplCustom>.sendCommand(<XConstructorCallImplCustom>)

org.eclipse.xtext.xbase.impl.XIfExpressionImpl@1babe75

} ] threw an exception.

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

at org.quartz.core.JobRunShell.run(JobRunShell.java:213) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh240]

at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh240]

Caused by: java.lang.IllegalArgumentException: Cannot convert number literal to typeorg.eclipse.smarthome.core.library.types.DecimalType

at org.eclipse.xtext.xbase.typesystem.computation.NumberLiterals.numberValue(NumberLiterals.java:161) ~[?:?]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.$Proxy175.apply(Unknown Source) ~[?:?]

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

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

... 1 more

Zacki
Beiträge: 43
Registriert: 26. Jan 2019 13:27
Answers: 0

Re: Exit aus While Schleife funkt nicht

Beitrag von Zacki »

Ich habs geschafft. Vielen Dank für die Hilfe.
Bin jz auch gleich dran, nicht nur einen Sonnenaufgang zu simulieren sondern auch ein Kerzenlicht.

Habe dieser über eine Zufallszahl die dann die Helligkeit verändert gelöst.
Allerdings habe ich den Syntax noch nicht ganz durchblickt.
(kerze = (Math::random * (32-24)).intValue + 18)
ist im Moment eher ein mit den Zahlen spielen, als wissen was ich mache.

Vielleicht kann mir ja jemand der Syntax erklären: Ich dachte immer ...(32-24)... steht für den Bereich aus dem die Zufallszahl ermittelt wird.
Also eine Zahl zwischen 24 und 32. Aber irgendwie war dem nicht ganz so und wofür steht das ...+18)?

Danke

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

Re: Exit aus While Schleife funkt nicht

Beitrag von udo1toni »

Math::random liefert meines Wissens eine zufällige Zahl zwischen 0 und 1.
Ergo, wenn Du eine Zahl zwischen 0 und 100 haben möchtest, wäre die Formel

Code: Alles auswählen

(Math::random *100).intValue
Wenn es zwischen 50 und 100 sein soll, entsprechend

Code: Alles auswählen

(Math::random * 50).intValue + 50
Allerdings ist schon Deine Idee eher... na ja...
Sagen wir mal so: openHAB ist dafür nicht geeignet. Überleg mal, wie oft pro Sekunde(!) die Helligkeit geändert werden müsste, um ein natürlich wirkendes Flackern zu erzeugen. openHAB ist leistungsfähig, aber nicht für diese Art Steuerung.
openHAB5.0.0 stable in einem Debian-Container (bookworm) (Proxmox 9.0.3, LXC)

Antworten