Accessing ZEN71 advanced features in WC?

I picked up a few ZEN71 switches for their multi-tap capabilities, which I want to use for lighting control. I’ve installed the device handler, but I don’t see any way to access the scenes and attributes from webCore. I see a button option (selected in the screenshot below) with 32 available buttons, but they don’t seem to correspond to the attributes.

I’m a bit confused around webCore and the new app, and references to Github repos that don’t exist anymore, so it’s possible I’ve missed something basic.

Thanks for your help.

Webcore is a legacy groovy app that really has not been updated much in the past few years. It will cease when ST ends support for groovy on the platform.

You may find more answers by posting on the webcore forum. I believe I saw a similar question in regards to the zen switches but I may be wrong on that.

WebCoRE has an embedded list of capabilities which is rather dated now. In particular the button capability is only aware of the pushed and held values for the button attribute as that is all there used to be, with a button number being added in the event data to cater for extra values. So, for example, a quadruple tap might be presented as a push on button #6. The same trick was used for multiple physical buttons when components weren’t widely handled.

If you change the Compare to section to use an Expression rather than a Value you can enter the required attribute value as a string.

Thanks! I need to enter both the scene (1 or 2) as well as the attribute, and I haven’t figured out how to specify either. Would I specify the device attribute using the square bracket format? If so, would I use the button attribute?

Here are the scene/attribute values from the docs:

Upper Paddle:
1 x tap: load on; Scene 1, attribute 00
2 x tap: Scene 1, attribute 03
3 x tap: enter inclusion (pairing) mode (only if the switch is not included to the hub); Scene 1, attribute 04
4 x tap: Scene 1, attribute 05
5 x tap: Scene 1, attribute 06
6 x tap: change LED indicator mode (see parameter 2)
held: Scene 1, attribute 01
released: Scene 1, attribute 02

Lower Paddle:
1 x tap: load off; Scene 2, attribute 00
2 x tap: Scene 2, attribute 03
3 x tap: enter exclusion (unpairing) mode; Scene 2, attribute 04
4 x tap: Scene 2, attribute 05
5 x tap: Scene 2, attribute 06
held: Scene 2, attribute 01
released: Scene 2, attribute 02
held for 10 seconds (LED indicator starts blinking): enter the setting menu >> 5 x tap down for factory reset; 5 x tap up to change LED bulb mode (see parameter 11); 2 x tap down to enable the range test tool.

Supported Command Classes:
COMMAND_CLASS_ZWAVEPLUS_INFO_V2,
COMMAND_CLASS_SWITCH_BINARY_V2,
COMMAND_CLASS_CONFIGURATION_V4,
COMMAND_CLASS_CENTRAL_SCENE_V3,
COMMAND_CLASS_ASSOCIATION_V3,
COMMAND_CLASS_MULTI_CHANNEL_ASSOCIATION_V3,
COMMAND_CLASS_ASSOCIATION_GRP_INFO_V3,
COMMAND_CLASS_TRANSPORT_SERVICE_V2,
COMMAND_CLASS_VERSION_V3,
COMMAND_CLASS_MANUFACTURER_SPECIFIC_V1,
COMMAND_CLASS_DEVICE_RESET_LOCALLY_V1,
COMMAND_CLASS_INDICATOR_V3,
COMMAND_CLASS_POWERLEVEL_V1,
COMMAND_CLASS_SECURITY_2,
COMMAND_CLASS_SUPERVISION_V1,
COMMAND_CLASS_FIRMWARE_UPDATE_MD_V5

Thanks again!

I don’t know much about the device but the device handler I’ve seen uses the button attributes down, down_hold, down_2x, down_3x, down_4x, down_5x, up, up_hold, up_2x, up_3x, up_4x, and up_5x which seems to match the above. SmartThings doesn’t have values for ‘released’ and I didn’t see any attempt to borrow other values to handle that.

So I think you probably need to think of the device like a button.

Thanks Graham! I’m starting to make some progress, but I’m not able to come up with the right conditions.

Below is my piston and the log from when I press the rocker as follows:

  1. paddle up
  2. paddle up_2x
  3. paddle down
  4. paddle down_2x
  • The first paddle up appears to generate both of the first 2 events, and one of them triggers my piston and hits the Test 1 case.
  • The paddle up_2x event doesn’t seem to match any condition in the piston.
  • The paddle down generates the “switch is off” event but doesn’t match any condition in the piston.
  • The paddle down_2x then hits the Test 2 case since the switch is now off.

What want is to be able to take action on either up or down 2x events, regardless of current switch state.

Any thoughts?

Log (in chrono order):
10:56:32 AM: debug switch is on
10:56:34 AM: debug paddle up
10:56:34 AM: trace ║ test 1
10:56:34 AM: trace ║ “device: Carport light new, value: up”
10:56:34 AM: trace ║ “command: up”
10:56:42 AM: debug paddle up_2x
10:56:50 AM: debug switch is off
10:56:57 AM: debug paddle down_2x
10:56:57 AM: trace ║ test 2
10:56:57 AM: trace ║ “device: Carport light new, value: down_2x”
10:56:57 AM: trace ║ “command: down_2x”

The only trigger condition is the button gets pushed, which means the piston should be subscribing to the button attribute and executing whenever there is an event. It will not be executed when the switch is toggled.

So the up seems fine. The piston has run and hit ‘Test 1’ because the switch is on. It doesn’t hit ‘Test 2’ because the switch is off. It doesn’t hit ‘Test 3’ because the button wasn’t pushed, it was up.

I don’t know what has happened with your up_2x and down. I would expect the piston to execute on each occasion and one of ‘Test 1’ or ‘Test 2’ to be hit.

The down_2x looks to be behaving as expected. Again if you want to act on the paddle action you need to test for button gets down_2x which requires working around the limitations in webCoRE by defining the attribute value yourself.

Generally speaking the full webCoRE logs are the best way of seeing what webCoRE thinks is going on.

