Rule Takes VERY long time to load

  • Platform information:
    • Hardware: CPUArchitecture/RAM/storage
      Raspberry Pi 3 (RPi3) Model B
    • OS: what OS is used and which version
      Rasbian 2.3

I have a rule that I really like, even though it isn’t critical, but it takes many times longer to load than all the other rules combined. Up to 5 or 10 minutes just for it alone to load. After it has loaded it works fine. I am pretty new to all this, but I was wondering if there was any way I could reduce the load time of this seemingly simple looking rule.

import java.util.concurrent.ThreadLocalRandom

var int MaxBrightness = 65
var int MinBrightness = 15

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;
    }
    sendCommand(Bedroom, OFF)
    sendCommand(Hallway, 0)
    sendCommand(Kitchen, OFF)
    sendCommand(Livingroom, 0)
    Thread::sleep(1000)
    sendCommand(DiscoBall_Switch, ON)
    Thread::sleep(2000)
    sendCommand(Livingroom_Sync, ON)
    Livingroom.postUpdate(100)
    while (Party.state == ON) {
        if (MaxBrightness > MinBrightness) {
            sendCommand(Light1_Color, ThreadLocalRandom::current().nextInt(360) + ",100," + (ThreadLocalRandom::current().nextInt(1 + MaxBrightness - MinBrightness) + MinBrightness))
            sendCommand(Light2_Color, ThreadLocalRandom::current().nextInt(360) + ",100," + (ThreadLocalRandom::current().nextInt(1 + MaxBrightness - MinBrightness) + MinBrightness))
            sendCommand(Light3_Color, ThreadLocalRandom::current().nextInt(360) + ",100," + (ThreadLocalRandom::current().nextInt(1 + MaxBrightness - MinBrightness) + MinBrightness))
            sendCommand(Light4_Color, ThreadLocalRandom::current().nextInt(360) + ",100," + (ThreadLocalRandom::current().nextInt(1 + MaxBrightness - MinBrightness) + MinBrightness))
            sendCommand(Light5_Color, ThreadLocalRandom::current().nextInt(360) + ",100," + (ThreadLocalRandom::current().nextInt(1 + MaxBrightness - MinBrightness) + MinBrightness))
            sendCommand(Hallway, ThreadLocalRandom::current().nextInt(360) + ",100," + (ThreadLocalRandom::current().nextInt(1 + MaxBrightness - MinBrightness) + MinBrightness))
        } else {
            sendCommand(Light1_Color, ThreadLocalRandom::current().nextInt(360) + ",100," + MaxBrightness)
            sendCommand(Light2_Color, ThreadLocalRandom::current().nextInt(360) + ",100," + MaxBrightness)
            sendCommand(Light3_Color, ThreadLocalRandom::current().nextInt(360) + ",100," + MaxBrightness)
            sendCommand(Light4_Color, ThreadLocalRandom::current().nextInt(360) + ",100," + MaxBrightness)
            sendCommand(Light5_Color, ThreadLocalRandom::current().nextInt(360) + ",100," + MaxBrightness)
            sendCommand(Hallway, ThreadLocalRandom::current().nextInt(360) + ",100," + MaxBrightness)
        }
        Thread::sleep(900)
    }
    sendCommand(Livingroom, 0)
    sendCommand(Hallway, 0)
    sendCommand(DiscoBall_Switch, OFF)
    Thread::sleep(1000)
    sendCommand(Livingroom_Temperature, new PercentType(84))
    sendCommand(Livingroom, new PercentType(100))
end

I’ve previously seen talk that parsing/compiling rules with primitive variable types is expensive, so the var int are suspect - also nextInt part sticks out to me. Cannot remember details, @rikoshak may shed more light.

The avoidance is to use Numbers and .intValue where possible.

I am pretty sure it is the nextInt, but I have no idea of a better way to do the same thing without using that. It is the only example I have seen so far that does what I want it to do.

I suggest using a Lambda. In this case it should be pretty straight forward and should reduce the compilation time as there will be only 1 call of the nextInt() function in the script.
The problem is that I still haven’t fully understood these.

Give me a tick and I may come up with something

Ok, thank you very much.

Please open a GitHub issue to openhab-core.
As @vzorglub mentioned we have seen this kind of problem on a number of occasions but so far could not really get hold of it. Now if you have a reproducible, simple to boil down rule to show that problem, please provide it as part of the issue so some developer can take this as an example to reproduce and apply his profiling tools.

1 Like

Try this, but I can’t promise anything…

import java.util.concurrent.ThreadLocalRandom

var Number MaxBrightness = 65
var Number MinBrightness = 15

