Seite 2 von 3

Re: RGB über MQTT

Verfasst: 5. Feb 2020 23:56
von Thommy2012
Hallo Udo,

Danke für deine schnelle Antwort.

Heißt das ich brauche die erste Regel nicht mehr? oder muss ich von meinen LED_1_color die Var HSB mit einbeziehen, sowie du es mir gerade beschrieben hast!!

Gruß Thommy


Gesendet von iPhone mit Tapatalk

Re: RGB über MQTT

Verfasst: 6. Feb 2020 00:32
von udo1toni
Na, es kommt ja drauf an, was Du tun möchtest. Die erste Rule sendet RGB-Werte, die über Items von knx kommen an ein Item weiter. Wenn es sich um ein normales Color Item handelt, müssen die Werte, damit es korrekt funktioniert, nach HSB umgewandelt werden.

Code: Alles auswählen

rule "Set BH_Livingroom_RGB value reverse"
when
    Item redValue changed or
    Item greenValue changed or
    Item blueValue changed
then
    var Number nRed   = 0
    var Number nGreen = 0
    var Number nBlue  = 0
    if(  redValue.state instanceof Number) nRed   = (  redValue.state as Number).floatValue
    if(greenValue.state instanceof Number) nGreen = (greenValue.state as Number).floatValue
    if( blueValue.state instanceof Number) nBlue  = ( blueValue.state as Number).floatValue
    logInfo("rgb","R = {} G = {} B = {}",nReg,nGreen,nBlue)
    var hsbValue = HSBType.fromRGB(nRed.intValue,nGreen.intValue,nBlue.intValue)
    LED_1_color_RGB.sendCommand(hsbValue)
end
Wobei man dann natürlich gleich von vornherein mit Integer arbeiten könnte. Ich weiß aber ja nicht, was konkret von knx kommt...

Re: RGB über MQTT

Verfasst: 6. Feb 2020 08:04
von Thommy2012
Hallo Udo,

ich weiß nicht ob ich was falsch mache ich habe mal beide Versionen jetzt ausprobiert.

Code: Alles auswählen

import org.eclipse.smarthome.core.library.types.HSBType





rule "Set BH_Livingroom_RGB value reverse"
when
    Item redValue changed or
    Item greenValue changed or
    Item blueValue changed
then

   
    var Number nRed   = 0
    var Number nGreen  = 0
    var Number nBlue  = 0
    if(  redValue.state instanceof Number) nRed   =  (  redValue.state as Number).floatValue
  
    if(greenValue.state instanceof Number) nGreen = (greenValue.state as Number).floatValue
    if( blueValue.state instanceof Number) nBlue  = ( blueValue.state as Number).floatValue
    logInfo("rgb","R = {} G = {} B = {}",nRed,nGreen,nBlue)

    var String strSend = ""
    strSend = nRed.toString + "," + nGreen.toString + "," + nBlue.toString
    LED_1_color.sendCommand(strSend)
    
  var Integer redValue   = 50
var Integer greenValue = 100
var Integer blueValue  = 255
var hsbValue = HSBType.fromRGB(redValue,greenValue,blueValue)
new_H.sendCommand(hsbValue)

       
end
Habe jetzt mal zum Testen ein weiteres Color Item new_H eingefügt. sendCommand ist rot unterstrichen und es kommt folgene fehlermeldung im Studio.
Bei der Var integer steht unten im log

Type mismatch: cannot convert from NumberItem to DecimalType

Type mismatch: cannot convert from NumberItem to PercentType


Ambiguous feature call.
The extension methods
sendCommand(Item, Number) in BusEvent and
sendCommand(Item, Command) in BusEvent
both match.(org.eclipse.xtext.xbase.validation.IssueCodes.ambiguous_feature_call)

ich kann die Regel ausführen aber am HSB Wert ändert sich nix

Code: Alles auswählen