I’m not sure what’s happening here. It seems the held and released events are triggering the piston for both up and down, which works for my purposes. They’re all being caught via the Test 1 case because the light is on, but that’s ok (I think) as long as it causes my Test 6 or Test code to run.

So I made a stripped-down version that goes right to the hold checks, and it doesn’t even fire, though it appears to be subscribed to the same switch and shows the lightning bolt (I confirmed the switch itself is still on).

What did I miss here?

This works (I think):

6/10/2022, 6:18:27 PM +444ms
+1ms 	╔Received event [Carport light new].button = down_released with a delay of 39ms
+54ms 	║RunTime Analysis CS > 14ms > PS > 5ms > PE > 35ms > CE
+57ms 	║Runtime (50133 bytes) successfully initialized in 5ms (v0.3.109.20181207) (55ms)
+58ms 	║╔Execution stage started
+70ms 	║║Comparison (enum) on is (string) on = true (1ms)
+72ms 	║║Condition #2 evaluated true (9ms)
+73ms 	║║Condition group #1 evaluated true (state did not change) (10ms)
+75ms 	║║Cancelling statement #3's schedules...
+80ms 	║║test 1
+81ms 	║║Executed virtual command log (1ms)
+90ms 	║║Calculating (string) "device: + (string) Carport light new >> (string) "device: Carport light new
+93ms 	║║Calculating (string) "device: Carport light new + (string) , value: >> (string) "device: Carport light new, value:
+96ms 	║║Calculating (string) "device: Carport light new, value: + (string) down_released >> (string) "device: Carport light new, value: down_released
+98ms 	║║Calculating (string) "device: Carport light new, value: down_released + (string) " >> (string) "device: Carport light new, value: down_released"
+102ms 	║║"device: Carport light new, value: down_released"
+103ms 	║║Executed virtual command log (1ms)
+109ms 	║║Calculating (string) "command: + (string) down_released >> (string) "command: down_released
+112ms 	║║Calculating (string) "command: down_released + (string) " >> (string) "command: down_released"
+116ms 	║║"command: down_released"
+117ms 	║║Executed virtual command log (2ms)
+130ms 	║║Comparison (enum) on is (string) off = false (2ms)
+132ms 	║║Condition #7 evaluated false (11ms)
+133ms 	║║Condition group #6 evaluated false (state did not change) (12ms)
+138ms 	║║Comparison (enum) down_released gets (string) pushed = false (1ms)
+139ms 	║║Condition #19 evaluated false (4ms)
+140ms 	║║Condition group #18 evaluated false (state did not change) (5ms)
+146ms 	║║Comparison (enum) down_released gets (string) pushed = false (0ms)
+147ms 	║║Condition #25 evaluated false (4ms)
+148ms 	║║Condition group #24 evaluated false (state did not change) (6ms)
+153ms 	║║Comparison (enum) down_released gets (string) held = false (1ms)
+154ms 	║║Condition #31 evaluated false (4ms)
+155ms 	║║Condition group #30 evaluated false (state did not change) (5ms)
+161ms 	║║Comparison (dynamic) down_released is (string) up_hold = false (1ms)
+163ms 	║║Condition #37 evaluated false (5ms)
+164ms 	║║Condition group #36 evaluated false (state did not change) (7ms)
+170ms 	║║Comparison (dynamic) down_released is (string) down_hold = false (2ms)
+171ms 	║║Cancelling condition #41's schedules...
+172ms 	║║Condition #41 evaluated false (6ms)
+173ms 	║║Cancelling condition #40's schedules...
+174ms 	║║Condition group #40 evaluated false (state changed) (8ms)
+176ms 	║╚Execution stage complete. (117ms)
+177ms 	╚Event processed successfully (176ms)
6/10/2022, 6:18:26 PM +719ms
+1ms 	╔Received event [Carport light new].button = down_hold with a delay of 39ms
+45ms 	║RunTime Analysis CS > 16ms > PS > 4ms > PE > 25ms > CE
+49ms 	║Runtime (50140 bytes) successfully initialized in 4ms (v0.3.109.20181207) (46ms)
+50ms 	║╔Execution stage started
+63ms 	║║Comparison (enum) on is (string) on = true (1ms)
+65ms 	║║Condition #2 evaluated true (10ms)
+66ms 	║║Condition group #1 evaluated true (state did not change) (12ms)
+68ms 	║║Cancelling statement #3's schedules...
+73ms 	║║test 1
+74ms 	║║Executed virtual command log (2ms)
+82ms 	║║Calculating (string) "device: + (string) Carport light new >> (string) "device: Carport light new
+85ms 	║║Calculating (string) "device: Carport light new + (string) , value: >> (string) "device: Carport light new, value:
+88ms 	║║Calculating (string) "device: Carport light new, value: + (string) down_hold >> (string) "device: Carport light new, value: down_hold
+90ms 	║║Calculating (string) "device: Carport light new, value: down_hold + (string) " >> (string) "device: Carport light new, value: down_hold"
+94ms 	║║"device: Carport light new, value: down_hold"
+94ms 	║║Executed virtual command log (1ms)
+101ms 	║║Calculating (string) "command: + (string) down_hold >> (string) "command: down_hold
+103ms 	║║Calculating (string) "command: down_hold + (string) " >> (string) "command: down_hold"
+107ms 	║║"command: down_hold"
+108ms 	║║Executed virtual command log (1ms)
+118ms 	║║Comparison (enum) on is (string) off = false (1ms)
+120ms 	║║Condition #7 evaluated false (8ms)
+121ms 	║║Condition group #6 evaluated false (state did not change) (10ms)
+126ms 	║║Comparison (enum) down_hold gets (string) pushed = false (1ms)
+127ms 	║║Condition #19 evaluated false (4ms)
+128ms 	║║Condition group #18 evaluated false (state did not change) (5ms)
+133ms 	║║Comparison (enum) down_hold gets (string) pushed = false (1ms)
+135ms 	║║Condition #25 evaluated false (4ms)
+135ms 	║║Condition group #24 evaluated false (state did not change) (5ms)
+141ms 	║║Comparison (enum) down_hold gets (string) held = false (1ms)
+143ms 	║║Condition #31 evaluated false (5ms)
+144ms 	║║Condition group #30 evaluated false (state did not change) (6ms)
+150ms 	║║Comparison (dynamic) down_hold is (string) up_hold = false (1ms)
+151ms 	║║Condition #37 evaluated false (5ms)
+152ms 	║║Condition group #36 evaluated false (state did not change) (6ms)
+159ms 	║║Comparison (dynamic) down_hold is (string) down_hold = true (1ms)
+160ms 	║║Cancelling condition #41's schedules...
+161ms 	║║Condition #41 evaluated true (6ms)
+162ms 	║║Cancelling condition #40's schedules...
+163ms 	║║Condition group #40 evaluated true (state changed) (9ms)
+165ms 	║║Cancelling statement #42's schedules...
+170ms 	║║test 7 - down_hold detected
+171ms 	║║Executed virtual command log (2ms)
+173ms 	║╚Execution stage complete. (124ms)
+174ms 	╚Event processed successfully (174ms)
6/10/2022, 6:18:24 PM +948ms
+1ms 	╔Received event [Carport light new].button = up_released with a delay of 42ms
+55ms 	║RunTime Analysis CS > 19ms > PS > 4ms > PE > 32ms > CE
+58ms 	║Runtime (50128 bytes) successfully initialized in 4ms (v0.3.109.20181207) (56ms)
+59ms 	║╔Execution stage started
+72ms 	║║Comparison (enum) on is (string) on = true (2ms)
+73ms 	║║Condition #2 evaluated true (10ms)
+74ms 	║║Condition group #1 evaluated true (state did not change) (11ms)
+76ms 	║║Cancelling statement #3's schedules...
+81ms 	║║test 1
+82ms 	║║Executed virtual command log (1ms)
+91ms 	║║Calculating (string) "device: + (string) Carport light new >> (string) "device: Carport light new
+94ms 	║║Calculating (string) "device: Carport light new + (string) , value: >> (string) "device: Carport light new, value:
+98ms 	║║Calculating (string) "device: Carport light new, value: + (string) up_released >> (string) "device: Carport light new, value: up_released
+101ms 	║║Calculating (string) "device: Carport light new, value: up_released + (string) " >> (string) "device: Carport light new, value: up_released"
+104ms 	║║"device: Carport light new, value: up_released"
+105ms 	║║Executed virtual command log (1ms)
+112ms 	║║Calculating (string) "command: + (string) up_released >> (string) "command: up_released
+114ms 	║║Calculating (string) "command: up_released + (string) " >> (string) "command: up_released"
+118ms 	║║"command: up_released"
+119ms 	║║Executed virtual command log (1ms)
+129ms 	║║Comparison (enum) on is (string) off = false (1ms)
+131ms 	║║Condition #7 evaluated false (9ms)
+132ms 	║║Condition group #6 evaluated false (state did not change) (10ms)
+137ms 	║║Comparison (enum) up_released gets (string) pushed = false (0ms)
+138ms 	║║Condition #19 evaluated false (4ms)
+139ms 	║║Condition group #18 evaluated false (state did not change) (5ms)
+144ms 	║║Comparison (enum) up_released gets (string) pushed = false (1ms)
+145ms 	║║Condition #25 evaluated false (4ms)
+146ms 	║║Condition group #24 evaluated false (state did not change) (5ms)
+152ms 	║║Comparison (enum) up_released gets (string) held = false (1ms)
+154ms 	║║Condition #31 evaluated false (4ms)
+155ms 	║║Condition group #30 evaluated false (state did not change) (6ms)
+160ms 	║║Comparison (dynamic) up_released is (string) up_hold = false (1ms)
+162ms 	║║Cancelling condition #37's schedules...
+163ms 	║║Condition #37 evaluated false (5ms)
+164ms 	║║Cancelling condition #36's schedules...
+165ms 	║║Condition group #36 evaluated false (state changed) (7ms)
+170ms 	║║Comparison (dynamic) up_released is (string) down_hold = false (1ms)
+172ms 	║║Condition #41 evaluated false (5ms)
+173ms 	║║Condition group #40 evaluated false (state did not change) (6ms)
+175ms 	║╚Execution stage complete. (115ms)
+176ms 	╚Event processed successfully (175ms)
6/10/2022, 6:18:24 PM +464ms
+1ms 	╔Received event [Carport light new].button = up_hold with a delay of 47ms
+43ms 	║RunTime Analysis CS > 15ms > PS > 4ms > PE > 24ms > CE
+46ms 	║Runtime (50144 bytes) successfully initialized in 4ms (v0.3.109.20181207) (45ms)
+47ms 	║╔Execution stage started
+59ms 	║║Comparison (enum) on is (string) on = true (1ms)
+61ms 	║║Condition #2 evaluated true (10ms)
+62ms 	║║Condition group #1 evaluated true (state did not change) (10ms)
+64ms 	║║Cancelling statement #3's schedules...
+69ms 	║║test 1
+70ms 	║║Executed virtual command log (1ms)
+78ms 	║║Calculating (string) "device: + (string) Carport light new >> (string) "device: Carport light new
+81ms 	║║Calculating (string) "device: Carport light new + (string) , value: >> (string) "device: Carport light new, value:
+83ms 	║║Calculating (string) "device: Carport light new, value: + (string) up_hold >> (string) "device: Carport light new, value: up_hold
+86ms 	║║Calculating (string) "device: Carport light new, value: up_hold + (string) " >> (string) "device: Carport light new, value: up_hold"
+89ms 	║║"device: Carport light new, value: up_hold"
+90ms 	║║Executed virtual command log (1ms)
+97ms 	║║Calculating (string) "command: + (string) up_hold >> (string) "command: up_hold
+99ms 	║║Calculating (string) "command: up_hold + (string) " >> (string) "command: up_hold"
+102ms 	║║"command: up_hold"
+103ms 	║║Executed virtual command log (1ms)
+114ms 	║║Comparison (enum) on is (string) off = false (1ms)
+115ms 	║║Condition #7 evaluated false (9ms)
+116ms 	║║Condition group #6 evaluated false (state did not change) (11ms)
+122ms 	║║Comparison (enum) up_hold gets (string) pushed = false (0ms)
+123ms 	║║Condition #19 evaluated false (4ms)
+124ms 	║║Condition group #18 evaluated false (state did not change) (6ms)
+133ms 	║║Comparison (enum) up_hold gets (string) pushed = false (0ms)
+135ms 	║║Condition #25 evaluated false (6ms)
+136ms 	║║Condition group #24 evaluated false (state did not change) (9ms)
+143ms 	║║Comparison (enum) up_hold gets (string) held = false (1ms)
+144ms 	║║Condition #31 evaluated false (4ms)
+145ms 	║║Condition group #30 evaluated false (state did not change) (6ms)
+152ms 	║║Comparison (dynamic) up_hold is (string) up_hold = true (2ms)
+153ms 	║║Cancelling condition #37's schedules...
+154ms 	║║Condition #37 evaluated true (6ms)
+155ms 	║║Cancelling condition #36's schedules...
+156ms 	║║Condition group #36 evaluated true (state changed) (8ms)
+158ms 	║║Cancelling statement #38's schedules...
+163ms 	║║test 6 - up_hold detected
+164ms 	║║Executed virtual command log (2ms)
+170ms 	║║Comparison (dynamic) up_hold is (string) down_hold = false (1ms)
+171ms 	║║Condition #41 evaluated false (4ms)
+172ms 	║║Condition group #40 evaluated false (state did not change) (6ms)
+174ms 	║╚Execution stage complete. (127ms)
+175ms 	╚Event processed successfully (175ms)

This doesn’t:

Logs

The log is empty

This works. Thanks for all your help, Graham!

6/10/2022, 10:47:14 PM +36ms
+1ms 	╔Received event [Carport light new].button = up_released with a delay of 41ms
+10075ms 	║RunTime Analysis CS > 17ms > PS > 10017ms > PE > 41ms > CE
+10076ms 	║Piston waited at a semaphore for 10013ms
+10079ms 	║Runtime (49654 bytes) successfully initialized in 10017ms (v0.3.109.20181207) (10076ms)
+10080ms 	║╔Execution stage started
+10086ms 	║║Comparison (enum) up_released gets (string) up_2x = false (0ms)
+10088ms 	║║Condition #19 evaluated false (3ms)
+10089ms 	║║Condition group #18 evaluated false (state did not change) (5ms)
+10094ms 	║║Comparison (enum) up_released gets (string) down_2x = false (0ms)
+10095ms 	║║Condition #25 evaluated false (4ms)
+10096ms 	║║Condition group #24 evaluated false (state did not change) (5ms)
+10101ms 	║║Comparison (enum) up_released gets (string) up_3x = false (1ms)
+10102ms 	║║Condition #46 evaluated false (4ms)
+10103ms 	║║Condition group #45 evaluated false (state did not change) (5ms)
+10108ms 	║║Comparison (enum) up_released gets (string) down_3x = false (1ms)
+10110ms 	║║Condition #52 evaluated false (4ms)
+10111ms 	║║Condition group #51 evaluated false (state did not change) (5ms)
+10116ms 	║║Comparison (enum) up_released gets (string) up_hold = false (1ms)
+10117ms 	║║Condition #31 evaluated false (4ms)
+10118ms 	║║Condition group #30 evaluated false (state did not change) (5ms)
+10124ms 	║║Comparison (enum) up_released gets (string) down_hold = false (0ms)
+10125ms 	║║Condition #61 evaluated false (4ms)
+10126ms 	║║Condition group #60 evaluated false (state did not change) (6ms)
+10132ms 	║║Comparison (dynamic) up_released is (string) up_hold = false (1ms)
+10133ms 	║║Condition #37 evaluated false (5ms)
+10134ms 	║║Condition group #36 evaluated false (state did not change) (6ms)
+10140ms 	║║Comparison (dynamic) up_released is (string) down_hold = false (1ms)
+10142ms 	║║Condition #41 evaluated false (4ms)
+10142ms 	║║Condition group #40 evaluated false (state did not change) (6ms)
+10144ms 	║╚Execution stage complete. (65ms)
+10145ms 	╚Event processed successfully (10145ms)
6/10/2022, 10:47:16 PM +922ms
+2ms 	╔Received event [Carport light new].button = down_released with a delay of 48ms
+74ms 	║RunTime Analysis CS > 19ms > PS > 6ms > PE > 49ms > CE
+77ms 	║Runtime (49554 bytes) successfully initialized in 6ms (v0.3.109.20181207) (75ms)
+78ms 	║╔Execution stage started
+85ms 	║║Comparison (enum) down_released gets (string) up_2x = false (1ms)
+87ms 	║║Condition #19 evaluated false (5ms)
+88ms 	║║Condition group #18 evaluated false (state did not change) (6ms)
+93ms 	║║Comparison (enum) down_released gets (string) down_2x = false (0ms)
+95ms 	║║Condition #25 evaluated false (4ms)
+96ms 	║║Condition group #24 evaluated false (state did not change) (6ms)
+101ms 	║║Comparison (enum) down_released gets (string) up_3x = false (1ms)
+102ms 	║║Condition #46 evaluated false (4ms)
+103ms 	║║Condition group #45 evaluated false (state did not change) (5ms)
+109ms 	║║Comparison (enum) down_released gets (string) down_3x = false (1ms)
+111ms 	║║Condition #52 evaluated false (4ms)
+112ms 	║║Condition group #51 evaluated false (state did not change) (5ms)
+118ms 	║║Comparison (enum) down_released gets (string) up_hold = false (2ms)
+119ms 	║║Condition #31 evaluated false (5ms)
+120ms 	║║Condition group #30 evaluated false (state did not change) (6ms)
+126ms 	║║Comparison (enum) down_released gets (string) down_hold = false (0ms)
+127ms 	║║Cancelling condition #61's schedules...
+128ms 	║║Condition #61 evaluated false (5ms)
+129ms 	║║Cancelling condition #60's schedules...
+130ms 	║║Condition group #60 evaluated false (state changed) (8ms)
+137ms 	║║Comparison (dynamic) down_released is (string) up_hold = false (1ms)
+138ms 	║║Condition #37 evaluated false (5ms)
+139ms 	║║Condition group #36 evaluated false (state did not change) (7ms)
+146ms 	║║Comparison (dynamic) down_released is (string) down_hold = false (2ms)
+147ms 	║║Cancelling condition #41's schedules...
+148ms 	║║Condition #41 evaluated false (6ms)
+149ms 	║║Cancelling condition #40's schedules...
+150ms 	║║Condition group #40 evaluated false (state changed) (9ms)
+152ms 	║╚Execution stage complete. (74ms)
+153ms 	╚Event processed successfully (153ms)
6/10/2022, 10:47:16 PM +585ms
+1ms 	╔Received event [Carport light new].button = down_hold with a delay of 45ms
+61ms 	║RunTime Analysis CS > 18ms > PS > 4ms > PE > 40ms > CE
+64ms 	║Runtime (49547 bytes) successfully initialized in 4ms (v0.3.109.20181207) (63ms)
+65ms 	║╔Execution stage started
+72ms 	║║Comparison (enum) down_hold gets (string) up_2x = false (0ms)
+73ms 	║║Condition #19 evaluated false (4ms)
+74ms 	║║Condition group #18 evaluated false (state did not change) (5ms)
+79ms 	║║Comparison (enum) down_hold gets (string) down_2x = false (1ms)
+80ms 	║║Condition #25 evaluated false (4ms)
+81ms 	║║Condition group #24 evaluated false (state did not change) (5ms)
+86ms 	║║Comparison (enum) down_hold gets (string) up_3x = false (0ms)
+88ms 	║║Condition #46 evaluated false (4ms)
+89ms 	║║Condition group #45 evaluated false (state did not change) (6ms)
+95ms 	║║Comparison (enum) down_hold gets (string) down_3x = false (0ms)
+96ms 	║║Condition #52 evaluated false (5ms)
+97ms 	║║Condition group #51 evaluated false (state did not change) (6ms)
+104ms 	║║Comparison (enum) down_hold gets (string) up_hold = false (1ms)
+106ms 	║║Cancelling condition #31's schedules...
+107ms 	║║Condition #31 evaluated false (6ms)
+108ms 	║║Cancelling condition #30's schedules...
+109ms 	║║Condition group #30 evaluated false (state changed) (8ms)
+114ms 	║║Comparison (enum) down_hold gets (string) down_hold = true (1ms)
+115ms 	║║Cancelling condition #61's schedules...
+116ms 	║║Condition #61 evaluated true (5ms)
+117ms 	║║Cancelling condition #60's schedules...
+118ms 	║║Condition group #60 evaluated true (state changed) (7ms)
+120ms 	║║Cancelling statement #62's schedules...
+125ms 	║║button down_hold
+126ms 	║║Executed virtual command log (2ms)
+134ms 	║║Calculating (string) "device: + (string) Carport light new >> (string) "device: Carport light new
+137ms 	║║Calculating (string) "device: Carport light new + (string) , value: >> (string) "device: Carport light new, value:
+140ms 	║║Calculating (string) "device: Carport light new, value: + (string) down_hold >> (string) "device: Carport light new, value: down_hold
+143ms 	║║Calculating (string) "device: Carport light new, value: down_hold + (string) " >> (string) "device: Carport light new, value: down_hold"
+146ms 	║║"device: Carport light new, value: down_hold"
+147ms 	║║Executed virtual command log (2ms)
+153ms 	║║Comparison (dynamic) down_hold is (string) up_hold = false (1ms)
+155ms 	║║Cancelling condition #37's schedules...
+156ms 	║║Condition #37 evaluated false (5ms)
+157ms 	║║Cancelling condition #36's schedules...
+157ms 	║║Condition group #36 evaluated false (state changed) (8ms)
+164ms 	║║Comparison (dynamic) down_hold is (string) down_hold = true (1ms)
+165ms 	║║Cancelling condition #41's schedules...
+166ms 	║║Condition #41 evaluated true (6ms)
+167ms 	║║Cancelling condition #40's schedules...
+168ms 	║║Condition group #40 evaluated true (state changed) (8ms)
+170ms 	║║Cancelling statement #42's schedules...
+174ms 	║║down_hold
+175ms 	║║Executed virtual command log (1ms)
+178ms 	║╚Execution stage complete. (113ms)
+179ms 	╚Event processed successfully (179ms)
6/10/2022, 10:47:13 PM +838ms
+1ms 	╔Received event [Carport light new].button = up_hold with a delay of 39ms
+54ms 	║RunTime Analysis CS > 14ms > PS > 4ms > PE > 35ms > CE
+56ms 	║Runtime (49549 bytes) successfully initialized in 4ms (v0.3.109.20181207) (54ms)
+57ms 	║╔Execution stage started
+64ms 	║║Comparison (enum) up_hold gets (string) up_2x = false (1ms)
+65ms 	║║Condition #19 evaluated false (4ms)
+66ms 	║║Condition group #18 evaluated false (state did not change) (5ms)
+72ms 	║║Comparison (enum) up_hold gets (string) down_2x = false (1ms)
+73ms 	║║Condition #25 evaluated false (4ms)
+74ms 	║║Condition group #24 evaluated false (state did not change) (5ms)
+80ms 	║║Comparison (enum) up_hold gets (string) up_3x = false (0ms)
+81ms 	║║Condition #46 evaluated false (4ms)
+82ms 	║║Condition group #45 evaluated false (state did not change) (6ms)
+87ms 	║║Comparison (enum) up_hold gets (string) down_3x = false (0ms)
+89ms 	║║Condition #52 evaluated false (4ms)
+90ms 	║║Condition group #51 evaluated false (state did not change) (6ms)
+95ms 	║║Comparison (enum) up_hold gets (string) up_hold = true (1ms)
+97ms 	║║Cancelling condition #31's schedules...
+98ms 	║║Condition #31 evaluated true (5ms)
+99ms 	║║Cancelling condition #30's schedules...
+100ms 	║║Condition group #30 evaluated true (state changed) (7ms)
+102ms 	║║Cancelling statement #32's schedules...
+109ms 	║║button hold
+110ms 	║║Executed virtual command log (1ms)
+118ms 	║║Calculating (string) "device: + (string) Carport light new >> (string) "device: Carport light new
+122ms 	║║Calculating (string) "device: Carport light new + (string) value: >> (string) "device: Carport light new value:
+124ms 	║║Calculating (string) "device: Carport light new value: + (string) up_hold >> (string) "device: Carport light new value: up_hold
+127ms 	║║Calculating (string) "device: Carport light new value: up_hold + (string) " >> (string) "device: Carport light new value: up_hold"
+130ms 	║║"device: Carport light new value: up_hold"
+131ms 	║║Executed virtual command log (1ms)
+210ms 	║║Comparison (enum) up_hold gets (string) down_hold = false (73ms)
+211ms 	║║Condition #61 evaluated false (77ms)
+213ms 	║║Condition group #60 evaluated false (state did not change) (78ms)
+219ms 	║║Comparison (dynamic) up_hold is (string) up_hold = true (1ms)
+220ms 	║║Cancelling condition #37's schedules...
+221ms 	║║Condition #37 evaluated true (6ms)
+222ms 	║║Cancelling condition #36's schedules...
+223ms 	║║Condition group #36 evaluated true (state changed) (8ms)
+225ms 	║║Cancelling statement #38's schedules...
+230ms 	║║up_hold
+231ms 	║║Executed virtual command log (1ms)
+237ms 	║║Comparison (dynamic) up_hold is (string) down_hold = false (1ms)
+239ms 	║║Condition #41 evaluated false (4ms)
+240ms 	║║Condition group #40 evaluated false (state did not change) (6ms)
+242ms 	║╚Execution stage complete. (184ms)
+243ms 	╚Event processed successfully (243ms)
6/10/2022, 10:47:10 PM +824ms
+1ms 	╔Received event [Carport light new].button = down_4x with a delay of 42ms
+69ms 	║RunTime Analysis CS > 16ms > PS > 6ms > PE > 46ms > CE
+72ms 	║Runtime (49543 bytes) successfully initialized in 6ms (v0.3.109.20181207) (69ms)
+72ms 	║╔Execution stage started
+80ms 	║║Comparison (enum) down_4x gets (string) up_2x = false (0ms)
+81ms 	║║Condition #19 evaluated false (5ms)
+82ms 	║║Condition group #18 evaluated false (state did not change) (6ms)
+88ms 	║║Comparison (enum) down_4x gets (string) down_2x = false (1ms)
+89ms 	║║Condition #25 evaluated false (4ms)
+90ms 	║║Condition group #24 evaluated false (state did not change) (5ms)
+95ms 	║║Comparison (enum) down_4x gets (string) up_3x = false (0ms)
+97ms 	║║Condition #46 evaluated false (4ms)
+98ms 	║║Condition group #45 evaluated false (state did not change) (6ms)
+103ms 	║║Comparison (enum) down_4x gets (string) down_3x = false (1ms)
+105ms 	║║Condition #52 evaluated false (4ms)
+106ms 	║║Condition group #51 evaluated false (state did not change) (5ms)
+111ms 	║║Comparison (enum) down_4x gets (string) up_hold = false (1ms)
+112ms 	║║Condition #31 evaluated false (4ms)
+113ms 	║║Condition group #30 evaluated false (state did not change) (5ms)
+119ms 	║║Comparison (enum) down_4x gets (string) down_hold = false (1ms)
+120ms 	║║Condition #61 evaluated false (4ms)
+121ms 	║║Condition group #60 evaluated false (state did not change) (5ms)
+127ms 	║║Comparison (dynamic) down_4x is (string) up_hold = false (1ms)
+129ms 	║║Condition #37 evaluated false (5ms)
+130ms 	║║Condition group #36 evaluated false (state did not change) (6ms)
+136ms 	║║Comparison (dynamic) down_4x is (string) down_hold = false (1ms)
+137ms 	║║Condition #41 evaluated false (5ms)
+138ms 	║║Condition group #40 evaluated false (state did not change) (6ms)
+140ms 	║╚Execution stage complete. (68ms)
+141ms 	╚Event processed successfully (141ms)
6/10/2022, 10:47:08 PM +740ms
+1ms 	╔Received event [Carport light new].button = up_4x with a delay of 40ms
+54ms 	║RunTime Analysis CS > 15ms > PS > 5ms > PE > 34ms > CE
+57ms 	║Runtime (49539 bytes) successfully initialized in 5ms (v0.3.109.20181207) (55ms)
+58ms 	║╔Execution stage started
+64ms 	║║Comparison (enum) up_4x gets (string) up_2x = false (1ms)
+65ms 	║║Condition #19 evaluated false (4ms)
+66ms 	║║Condition group #18 evaluated false (state did not change) (5ms)
+71ms 	║║Comparison (enum) up_4x gets (string) down_2x = false (0ms)
+73ms 	║║Condition #25 evaluated false (3ms)
+73ms 	║║Condition group #24 evaluated false (state did not change) (5ms)
+78ms 	║║Comparison (enum) up_4x gets (string) up_3x = false (0ms)
+80ms 	║║Cancelling condition #46's schedules...
+80ms 	║║Condition #46 evaluated false (4ms)
+81ms 	║║Cancelling condition #45's schedules...
+82ms 	║║Condition group #45 evaluated false (state changed) (7ms)
+87ms 	║║Comparison (enum) up_4x gets (string) down_3x = false (1ms)
+88ms 	║║Condition #52 evaluated false (4ms)
+89ms 	║║Condition group #51 evaluated false (state did not change) (5ms)
+94ms 	║║Comparison (enum) up_4x gets (string) up_hold = false (1ms)
+95ms 	║║Condition #31 evaluated false (4ms)
+96ms 	║║Condition group #30 evaluated false (state did not change) (5ms)
+101ms 	║║Comparison (enum) up_4x gets (string) down_hold = false (1ms)
+102ms 	║║Condition #61 evaluated false (4ms)
+103ms 	║║Condition group #60 evaluated false (state did not change) (5ms)
+109ms 	║║Comparison (dynamic) up_4x is (string) up_hold = false (1ms)
+110ms 	║║Condition #37 evaluated false (4ms)
+111ms 	║║Condition group #36 evaluated false (state did not change) (6ms)
+117ms 	║║Comparison (dynamic) up_4x is (string) down_hold = false (1ms)
+118ms 	║║Condition #41 evaluated false (5ms)
+119ms 	║║Condition group #40 evaluated false (state did not change) (6ms)
+121ms 	║╚Execution stage complete. (64ms)
+122ms 	╚Event processed successfully (122ms)
6/10/2022, 10:46:56 PM +545ms
+1ms 	╔Received event [Carport light new].button = up_3x with a delay of 35ms
+52ms 	║RunTime Analysis CS > 14ms > PS > 5ms > PE > 33ms > CE
+55ms 	║Runtime (49545 bytes) successfully initialized in 5ms (v0.3.109.20181207) (53ms)
+56ms 	║╔Execution stage started
+63ms 	║║Comparison (enum) up_3x gets (string) up_2x = false (1ms)
+65ms 	║║Condition #19 evaluated false (4ms)
+66ms 	║║Condition group #18 evaluated false (state did not change) (5ms)
+71ms 	║║Comparison (enum) up_3x gets (string) down_2x = false (1ms)
+73ms 	║║Cancelling condition #25's schedules...
+74ms 	║║Condition #25 evaluated false (6ms)
+75ms 	║║Cancelling condition #24's schedules...
+76ms 	║║Condition group #24 evaluated false (state changed) (8ms)
+82ms 	║║Comparison (enum) up_3x gets (string) up_3x = true (1ms)
+84ms 	║║Cancelling condition #46's schedules...
+84ms 	║║Condition #46 evaluated true (6ms)
+86ms 	║║Cancelling condition #45's schedules...
+87ms 	║║Condition group #45 evaluated true (state changed) (8ms)
+89ms 	║║Cancelling statement #47's schedules...
+94ms 	║║button 1 up_3x
+95ms 	║║Executed virtual command log (2ms)
+104ms 	║║Calculating (string) "device: + (string) Carport light new >> (string) "device: Carport light new
+107ms 	║║Calculating (string) "device: Carport light new + (string) , value: >> (string) "device: Carport light new, value:
+110ms 	║║Calculating (string) "device: Carport light new, value: + (string) up_3x >> (string) "device: Carport light new, value: up_3x
+113ms 	║║Calculating (string) "device: Carport light new, value: up_3x + (string) " >> (string) "device: Carport light new, value: up_3x"
+117ms 	║║"device: Carport light new, value: up_3x"
+118ms 	║║Executed virtual command log (1ms)
+124ms 	║║Comparison (enum) up_3x gets (string) down_3x = false (0ms)
+125ms 	║║Condition #52 evaluated false (4ms)
+126ms 	║║Condition group #51 evaluated false (state did not change) (6ms)
+131ms 	║║Comparison (enum) up_3x gets (string) up_hold = false (0ms)
+133ms 	║║Condition #31 evaluated false (5ms)
+134ms 	║║Condition group #30 evaluated false (state did not change) (6ms)
+140ms 	║║Comparison (enum) up_3x gets (string) down_hold = false (0ms)
+141ms 	║║Condition #61 evaluated false (4ms)
+142ms 	║║Condition group #60 evaluated false (state did not change) (6ms)
+148ms 	║║Comparison (dynamic) up_3x is (string) up_hold = false (1ms)
+150ms 	║║Condition #37 evaluated false (6ms)
+151ms 	║║Condition group #36 evaluated false (state did not change) (7ms)
+157ms 	║║Comparison (dynamic) up_3x is (string) down_hold = false (1ms)
+159ms 	║║Condition #41 evaluated false (5ms)
+160ms 	║║Condition group #40 evaluated false (state did not change) (6ms)
+162ms 	║╚Execution stage complete. (106ms)
+163ms 	╚Event processed successfully (163ms)
6/10/2022, 10:46:52 PM +394ms
+1ms 	╔Received event [Carport light new].button = down_2x with a delay of 35ms
+50ms 	║RunTime Analysis CS > 14ms > PS > 4ms > PE > 32ms > CE
+53ms 	║Runtime (49541 bytes) successfully initialized in 4ms (v0.3.109.20181207) (52ms)
+54ms 	║╔Execution stage started
+61ms 	║║Comparison (enum) down_2x gets (string) up_2x = false (1ms)
+62ms 	║║Cancelling condition #19's schedules...
+63ms 	║║Condition #19 evaluated false (5ms)
+64ms 	║║Cancelling condition #18's schedules...
+65ms 	║║Condition group #18 evaluated false (state changed) (8ms)
+80ms 	║║Comparison (enum) down_2x gets (string) down_2x = true (10ms)
+81ms 	║║Cancelling condition #25's schedules...
+82ms 	║║Condition #25 evaluated true (14ms)
+83ms 	║║Cancelling condition #24's schedules...
+84ms 	║║Condition group #24 evaluated true (state changed) (17ms)
+86ms 	║║Cancelling statement #57's schedules...
+91ms 	║║button 1 down_2x
+92ms 	║║Executed virtual command log (1ms)
+100ms 	║║Calculating (string) "device: + (string) Carport light new >> (string) "device: Carport light new
+103ms 	║║Calculating (string) "device: Carport light new + (string) , value: >> (string) "device: Carport light new, value:
+106ms 	║║Calculating (string) "device: Carport light new, value: + (string) down_2x >> (string) "device: Carport light new, value: down_2x
+109ms 	║║Calculating (string) "device: Carport light new, value: down_2x + (string) " >> (string) "device: Carport light new, value: down_2x"
+112ms 	║║"device: Carport light new, value: down_2x"
+113ms 	║║Executed virtual command log (2ms)
+118ms 	║║Comparison (enum) down_2x gets (string) up_3x = false (0ms)
+120ms 	║║Condition #46 evaluated false (4ms)
+121ms 	║║Condition group #45 evaluated false (state did not change) (6ms)
+126ms 	║║Comparison (enum) down_2x gets (string) down_3x = false (1ms)
+127ms 	║║Condition #52 evaluated false (4ms)
+128ms 	║║Condition group #51 evaluated false (state did not change) (5ms)
+133ms 	║║Comparison (enum) down_2x gets (string) up_hold = false (1ms)
+134ms 	║║Condition #31 evaluated false (4ms)
+135ms 	║║Condition group #30 evaluated false (state did not change) (5ms)
+141ms 	║║Comparison (enum) down_2x gets (string) down_hold = false (0ms)
+142ms 	║║Condition #61 evaluated false (4ms)
+143ms 	║║Condition group #60 evaluated false (state did not change) (6ms)
+149ms 	║║Comparison (dynamic) down_2x is (string) up_hold = false (1ms)
+150ms 	║║Condition #37 evaluated false (5ms)
+151ms 	║║Condition group #36 evaluated false (state did not change) (6ms)
+157ms 	║║Comparison (dynamic) down_2x is (string) down_hold = false (1ms)
+158ms 	║║Condition #41 evaluated false (5ms)
+159ms 	║║Condition group #40 evaluated false (state did not change) (6ms)
+161ms 	║╚Execution stage complete. (108ms)
+163ms 	╚Event processed successfully (162ms)
6/10/2022, 10:46:49 PM +675ms
+1ms 	╔Received event [Carport light new].button = up_2x with a delay of 38ms
+51ms 	║RunTime Analysis CS > 14ms > PS > 4ms > PE > 33ms > CE
+54ms 	║Runtime (49565 bytes) successfully initialized in 4ms (v0.3.109.20181207) (52ms)
+55ms 	║╔Execution stage started
+71ms 	║║Comparison (enum) up_2x gets (string) up_2x = true (10ms)
+73ms 	║║Cancelling condition #19's schedules...
+74ms 	║║Condition #19 evaluated true (14ms)
+75ms 	║║Cancelling condition #18's schedules...
+75ms 	║║Condition group #18 evaluated true (state changed) (16ms)
+78ms 	║║Cancelling statement #20's schedules...
+83ms 	║║button 1 up_2x
+84ms 	║║Executed virtual command log (2ms)
+93ms 	║║Calculating (string) "device: + (string) Carport light new >> (string) "device: Carport light new
+96ms 	║║Calculating (string) "device: Carport light new + (string) , value: >> (string) "device: Carport light new, value:
+99ms 	║║Calculating (string) "device: Carport light new, value: + (string) up_2x >> (string) "device: Carport light new, value: up_2x
+102ms 	║║Calculating (string) "device: Carport light new, value: up_2x + (string) " >> (string) "device: Carport light new, value: up_2x"
+105ms 	║║"device: Carport light new, value: up_2x"
+106ms 	║║Executed virtual command log (1ms)
+112ms 	║║Comparison (enum) up_2x gets (string) down_2x = false (1ms)
+114ms 	║║Condition #25 evaluated false (4ms)
+115ms 	║║Condition group #24 evaluated false (state did not change) (5ms)
+120ms 	║║Comparison (enum) up_2x gets (string) up_3x = false (1ms)
+121ms 	║║Condition #46 evaluated false (4ms)
+122ms 	║║Condition group #45 evaluated false (state did not change) (5ms)
+128ms 	║║Comparison (enum) up_2x gets (string) down_3x = false (0ms)
+129ms 	║║Condition #52 evaluated false (4ms)
+130ms 	║║Condition group #51 evaluated false (state did not change) (6ms)
+135ms 	║║Comparison (enum) up_2x gets (string) up_hold = false (0ms)
+137ms 	║║Condition #31 evaluated false (5ms)
+138ms 	║║Condition group #30 evaluated false (state did not change) (6ms)
+143ms 	║║Comparison (enum) up_2x gets (string) down_hold = false (1ms)
+145ms 	║║Condition #61 evaluated false (4ms)
+146ms 	║║Condition group #60 evaluated false (state did not change) (5ms)
+152ms 	║║Comparison (dynamic) up_2x is (string) up_hold = false (1ms)
+153ms 	║║Condition #37 evaluated false (5ms)
+154ms 	║║Condition group #36 evaluated false (state did not change) (6ms)
+161ms 	║║Comparison (dynamic) up_2x is (string) down_hold = false (2ms)
+162ms 	║║Condition #41 evaluated false (5ms)
+163ms 	║║Condition group #40 evaluated false (state did not change) (6ms)
+165ms 	║╚Execution stage complete. (111ms)
+166ms 	╚Event processed successfully (166ms)

Cleaning up the code above, I was again challenged by how to trigger the piston, as there’s no simple changes trigger for button . There’s only gets , and the value options are pushed and held . Neither of them is emitted by the handler, unfortunately.

I was able to get it to work by changing from using an if statement to on events .

Note also that, in my case, I had to also handle the ‘released’ events which always follow ‘hold’.

Final working piston:

The button uses gets as a trigger condition because it needs to work with the current event. The changes condition compares the current event with what it was last time the condition was evaluated so unless the last button push is something different there isn’t a change.

All the trigger does is subscribe to a device and attribute. All your button gets ... conditions are triggers, but actually apart from the default device subscription behaviour there is nothing special about them.