I’m struggling with my hue binding. The code below is just a test to cycle through the colors, updating every 2 seconds. It causes a Cannot cast org.openhab.core.library.types.HSBType to void Error in the log.
If I remove the as HSBType from currentState = hue_color_4.state as HSBType, then I get an error in the editor saying Type mismatch: cannot convert from State to HSBType and an error in the logs that says the name '.hue cannot be resolved to an item or type.
The code from the last bit of hue binding wiki page https://github.com/openhab/openhab/wiki/Hue-Binding doesn’t work either because it never fires due to this line: if (philipsColor1.state instanceof HSBType)
My non-functional code:
rule "hue test"
when
Time cron "0/2 * * * * ? *"
then
var HSBType currentState
currentState = hue_color_4.state as HSBType
var double new_H = currentState.hue.floatValue() + 6.0
var double new_S = currentState.saturation.floatValue() + 5.0
var double new_B = currentState.saturation.floatValue()
if (new_H > 360.0) new_H=0.0
if (new_S > 100.0) new_S=100.0
if (new_B > 100.0) new_B=100.0
val String color = String::format("%.3f",new_H)+","+String::format("%.3f",new_S)+ ","+String::format("%.3f",new_B)
hue_color_4.sendCommand(color)
logInfo("File", "color test: "+ color)
end
for setting a specific color, you don’t have to use a string but HSBType:
var HSBType currentState
currentState = hue_color_4.state as HSBType
var DecimalType new_H = currentState.hue + 6
var PercentType new_S = currentState.saturation + 5
var PercentType new_B = currentState.brightness
var HSBType newState = new HSBType(new_H,new_S,new_B)
hue_color_4.sendCommand(newState)
logInfo("File", "color test: hue = {} sat = {} bright = {}", new_H, new_S, new_B)
As I don’t use the color item other than UI, I’m not sure if this code does work as expected (I use long values to send via exec binding and therefore use other maths for the vars)
Udo,
hue_color_4 is a color item bound to a hue light bulb. Color hue_color_4 "Livingroom Hue 4" (Hue) {hue="4"}
The problem is that it is choking on this line: currentState = hue_color_4.state as HSBType
Rich, I believe your code would work on my setup, but my problem is that I’m trying to get the current state, modify the values and then send it back.
I got it to work with the code below, but would love to know why I can’t make the line above work. I’ve had this experience with almost every example on the wiki. It doesn’t work out of the box. It makes me think I’ve got something fundamentally wrong with my installation.
rule "hue test"
when
Time cron "0/10 * * * * ? *"
then
var String stringState
stringState = hue_color_4.state.toString()
var segments = stringState.split(',').iterator
var double new_H = Double::parseDouble(segments.next) + 1.0
var double new_S = Double::parseDouble(segments.next) + 1.0
var double new_B = Double::parseDouble(segments.next)
if (new_H > 360.0) new_H=0.0
if (new_S > 70.0) new_S=70.0
if (new_B > 100.0) new_B=100.0
val String color = String::format("%.3f",new_H)+","+String::format("%.3f",new_S)+ ","+String::format("%.3f",new_B)
hue_color_4.sendCommand(color)
end
You take the current values and change the values as you currently are. And replace the val String color = String::format... line with my line val HSBType color = new HSBType(....
The code is equivalent only it uses the HSBType to send the new value instead of the String which is what I figured was the source of the problem.
I [quote=“shogan50, post:1, topic:12143”]
The code from the last bit of hue binding wiki page Hue Binding · openhab/openhab1-addons Wiki · GitHub doesn’t work either because it never fires due to this line: if (philipsColor1.state instanceof HSBType)
[/quote]
This is a major clue actually. If the rule never fires because of that if statement it means that the state of the Item isn’t an HSBType which means you can’t cast it to an HSBType (i.e. hue_color_4.state as HSBType would throw an error).
I thought a Color Item stored its state as an HSBType so this is very odd behavior indeed. Furthermore the toString seems to be printing it out as an HSBType.
On a Raspberry Pi running Raspian, you should install openHAB using the apt-get method described here:
Installing this way tends to eliminate a set of possible oddities. The only reason I suggest it is because the error you receive doesn’t make any sense to me!
I have a Color Item and as I understand this item is of HSBType.
Now I want to convert the HSB to RGB values in the range 0-255 and send that as an hex-string to my LED-strip.
But I fail on first base with this error message in the log:
2017-10-24 15:48:53.213 [INFO ] [penhab.model.script.WIFI_RGB_1] - WIFI_RGB_1 (Type=ColorItem, State=228.676056,83.757550,100.000000)
2017-10-24 15:48:53.342 [ERROR] [o.o.c.s.ScriptExecutionThread ] - Error during the execution of rule ‘Extract RGBW values from HSL setting’: Cannot cast org.openhab.core.library.types.HSBType to void
Here is the Item definition:
Color WIFI_RGB_1 "LED-strip vard." <slider> (gVardag)
and here is the rule: I have not completed the rule yet because it fails immediately after the logInfo statement
rule "Extract RGBW values from HSB setting"
when
Item WIFI_RGB_1 received command
then
logInfo( "WIFI_RGB_1", WIFI_RGB_1.toString)
var redValue = (WIFI_RGB_1.state as HSBType).red
var greenValue = (WIFI_RGB_1.state as HSBType).green
var blueValue = (WIFI_RGB_1.state as HSBType).blue
logInfo( "redValue" , redValue.toString)
logInfo( "greenValue" , greenValue.toString)
logInfo( "blueValue" , blueValue.toString)
end
So according to everything I have read above, I should be able to cast a Color item to HSBType but that does not work. I have tried several other ways described elsewhere in the community but without success. Now I am at the ends of my wits.
Just to make it clear, you cannot cast a Color Item to an HSBType, and in fact, you are not doing that. You can cast the State of a Color Item to an HSBType and that is what you are doing with (WIFI_RGB_1.state as HSBType).
Add some log statements between your lines that assign your red, green, and blue values. There is more than 100 msec between your log statement and the error which seems like a really long time. I can’t tell if the line generating the error is redValue or later on.
Try using .getRed et all instead of just red. It shouldn’t make a difference but something is going on. The code as written looks correct to me.
rule "Extract RGBW values from HSB setting"
when
Item WIFI_RGB_1 received command
then
logInfo( "WIFI_RGB_1", WIFI_RGB_1.toString)
var redValue = (WIFI_RGB_1.state as HSBType).getRed
logInfo( "redValue" , redValue.toString)
var greenValue = (WIFI_RGB_1.state as HSBType).getGreen
logInfo( "greenValue" , greenValue.toString)
var blueValue = (WIFI_RGB_1.state as HSBType).getBlue
logInfo( "blueValue" , blueValue.toString)
end
putting a log statement between each assignment and using .getRed instead of .red
Made no difference to the log output:
2017-10-24 19:49:09.490 [INFO ] [penhab.model.script.WIFI_RGB_1] - WIFI_RGB_1 (Type=ColorItem, State=131.323944,86.022433,100.000000)
2017-10-24 19:49:09.596 [ERROR] [o.o.c.s.ScriptExecutionThread ] - Error during the execution of rule ‘Extract RGBW values from HSL setting’: Cannot cast org.openhab.core.library.types.HSBType to void
BTW I’m running OH 1.8.0 on an older RPi. Can’t tell the model but it is a few years old.
No difference but we now know for sure that the var redValue line is throwing the error.
What version of OH are you running? I’m surprised to see org.openhab.core.library.types. In OH 2 all of those classes moved to org.eclipse.smarthome.core.library.types. Are you using a 1.x version binding for these Color Items?
I’m running OH 1.8.0.
Since the LED-strip will be controlled over MQTT I have not installed any specific binding to handle color items. I will parse the RGB values to an hex string and send that over MQTT. Maybe this is the cause!
Should I install e.g. the Philips Hue binding even though I will not use any device like that?
OK, that is important to know. If there is a bug here then I’m afraid the only solution will be to upgrade to 2.x. You could try at least upgrading to 1.8.3 but if you need to upgrade you may as well go all the way.
You don’t need any extra bindings installed. The vast majority of users are on OH 2 where these classes have moved packages. I was just trying to figure out why the error was referencing the old package for HSBType. If you are on 1.8.0 that explains it.
No, HSBType is a core class. It is always there regardless of your installed bindings.
At this point, I don’t have a lot left to offer. Your code looks right. The error is not terribly helpful. And version 1.8.0 is three versions behind the latest stable release so I can’t really even offer any information as to whether there was an identified bug on this that has since been fixed.
My last recommendations is to explicitly force the types of the values to ints
var int redValue =
If that doesn’t work look to upgrade and see if that fixes it.
For OH1 you need this import (or at least import org.openhab.core.library.types.HSBType)
For OH2 this import is obsolete.
My code is almost the same on OH1.8.0:
import org.openhab.core.library.types.*
import org.openhab.model.script.actions.*
import org.openhab.core.types.Command
var HSBType hsbValue
rule "Color Light"
when
Item ColorLight changed
then
hsbValue = ColorLight.state as HSBType
var int red = hsbValue.red.intValue
var int green = hsbValue.green.intValue
var int blue = hsbValue.blue.intValue
logInfo("colorlight","red = {}, green = {}, blue = {}", red, green, blue)
executeCommandLine("/usr/bin/sendrgb " + red + " " + green + " " + blue)
end
Once I checked my imports and did some other syntax changes, adapting to Xbase formats then the whole thing works! I should never have klicked on the Quick fix Organize imports. The code is below, adapted to an RGBW LED-strip. The W component is calculated as the least common denominator of RGB.
import org.openhab.core.library.types.*
import org.openhab.model.script.actions.*
import org.openhab.core.types.*
import org.openhab.core.library.items.*
import org.eclipse.xtext.xbase.lib.*
import java.util.Map
import java.util.Set
var String redString
var String greenString
var String blueString
var String whiteString
var String RGBvalues
var HSBType hsbValue
rule "Extract RGBW values from HSB setting"
when
Item WIFI_RGB_1 received command
then
logInfo( "WIFI_RGB_1", WIFI_RGB_1.toString)
hsbValue = WIFI_RGB_1.state as HSBType
var int redValue = hsbValue.red.intValue * 255 / 100
var int greenValue = hsbValue.green.intValue * 255 / 100
var int blueValue = hsbValue.blue.intValue * 255 / 100
redString = Integer::toHexString(redValue) //Convert byte to hex string
if (redValue < 16) redString = "0" + redString //Left pad red string with 0 if single character only
greenString = Integer::toHexString(greenValue) //Convert byte to hex string
if (greenValue < 16) greenString = "0" + greenString //Left pad green string with 0 if single character only
blueString = Integer::toHexString(blueValue) //Convert byte to hex string
if (blueValue < 16) blueString = "0" + blueString //Left pad blue string with 0 if single character only
var int whiteValue = Math::min(redValue, (Math::min(greenValue, blueValue))) //White setting is set to least common denominator of colors
whiteString = Integer::toHexString(whiteValue) //Convert byte to hex string
if (whiteValue < 16) whiteString = "0" + whiteString //Left pad white string with 0 if single character only
RGBvalues = redString + greenString + blueString + whiteString //Combine into one message
logInfo( "WIFI_RGB_1_RGB", RGBvalues.toString)
sendCommand( WIFI_RGB_1_RGB, RGBvalues)
end