2020-02-06 07:56:34.299 [INFO ] [g.eclipse.smarthome.model.script.rgb] - R = 100.0 G = 0.0 B = 100.0

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

2020-02-06 07:56:34.321 [ome.event.ItemCommandEvent] - Item 'LED_1_color' received command 100.0,0.0,100.0

2020-02-06 07:56:34.345 [ome.event.ItemCommandEvent] - Item 'new_H' received command 226,78,100

2020-02-06 07:56:34.350 [vent.ItemStateChangedEvent] - greenValue changed from 0.0 to 54.64

2020-02-06 07:56:34.355 [vent.ItemStateChangedEvent] - LED_1_color changed from 0.0,0.0,100.0 to 100.0,0.0,100.0

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

2020-02-06 07:56:34.378 [INFO ] [g.eclipse.smarthome.model.script.rgb] - R = 100.0 G = 54.64 B = 100.0

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

2020-02-06 07:56:34.378 [vent.ItemStateChangedEvent] - blueValue changed from 100.0 to 20.0

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

2020-02-06 07:56:34.417 [INFO ] [g.eclipse.smarthome.model.script.rgb] - R = 100.0 G = 54.64 B = 20.0

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

2020-02-06 07:56:34.418 [ome.event.ItemCommandEvent] - Item 'LED_1_color' received command 100.0,54.64,100.0

2020-02-06 07:56:34.433 [ome.event.ItemCommandEvent] - Item 'new_H' received command 226,78,100

2020-02-06 07:56:34.436 [vent.ItemStateChangedEvent] - LED_1_color changed from 100.0,0.0,100.0 to 100.0,54.64,100.0

2020-02-06 07:56:34.452 [ome.event.ItemCommandEvent] - Item 'LED_1_color' received command 100.0,54.64,20.0

2020-02-06 07:56:34.459 [ome.event.ItemCommandEvent] - Item 'new_H' received command 226,78,100

2020-02-06 07:56:34.467 [vent.ItemStateChangedEvent] - LED_1_color changed from 100.0,54.64,100.0 to 100.0,54.64,20.0

Und bei der zweiten Variante ist im Logfile nRed rot unterstrichen.

Kann es sein das evtl. noch was im Import oder so fehlt.

Sorry wenn ich mich zu doof anstelle .

Re: RGB über MQTT

Verfasst: 6. Feb 2020 10:51
von Thommy2012
Habe jetzt mal spassenshalber den Datenpunkt vom KNX auf 9.001 geändert.

Werte bleiben gelich aber im Studio kommt jetzt der fehler

Type mismatch: cannot convert from Number to int

Datenpunkt 5.001% 0-100 und 5.004 % 0-255 gehen nicht kommt

Code: Alles auswählen

2020-02-06 10:15:06.292 [WARN ] [.internal.handler.DeviceThingHandler] - Ignoring KNX bus data: couldn't transform to any Type (destination='6/6/0', datapoint='command DP 6/6/0 'knx:device:Tunnel:Aktor1_1_40', DPT id 9.001, low priority', data='0x64')

2020-02-06 10:15:06.292 [WARN ] [.internal.handler.DeviceThingHandler] - Ignoring KNX bus data: couldn't transform to any Type (destination='6/6/0', datapoint='command DP 6/6/0 'knx:device:Tunnel:Aktor1_1_40', DPT id 9.001, low priority', data='0x64')

2020-02-06 10:15:06.321 [INFO ] [g.knx.internal.dpt.KNXCoreTypeMapper] - Translator couldn't parse data for datapoint type '9.001' (KNXIllegalArgumentException).

2020-02-06 10:15:06.325 [WARN ] [.internal.handler.DeviceThingHandler] - Ignoring KNX bus data: couldn't transform to any Type (destination='6/6/2', datapoint='command DP 6/6/2 'knx:device:Tunnel:Aktor1_1_40', DPT id 9.001, low priority', data='0x00')

