RGB über MQTT

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

newhab
Beiträge: 18
Registriert: 5. Dez 2020 16:56
Answers: 0

Re: RGB über MQTT

Beitrag von newhab »

Ich hab mal ein bissel rumgespielt und deine Rules eingebaut, funktionier soweit ganz gut.. und die Slider zeigen abhängig vom Colopicker die Werte an - vielen dank dafür..
den Trigger für die erste regel habe ich wieder "changed" geändert, da ich noch ein paar feste farben als "Taster" eingebaut habe und ich sonst den collorpicker doppelt andrücken musste.

Die Slider habe ich auf "received command" gelassen, so habe ich dich verstanden- damit die regel nur dann von diesem event ausgelöst wirt, wenn ich die Slider direkt anpacke..?!?

Die "RGBLedColor" wird auch geändert und angezeigt aber leider gibt es einen Problem bei der übersetzung in "HSBType" hättest du da eventuell noch einen Tip für mich?!
im logfile kommt folgender Fehler

Code: Alles auswählen

021-02-05 22:13:53.564 [ome.event.ItemCommandEvent] - Item 'd_redValue' received command 50

==> /var/log/openhab2/openhab.log <==

2021-02-05 22:13:53.586 [INFO ] [g.eclipse.smarthome.model.script.rgb] - R = 127 G = 0 B = 0

==> /var/log/openhab2/events.log <==

2021-02-05 22:13:53.598 [ome.event.ItemCommandEvent] - Item 'RGBLedColor' received command 127,0,0

==> /var/log/openhab2/openhab.log <==

2021-02-05 22:13:53.598 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Send  RGB items from slider': An error occurred during the script execution: null
Auch dein Tip mit den LogInfo fande ich sehr gut, hilft bei der Problemsuche..
und gleich mal mit verbaut (werde ich dann später wieder ausklammern)

wie ich "color" baue und zusammensetzte habe ich (denke ich) verstanden
aber für die Übersetzung in HSB - da bin ich leider raus
was macht diese Funktion "new HSBType(new Color(."

Aber hat mir auch so schon ein gutes Stück weiter geholfen und ist aufgeräumter in der Rule!! Danke DIR

newhab
Beiträge: 18
Registriert: 5. Dez 2020 16:56
Answers: 0

Re: RGB über MQTT

Beitrag von newhab »

bekomme den Fehler leider nicht raus
"An error occurred during the script execution: null"
RGB1_color item wird auch nicht angesprochen..
habe auch schon versucht die Daten über ein anders Item auszulesen "HSBLedColor"
indem ich ich "hsbValue" als variable erzeuge.. leider ohne Erfolg
dort bekomme ich den Fehler:
" 'intValue' is not a member of 'java.lang.String' "
Rule:

Code: Alles auswählen

rule "HSB value RGB color value"
when
    Item RGB1_color  changed
then
	logInfo("hsb -> rgb","Rule gestartet")
    val hsbValue   = RGB1_color.state as HSBType
    val redValue   = (hsbValue.red   * 2.55).intValue.toString
    val greenValue = (hsbValue.green * 2.55).intValue.toString
    val blueValue  = (hsbValue.blue  * 2.55).intValue.toString

    val color      = redValue + "," + greenValue + "," + blueValue
    
	RGBLedColor.postUpdate(color)		logInfo("hsb -> rgb","RGBLED send")
    
    HSBLedColor.sendCommand((hsbValue))	logInfo("hsb -> rgb","HSBLED send")
	
	logInfo("hsb -> rgb","Slider")
    d_redValue.postUpdate(hsbValue.red)
    d_greenValue.postUpdate(hsbValue.green)
    d_blueValue.postUpdate(hsbValue.blue)
end
rule "Send  RGB items from slider"
when
    Item d_redValue received command or
    Item d_greenValue received command or
    Item d_blueValue received command
then
    
    val redValue   = (2.55 * (d_redValue.state   as DecimalType)).intValue.toString
    val greenValue = (2.55 * (d_greenValue.state as DecimalType)).intValue.toString
    val blueValue  = (2.55 * (d_blueValue.state  as DecimalType)).intValue.toString

	logInfo("rgb","R = {} G = {} B = {}",redValue,greenValue,blueValue)
    val color      = redValue + "," + greenValue + "," + blueValue 
    RGBLedColor.sendCommand(color)
    RGB1_color.postUpdate(new HSBType(new Color(color)))
    
    var hsbValue = HSBType.fromRGB(redValue.intValue,greenValue.intValue,blueValue.intValue)
    HSBLedColor.postUpdate(hsbValue)
    
end
und seid gestern sind auch die "postUpdate" nach "logInfo("hsb -> rgb","Slider")"alle rot unterstrichen - aber die Rules funktionieren..
was ist nun schon wieder FALSCH :oops:
ich versteh leider nicht warum. Als ich sie Eigpflegt habe, war alles noch OK

