Zigbee Colour LED configuration

  • Platform information:
    • Hardware: Pi 4
    • OS: Openhabian
    • Java Runtime Environment: Java 17
    • openHAB version: 4.2.2
  • Issue of the topic: I’ve purchased a number of these: Oz Smart Things DL41-03-10-R-ZB control via MQTT | Zigbee2MQTT and can control them via zigbee2mqqt. I have other zigbee devices (switches and sensors) that are all working fine.
  • I need to expose these to Google Home so they can be voice controlled.
  • I can configure a ‘Generic MQTT Thing’ to get the relevant channels, and create items from these, but I’m having trouble with the colour channel, and working out which item to tag as ga.
  • I have scrapped everything, and am hoping for a kind soul to walk me through setting this up

I have Ikea color lamps with the same description in z2m.

My working thing code tab is:

  - id: color_rgb
    channelTypeUID: mqtt:color
    label: Farbe
    configuration:
      retained: false
      postCommand: false
      formatBeforePublish: '{"color":{"r":%1$d,"g":%2$d,"b":%3$d}}'
      commandTopic: zigbee2mqtt/IkeaColorlampe/set
      colorMode: RGB
      stateTopic: zigbee2mqtt/IkeaColorlampe/get
      off: "0"
      on: "1"

Link to a color item it should work.
With Google home I can’t help you.
Greets.
PS Maybe the stateTopic is wrong. I change the color only with openhab… So I don’t need the stateTopic part.

the .../get topic is to request a specific state, so this topic is most likely not to be correct at all.
MQTT Explorer should show the correct stateTopic (payload should be json with complete state).

I would expect something like

{"state":"ON","brightness":100,{"color":{"x":0.123,"y":0.123}}}

(be aware of x/y value instead of rgb). If that’s correct, then the configuration should be something like this:

- id: color_rgb
    channelTypeUID: mqtt:color
    label: Farbe
    configuration:
      retained: false
      postCommand: false
      formatBeforePublish: '{"color":{"x":%1$d,"y":%2$d},"brightness":%3$d}'
      commandTopic: zigbee2mqtt/IkeaColorlampe/set
      colorMode: XYY
      transformationPattern: JS:|in=JSON.parse(input); in.color.x+','+in.color.y+','+in.brightness;
      stateTopic: zigbee2mqtt/IkeaColorlampe
      on: ON
      off: OFF

Thanks, still banging my head against a wall, but the effort is appreciated.

Thanks for the help. The status topic looks like this:

{
    "brightness": 10,
    "color": {
        "x": 0.1355,
        "y": 0.0399
    },
    "color_mode": "xy",
    "color_power_on_behavior": null,
    "color_temp": 500,
    "do_not_disturb": false,
    "linkquality": 131,
    "state": "ON"
}

My thing now looks like this:

UID: mqtt:topic:c0a82307a5:af6ca82f6a
label: OzLight1
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:c0a82307a5
channels:
  - id: OzLight1_Colour
    channelTypeUID: mqtt:color
    label: Colour
    description: Test Colour Channel
    configuration:
      retained: false
      postCommand: false
      formatBeforePublish: '{"color":{"x":%1$d,"y":%2$d},"brightness":%3$d}'
      commandTopic: zigbee2mqtt/OzLight1/set
      colorMode: XYY
      transformationPattern: JS:|in=JSON.parse()input; in.color.x+','+in.color.y+','+in.brightness;
      stateTopic: zigbee2mqtt/OzLight1
      off: OFF
      on: ON

And attached a Color item to it, but changing the sliders doesn’t change the light, but it does send MQTT : In MQTT Explorer I see messages published to zigbee2mqtt/OzLight1/set but just 3 numbers (0.359299,0.336995,24.00). I’m thinking that the formatBeforePublish isn’t working?

Some progress!

formatBeforePublish: '{"color":{"x":%1$f,"y":%2$f},"brightness":%3$f}'

