To solve this optimization problem, we need to define the decision variables, the objective function, and the constraints. 

Let's denote:
- $x$ as the number of home vacuums repaired,
- $y$ as the number of shop vacuums repaired.

The profit per home vacuum is $20, and the profit per shop vacuum is $35. Thus, the total profit (objective function) can be represented as $20x + 35y$.

Each shop vacuum requires 1 hour of disassembly and each home vacuum requires 0.5 hours of disassembly. Given that there are 300 hours available for disassembly, we have the constraint $0.5x + y \leq 300$.

For repair, each shop vacuum requires 2 hours and each home vacuum requires 1 hour, with 400 hours available. This gives us another constraint: $x + 2y \leq 400$.

Also, $x \geq 0$ and $y \geq 0$ because the number of vacuums cannot be negative.

The goal is to maximize profit, which translates to maximizing $20x + 35y$ under these constraints.

Here's how we can represent this problem in Gurobi using Python:

```python
from gurobipy import *

# Create a model
m = Model("Vacuum_Repair")

# Define the decision variables
x = m.addVar(name="home_vacuums", vtype=GRB.CONTINUOUS, lb=0)
y = m.addVar(name="shop_vacuums", vtype=GRB.CONTINUOUS, lb=0)

# Set the objective function to maximize profit
m.setObjective(20*x + 35*y, GRB.MAXIMIZE)

# Add constraints for disassembly and repair time
m.addConstr(0.5*x + y <= 300, name="disassembly_time")
m.addConstr(x + 2*y <= 400, name="repair_time")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: {x.varName} = {x.x}, {y.varName} = {y.x}")
    print(f"Maximum profit: ${20*x.x + 35*y.x:.2f}")
else:
    print("Model is infeasible")
```