Die Action callScript() kann nur DSL Scripte starten, und diese dürfen nicht über die UI erzeugt werden, stattdessen müssen sie im Verzteichnis $OPENHAB_CONF/scripts/ abgespeichert werden, mit der Endung .script (die nicht mit angegeben werden darf)
Kannst Du hier nachlesen:
https://www.openhab.org/docs/configurat ... em-actions
Warum überhaupt indirekt über ein Script?
Code: Alles auswählen
// Globale Variablen in der rules Datei vor der ersten Rule definieren!
var Timer tColorchange = null // Timer für Farbwechsel
rule "farbtest"
when
Item partymode changed // Partymodus aktiviert oder deaktiviert
then
tColorchange?.cancel // entferne laufende Timer
if(newState != ON) // Falls nicht ON
return; // Rule beenden
tColorchange = createTimer(now.plus(500, java.time.temporal.ChronoUnit.MILLIS), [| // erzeuge Timer in einer halben Sekunde
val oldHSB = mauerfarbe.state as HSBType // hole aktuellen Status als HSB
val hue = new DecimalType((oldHSB.hue + 1).intValue % 360) // wähle nächste Stufe
val sat = oldHSB.saturation // wähle eingestellte Sättigung
val bri = oldHSB.brightness // wähle aktuelle Helligkeit
val newHSB = new HSBType(hue, sat, bri) // erzeuge neuen HSB-Wert
mauerfarbe.sendCommand(newHSB.toString) // Schreibe Wert in Item
tColorchange.reschedule(now.plus(500, java.time.temporal.ChronoUnit.MILLIS)) // plane den nächsten Timeraufruf
])
end
Erst mal ist es sinnvoller, einen Timer zu verwenden. Damit wird die Rule nur dann ausgeführt, wenn der Schalter umgeschaltet wird.
Als erstes wird bei einem Wechsel der Schalterstellung ein eventuell laufender Timer abgebrochen (das ? bedeutet: Falls die Variable nicht null ist)
Ist der neue Status nicht ON, so wird die Rule abgebrochen.
Ist der Status aber ON, so wird die nächste Zeile ausgeführt, die einen Timer anlegt.
Der Timer wird in 500 Millisekunden ausgeführt - die Schreibweise ist etwas umständlich, leider gehört ChronoUnit nicht zu den Standard Imports.
Alternativ könnte man auch
.plusNanos(500000000) schreiben.
Falls Du tatsächlich einen Farbwechsel alle 2 Sekunden willst, geht natürlich auch
.plusSeconds(2)
Innerhalb des Timer Lambdas läuftg der Code in ähnlicher Form, wie von Dir vorgesehen:
Die Variable oldHSB wird mit dem aktuellen HSB Wert geladen
Die lokale Konstante hue wird mit dem nächsten Farbwert geladen. Dabei wird der
neue Wert Modulo 360 genommen, der Modulo Operator steht nur für Integer zur Verfügung, allerdings wird hue als DecimalType gebraucht.
Die zwei Werte saturation und brightness werden in lokale Konstanten übernommen
der neue HSB-Wert wird in der lokalen Konstanten newHSB gespeichert.
newHSB wird als String als Befehl ans Item gesendet.
Abschließend wird der Timer neu eingeplant.
Den Code habe ich unter openHAB4.0.3 getestet, er sollte aber exakt so auch unter 3.x laufen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet