.sendCommand() sendet einen Befehl an den angebundenen Channel (der sie wiederum an den Bus weiterleitet). Das heißt, der Befehl wird letztlich an das verbundene Gerät gesendet. Wenn nichts anderes konfiguriert ist, versucht openHAB, aus dem gesendeten Befehl den wahrscheinlichen neuen Status des Items zu erraten und entsprechend zu setzen.
.postUpdate() ändert den Status des Items. Sonst nichts. (Ausnahme: knx Binding und *-control-Channel)
Eine Änderung eines Wertgebers in der UI (also durch den Anwender, z.B. indem ein Slider bewegt wird) löst ein
.sendCommand() aus.
Ein
.sendCommand() löst den Trigger
received command aus.
Ein
.postUpdate() löst den Trigger
received update aus. Sollte der neue Status ein anderer als der alte Status sein, wird
zusätzlich noch der Trigger
changed ausgelöst.
Du möchtest zusätzlich zum Color Picker auch den RGB-Wert über Slider einstellen können. Entsprechend müssen die Rules auf
received command triggern. Damit die jeweils anderen Items automatisch den korrekten Wert anzeigen, müssen zusätzlich zum übermitteln des Kommandos an das Color Item, welches die Lampe steuert, noch die jeweils nicht steuernden Items per
.postUpdate() den neuen Status erhalten.
Hier mal beide Rules zusammengefasst:
Code: Alles auswählen
rule "HSB value RGB color value"
when
Item RGB1_color received command // das Color Widget wurde eingestellt
Item d_redValue received command or // der red Slider wurde eingestellt
Item d_greenValue received command or // der green Slider wurde eingestellt
Item d_blueValue received command // der blue Slider wurde eingestellt
then
logInfo("rgb","Rule gestartet")
var hsbValue = New HSBType()
var Integer redValue = 0
var Integer greenValue = 0
var Integer blueValue = 0
if(triggeringItem.name == "RGB1_color") {
hsbValue = RGB1_color.state as HSBType // color-Wert aus Item extrahieren
redValue = (2.55 * hsbValue.red ).intValue // red -Wert bestimmen
greenValue = (2.55 * hsbValue.green).intValue // green-Wert bestimmen
blueValue = (2.55 * hsbValue.blue ).intValue // blue -Wert bestimmen
d_redValue.postUpdate(hsbValue.red) // Slider red setzen
d_greenValue.postUpdate(hsbValue.green) // Slider green setzen
d_blueValue.postUpdate(hsbValue.blue) // Slider blue setzen
} else {
redValue = (2.55 * (d_redValue.state as DecimalType)).intValue // red -Wert aus Item extrahieren
greenValue = (2.55 * (d_greenValue.state as DecimalType)).intValue // green-Wert aus Item extrahieren
blueValue = (2.55 * (d_blueValue.state as DecimalType)).intValue // blue -Wert aus Item extrahieren
hsbValue = HSBType.fromRGB(redValue,greenValue,blueValue) // color-Wert bestimmen
HSBLedColor.postUpdate(hsbValue) // Colorpicker setzen
}
logInfo("rgb","R = {} G = {} B = {}",redValue,greenValue,blueValue)
val strColor = redValue.toString + "," + greenValue.toString + "," + blueValue.toString
RGBLedColor.postUpdate(strColor)
logInfo("rgb","RGBLED send")
HSBLedColor.sendCommand(hsbValue) // HSB-Wert senden
end
Im ersten Teil werden die Variablen definiert.
Falls die Rule über den Color Picker getriggert wurde (Name des triggernden Items ist RGB1_color) wird hsbValue über den Color Picker gesetzt, die Sollwerte der Slider werden bestimmt und die Slider werden gesetzt.
Falls die Rule nicht über den Color Picker getriggert wurde (der else-Teil), werden die Werte der drei Slider ausgelesen, der hsb-Wert berechent sowie der Color Picker gesetzt.
Der Rest der Rule ist für beide Teile identisch (deshalb ist es auch sinnvoll, die beiden Funktionen in einer Rule zu realisieren), es wird der String aus rgb generiert und in das Item RGBLedColor geschrieben, der hsb-Wert wird an das HSBLedColor Item gesendet.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet