     monitor_t* now = &monitorData[monitorCursor];
     if(monitorSize < MONITOR_POINTS)
       monitorSize++;
-    now->timestamp = millis();
+    now->timestamp = millisWrapper();
     if(GOT_TEMP_SENSOR) {
       getTemperature(&now->waterCelsius);               yield();
     }

  bool gotOverflow = false;     // does the growbed have an overflow?
  int fillLevel = 7;            // cms below the level sensor: drain point
  bool filling = false;         // true when closed / on
  long lastFlip = -1;           // millis at last state change
  int floodMins = 18;

  Valve() { number = counter++; }

    // dbg(valveDBG, "pump Pin = "); dbg(valveDBG, pumpMcpPin);
    // dbg(valveDBG, ", solen = "); dln(valveDBG, solenoidMcpPin);

    lastFlip = millisWrapper();
  }
  void on()  { stateChange(true); }  // fill time
  void off() { stateChange(false); } // drain time
  void step(monitor_t* now, char cycleMins) {   // check conditions and adjust
    dbg(valveDBG, "\nvalve[].step - number = "); dln(valveDBG, number);
    unsigned long t = millisWrapper();
    dbg(valveDBG, "t = "); dbg(valveDBG, t);
    dbg(valveDBG, "; filling = "); dln(valveDBG, filling);
    if(filling &&
