Rule Takes VERY long time to load

Was there anything intrinsically wrong with my syntax?
I haven’t done this much and inferred from other posts.

Not at all. It was syntactically correct and defined the same thing. It is just a little cleaner to avoid typing code that you don’t need to type.

I also have an unsubstantiated theory that would make defining lambdas like this better for solving the slow Rules parsing problem. When you explicitly define the types of everything and use a lot of primitives and such you are giving the Rules parser a lot more work to do when it loads the .rules files because it has to go through all this extra checking and evaluation to make sure everything is correct based on type. However, when you don’t define the types this allows the Rules engine to defer this checking until run time. Obviously this makes the rules parsing faster because it has less to do. But it also works fast at run time too because the engine has a lot more information it can use and consequently has less that needs to be checked to make sure the types are correct.

Put another way, at parse/compile time the parser has to test for every possible combination of types that might possibly pass through those lines of code and use those variables. But at run time, it only has to perform one test because it knows the types of everything already for this run through the code.

So, if my theory is correct, it means that my syntax should parse a little faster than explicitly using Functions@Function1.

I should note that one reason why almost all the examples you find on the forum use the Functions$Function1 syntax is because until 2.3 I think my recommended syntax didn’t work. There was a bug in the library or something that got fixed along with all the other improvements that were made in the 2.3 release.

I’ve gone back and tried to adjust to the cleaner syntax in my DPs and other tutorials but haven’t gotten to all of them yet.

These days actually I tend to recommend against the use of global lambas in almost all cases anyway. This posting is one of the few places where it makes sense. The problem with global lambdas are:

  • they are not thread safe, if two Rules call the same lambda at the same time, the local variables will get overridden as the two threads run through the lambda in parallel
  • certain errors, particularly type errors, cause the lambda to terminate without chance to catch exceptions or execute a finally block; do not use locks in lambdas for this reason
  • much of the time, they are unnecessary when one applies the DPs to create generic code

They still have their uses. In this case, assuming the calls to intValue is the source of the slowdown, limiting the lines that make that call to one could make a pretty big difference. Without that concern though, I would not use the lambda and just make the call twice within the Rule and eliminate the need for the lambda.

That’s probably far more than anyone wants to know what goes on inside my mind. This is all just supposition based on observation. I’ve not looked at the code. I could be completely wrong.

This loads pretty quickly, but it is throwing an error when the rule is ran:

import java.util.concurrent.ThreadLocalRandom

val Number MaxBrightness = 65
val Number MinBrightness = 15

var Timer partyTimer = null

val generateRandomInt = [ Number  i |
    val Number random = ThreadLocalRandom::current().nextInt(i)
    ""+random
]

rule "party - Party"
when
    Item Party changed to ON or
    System started
then
    if (triggeringItem === null) {
        Party.postUpdate(OFF)
        logInfo("info", "Loaded model 'party.rules'")
        return;
    }

    Bedroom.sendCommand(OFF)
    Hallway.sendCommand(OFF)
    Kitchen.sendCommand(OFF)
    Livingroom.sendCommand(0)

    var sleep = 1000
    createTimer(now.plusMillis(sleep), [ | DiscoBall_Switch.sendCommand(ON) ])

    sleep = sleep + 2000
    createTimer(now.plusMillis(sleep), [ |
        Livingroom_Sync.sendCommand(ON)
        Livingroom.postUpdate(100)

        partyTimer = createTimer(now, [ |
            PartyLights.members.forEach[ light |
                val color = generateRandomInt.apply(360)
                val brightness = if (MaxBrightness > MinBrightness) generateRandomInt.apply(1 + MaxBrightness - MinBrightness) + MinBrightness else MaxBrightness
                light.sendCommand(color + ",100," + brightness)
            ]
            if (Party.state == ON) {
                partyTimer.reschedule(now.plusMillis(900))
            } else {
                Livingroom.sendCommand(0)
                Hallway.sendCommand(OFF)
                DiscoBall_Switch.sendCommand(OFF)
                createTimer(now.plusSeconds(1), [ |
                    Livingroom_Temperature.sendCommand(84)
                    Livingroom.sendCommand(100)
                ])
            }
        ])
    ])
end
2018-11-16 18:19:01.627 [ERROR] [org.quartz.core.JobRunShell         ] - Job DEFAULT.2018-11-16T18:19:01.580-05:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

  <XMemberFeatureCallImplCustom>.forEach(<XClosureImplCustom>)

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@12f1a5e

} ] threw an unhandled Exception: 