2020-02-06 10:15:06.329 [INFO ] [g.knx.internal.dpt.KNXCoreTypeMapper] - Translator couldn't parse data for datapoint type '9.001' (KNXIllegalArgumentException).

2020-02-06 10:15:06.332 [WARN ] [.internal.handler.DeviceThingHandler] - Ignoring KNX bus data: couldn't transform to any Type (destination='6/6/2', datapoint='command DP 6/6/2 'knx:device:Tunnel:Aktor1_1_40', DPT id 9.001, low priority', data='0x00')
obwohl im Logviewer steht das es um 9.001 handelt

von der anlage werden die werte als Prozent ausgegeben

Re: RGB über MQTT

Verfasst: 8. Feb 2020 02:38
von udo1toni
Du kannst die Datenpunkte nicht frei wählen, es kommt darauf an, was die Devices liefern. Wenn Du schreibst "von der Anlage werden ide Werte als Prozent ausgegeben" dann ist das nicht ausreichend. Es gibt zig verschiedene Prozentangaben in knx, die zueinander inkompatibel sind. Wichtig ist der korrekte DPT, den Du aus der Dokumentation des Devices erfährst, welches sendet.

Du kannst auch nicht einfach verschiedene Items nach Lust und Laune definieren ;) die müssen schon zu den Datenpunkten passen, ebenso die Channel. Alle Teile müssen korrekt ineinander greifen.

Um einzugrenzen, an welcher Stelle in der Rule der Type mismatch auftritt, wären logInfo Zeilen hilfreich. So z.B.:

Code: Alles auswählen

rule "Set BH_Livingroom_RGB value reverse"
when
    Item redValue changed or
    Item greenValue changed or
    Item blueValue changed
then
    logInfo("rgb","Rule startet")
    var Number nRed   = 0
    var Number nGreen = 0
    var Number nBlue  = 0
    if(  redValue.state instanceof Number) nRed   = (  redValue.state as Number).floatValue
    if(greenValue.state instanceof Number) nGreen = (greenValue.state as Number).floatValue
    if( blueValue.state instanceof Number) nBlue  = ( blueValue.state as Number).floatValue
    logInfo("rgb","R = {} G = {} B = {}",nReg,nGreen,nBlue)
    var hsbValue = HSBType.fromRGB(nRed.intValue,nGreen.intValue,nBlue.intValue)
    logInfo("rgb","hsb gesetzt: {}",hsbValue.toString)
    LED_1_color_RGB.sendCommand(hsbValue)
end
Wenn der DPT 9.xxx ist, muss die Rule ziemlich sicher genau so aussehen.
Wenn der DPT 5.xxx ist, sieht die Sache anders aus.
Welche logZeilen werden noch ausgegeben?

Re: RGB über MQTT

Verfasst: 10. Feb 2020 03:07
von Thommy2012
Hallo Udo,

ich weiß zwar nicht wo das problem an der ersten Rule lag, aber jetzt geht es ohne Probleme.

Code: Alles auswählen

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

2020-02-10 03:05:57.685 [INFO ] [g.eclipse.smarthome.model.script.rgb] - Rule startet

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

2020-02-10 03:05:57.723 [vent.ItemStateChangedEvent] - blueValue changed from 50.0 to 0.0

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

2020-02-10 03:05:57.727 [INFO ] [g.eclipse.smarthome.model.script.rgb] - Rule startet

2020-02-10 03:05:57.730 [INFO ] [g.eclipse.smarthome.model.script.rgb] - R = 0.0 G = 0.0 B = 0.0

2020-02-10 03:05:57.737 [INFO ] [g.eclipse.smarthome.model.script.rgb] - hsb gesetzt: 0,0,0

2020-02-10 03:05:57.742 [INFO ] [g.eclipse.smarthome.model.script.rgb] - R = 0.0 G = 0.0 B = 0.0

