protected DateTime nextIrrigationAt() {
    DateTime dt = new DateTime();
    for (int i = 0; i < 7; i++) {
      for (final int dayOfWeek : wateringDays) {
        if (dayOfWeek == (dt.getDayOfWeek())) {
          // If it's the first run then we may match the same day we are currently on, in this case
          // we need to check that we don't report a time in the past. Validate that the hour and
          // minute right now are not past the scheduled watering time. If it's not the first run
          // then it's ok to let through.
          if (i != 0 || (i == 0 && dt.toLocalTime().isBefore(wateringStartTime))) {

            // Reset the hour to 0 and increment until we match the watering hour.
            dt = dt.withHourOfDay(0);
            while (dt.getHourOfDay() < wateringStartTime.getHourOfDay()) {
              dt = dt.plusHours(1);
            }

            // Reset the minute to 0 and increment until we match the watering minute.
            dt = dt.withMinuteOfHour(0);
            while (dt.getMinuteOfHour() < wateringStartTime.getMinuteOfHour()) {
              dt = dt.plusMinutes(1);
            }
            return dt;
          }
        }
      }
      dt = dt.plusDays(1);
    }
    return null;
  }