"Das kommte halt so!" ist eines meiner Lieblingszitate (Tjorven - Ferien auf Saltkrokan von Astrid Lindgren)
Zu Deinem "Problem":
Es läuft darauf hinaus, dass Du ein Number Item anlegst (wobei - Dimmer Item ginge auch...) und den Status dieses Items per Rule setzt.
Erster Versuch:
Code: Alles auswählen
var Timer tLampe = null
rule "Lampe auswerten"
when
Item LampeSw changed // Statuswechsel
then
tLampe?.cancel // timer löschen
if(newState == ON) { // Lampe eingeschaltet
if(!LampeSw.changedBetween(now.minusNanos(100000000), now.minusSeconds(4))) { // falls kein Wechsel seit 4 Sekunden
LampeDim.postUpdate(100) // Dimmwert 100
} else { // ansonsten
var nSoll = (LampeDim.state as Number) - 33 // Sollwert = Istwert - 33
if(nSoll < 30) nSoll = 100 // Falls unter kleinster Stufe -> 100
LampeDim.postUpdate(nSoll) // Dimmwert setzen
}
} else { // Lampe wurde ausgeschaltet
tLampe = createTimer(now.plusSeconds(3),[| // nach 3 Sekunden
LampeDim.postUpdate(0) // Lampe aus
])
}
end
Ich bin gerade nicht Zuhause...
Die Theorie:
Zunächst wird ein eventuell laufender Timer abgebrochen (siehe weiter unten)
Die Schaltstellung hat nach ON gewechselt:
Gab es in den letzten 4 Sekunden keinen Statuswechsel, so war die Lampe vorher aus, ergo muss die Lampe 100 % haben.
Gab es innerhalb des Zeitfensters bereits einen Statuswechsel, war die Lampe vorher an und wurde gedimmt, ergo muss die Stufe um 1 reduziert werden (bzw. um 33 %). Landet die neue Stufe unter 33 %, so war die Lampe schon auf niedrigster Stufe und muss deshalb wieder auf 100 sein.
Die Schaltstellung hat nach OFF gewechselt:
Der Timer wird gestartet. Läuft der Timer ab, so wird der Status auf 0 geändert.
Interessant wäre natürlich auch ein Rule, die die Lampe durch die passende Schaltfolge auf eine Wunschhelligkeit bringt (natürlich von jeder beliebigen Stufe aus...)
Code: Alles auswählen
var Timer tLamp2 = null
rule "Lampe schalten"
when
Item LampeDim received command
then
switch(receivedCommand) {
case OFF : {
LampeSw.sendCommand(OFF)
}
case ON : {
val nLevel = LampeDim.state as Number
if(nLevel == 0) {
LampeSw.sendCommand(ON)
} else if(nLevel < 100) {
tLamp2?.cancel
LampeSw.sendCommand(OFF)
tLamp2 = createTimer(now.plusSeconds(4), [|
LampeSw.sendCommand(ON)
])
}
}
default : {
val nSoll = ((receivedCommand as Number)/33).intValue
if(((LampeDim.state as Number)/33).intValue != nSoll) {
var int iSchritt = (((LampeDim.state as Number)/33).intValue + 3 - nSoll) % 3
while(iSchritt > 0) {
LampeSw.sendCommand(OFF)
Thread.sleep(100)
LampeSw.sendCommand(ON)
iSchritt --
}
}
}
}
end
Alles nur theoretisch...

openHAB5.0.1 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime) (Proxmox 9.0.11, LXC)