2020-02-10 03:05:57.748 [INFO ] [g.eclipse.smarthome.model.script.rgb] - hsb gesetzt: 0,0,0

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

2020-02-10 03:05:57.764 [ome.event.ItemCommandEvent] - Item 'LED_1_color' received command 0,0,0

2020-02-10 03:05:57.767 [nt.ItemStatePredictedEvent] - LED_1_color predicted to become 0,0,0

2020-02-10 03:05:57.783 [ome.event.ItemCommandEvent] - Item 'LED_1_color' received command 0,0,0

2020-02-10 03:05:57.797 [nt.ItemStatePredictedEvent] - LED_1_color predicted to become 0,0,0

2020-02-10 03:05:57.809 [vent.ItemStateChangedEvent] - LED_1_color changed from 330,100,39 to 0,0,0

2020-02-10 03:06:00.694 [vent.ItemStateChangedEvent] - redValue changed from 0.0 to 100.0

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

2020-02-10 03:06:00.699 [INFO ] [g.eclipse.smarthome.model.script.rgb] - Rule startet

2020-02-10 03:06:00.722 [INFO ] [g.eclipse.smarthome.model.script.rgb] - R = 100.0 G = 0.0 B = 0.0

2020-02-10 03:06:00.732 [INFO ] [g.eclipse.smarthome.model.script.rgb] - hsb gesetzt: 0,100,39

Vielen Lieben dank für deine Bemühungen. :D

Re: RGB über MQTT

Verfasst: 11. Feb 2020 01:31
von udo1toni
Super, dass es nun klappt!

Re: RGB über MQTT

Verfasst: 5. Feb 2021 00:19
von newhab
Hallo und schönen guten Abend..
Ich bin auch gerade Dabei so einen Controller einzubinden..
Soweit funktoniert auch etwas..
nun bin ich auch auf Deine Regel gestoßen und möchte damit die Slider in Openhab zum einstellen der Farben(RGB) nehmen bzw zum Mischen und Übersetzten - welche Farbe RGB wird welche Farbe im Colorpicker
Sobald ich nun aber den Slider benutze und auf 100% schiebe, bekomme ich am Dimmer nur noch 39% (zum Beispiel Rot)
das selbe lese ich auch im logfile von "Tommy2012" vom 10.Feb.2020
"2020-02-10 03:06:00.732 [INFO ] [g.eclipse.smarthome.model.script.rgb] - hsb gesetzt: 0,100,39" -brightness bei 39
Meine Frage wäre nun, wie bekomme ich den Dimmer mit dem Slider 100% Rot(255.0.0) auf volle Helligkeit
bzw. gleich die Zweite Frage, bekomme ich den Slider auch mit dem Colorpicker verknüft, so das ich Farbe des Pickers auch am Slider wieder sehe..
Vielen Dank für eure Hilfe schon jetzt..

meine Rules:

Code: Alles auswählen


rule "HSB value RGB color value"
	when
    		Item RGB1_color changed
	then
	
    		val hsbValue = RGB1_color.state as HSBType
			val brightness = hsbValue.brightness.intValue 
			val redValue = ((((hsbValue.red.intValue * 255) / 100) *brightness) /100).toString
			val greenValue = ((((hsbValue.green.intValue * 255) / 100) *brightness) /100).toString
			val blueValue = ((((hsbValue.blue.intValue * 255) / 100) *brightness) /100).toString

			val color = redValue + "," + greenValue + "," + blueValue

		RGBLedColor.sendCommand(color)
	end

rule "Send  RGB items from slider"
	when
		Item d_redValue changed or
		Item d_greenValue changed or
		Item d_blueValue changed
	then
		val redValue=  Math::round(2.55* (d_redValue.state as DecimalType).intValue)
		val greenValue=  Math::round(2.55* (d_greenValue.state as DecimalType).intValue) 
		val blueValue=  Math::round(2.55* (d_blueValue.state as DecimalType).intValue)
		val color = redValue + "," + greenValue + "," + blueValue
		RGBLedColor.sendCommand(color)
	end
