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 entry-level devices sold,
- $y$ as the number of premium devices sold.

The objective is to maximize profit. Given that the company makes a $300 profit for each entry-level device and a $200 profit for each premium device, the objective function can be written as:

Maximize: $300x + 200y$

The constraints are:
1. The daily demand for entry-level devices is at most 20: $x \leq 20$
2. The daily demand for premium devices is at most 15: $y \leq 15$
3. The company can only sell at most 30 devices total per day: $x + y \leq 30$
4. Non-negativity constraints since the number of devices cannot be negative: $x \geq 0, y \geq 0$

Now, let's translate these into Gurobi code in Python:

```python
from gurobipy import *

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

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

# Objective function: Maximize profit
m.setObjective(300*x + 200*y, GRB.MAXIMIZE)

# Constraints
m.addConstr(x <= 20, "max_entry_level_demand")
m.addConstr(y <= 15, "max_premium_demand")
m.addConstr(x + y <= 30, "total_devices_limit")

# Solve the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution found. Sell {x.x} entry-level devices and {y.x} premium devices.")
else:
    print("No optimal solution found.")

print("Objective function value (profit):", m.objVal)
```