java.lang.IllegalStateException: Could not invoke method: java.util.concurrent.ThreadLocalRandom.nextInt(int) on instance: java.util.concurrent.ThreadLocalRandom@d98ce9

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1102) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1060) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:143) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:763) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:219) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:826) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:263) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:189) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1078) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1060) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:143) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:763) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:219) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluateArgumentExpressions(XbaseInterpreter.java:1115) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1045) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:143) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:901) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:225) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:459) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:243) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:826) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:263) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:189) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at com.sun.proxy.$Proxy170.accept(Unknown Source) [?:?]

	at java.lang.Iterable.forEach(Iterable.java:75) [?:?]

	at java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) [?:?]

	at sun.reflect.GeneratedMethodAccessor185.invoke(Unknown Source) ~[?:?]

	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]

	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1085) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1060) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:143) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:763) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:219) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:189) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

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

	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:49) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

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

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

Caused by: java.lang.IllegalArgumentException: argument type mismatch

	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]

	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]

	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]

	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]

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

	... 77 more

It doesn’t like the call to the lambda in the if in the foreach statement
change this line:

                val brightness = if (MaxBrightness > MinBrightness) generateRandomInt.apply(1 + MaxBrightness - MinBrightness) + MinBrightness else MaxBrightness

With:

             if (MaxBrightness > MinBrightness) {
                 brightness = generateRandomInt.apply(1 + MaxBrightness - MinBrightness) + MinBrightness
             } else {
                 brightness = MaxBrightness
             }

Still errors when running the rule.

import java.util.concurrent.ThreadLocalRandom

val Number MaxBrightness = 65
val Number MinBrightness = 15

var Timer partyTimer = null

val generateRandomInt = [ Number  i |
    val Number random = ThreadLocalRandom::current().nextInt(i)
    ""+random
]

rule "party - Party"
when
    Item Party changed to ON or
    System started
then
    if (triggeringItem === null) {
        Party.postUpdate(OFF)
        logInfo("info", "Loaded model 'party.rules'")
        return;
    }

    Bedroom.sendCommand(OFF)
    Hallway.sendCommand(OFF)
    Kitchen.sendCommand(OFF)
    Livingroom.sendCommand(0)

    var sleep = 1000
    createTimer(now.plusMillis(sleep), [ | DiscoBall_Switch.sendCommand(ON) ])

    sleep = sleep + 2000
    createTimer(now.plusMillis(sleep), [ |
        Livingroom_Sync.sendCommand(ON)
        Livingroom.postUpdate(100)

        partyTimer = createTimer(now, [ |
            PartyLights.members.forEach[ light |
                var brightness = MaxBrightness
                if (MaxBrightness > MinBrightness) {
                    brightness = generateRandomInt.apply(1 + MaxBrightness - MinBrightness) + MinBrightness
                }
                light.sendCommand(generateRandomInt.apply(360) + ",100," + brightness)
            ]
            if (Party.state == ON) {
                partyTimer.reschedule(now.plusMillis(900))
            } else {
                Livingroom.sendCommand(0)
                Hallway.sendCommand(OFF)
                DiscoBall_Switch.sendCommand(OFF)
                createTimer(now.plusSeconds(1), [ |
                    Livingroom_Temperature.sendCommand(84)
                    Livingroom.sendCommand(100)
                    partyTimer.cancel
                    partyTimer = null
                ])
            }
        ])
    ])
end

2018-11-16 18:49:03.981 [ERROR] [org.quartz.core.JobRunShell         ] - Job DEFAULT.2018-11-16T18:49:03.951-05:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

  <XMemberFeatureCallImplCustom>.forEach(<XClosureImplCustom>)

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@edd4f4

} ] threw an unhandled Exception: 

java.lang.IllegalStateException: Could not invoke method: java.util.concurrent.ThreadLocalRandom.nextInt(int) on instance: java.util.concurrent.ThreadLocalRandom@d98ce9

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1102) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1060) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:143) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:763) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:219) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:826) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:263) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:189) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1078) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1060) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:143) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:763) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:219) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluateArgumentExpressions(XbaseInterpreter.java:1115) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1045) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:143) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:901) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:225) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:1211) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:215) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:459) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:243) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:189) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at com.sun.proxy.$Proxy170.accept(Unknown Source) [?:?]

	at java.lang.Iterable.forEach(Iterable.java:75) [?:?]

	at java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) [?:?]

	at sun.reflect.GeneratedMethodAccessor185.invoke(Unknown Source) ~[?:?]

	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]

	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1085) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1060) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:143) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:763) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:219) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:189) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

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

	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:49) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

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

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

Caused by: java.lang.IllegalArgumentException: argument type mismatch

	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]

	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]

	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]

	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]

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

	... 81 more

Add a logInfo
I am wondering if the problem is that the lamdbas are not thread safe.

            PartyLights.members.forEach[ light |
                var brightness = MaxBrightness
                if (MaxBrightness > MinBrightness) {
                    brightness = generateRandomInt.apply(1 + MaxBrightness - MinBrightness) + MinBrightness
                }
                light.sendCommand(generateRandomInt.apply(361) + ",100," + brightness)
                logInfo(light.name.toString, brightness.toString)
            ]

