it’s possible via rule and zigbee2mqtt.
First my setup for zigbee2mtt. I’ve made a script to create the thing config for it.
Thing topic lichterkette "lichterkette" {
Channels:
Type switch : state "state" [ stateTopic = "zigbee2mqtt/lichterkette/state", commandTopic = "zigbee2mqtt/lichterkette/set/state", on = "ON", off = "OFF" ]
Type dimmer : brightness "brightness" [ stateTopic = "zigbee2mqtt/lichterkette/brightness", commandTopic = "zigbee2mqtt/lichterkette/set/brightness", min = 0, max = 254 ]
Type colorHSB : color "color" [
stateTopic = "zigbee2mqtt/lichterkette/color",
commandTopic = "zigbee2mqtt/lichterkette/set/color",
transformationPatternOut="JS:HSBJSON.js"
]
Type string : effectName "effectName" [
stateTopic = "zigbee2mqtt/lichterkette/effect-effect"
]
Type string : effectCmd "effecCmd2" [
commandTopic = "zigbee2mqtt/lichterkette/set/effect"
]
Type number : effectSpeed "effectSpeed" [
stateTopic = "zigbee2mqtt/lichterkette/effect-speed",
min = 0, max = 100
]
Type number : linkquality "linkquality" [ stateTopic = "zigbee2mqtt/lichterkette/linkquality", min = 0, max = 255, unit = "lqi" ]
}
Note the effectCmd
channel (writeonly) and effectSpeed
, effectName
which are readyonly
The items
Group Lichterkette "Lichterkette" <light> (Beleuchtung, gAussen,Zigbee) ["Lightbulb"] {
homekit="Lighting",
ga="Light" [ roomHint="Garten "]
}
Switch Lichterkette_Switch "Schalter" (Lichterkette) ["Light","Switch"] {
channel="mqtt:topic:zigbee:lichterkette:state",
homekit="Lighting.OnState",
ga="lightPower"
}
Dimmer Lichterkette_Brightness "Helligkeit [%.1f %%]" (Lichterkette) ["Control"] {
channel="mqtt:topic:zigbee:lichterkette:brightness",
homekit="Lighting.Brightness",
ga="lightBrightness"
}
Color Lichterkette_Color "Farbe" (Lichterkette) ["Control"] {
channel="mqtt:topic:zigbee:lichterkette:color",
homekit="Lighting.Hue, Lighting.Saturation"
}
String Lichterkette_Alert "Alert" (Lichterkette)
String Lichterkette_Effect_Cmd (Lichterkette) { autoupdate="false", channel="mqtt:topic:zigbee:lichterkette:effectCmd" }
String Lichterkette_Effect_Name "Effekt" (Lichterkette) ["Control"] {
channel="mqtt:topic:zigbee:lichterkette:effectName",
stateDescription=""[
readOnly=false,
options="none=none, steady=steady, snow=snow, rainbow=rainbow, snake=snake,tinkle=tinkle, fireworks=fireworks, flag=flag, waves=waves, updown=updown,vintage=vintage, fading=fading, collide=collide, strobe=strobe,sparkles=sparkles, carnival=carnival,glow=glow"
]
}
Number Lichterkette_Effect_Speed "Effect speed" (Lichterkette) { channel="mqtt:topic:zigbee:lichterkette:effectSpeed" }
Lichterkette_Effect_Cmd
is a dropdown in the UI thanks to stateDescription
.
Now I create a rule to post the right JSON to the effect-mqtt channel.
The timers are for debouncing the settings and changes from the device.
var Timer effectTimer
var Timer effectSetTimer
rule "Lichterkette_Effect_Change"
when Item Lichterkette_Effect_Name changed
or
Item Lichterkette_Effect_Speed changed
then
if ( Lichterkette_Effect_Name.state == UNDEF ) {
return
}
if ( Lichterkette_Effect_Speed.state == UNDEF ) {
return
}
if ( effectTimer !== null ) {
return
}
if(effectSetTimer!== null) {
effectSetTimer.cancel()
}
effectSetTimer = createTimer(now.plusSeconds(1)) [|
val effectSpeed = Lichterkette_Effect_Speed.state.toString
val effectName = Lichterkette_Effect_Name.state.toString
val jsonString = String.format('{"effect" : "%s", "speed" : %s}', effectName, effectSpeed)
Lichterkette_Effect_Cmd.sendCommand(jsonString)
effectTimer = createTimer(now.plusSeconds(5)) [|
effectTimer = null
]
]
end
You could extend the rule for more settings in the json.
greetings