works, but brightness goes from 0 - 100, where the light expects 0-254

That’s a bit tricky… but no real problem :slight_smile:

- id: color_rgb
    channelTypeUID: mqtt:color
    label: Farbe
    configuration:
      retained: false
      postCommand: false
      commandTopic: zigbee2mqtt/IkeaColorlampe/set
      colorMode: XYY
      transformationPatternOut: JS:|in=input.split(",");'{"color":{"x":'+in[0]+',"y":'+in[1]+'},"brightness":'+(in[2]*2.55)+'}';
      transformationPattern: JS:|in=JSON.parse(input); in.color.x+','+in.color.y+','+in.brightness/2.55;
      stateTopic: zigbee2mqtt/IkeaColorlampe
      on: ON
      off: OFF

Please be aware that I changed from formatBeforePublish to transformationPatternOut and also changed transformationPattern slightly, as there was a typo (I changed my posting above)
I did not test :slight_smile:

Thanks, wiil try it when I get the chance

Sadly didn’t work. Back to banging my head!

Any messages in openhab.log?

Hmm, logging crashed 2 days ago - need to sort that out first! Frontail is showing blank lines popping up, but both openhab.log and events.log last entry was from 3rd Dec

when changing the colorpicker item:

2024-12-05 10:10:16.412 [ERROR] [javascript.transformation.|835486551] - Failed to execute script: SyntaxError: <eval>:1:0 Expected an operand but found in
in=input.split(",");'{"color":{"x":'+in[0]+',"y":'+in[1]+'},"brightness":'+(in[2]*2.55)+'}';
^
<eval>:1:37 Expected an operand but found in
in=input.split(",");'{"color":{"x":'+in[0]+',"y":'+in[1]+'},"brightness":'+(in[2]*2.55)+'}';
                                     ^
        at org.graalvm.polyglot.Context.eval(Context.java:399)
        at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.eval(GraalJSScriptEngine.java:458)
        at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.eval(GraalJSScriptEngine.java:426)
        at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:262)
        at org.openhab.automation.jsscripting.internal.scriptengine.DelegatingScriptEngineWithInvocableAndAutocloseable.eval(DelegatingScriptEngineWithInvocableAndAutocloseable.java:52)
        ... 29 more
2024-12-05 10:10:16.413 [WARN ] [t.generic.ChannelStateTransformation] - Executing the JS-transformation failed: Failed to execute script.. Pattern: '|in=input.split(",");'{"color":{"x":'+in[0]+',"y":'+in[1]+'},"brightness":'+(in[2]*2.55)+'}';'. Value: '0.186793,0.272278,56.00'
2024-12-05 10:10:16.610 [ERROR] [javascript.transformation.|835486551] - Failed to execute script: SyntaxError: <eval>:1:0 Expected an operand but found in
in=input.split(",");'{"color":{"x":'+in[0]+',"y":'+in[1]+'},"brightness":'+(in[2]*2.55)+'}';
^
<eval>:1:37 Expected an operand but found in
in=input.split(",");'{"color":{"x":'+in[0]+',"y":'+in[1]+'},"brightness":'+(in[2]*2.55)+'}';
                                     ^
        at org.graalvm.polyglot.Context.eval(Context.java:399)
        at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.eval(GraalJSScriptEngine.java:458)
        at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.eval(GraalJSScriptEngine.java:426)
        at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:262)
        at org.openhab.automation.jsscripting.internal.scriptengine.DelegatingScriptEngineWithInvocableAndAutocloseable.eval(DelegatingScriptEngineWithInvocableAndAutocloseable.java:52)
        ... 29 more
