Rule for Rollershutters - with proxy items and reed-contacts

You would have to do this anyway if you use a proxy item. No matter your approach, you have to have code somewhere that determines whether the rollershutters need to be down or not.

However, if you use Design Pattern: Separation of Behaviors (Design Pattern: Simple State Machine (e.g. Time Of Day) is a specific implementation of this) you can, and should centralize the calculation of whether or not the shutters should be down and set a flag Item. Then in the original rule and in the second rule you just need to check the flag.

So it becomes:

rule "Calculate the desired shutter state"
when
    // whatever events indicate that the rollershutters should change state
    System started
then
    // Calculate whether the rollershutters should be open or not

    DesiredRollerShutterState.sendCommand(newState)
end

rule "Control rollershutters"
when
    Item DesiredRollerShutterState changes
then
    gRollershutters.members.forEach[ rs |
        val sensor = gRollershutterContacts.members.findFirst[ s | s.name = rs.name+"_Sensor" ]
        if(sensor == null || sensor.state == CLOSED) rs.sendCommand(DesiredRollerShutterState.state)
    ]
end

rule "Close rollershutters when doors close if necessary"
when
    Member of gRollershutterContacts changes to CLOSED
then
    if(DesiredRollerShutterState.state != triggeringItem.state) 
        sendCommand(triggeringItem.name.replace("_Contact",""), DOWN)
end