It’s because you have the presence statement set to ‘never subscribe’ and you have two statements (mode and SHM) separated by ‘OR’s above.
Your piston will never be triggered by ‘presence changes’ and when triggered by mode or SHM, because of the ‘OR’s only one statement needs to be true for the group of statements to be true. Piston runs from the top down until it finds a true, it then moves on.
webCoRE won’t bother evaluating the other statements, in order to save evaluation time, and therefore the presence, and in turn the variables, will never get set.
Hope that makes sense?