2024-12-05 10:10:16.612 [WARN ] [t.generic.ChannelStateTransformation] - Executing the JS-transformation failed: Failed to execute script.. Pattern: '|in=input.split(",");'{"color":{"x":'+in[0]+',"y":'+in[1]+'},"brightness":'+(in[2]*2.55)+'}';'. Value: '0.172284,0.261031,56.00'
==> /var/log/openhab/events.log <==
2024-12-05 10:10:16.395 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'OzLight1_Colour' received command 198,61,56
2024-12-05 10:10:16.398 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'OzLight1_Colour' predicted to become 198,61,56
2024-12-05 10:10:16.399 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'OzLight1_Colour' changed from 198,60,56 to 198,61,56
2024-12-05 10:10:16.593 [INFO ] [openhab.event.ItemCommandEvent      ] - Item 'OzLight1_Colour' received command 198,70,56
2024-12-05 10:10:16.595 [INFO ] [penhab.event.ItemStatePredictedEvent] - Item 'OzLight1_Colour' predicted to become 198,70,56
2024-12-05 10:10:16.599 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'OzLight1_Colour' changed from 198,61,56 to 198,70,56```



When changing via zigbee2mqtt:

2024-12-05 10:14:39.889 [ERROR] [avascript.transformation.|1011883812] - Failed to execute script: SyntaxError: <eval>:1:0 Expected an operand but found in
in=JSON.parse(input); in.color.x+','+in.color.y+','+in.brightness/2.55;
^
<eval>:1:22 Expected an operand but found in
in=JSON.parse(input); in.color.x+','+in.color.y+','+in.brightness/2.55;
                      ^
        at org.graalvm.polyglot.Context.eval(Context.java:399)
        at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.eval(GraalJSScriptEngine.java:458)
        at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.eval(GraalJSScriptEngine.java:426)
        at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:262)
        at org.openhab.automation.jsscripting.internal.scriptengine.DelegatingScriptEngineWithInvocableAndAutocloseable.eval(DelegatingScriptEngineWithInvocableAndAutocloseable.java:52)
        ... 31 more
2024-12-05 10:14:39.890 [WARN ] [t.generic.ChannelStateTransformation] - Executing the JS-transformation failed: Failed to execute script.. Pattern: '|in=JSON.parse(input); in.color.x+','+in.color.y+','+in.brightness/2.55;'. Value: '{"brightness":142,"color":{"h":308,"hue":308,"s":100,"saturation":100,"x":0.4066,"y":0.1643},"color_mode":"xy","color_options":{"execute_if_off":false},"color_power_on_behavior":null,"color_temp":153,"do_not_disturb":false,"linkquality":116,"state":"ON"}'
2024-12-05 10:14:40.351 [ERROR] [avascript.transformation.|1011883812] - Failed to execute script: SyntaxError: <eval>:1:0 Expected an operand but found in
in=JSON.parse(input); in.color.x+','+in.color.y+','+in.brightness/2.55;
^
<eval>:1:22 Expected an operand but found in
in=JSON.parse(input); in.color.x+','+in.color.y+','+in.brightness/2.55;
                      ^
        at org.graalvm.polyglot.Context.eval(Context.java:399)
        at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.eval(GraalJSScriptEngine.java:458)
        at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.eval(GraalJSScriptEngine.java:426)
        at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:262)
        at org.openhab.automation.jsscripting.internal.scriptengine.DelegatingScriptEngineWithInvocableAndAutocloseable.eval(DelegatingScriptEngineWithInvocableAndAutocloseable.java:52)
        ... 31 more
2024-12-05 10:14:40.352 [WARN ] [t.generic.ChannelStateTransformation] - Executing the JS-transformation failed: Failed to execute script.. Pattern: '|in=JSON.parse(input); in.color.x+','+in.color.y+','+in.brightness/2.55;'. Value: '{"brightness":142,"color":{"h":308,"hue":308,"s":100,"saturation":100,"x":0.4066,"y":0.1643},"color_mode":"xy","color_options":{"execute_if_off":false},"color_power_on_behavior":null,"color_temp":153,"do_not_disturb":false,"linkquality":120,"state":"ON"}'
2024-12-05 10:14:40.378 [ERROR] [avascript.transformation.|1011883812] - Failed to execute script: SyntaxError: <eval>:1:0 Expected an operand but found in
in=JSON.parse(input); in.color.x+','+in.color.y+','+in.brightness/2.55;
^
<eval>:1:22 Expected an operand but found in
in=JSON.parse(input); in.color.x+','+in.color.y+','+in.brightness/2.55;
                      ^
        at org.graalvm.polyglot.Context.eval(Context.java:399)
        at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.eval(GraalJSScriptEngine.java:458)
        at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.eval(GraalJSScriptEngine.java:426)
        at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:262)
        at org.openhab.automation.jsscripting.internal.scriptengine.DelegatingScriptEngineWithInvocableAndAutocloseable.eval(DelegatingScriptEngineWithInvocableAndAutocloseable.java:52)
        ... 31 more
2024-12-05 10:14:40.379 [WARN ] [t.generic.ChannelStateTransformation] - Executing the JS-transformation failed: Failed to execute script.. Pattern: '|in=JSON.parse(input); in.color.x+','+in.color.y+','+in.brightness/2.55;'. Value: '{"brightness":142,"color":{"h":308,"hue":308,"s":100,"saturation":100,"x":0.4066,"y":0.1643},"color_mode":"xy","color_options":{"execute_if_off":false},"color_power_on_behavior":null,"color_temp":153,"do_not_disturb":false,"linkquality":112,"state":"ON"}'

Current code for the Thing:

UID: mqtt:topic:c0a82307a5:b05828ee3b
label: OzLight1
thingTypeUID: mqtt:topic
configuration: {}
bridgeUID: mqtt:broker:c0a82307a5
channels:
  - id: OzLight1_Colour
    channelTypeUID: mqtt:color
    label: Colour
    description: Test Colour Channel
    configuration:
      postCommand: false
      retained: false
      transformationPatternOut: JS:|in=input.split(",");'{"color":{"x":'+in[0]+',"y":'+in[1]+'},"brightness":'+(in[2]*2.55)+'}';
      commandTopic: zigbee2mqtt/OzLight1/set
      colorMode: XYY
      transformationPattern: JS:|in=JSON.parse(input);
        in.color.x+','+in.color.y+','+in.brightness/2.55;
      stateTopic: zigbee2mqtt/OzLight1
      off: OFF
      on: ON
  - id: brightness
    channelTypeUID: mqtt:dimmer
    label: Brightness
    description: ""
    configuration:
      commandTopic: zigbee2mqtt/OzLight1/set/brightness
      min: 0
      stateTopic: zigbee2mqtt/OzLight1/get
      max: 254

Turns out, JS inline doesn’t like variables…
Please try

      transformationPatternOut:
        - JS:| '{"color":{"x":' + input.split(',')[0] + ',"y":' +
          input.split(',')[1] + '},"brightness":' + (input.split(',')[2]*2.55) +
          '}';
      formatBeforePublish: "%s"
      commandTopic: zigbee2mqtt/OzLight1/set
      colorMode: XYY
      transformationPattern:
        - JS:| JSON.parse(input).color.x + ',' + JSON.parse(input).color.y + ','
          + JSON.parse(input).brightness/2.55;
      stateTopic: zigbee2mqtt/OzLight1

Edit: :slight_smile: in seems to be a key word in JS…

      transformationPatternOut:
        - JS:|data = input.split(','); '{"color":{"x":' + data[0] + ',"y":' +
          data[1] + '},"brightness":' + (data[2]*2.55) + '}';
      transformationPattern:
        - JS:|data = JSON.parse(input); data.color.x + ',' + data.color.y + ','
          + data.brightness/2.55;
1 Like

@Udo_Hartmann

many Thx!

finally my status from my RGB Stripes is also synchronized in OH

Woot! Thanks Udo, that did it
Now on with my journey of connecting it to Google Assistant!