## Symbolic Representation of the Optimization Problem

The optimization problem can be symbolically represented as follows:

```json
{
    'sym_variables': [
        ('x1', 'home vacuums'),
        ('x2', 'shop vacuums')
    ],
    'objective_function': '20*x1 + 35*x2',
    'constraints': [
        '0.5*x1 + 1*x2 <= 300',  // disassembly time constraint
        '1*x1 + 2*x2 <= 400',   // repair time constraint
        'x1 >= 0',               // non-negativity constraint for home vacuums
        'x2 >= 0'                // non-negativity constraint for shop vacuums
    ]
}
```

## Gurobi Code

Here is the Gurobi code in Python that solves the optimization problem:

```python
import gurobipy as gp

# Create a new model
model = gp.Model("Vacuum_Repair")

# Define the variables
x1 = model.addVar(name="home_vacuums", obj=20, lb=0)  # home vacuums
x2 = model.addVar(name="shop_vacuums", obj=35, lb=0)  # shop vacuums

# Define the constraints
model.addConstr(0.5 * x1 + 1 * x2 <= 300, name="disassembly_time")  # disassembly time constraint
model.addConstr(1 * x1 + 2 * x2 <= 400, name="repair_time")  # repair time constraint

# Solve the model
model.optimize()

# Print the solution
if model.status == gp.GUROBI_OPTIMAL:
    print("Optimal solution found.")
    print(f"Home vacuums: {x1.varValue}")
    print(f"Shop vacuums: {x2.varValue}")
    print(f"Max profit: {model.objVal}")
else:
    print("No optimal solution found.")
```

This code defines a Gurobi model with two variables, `x1` and `x2`, representing the number of home vacuums and shop vacuums to be repaired, respectively. The objective function is set to maximize the profit, which is $20 per home vacuum and $35 per shop vacuum. The disassembly time and repair time constraints are added to the model, along with non-negativity constraints for both variables. The model is then solved, and the optimal solution is printed if one is found.