Another Millis Timer off question...

Looks like you are close but you got a bit excited here !

      valveOut, LOW;

If I were you I would rename previousMillis to startMillis or even more explicitly postFlowStartTime. The variable should only be set to millis() when the button becomes released. Is that what your code does ?

      if (currentMillis - previousMillis >= postFlow)
        digitalWrite(valveOut, LOW); // turn on valve
      previousMillis = currentMillis;

Which line or lines of code do you intend to execute if the test returns true ? My advice would be to always use {} round conditional code blocks even if the block is only 1 line. It makes the intention much clearer.

Did you see my reply #17 ?