case ist keine Funktion
Es geht hier um bedingte Verzweigungen. Nehmen wir an, Du hast ein Item, dessen Status Du nutzen willst, um unterschiedliche Dinge zu tun. Bei einem Item mit zwei möglichen Zuständen (z.B. Switch) ist das einfach, entweder der eine Zustand trifft zu oder der andere, also
Code: Alles auswählen
if(Item.state == OFF)
// mach was
else
//mach was anderes
Aber vielleicht hat das Item mehr als zwei Zustände, z.B. ein Item, welches per Selection Widget vier Zustände annehmen kann, der Einfachheit halber 1, 2, 3 oder 4.
Möglichkeit eins:
Code: Alles auswählen
if(Item.state == 1) // mach was
else if(Item.state == 2) // mach was anderes
else if(Item.state == 3) // mach noch was anderes
else // mach noch was völlig anderes
Für den vierten Fall ist es schon etwas kritisch, einfach davon auszugehen, dass es nur die definierten vier Zustände gibt.
Aber auch sonst ist das Konstrukt eher unbefriedigend, weil immer und immer wieder der Vergleich auf der einen Seite identisch angegeben wird, der einzige Unterschied ist der konkrete Wert.
Da kommt die bedingte Verzweigung mit switch() ins Spiel:
Code: Alles auswählen
switch(Item.state.toString) {
case "1" : // mach was
case "2" : // mach was anderes
case "3" : // mach noch was anderes
case "4" : // mach noch was völlig anderes
default : // beschwere dich über einen nicht zulässigen Wert
}
Wie immer wird jeweils nur ein Befehl ausgeführt, sollen es mehrere Befehle sein, so müssen diese als Block mit {} markiert werden.
Deshalb müssen auch die einzelnen case Schlüsselworte gemeinsam in einem Block stehen
default kümmert sich um alle Fälle, die nicht vorher abgehandelt wurden, weshalb es auch am Schluss stehen muss. Das funktioniert natürlich genauso auch mit if() und else, aber man spart sich etwas Tipparbeit (und intern funktioniert es natürlich etwas anders weil der Vergleichswert eben nicht immer wieder in das passende Register geladen werden muss, sondern einfach vom Stack geholt wird, das geht also aus Computersicht viel schneller. Der Anwender wird den Geschwindigkeitsvorteil aber nicht bemerken
Wichtig: Wenn Du switch() mit einem numerischen Status einsetzt, musst Du Dich entscheiden. Entweder Du prüft, ob es sich tatsächlich um eine Zahl handelt und gibst dann das
as Number mit an, dann kannst Du auch die Zahl direkt vergleichen (wobei man leider nicht unmittelbar < oder > verwenden kann), oder Du sorgst mit .toString dafür, dass der Status ein String wird (.toString steht immer zur Verfügung, es gibt dann also auch keinen Fehler), dann musst Du natürlich beim Vergleich auch Strings angeben. 1 -> eine Zahl. "1" -> ein String. Man könnte auch (1).toString schreiben
aber da sind die Anführungszeichen dann vielleicht doch etwas einfacher...
switch() verhält sich in der DSL etwas anders als in Java gewohnt, man muss am Ende eines Blocks kein break; mit angeben (und darf das auch nicht). Würde man das in Java weg lassen, so würde
ab dem zutreffenden Vergleich alles ausgeführt. Hier wird also einfach nur der Block ausgeführt, welcher zutrifft, anschließend wird der Code hinter der } vom switch(){ ausgeführt.
Der < oder > Vergleich geht übrigens auch mit case, nur ist es fragwürdig, ob das so sinnvoll ist:
Code: Alles auswählen
switch(Item.state.toString) {
case !(Item.state instanceof Number) : // beschwere Dich über ein falsches Format
case (Item.state as Number) < 2 : // beschwere Dich über zu wenig
case "3" : // mach was
case Alarm.state != ON : // was soll das denn?
case (Item.state as Number) >= 4 : // beschwere Dic hüber zu viel
}
Man kann also auch konkrete Boolean Ausdrücke angeben, die noch nicht mal einen Bezug auf den ursprünglichen Parameter haben müssen. Aber dann kann man das Ganze auch genauso gut über if() zusammenbauen...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet