Example: Convert Color Item Values To RGB (With Explanation)

rules
color
hsb
Tags: #<Tag:0x00007fd316bcb600> #<Tag:0x00007fd316bcb2b8> #<Tag:0x00007fd316bcb150>

(SiLeX) #1

Because there are regular questions on how to read the Color Items’ values as 24-bit RGB ranging from 0-255 I just wrote this little explanation how and why it works. (Or at least one of the many ways)

Let’s say you have a Color item named aacc_color. With this rule you can read out the R, G and B values from it:

rule "get RGB Colors from ColorItem"
  when
    Item aacc_color received command
  then
	val red = (receivedCommand as HSBType).red * 2.55
	val green = (receivedCommand as HSBType).green * 2.55
	val blue = (receivedCommand as HSBType).blue * 2.55
end

aacc_color is the name of my Color item.

aacc_color.state contains the State object of the Color item. Not really useful for us. So we need to convert it to something that really represents colors. In OpenHAB and OpenHAB2 this is the HSBType, which essentially is Hue, Saturation and Brightness.

(aacc_color.state as HSBType) is our Color item. Now it’s not an OpenHAB State object anymore, but a useful color type. If we are interested in the RED, GREEN and BLUE values, we need another step.

(aacc_color.state as HSBType).red contains the percentage of red color. This is returned as a PercentType. Yet, I want to have it as a number, ranging from 0 to 255 to control my lights. This can be done through simple maths.

(aacc_color.state as HSBType).red * 2.55 represents your amount of red between 0 (no red at all) and 255 (full brightness red).

Now you can take your variables and sent commands to other items that may be your RGB light bulbs, or in my case, my DIY MySensors 2,4GHz remote controlled china LED RGB Strips:

rule "Set RGB LEDs from Color item using ColorPicker"
  when
    Item aacc_color received command
  then
	val red = (receivedCommand as HSBType).red * 2.55
	val green = (receivedCommand as HSBType).green * 2.55
	val blue = (receivedCommand as HSBType).blue * 2.55
  	
  	aacc_color_r.sendCommand(red)
  	aacc_color_g.sendCommand(green)
  	aacc_color_b.sendCommand(blue)
end

Brotip: While using any editor of your choice is fine for writing simple rules, you really should consider using the Eclipse SmartHome IDE for more complicated things like casting Item states to different types. Errors will show up instantly and you have integrated JavaDoc documenatation. This will save you a lot of time and hair.

Bonus content
You can also make use of your own new color-handling code to have functioning ON and OFF buttons near the colorpicker:

rule "Luminium Color Item"
  when
    Item aacc_color received command
  then
  	if (receivedCommand instanceof HSBType)
  	{
    	val red = (receivedCommand as HSBType).red * 2.55
    	val green = (receivedCommand as HSBType).green * 2.55
    	val blue = (receivedCommand as HSBType).blue * 2.55
	  	
	  	aacc_color_r.sendCommand(red)
	  	aacc_color_g.sendCommand(green)
	  	aacc_color_b.sendCommand(blue)
  	}
  	else if (receivedCommand == ON){
		 aacc_color.sendCommand(new HSBType("23,60,100"))
  	}
  	else if (receivedCommand == OFF){
		 aacc_mode.sendCommand(0) // Fade-out lights very slowly. Implemented in the device code
  	}
end

Enjoy your colors.


How to convert RGB to HSB and vice versa?
OpenHAB2 Hue changing rule
Set startsettings or change current settings for Items (Color, brightness) with command
Dimmer item and parsing of its value
[Question] SendCommand only if update is significantly different?
Struggling with setting Fibaro RGBW from Rule
How can I compare a color item with a value
Set color for HM-LC-RGBW-WM
Rule String Array to int Array
OpenHab 2 Homekit on iOS Device
(SiHui) #2

That is the first time I did understand all this HSBType stuff :slight_smile:, thanks for that.
Maybe you should copy that to:
https://community.openhab.org/c/tutorials-examples


(Cody) #3

This is very much appreciated! I just happened to start a project with an H801 and rgb strip a few days ago. Although I got the general gist of how things work through browsing several examples, this really helped clear things up.

A couple questions. The slider below the color picker, what exactly does it control? In playing with it it seemed to have done anything from change the brightness, to completely change the color. Any examples for how to implement it?

Also, is it just me, or is incredibly difficult to get accurate colors using the color picker? Anything in much from the very edge ends up being a bluish white. “In between” colors barely work. No matter how precisely I try to be, I am unable to get a true red using the color picker.


(SiLeX) #5

If you are talking about that picture I posted, that is from the Basic UI. It only controls the Brightness channel. But this can be chosen by the UI that displays the ColorPicker.


( ) #6

Why link it? Just move the article :wink:

Great article! Thanks!


(Cody) #7

Thanks for the clarification. So something like this should work in the rule?

var brightness = (aacc_color.state as HSBType).brightness.intValue

(Joe Lawrence) #8

Hopefully some of you color Gurus can help me with a color problem I am having with this device -> EZMultiPli.

In the manual it is first stated, "LED Color EZMultiPli has a color LED beneath the motion sensor dome. This LED is a convenient night light or an indicator light. The LED can be set to any of eight colors via the Z-Wave Color Switch Command Class
:
1)BLACK (off)
2)WHITE
3)RED
4)GREEN
5)BLUE
6)AQUA
7)PINK
8)YELLOW

A Z-Wave BASIC SET ON/OFF also controls the LED but it only uses the white color. Use the Color Switch Command
Class to control the color of the LED."

Then later we have,

Color Switch Command Class
The color of the LED is controlled with the Color Switch Command Class.

Name                   Value (HEX)                        Description                                                  
Command Class          33                                 COMMAND_CLASS_COLOR_CONTROL
Command                03                                 STATE_SET
Length                 3                                  Number of ID/State pairs in this command
Capability ID          02                                 RED
State                  00 or FF                           00=OFF, 01-FF=ON
Capability ID          03                                 GREEN
State                  00 or FF                           00=OFF, 01-FF=ON
Capability ID          04                                 BLUE
State                  00 or FF                           00=OFF, 01-FF=ON
Dimming Duration                                          Not used

There are 3 LEDs inside the PIR sensor dome, RED, GREEN and BLUE. Each of the LEDs can be turned either ON or OFF to yield eight different colors. Dimming is not supported. A single command can set the value of all three LEDs or
each LED can be controlled in a separate command.

Note that if the pushbutton is pressed, the color setting is lost because the sensor will enter motion testing mode where
the LED turns on white anytime motion is detected for 5 minutes. Setting the color however cancels motion testing mode and the color will remain.

A BASIC_SET command turns the LED on white or off


With openHAB 1, I could turn the led on with a sendCommand(device, ON). Never tried to work with the color.

Paper UI has also created a channel similar to: “I have a channel created zwave:device:xxxxxxxx:node19:color_color”

So folks, what command can I send to turn these lights on and off, as I have searched for WEEKS, tried many things, but, no light.

(I know I’m going smack myself in the head when I get an explanation)


Problems commanding color of EzMultiPli
Using ColorItem with MQTT and the Tasmota Firmware
(SiLeX) #9

Because the HSBType inherits the intValue method from DecimalType (see
here:
https://eclipse.org/smarthome/documentation/javadoc/org/eclipse/smarthome/core/library/types/HSBType.html)
this should work, yes.

Go and try to type it in the Eclipse SmartHome Designer if you feel unsure
about which methods you may use.

So then you have the brightness in a variable. Just out of interest: What
are you going to do with it?

Cody bot@community.openhab.org schrieb am Di., 28. Feb. 2017 um 15:10 Uhr:


(Joe Lawrence) #11

I also see the following in my logs:

2017-03-05 17:11:04.245 [INFO ] [.commandclass.ZWaveColorCommandClass] - NODE 19: Color report RED 0
2017-03-05 17:11:04.277 [INFO ] [.commandclass.ZWaveColorCommandClass] - NODE 19: Color report BLUE 0
2017-03-05 17:11:04.308 [INFO ] [.commandclass.ZWaveColorCommandClass] - NODE 19: Color report GREEN 0
2017-03-05 17:11:04.309 [INFO ] [.commandclass.ZWaveColorCommandClass] - NODE 19: Color report finished {RED=0, BLUE=0, GREEN=0}



(SiLeX) #12

Hey friends! I found a rather big issue in my technique and ran into trouble today.
As you can see in the code, I am using (aacc_color.state as HSBType).red to get the red amount in the Color item. If a another rule (or the RGB device itself) posts an update to the Item, you will have wrong (the new) values in .red instead of the values you requested.

So (aacc_color.state as HSBType) should really be just receivedCommand. We don’t even need to cast, because the command already is an HSBType.

I have updates my examples in my original post.


(Guillermo Ruffino) #13

I am sending an RGB value in hex format to an Arduino running MySensors and controlling itself a RGB strip with neo pixel, the rule ended up looking like this:

rule "LEDColorChanging"
then Item LEDColor changed
then 	
	logInfo("LED", "Color changing")
		
	hsbValue = LEDColor.state as HSBType
	redValue   = String.format("%02X", (hsbValue.red.floatValue * 2.55) as int)
	greenValue = String.format("%02X", (hsbValue.green.floatValue * 2.55) as int)
	blueValue  = String.format("%02X", (hsbValue.blue.floatValue * 2.55) as int)
    
	sendCommand(Text_Text, redValue + greenValue + blueValue)
	logInfo("LED Color changed", "R" + redValue + "G" + greenValue + "B" + blueValue)

end

This ended logging something like: LED Color changed: RA8G03BFF


(Kees Van Gelder) #14

Clear, thank you.
just a question to see if i fully understood:
Is receivedCommand the substitution of (aac_color.state as HSBType)?

As the one is used in your “Set RGB LEDs from color item Using Colorpicker” rule and the other in your
"Luminium Farbe Setzen" rule for the same purpose


(SiLeX) #15

receivedCommand is automatically set for rules that react on “received
command” events.

See http://docs.openhab.org/configuration/rules-dsl.html#implicit-variables


(Kees Van Gelder) #16

I had to think about that a little but now I get it. Tnx


(Ilkka Tengvall) #17

As a thank you to these guides, I share an example of Arduino code which will implement this logic behind MQTT and MySensors network. Have a look if you need sample to build devices to do the RGB.


(Ilkka Tengvall) #18

I was requested for video of the LED effects done by @maghac. Here you can see the effects as of today: https://youtu.be/chN6CxMVWm4

There is also slider for lightbulb brightness I forgot to show. All things can be controlled over MQTT. This is about the link in previous post.


(Ahmad Yazan Tibi) #19

So, is it wrong what is mentioned in documentation to multiply with 255 (https://www.openhab.org/docs/configuration/rules-dsl.html#color-item),


(SiLeX) #20

It does not look all that correct. I will test this and change the docs, if applicable and let you hear back from me.


(SiLeX) #21

The docs were indeed wrong. There were also some other issues with maths. I fixed them and wait for the pull request to be accepted and the docs to be re-rendered. Thanks for this pointer, @a.tibi . I also updated my original post to reflect the changes that came in openHAB 2.2