This seems to work wonderfully and takes almost no time at all to load. I am not sure why, but when I removed the MaxBrightness and MinBrightness variables, it seemed to start working.

import java.util.concurrent.ThreadLocalRandom

rule "party - Party"
when
    Item Party changed to ON or
    System started
then
    if (triggeringItem === null) {
        Party.postUpdate(OFF)
        logInfo("info", "Loaded model 'party.rules'")
        return;
    }
    Bedroom.sendCommand(OFF)
    Hallway.sendCommand(OFF)
    Kitchen.sendCommand(OFF)
    Livingroom.sendCommand(0)
    createTimer(now.plusSeconds(1), [ | DiscoBall_Switch.sendCommand(ON) ])
    createTimer(now.plusSeconds(3), [ |
        Livingroom_Sync.sendCommand(ON)
        Livingroom.postUpdate(100)
        while (Party.state == ON) {
            PartyLights.members.forEach[ light |
                light.sendCommand(ThreadLocalRandom::current().nextInt(360) + ",100," + (ThreadLocalRandom::current().nextInt(1 + 65 - 15) + 15))
            ]
            Thread::sleep(900)
        }
        Livingroom.sendCommand(0)
        Hallway.sendCommand(OFF)
        DiscoBall_Switch.sendCommand(OFF)
        Thread::sleep(1000)
        Livingroom_Temperature.sendCommand(84)
        Livingroom.sendCommand(100)
    ])
end

I tested this just to see if it would work, and it fails:

import java.util.concurrent.ThreadLocalRandom

val generateRandomInt = [ Number  i |
    val Number random = ThreadLocalRandom::current().nextInt(i)
    ""+random
]

rule "party - Party"
when
    Item Party changed to ON or
    System started
then
    if (triggeringItem === null) {
        Party.postUpdate(OFF)
        logInfo("info", "Loaded model 'party.rules'")
        return;
    }
    Bedroom.sendCommand(OFF)
    Hallway.sendCommand(OFF)
    Kitchen.sendCommand(OFF)
    Livingroom.sendCommand(0)
    createTimer(now.plusSeconds(1), [ | DiscoBall_Switch.sendCommand(ON) ])
    createTimer(now.plusSeconds(3), [ |
        Livingroom_Sync.sendCommand(ON)
        Livingroom.postUpdate(100)
        while (Party.state == ON) {
            PartyLights.members.forEach[ light |
                //light.sendCommand(ThreadLocalRandom::current().nextInt(360) + ",100," + (ThreadLocalRandom::current().nextInt(1 + 65 - 15) + 15))
                light.sendCommand(generateRandomInt.apply(360) + ",100," + (generateRandomInt.apply(1 + 65 - 15) + 15))
            ]
            Thread::sleep(900)
        }
        Livingroom.sendCommand(0)
        Hallway.sendCommand(OFF)
        DiscoBall_Switch.sendCommand(OFF)
        Thread::sleep(1000)
        Livingroom_Temperature.sendCommand(84)
        Livingroom.sendCommand(100)
    ])
end
2018-11-16 19:32:18.878 [INFO ] [.eclipse.smarthome.model.script.info] - Loaded model 'party.rules'

2018-11-16 19:32:27.099 [ERROR] [org.quartz.core.JobRunShell         ] - Job DEFAULT.2018-11-16T19:32:27.078-05:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

  <XMemberFeatureCallImplCustom>.forEach(<XClosureImplCustom>)

  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@e4af0a

} ] threw an unhandled Exception: 

