Figured it out after some hours of fiddling 
Posting back in case others will need this.
Virtual.items
Color vBulbTrumpet4Color
String Trumpet4PolledBri { http="<[LightsCache:900:JSONPATH($.30.state.bri)]" }
.rules:
val String deconzHost = "http://127.0.0.1:8090/"
val String lightTrumpet4 = "api/0950775C33/lights/30/state"
rule "Trumpet 4 - Color"
when
Item vBulbTrumpet4Color changed
then
var String result = ""
var HSBType hsbValue = vBulbTrumpet4Color.state as HSBType
logInfo("deconz", "vBulbTrumpet4Color=" + hsbValue)
val xyY = hsbValue.toXY.toString // convert to xyY
val double x = Float::parseFloat(xyY.split(",").get(0).substring(1)) / 100.0 // scale to 0..1.0
val double y = Float::parseFloat(xyY.split(",").get(1).substring(1)) / 100.0 // scale to 0..1.0
//val int Y = (Float::parseFloat(xyY.split(",").get(2).substring(1).split("]").get(0)) * 2.55).intValue !! not useful, use HSBType brightness instead
val int Y = (hsbValue.brightness * 2.55).intValue // scale to 0..255
logInfo("deconz", "xyY=" + xyY.toString)
logInfo("deconz", "x=" + x)
logInfo("deconz", "y=" + y)
logInfo("deconz", "Y=" + Y)
val String xyString = '{"xy": [' + x.toString + ',' + y.toString + ']}'
val String YString = '{"bri":' + Y.toString + '}'
logInfo("deconz", "xyString=" + xyString)
logInfo("deconz", "YString=" + YString)
logInfo("deconz", "Trumpet4PolledBri=" + Trumpet4PolledBri.state)
deconzUrlString = deconzHost + lightTrumpet4
if (Trumpet4PolledBri.state != Y.toString) {
result = sendHttpPutRequest(deconzUrlString, "application/json", YString, 5000)
logInfo("deconz", "sendHttpPutRequest() returned: " + result)
Thread::sleep(2000)
}
result = sendHttpPutRequest(deconzUrlString, "application/json", xyString, 5000)
logInfo("deconz", "sendHttpPutRequest() returned: " + result)
end
log:
2018-08-04 20:55:35.546 [INFO ] [clipse.smarthome.model.script.deconz] - vBulbTrumpet4Color=353,97,100
2018-08-04 20:55:35.547 [INFO ] [clipse.smarthome.model.script.deconz] - xyY=[62.32024, 32.190536, 21.498209]
2018-08-04 20:55:35.548 [INFO ] [clipse.smarthome.model.script.deconz] - x=0.6232024002075195
2018-08-04 20:55:35.548 [INFO ] [clipse.smarthome.model.script.deconz] - y=0.32190536499023437
2018-08-04 20:55:35.548 [INFO ] [clipse.smarthome.model.script.deconz] - Y=255
2018-08-04 20:55:35.549 [INFO ] [clipse.smarthome.model.script.deconz] - xyString={"xy": [0.6232024002075195,0.32190536499023437]}
2018-08-04 20:55:35.549 [INFO ] [clipse.smarthome.model.script.deconz] - YString={"bri":255}
2018-08-04 20:55:35.550 [INFO ] [clipse.smarthome.model.script.deconz] - Trumpet4PolledBri=1
2018-08-04 20:55:35.552 [INFO ] [clipse.smarthome.model.script.deconz] - sendHttpPutRequest() returned: [{"success":{"/lights/30/state/bri":255}}]
2018-08-04 20:55:37.555 [INFO ] [clipse.smarthome.model.script.deconz] - sendHttpPutRequest() returned: [{"success":{"/lights/30/state/xy":[0.623202,0.321905]}}]
Please feel free to suggest improvements as I really struggled with picking the vales from the returned percentType[]
Anyway, works like a charm, but the bulb must not get the bri and xy settings too close in time.
Cheers.