val Functions$Function1<String, int> generateRandomInt = [ i |
    val Number random = ThreadLocalRandom::current(i)
    new String(random.toString)
]

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;
    }
    sendCommand(Bedroom, OFF)
    sendCommand(Hallway, 0)
    sendCommand(Kitchen, OFF)
    sendCommand(Livingroom, 0)
    Thread::sleep(1000)
    sendCommand(DiscoBall_Switch, ON)
    Thread::sleep(2000)
    sendCommand(Livingroom_Sync, ON)
    Livingroom.postUpdate(100)
    while (Party.state == ON) {
        if (MaxBrightness > MinBrightness) {
            sendCommand(Light1_Color, generateRandomInt.apply(361) + ",100," + (generateRandomInt.apply(1 + MaxBrightness - MinBrightness) + MinBrightness))
            sendCommand(Light2_Color, generateRandomInt.apply(361) + ",100," + (generateRandomInt.apply(1 + MaxBrightness - MinBrightness) + MinBrightness))
            sendCommand(Light3_Color, generateRandomInt.apply(361) + ",100," + (generateRandomInt.apply(1 + MaxBrightness - MinBrightness) + MinBrightness))
            sendCommand(Light4_Color, generateRandomInt.apply(361) + ",100," + (generateRandomInt.apply(1 + MaxBrightness - MinBrightness) + MinBrightness))
            sendCommand(Light5_Color, generateRandomInt.apply(361) + ",100," + (generateRandomInt.apply(1 + MaxBrightness - MinBrightness) + MinBrightness))
            sendCommand(Hallway, generateRandomInt.apply(361) + ",100," + (generateRandomInt.apply(1 + MaxBrightness - MinBrightness) + MinBrightness))
        } else {
            sendCommand(Light1_Color, generateRandomInt.apply(361) + ",100," + MaxBrightness)
            sendCommand(Light2_Color, generateRandomInt.apply(361) + ",100," + MaxBrightness)
            sendCommand(Light3_Color, generateRandomInt.apply(361) + ",100," + MaxBrightness)
            sendCommand(Light4_Color, generateRandomInt.apply(361) + ",100," + MaxBrightness)
            sendCommand(Light5_Color, generateRandomInt.apply(361) + ",100," + MaxBrightness)
            sendCommand(Hallway, generateRandomInt.apply(361) + ",100," + MaxBrightness)
        }
        Thread::sleep(900)
    }
    sendCommand(Livingroom, 0)
    sendCommand(Hallway, 0)
    sendCommand(DiscoBall_Switch, OFF)
    Thread::sleep(1000)
    sendCommand(Livingroom_Temperature, new PercentType(84))
    sendCommand(Livingroom, new PercentType(100))
end

Once you manage to address the loading time (I have high hopes for Vincent’s approach) and you open an issue as Markus suggests I recommend getting rid of all these thread sleeps and use timers. The Rule would look something like:

import java.util.concurrent.ThreadLocalRandom

val Number MaxBrightness = 65 // these are constants so make them vals
val Number MinBrightness = 15

var Timer partyLoop = null

// This is a slightly cleaner way to define the lambda
val generateRandomInt = [ Number  i |
    val Number random = ThreadLocalRandom::current().nextInt(i) // current doesn't return a Number so we must call nextInt
    ""+random // returns a String version of the generated number
]

rule "party - Party"
when
    Item Party changed to ON or
    System started
then
    // great use of triggeringItem, but do you need to run the stuff at the end of the Rule too or does this 
    // happen elsewhere?
    if (triggeringItem === null) {
        Party.postUpdate(OFF)
        logInfo("info", "Loaded model 'party.rules'")
        return;
    }

    Bedroom.sendCommand(OFF)
    Hallway.sendCommand(OFF) // You can send ON/OFF to a Dimmer
    Kitchen.sendCommand(OFF)
    Livingroom.sendCommand(OFF)

    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)

        // Use a looping timer instead of a while loop
        partyTimer = createTimer(now, [ |
            // Put the party lights into a group
            PartyLights.members.forEach[ light | 
                val brightness = if(MaxBrightness > MinBrightness) generateRandomInt.apply(1 + MaxBrightness - MinBrightness) + MinBrightness else MaxBrightness
                val color = generateRandomInt.apply(361)
                val saturation = "100"
                light.sendCommand(color+","+saturation+","+brightness)
            ]
            if(Party.state == ON) partyTimer.reschedule(now.plusMillis(900))
        ])
    ])
end

rule "Party time's over"
when
    Item Party changed to OFF // if you don't want this to run at System started, change to received command OFF
then
    Livingroom.sendCommand(OFF) // you can send ON/OFF to Dimmers
    Hallway.sendCommand(OFF)
    DiscoBall_Switch.sendCommand(OFF)
    createTimer(now.plusSeconds(1), [ |
        Livingroom_Temperature.sendCommand(84) // You don't need to create a new PercentType
        Livingroom.sendCommand(100)
    ]
end

Notice the use of the method on the Item instead of the Action. See https://www.openhab.org/docs/configuration/rules-dsl.html#myitem-sendcommand-new-state-versus-sendcommand-myitem-new-state

The above minimizes the lines of code a bit and minimizes how often nextInt appears. I’d be very interested to see whether Vincent’s version or this version does anything to improve the Rule parsing noticeably.

You define the function as a Number and then return a String. How does that work?

I defined the type of the first argument as Number. I don’t explicitly define the function at all. I let the Rules DSL do that for me.

Since the result of the last line of the lambda isn’t void, it knows that I must be creating a Functions.

Because I only have one argument it knows I must be creating a Functions$Function1.

Because the last line of the lambda is a String and the first argument is a Number it knows I must be creating a Functions$Function1<Number, String>.

Because the Rules DSL is able to figure all that out based on the context provided, I don’t have to tell it all of the explicitly.

Despite being dumb and incorrect so much of the time in other areas, the Rules DSL is really good in this case at figuring out what you mean when you create the lambda without requiring you to explicitly state it.

1 Like

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.