java.lang.IllegalArgumentException: Value must be between 0 and 100

	at org.eclipse.smarthome.core.library.types.PercentType.validateValue(PercentType.java:55) [103:org.eclipse.smarthome.core:0.10.0.oh230]

	at org.eclipse.smarthome.core.library.types.PercentType.<init>(PercentType.java:50) [103:org.eclipse.smarthome.core:0.10.0.oh230]

	at org.eclipse.smarthome.core.library.types.HSBType.getBrightness(HSBType.java:183) [103:org.eclipse.smarthome.core:0.10.0.oh230]

	at org.eclipse.smarthome.core.library.types.HSBType.toFullString(HSBType.java:218) [103:org.eclipse.smarthome.core:0.10.0.oh230]

	at org.eclipse.smarthome.core.library.types.HSBType.toString(HSBType.java:213) [103:org.eclipse.smarthome.core:0.10.0.oh230]

	at org.eclipse.smarthome.core.items.events.ItemEventFactory.createCommandEvent(ItemEventFactory.java:213) [103:org.eclipse.smarthome.core:0.10.0.oh230]

	at org.eclipse.smarthome.core.items.events.ItemEventFactory.createCommandEvent(ItemEventFactory.java:227) [103:org.eclipse.smarthome.core:0.10.0.oh230]

	at org.eclipse.smarthome.model.script.actions.BusEvent.sendCommand(BusEvent.java:87) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.smarthome.model.script.actions.BusEvent.sendCommand(BusEvent.java:53) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at sun.reflect.GeneratedMethodAccessor168.invoke(Unknown Source) ~[?:?]

	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]

	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1085) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1060) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:143) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:763) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:219) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:189) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at com.sun.proxy.$Proxy170.accept(Unknown Source) [?:?]

	at java.lang.Iterable.forEach(Iterable.java:75) [?:?]

	at java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) [?:?]

	at sun.reflect.GeneratedMethodAccessor185.invoke(Unknown Source) ~[?:?]

	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]

	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:?]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1085) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1060) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:991) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:143) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:763) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:219) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:446) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:227) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:219) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:203) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:189) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) [158:org.eclipse.xtext.xbase:2.12.0.v20170519-0752]

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

	at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:49) [139:org.eclipse.smarthome.model.script:0.10.0.oh230]

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

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

So your removed the function and used the nextInt() directly inside the forEach
Makes sense. The function was a one liner anyway.

Did you try:

            PartyLights.members.forEach[ light |
                light.sendCommand(ThreadLocalRandom::current().nextInt(361) + ",100," + (ThreadLocalRandom::current().nextInt(1 + MaxBrightness - MinBrightness) + MinBrightness))
            ]

Yes I did, and that was giving this error:

2018-11-16 19:07:02.612 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'party - Party': Could not invoke method: java.util.concurrent.ThreadLocalRandom.nextInt(int) on instance: java.util.concurrent.ThreadLocalRandom@d98ce9

But when I removed those variables it started working just fine.

Try that. Could be that the nextInt() function only accept integers

            PartyLights.members.forEach[ light |
                light.sendCommand(ThreadLocalRandom::current().nextInt(361) + ",100," + (ThreadLocalRandom::current().nextInt(1 + MaxBrightness.intValue - MinBrightness.intValue) + MinBrightness.intValue))
            ]

It runs, but takes a minute or two to load, while the other way takes less than 10 seconds to load.

This is what I have decided to use for now, since it loads very fast and works perfectly:

rule "Party"
when
    Item Party changed to ON or
    System started
then
    if (triggeringItem === null) {
        Party.postUpdate(OFF)
        logInfo("info", "Loaded model 'party.rules'")
        return;
    }
    Bedroom.sendCommand(OFF)
    Hallway.sendCommand(OFF)
    Kitchen.sendCommand(OFF)
    Livingroom.sendCommand(0)
    createTimer(now.plusSeconds(1), [ | DiscoBall_Switch.sendCommand(ON) ])
    createTimer(now.plusSeconds(3), [ |
        Livingroom_Sync.sendCommand(ON)
        Livingroom.postUpdate(100)
        val Rand = new java.util.Random
        while (Party.state == ON) {
            PartyLights.members.forEach[ light |
                light.sendCommand(Rand.nextInt(360) + ",100," + (Rand.nextInt(1 + 65 - 15) + 15))
            ]
            Thread::sleep(900)
        }
        Livingroom.sendCommand(0)
        Hallway.sendCommand(OFF)
        DiscoBall_Switch.sendCommand(OFF)
        Thread::sleep(1000)
        Livingroom_Temperature.sendCommand(84)
        Livingroom.sendCommand(100)
    ])
end

I am starting to think that it could have been the use of int that was causing the load times all along. :confused:

I have seen strong evidence that the use of primitives is a major cause of slow loading times, particularly on Rpis. I was glad to see that was the first suggestion on the thread.

This also adds good evidence to that being the culprit.

It would really be helpful if you filled an issue on the ESH repo referring to this thread. I think this thread is the suggest evidence so far that primitives are the problem.

1 Like

@BigRedBrent

Check out this syntax for generating random number by: @Jo_C
In: Looking for Software utilities. like chrono, timer,

+1

@BigRedBrent please file it and let us know the number please once you did, we’re collecting important issues to track them.

I can probably guess what you mean by the ESH repo, but I don’t want to make a mistake. Since you obviously know what and where it exactly is, please give me the link to the issues section where I may open up an issue.

To be honest, I never would have found that link. But thanks to you I can now assume that this is the correct link:

While I fear this one is not the only one lurking it’s at least a starting point that can be used for further analysis.
I opened slow parser on number type casting · Issue #451 · openhab/openhab-core · GitHub and hope some knowledgeable core developer is willing to take on it.

1 Like