Hello,
experimenting with my first rules here, and I have run into what looks like a switch debounce problem.
I have a (zwave) contact, and I want it to turn on a device when the contact opens, and shut it off when the contact closes. Should be simple:
rule "when front storm door opened turn on front christmas lights"
when
Item FRONT_STORMDOOR_CONTACT received update
then
{
if (FRONT_STORMDOOR_CONTACT.state == OPEN)
{
logInfo("openhab","front storm door opened, turning on front christmas lights")
sendCommand(FRONTHALL_CHRISTMAS_LIGHTS,ON)
}
else
{
logInfo("openhab","front storm door closed, turning off front christmas lights")
sendCommand(FRONTHALL_CHRISTMAS_LIGHTS,OFF)
}
}
end
Problem is that when I trigger the contact switch, it’s actually executing two (or more!!) on/off messages every time the contact makes or breaks:
2016-03-01 18:46:46.950 [INFO ] [g.openhab.model.script.openhab] - front storm door opened, turning on front christmas lights
2016-03-01 18:46:46.995 [INFO ] [g.openhab.model.script.openhab] - front storm door opened, turning on front christmas lights
2016-03-01 18:46:51.735 [INFO ] [g.openhab.model.script.openhab] - front storm door closed, turning off front christmas lights
2016-03-01 18:46:51.748 [INFO ] [g.openhab.model.script.openhab] - front storm door closed, turning off front christmas lights
2016-03-01 18:46:56.103 [INFO ] [g.openhab.model.script.openhab] - front storm door opened, turning on front christmas lights
2016-03-01 18:46:56.137 [INFO ] [g.openhab.model.script.openhab] - front storm door opened, turning on front christmas lights
2016-03-01 18:47:04.247 [INFO ] [g.openhab.model.script.openhab] - front storm door closed, turning off front christmas lights
2016-03-01 18:47:04.458 [INFO ] [g.openhab.model.script.openhab] - front storm door closed, turning off front christmas lights
So my next thought was to manually debounce the switch in software using timers, but that isn’t really giving any better results:
var Timer StormDoorOpenDebounceTimer = null
var Timer StormDoorCloseDebounceTimer = null
rule "when front storm door opened for 300ms turn on front christmas lights"
when
Item FRONT_STORMDOOR_CONTACT received update
then
{
if (FRONT_STORMDOOR_CONTACT.state == OPEN)
{
logInfo("openhab","front storm door opened, debouncing...")
StormDoorOpenDebounceTimer = createTimer(now.plusMillis(300))
[|
logInfo("openhab","front storm door opened for 300ms continuously, turning on front christmas lights")
sendCommand(FRONTHALL_CHRISTMAS_LIGHTS,ON)
]
StormDoorCloseDebounceTimer.cancel
}
else
{
logInfo("openhab","front storm door closed, debouncing...")
StormDoorCloseDebounceTimer = createTimer(now.plusMillis(300))
[|
logInfo("openhab","front storm door closed, turning off front christmas lights")
sendCommand(FRONTHALL_CHRISTMAS_LIGHTS,OFF)
]
StormDoorOpenDebounceTimer.cancel
}
}
end
Which then cranks out:
2016-03-01 18:48:47.029 [INFO ] [g.openhab.model.script.openhab] - front storm door closed, debouncing...
2016-03-01 18:48:47.097 [INFO ] [g.openhab.model.script.openhab] - front storm door closed, debouncing...
2016-03-01 18:48:47.332 [INFO ] [g.openhab.model.script.openhab] - front storm door closed, turning off front christmas lights
2016-03-01 18:48:47.400 [INFO ] [g.openhab.model.script.openhab] - front storm door closed, turning off front christmas lights
So my questions are…
- Is there a better way to make sure only one event is sent on a bouncy contact?
- If not, what am I doing wrong with my debounce code?
Thanks!!