Das Beispiel ist etwas mager

weil ausgerechnet der Teil fehlt, der in der Rule aktiv arbeitet (also die sendCommands...)
Aber nehmen wir mal ein Beispiel einer statischen Szenensteuerung:
Code: Alles auswählen
rule "Szenen Schaltung"
when
Item Szene changed
then
if(!(newState instanceof Number) {
logWarn("scene","Szenensteuerung: {} ist keine gültige Szene! ABBRUCH!",newState)
return;
}
logInfo("scene","Szenensteuerung: es wurde Szene {} gewählt.",newState)
// aktueller Wert als Default
var swLicht1 = myLicht1.state // myLicht11-4 sind Switch Items
var swLicht2 = myLicht2.state
var swLicht3 = myLicht3.state
var swLicht4 = myLicht4.state
var dimLicht5 = myLicht5.state // myLicht 5-8 sind Dimmer Items
var dimLicht6 = myLicht6.state
var dimLicht7 = myLicht7.state
var dimLicht8 = myLicht8.state
switch((newState as Number).intValue) {
case 0 : { swLicht1 = OFF swLicht2 = OFF swLicht3 = OFF swLicht4 = OFF dimLicht5 = 0 dimLicht6 = 0 dimLicht7 = 0 dimLicht8 = 0 }
case 1 : { swLicht1 = ON swLicht2 = ON swLicht3 = OFF swLicht4 = OFF dimLicht5 = 30 dimLicht6 = 50 dimLicht7 = 70 dimLicht8 = 90 }
case 2 : { swLicht1 = OFF swLicht2 = ON swLicht3 = ON swLicht4 = OFF dimLicht5 = 15 dimLicht6 = 37 dimLicht7 = 42 dimLicht8 = 55 }
case 3 : { swLicht1 = OFF swLicht2 = OFF swLicht3 = ON swLicht4 = ON dimLicht5 = 11 dimLicht6 = 55 dimLicht7 = 12 dimLicht8 = 19 }
case 5 : { swLicht1 = OFF swLicht2 = ON dimLicht6 = 17 dimLicht8 = 47 }
}
if(myLicht1.state != swLicht1)
myLicht1.sendCommand(swLicht1.toString)
if(myLicht2.state != swLicht2)
myLicht2.sendCommand(swLicht2.toString)
if(myLicht3.state != swLicht3)
myLicht3.sendCommand(swLicht3.toString)
if(myLicht4.state != swLicht4)
myLicht4.sendCommand(swLicht4.toString)
if(myLicht5.state != dimLicht5)
myLicht5.sendCommand(dimLicht5)
if(myLicht6.state != dimLicht6)
myLicht6.sendCommand(dimLicht6)
if(myLicht7.state != dimLicht7)
myLicht7.sendCommand(dimLicht7)
if(myLicht8.state != dimLicht8)
myLicht8.sendCommand(dimLicht8)
end
Der Knackpunkt ist: zunächst werden die Sollwerte in Variablen festgelegt. Anschließend wird für jedes Item geprüft, ob der aktuelle Status mit dem Sollwert übereinstimmt. Nur bei einer Abweichung wird auch ein Befehl gesendet.
Damit auch Szenen "addierend" verwendet werden können (also die Szenennummer 5 steuert nur vier statt acht Items, die übrigen sollen einfach den aktuellen Status behalten), wird zu Beginn der aktuelle Status in die lokalen Variablen geladen.
Da es sich bei swLicht1 - 4 um OnOffType handelt, wird openHAB rummosern, weil es keinen Status als Befehl verwenden möchte (als ob das bei Zahlen anders wäre...) Deshalb der Kunstgriff mit dem .toString

Und ja, es gibt keine Szene 4. Szenen müssen nicht zwangsläufig durchgehend nummeriert sein
Natürlich ist das oben hässlicher Spaghetticode, geht hübscher mit Gruppen und HashMaps.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet