Logs attached. I have tried both a trigger and a condition as you can see in the logs. It seems that the trigger/condition does fire the piston, but then the piston reevaluates the trigger/piston in its execution stage. The triggering device is a virtual switch with auto-off set to 500ms so by the time the execution stage runs the switch has turned itself off.
What I don't understand is why the execution stage reevaluates the switch state?
9/30/2020, 9:49:18 AM +279ms
+1ms ╔Received event [VSW: Cooling off].switch = off with a delay of 1191ms, canQueue: false, calledMyself: true
+5ms ║RunTime initialize > 3 LockT > 0ms > rtDT > 1ms > pistonT > 0ms (first state access 2 2 1)
+7ms ║Runtime (5788 bytes) successfully initialized in 1ms (v0.3.110.20200916_HE)
+8ms ║╔Execution stage started
+15ms ║║Comparison (enum) off changes_away_from (string) off = false (0ms)
+17ms ║║Cancelling condition #2's schedules...
+19ms ║║Condition #2 evaluated false (6ms)
+20ms ║║Cancelling condition #1's schedules...
+22ms ║║Condition group #1 evaluated false (state changed) (11ms)
+26ms ║╚Execution stage complete. (19ms)
+60ms ╚Event processed successfully (59ms)
9/30/2020, 9:49:16 AM +599ms
+4ms ╔Received event [VSW: Cooling off].switch = on with a delay of 45ms, canQueue: true, calledMyself: false
+19ms ║RunTime initialize > 18 LockT > 2ms > rtDT > 2ms > pistonT > 1ms (first state access 14 6 12)
+22ms ║Runtime (5790 bytes) successfully initialized in 2ms (v0.3.110.20200916_HE)
+23ms ║╔Execution stage started
+39ms ║║Comparison (enum) on changes_away_from (string) off = true (1ms)
+41ms ║║Cancelling condition #2's schedules...
+44ms ║║Condition #2 evaluated true (9ms)
+46ms ║║Cancelling condition #1's schedules...
+48ms ║║Condition group #1 evaluated true (state changed) (13ms)
+49ms ║║Cancelling statement #3's schedules...
+743ms ║║Executed physical command [Downstairs thermostat].off() (688ms)
+744ms ║║Executed [Downstairs thermostat].off (690ms)
+1421ms ║║Executed physical command [Upstairs thermostat].off() (674ms)
+1423ms ║║Executed [Upstairs thermostat].off (677ms)
+1425ms ║║executeTask: Execution time exceeded by 124ms, Waiting for 150ms; lastPause: null
+1583ms ║║Executed virtual command [Downstairs thermostat, Upstairs thermostat].wait (2ms)
+1586ms ║║Requesting a wake up for Wed, Sep 30 2020 @ 9:49:28 AM EDT (in 10s)
+1602ms ║╚Execution stage complete. (1578ms)
+1629ms ║Setting up scheduled job for Wed, Sep 30 2020 @ 9:49:28 AM EDT (in 10s)
+1631ms ╚Event processed successfully (1629ms)
9/30/2020, 9:49:17 AM +134ms
+3ms ╔Received event [VSW: Cooling off].switch = off with a delay of 46ms, canQueue: true, calledMyself: false
+6ms ╚Event queued (5ms)
9/30/2020, 9:49:02 AM +845ms
+5ms ╔Received event [187 Montgomery Avenue Hubitat].test = 1601473742845 with a delay of 0ms, canQueue: true, calledMyself: false
+33ms ║RunTime initialize > 32 LockT > 1ms > rtDT > 19ms > pistonT > 18ms (first state access 12 7 25)
+37ms ║Runtime (5884 bytes) successfully initialized in 19ms (v0.3.110.20200916_HE)
+38ms ║╔Execution stage started
+45ms ║║Condition #2 evaluated false (4ms)
+46ms ║║Condition group #1 evaluated false (state did not change) (6ms)
+50ms ║╚Execution stage complete. (12ms)
+54ms ╚Event processed successfully (52ms)
9/30/2020, 9:48:51 AM +498ms
+22ms ╔Subscribing to devices...
+26ms ║Using Attribute subscription
+189ms ║Device missing from piston. Loading all from parent (158ms)
+199ms ║Subscribing to VSW: Cooling off.switch...
+213ms ║Piston controls Downstairs thermostat...