 /////////////////////////////////////////////////////////////////////////////
 // looooooooooooooooooooop //////////////////////////////////////////////////
 void loop() {
-  dnsServer.processNextRequest();
+  // TODO reinstate when doing captive portal dnsServer.processNextRequest();
   webServer.handleClient();
 
   if(loopCounter == TICK_MONITOR) { // monitor levels, step valves, push data

class FlowController { // the set of valves and their config ////////////////
  public:
  int numValves = 3;         // WARNING! call init if resetting!
  int cycleMins = 12;        // how long is a flood/drain cycle?
  int maxSimultDrainers = 1; // how many beds can drain simultaneously?
  int minBedsWet = 1;        // min beds that are full or filling
  int maxBedsWet = 2;        // max beds that are full or filling

  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 = 1; // TODO 10;

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