Benutzeravatar
udo1toni
Beiträge: 15269
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: RGB über MQTT

Beitrag von udo1toni »

Du kannst aus einem String nicht einfach wieder ein Integer machen. Du kannst aber das .toString in der Definition der Konstanten weg lassen (allerdings musst Du dann natürlich beim val color je Konstante das .toString ergänzen)

Bitte beim logInfo() im ersten String (das ist der Loggername) nur Buchstaben des englischen Alphabets und Ziffern verwenden. Ein Unterstrich wäre noch ok, aber...
Der Loggername darf nicht einfach irgendwie gesetzt werden, auch wenn das vereinzelt funktionieren mag. Der Loggername wird zur Steuerung verwendet, man kann den Log Level über die Karaf Konsole steuern, dazu muss der komplette Name (bzw. erste Teil des Loggernamens) angegeben werden, das sieht dann so aus:

Code: Alles auswählen

log:set WARN org.openhab.model.script.rgb
Dieser Befehl setzt das Log Level für alle logBefehle, die den Loggernamen "rgb" verwenden, das heißt, alle Befehle logDebug("rgb","...") und logInfo("rgb","...") werden außer Kraft gesetzt. Man kann auch den Punkt im Namen verwenden, dann kann man noch feiner steuern, welche logBefehle ausgeführt werden. Nicht erlaubt sind aber Leerzeichen, und auch mit anderen Zeichen (minus, größer, kleiner usw.) sollte man eher vorsichtig sein.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

newhab
Beiträge: 18
Registriert: 5. Dez 2020 16:56
Answers: 0

Re: RGB über MQTT

Beitrag von newhab »

Super.. jetzt funktioniert es!! :D :mrgreen:
vielen dank für deine Hilfe!!
habe auch den Loggername geändert.. - das ist wissen, welches mir wohl noch komplett fehlt.. (bin noch recht neu im Thema - is bestimmt schon aufgefallen :idea: )

die HSBLedColor (ist ein String item) funktioniert nur mit "sendCommand" - ist aber rot unterstrichen?! bei einem "postUpdate" funktioniert es gar nicht.
In der Rule sind die "post.Update" der Slider ebenfals rot unterstrichen.. hast du eine Idee warum?!
Im Visual Studio zeigt er mir für die Rule also 6 "fehler" an.. aber im BasicUI funtktionier alles und im log zeigt er auch keine Fehler..

hier noch mal die Rule:

Code: Alles auswählen

rule "HSB value RGB color value"
when
    Item RGB1_color  changed
then
	logInfo("rgb","Rule gestartet")
    val hsbValue   = RGB1_color.state as HSBType
    val redValue   = (hsbValue.red   * 2.55).intValue
    val greenValue = (hsbValue.green * 2.55).intValue
    val blueValue  = (hsbValue.blue  * 2.55).intValue

    val color      = redValue.toString + "," + greenValue.toString + "," + blueValue.toString
    
	RGBLedColor.postUpdate(color)		logInfo("rgb","RGBLED send")
    
    HSBLedColor.sendCommand(hsbValue)	logInfo("rgb","HSBLED send") //sendCommand rot Unterstrichen
	
	logInfo("rgb","Slider")
    d_redValue.postUpdate(hsbValue.red)                              //postUpdate rot Unterstrichen
    d_greenValue.postUpdate(hsbValue.green)                          //postUpdate rot Unterstrichen
    d_blueValue.postUpdate(hsbValue.blue)                            //postUpdate rot Unterstrichen
end



rule "Send RGB items from slider"
when
    Item d_redValue received command or
    Item d_greenValue received command or
    Item d_blueValue received command
then
    logInfo("slider","Rule gestartet")
    val redValue   = (2.55 * (d_redValue.state   as DecimalType)).intValue
    val greenValue = (2.55 * (d_greenValue.state as DecimalType)).intValue
    val blueValue  = (2.55 * (d_blueValue.state  as DecimalType)).intValue

	logInfo("slider","R = {} G = {} B = {}",redValue,greenValue,blueValue)
    val color      = redValue.toString + "," + greenValue.toString + "," + blueValue.toString 
    RGBLedColor.postUpdate(color)
    
    val hsbValue = HSBType.fromRGB(redValue.intValue,greenValue.intValue,blueValue.intValue)
    HSBLedColor.sendCommand(hsbValue)                                //sendCommand rot Unterstrichen
    RGB1_color.sendCommand(hsbValue)                                 //sendCommand rot Unterstrichen
end

Benutzeravatar
udo1toni
Beiträge: 15269
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: RGB über MQTT

Beitrag von udo1toni »

.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

Antworten