     int t = millis();
     dbg(valveDBG, "t = "); dbg(valveDBG, t);
     dbg(valveDBG, "; filling = "); dln(valveDBG, filling);
-    if(filling && ( lastFlip + (floodMins * 60 * 1000) ) <= t) { // flood over
+    if(filling &&
+        (
+          ( lastFlip + (floodMins * 60 * 1000) ) <= t  || full(now)
+        )
+      ) { // flood over
       dbg(valveDBG, "t = "); dln(valveDBG, t);
       dbg(valveDBG, "lastFlip = "); dln(valveDBG, lastFlip);
       dbg(valveDBG, "floodMins = "); dln(valveDBG, floodMins);

  // in beds with overflows can be 0; else will be cycle time minus fill time
  long startTime = -1;          // when to start cycling (after boot)    
  bool gotOverflow = false;     // does the growbed have an overflow?
  int fillLevel = 10;           // cms below the level sensor: drain point
  bool filling = false;         // true when closed / on
  long lastFlip = -1;           // millis at last state change
  int floodMins = 6; // TODO 10;

  Valve() { number = counter++; }
  void stateChange(bool newState) { // turn on or off

  duration = pulseIn(echoPin, HIGH, TIMEOUT);   // wait for response

  (*waterLevel) = (duration/2) / 29.1;
  delay(35);                                    // anti-interference measure

  dbg(monitorDBG, "Water Level: ");
  dbg(monitorDBG, *waterLevel);