RGBLedcolor - lese ich über einen String aus

sobald ich die "RGB value reverse" rule hinzufüge komm ich mit dem Slider "Rot" (bei 100%) nur noch auf einen wert von 39 statt 255


items dazu

Code: Alles auswählen


Switch RGB1_on "RGB Stripe [%s]"
Color  RGB1_color "Color HSB" (gLight_RGB_1) [ "Lighting" ]
Dimmer d_redValue "Rot [%d %%]"       (gLight_RGB_1)
Dimmer d_greenValue "Grün [%d %%]"       (gLight_RGB_1)
Dimmer d_blueValue "Blau [%d %%]"       (gLight_RGB_1)
String RGBLedColor "RGB [%s]"


Re: RGB über MQTT

Verfasst: 5. Feb 2021 13:20
von udo1toni
Du hast keine "RGB value reverse" rule. Es ist ungünstig, zwei Rules zu posten und dann einen dritten Namen zu verwenden.

In der Rule "HSB value RGB color value" hast Du einen Denkfehler. (HSBType).red usw. liefert bereits die Helligkeit des entsprechenden RGB-Kanals. Du musst also nicht noch mit brightness herumhantieren.
Außerdem ist Deine Formel falsch, denn Du musst Integer Werte in den String einbauen. Die Rules sollten eher so aussehen:

Code: Alles auswählen

rule "HSB value RGB color value"
when
    Item RGB1_color received command
then
    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.sendCommand(color)
    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

    val color      = redValue + "," + greenValue + "," + blueValue
    RGBLedColor.sendCommand(color)
    RGB1_color.postUpdate(new HSBType(new Color(color)))
end
Die Trigger sind auf received command geändert, so lösen die Rules nur aus, wenn der jeweilige Knopf in der UI betätigt wird. Bei einem postUpdate hingegen bleibt die Rule inaktiv. Deshalb können nun die Slider automatisch gesetzt werden (ungetestet, sollte aber funktionieren).

Re: RGB über MQTT

Verfasst: 5. Feb 2021 16:07
von newhab
Die 3.Rule, die ich benannt hatte war deine aus dem post oben drüber.. Deswegen wollte ich sie nicht nochmal extra posten..
Sorry, mein fehler
Danke für deine Antwort, werde ich heute Abend gleich mal Probieren..
mit den Slidern RGB ist die Helligkeit gleich mit, das ist Richtig.. aber wenn ich den Slider auf 100% machen, geht der "Dimmer" nur auf max 39%..
das wollte ich damit sagen.. (was auch bei RGB -> HSB raus kommt in der brightness)

die benannte Rule:

Code: Alles auswählen

rule "RGB value reverse"
when
    Item d_redValue changed or
    Item d_greenValue changed or
    Item d_blueValue changed
then
    logInfo("rgb","Rule startet")
    var Number nRed   = 0
    var Number nGreen = 0
    var Number nBlue  = 0
    if(  d_redValue.state instanceof Number) nRed   = (  d_redValue.state as Number).floatValue
    if(d_greenValue.state instanceof Number) nGreen = (d_greenValue.state as Number).floatValue
    if( d_blueValue.state instanceof Number) nBlue  = ( d_blueValue.state as Number).floatValue
    logInfo("rgb","R = {} G = {} B = {}",nRed,nGreen,nBlue)
    var color2 = nRed.intValue + "." + nGreen.intValue +"."+ nBlue.intValue
	RGBLedColor2.sendCommand(color2)
	var hsbValue = HSBType.fromRGB(nRed.intValue,nGreen.intValue,nBlue.intValue)
    logInfo("rgb","hsb gesetzt: {}",hsbValue.toString)
    RGB1_color.sendCommand(hsbValue)
	HSBLedColor2.sendCommand(hsbValue)
	
end