Repository navigation
Protocol Reference
Technical details of the MAK Pellet Boss WiFi HTTP protocol. This documents the communication between the grill's WiFi controller and the server (originally makgrillsmobile.com, now your Home Assistant instance).
The Pellet Boss WiFi controller is an HTTP client. It periodically POSTs form-encoded telemetry to a fixed endpoint and parses the response body as a command string. There is no authentication, no TLS requirement, and no session state — each POST is independent.
POST /GrillService/Service HTTP/1.1
Host: makgrillsmobile.com
Content-Type: application/x-www-form-urlencoded
The grill resolves makgrillsmobile.com via DNS and POSTs to port 80. With a DNS rewrite pointing that hostname to your HA IP, the POST arrives at HA's HTTP server.
Standard form-encoded body (application/x-www-form-urlencoded).
| Field | Type | Example | Description |
|---|---|---|---|
GrillId |
String | WiFiCD240B |
Unique grill identifier (typically "WiFi" + last 6 hex of MAC) |
Temp |
Integer | 275 |
Current pit temperature in °F |
Power |
String | ON |
Current power state |
Probe1 |
Integer | 165 |
Meat probe 1 temperature in °F (0 = not connected) |
Probe2 |
Integer | 0 |
Meat probe 2 temperature in °F (0 = not connected) |
Probe3 |
Integer | 0 |
Meat probe 3 temperature in °F (0 = not connected) |
GrillFlags |
String | ATSET |
Status flags (comma-separated if multiple) |
| Value | Meaning |
|---|---|
ON |
Grill is running normally |
OFF |
Grill is powered off |
COOL |
Grill is in cooldown cycle (fan running, fire extinguishing) |
CD |
Alternate cooldown indicator |
| Value | Meaning |
|---|---|
ATSET |
Grill has reached the target setpoint temperature |
| (empty) | Normal operation, not at setpoint |
GrillId=WiFiCD240B&Temp=275&Power=ON&Probe1=165&Probe2=0&Probe3=0&GrillFlags=ATSET
The response body is a quoted string containing URL-encoded parameters. The grill parses these as commands.
"setPoint=225&potStatus=&cookMode=1&zoneProbe=1&power=1"
Important: The entire response body is wrapped in double quotes. The grill expects this format.
| Field | Type | Values | Description |
|---|---|---|---|
setPoint |
Integer |
150–500
|
Target temperature in °F |
potStatus |
String | (empty) | Reserved (always empty in current implementation) |
cookMode |
Integer |
1, 2, 3
|
Cooking mode |
zoneProbe |
Integer |
1–4
|
Which probe controls the zone |
power |
Integer |
0, 1
|
Power command |
| Value | Mode | Description |
|---|---|---|
1 |
Smoke | Low temperature, heavy smoke production |
2 |
Grill | Medium temperature, moderate smoke |
3 |
Sear | High temperature, minimal smoke |
| Value | Probe |
|---|---|
1 |
Probe 1 |
2 |
Probe 2 |
3 |
Probe 3 |
4 |
Pit probe |
| Value | Action |
|---|---|
0 |
Power off |
1 |
Power on |
"setPoint=275&potStatus=&cookMode=2&zoneProbe=1&power=1"
This tells the grill: set target to 275°F, grill mode, zone controlled by probe 1, power on.
- The grill POSTs every few seconds while powered on (interval varies, typically 3–10 seconds)
- The grill stops POSTing when powered off (after cooldown completes)
- There is no keepalive or heartbeat when the grill is off
- The integration uses a 60-second timeout to determine connectivity
Grill powers on
│
▼
Connect to WiFi
│
▼
Resolve makgrillsmobile.com via DNS
│
▼
┌─────────────────────────┐
│ POST /GrillService/Service │◄─── repeats every few seconds
│ Body: GrillId=...&Temp=... │
└─────────────┬─────────────┘
│
▼
┌─────────────────────────────┐
│ Response: "setPoint=...&..." │
└─────────────┬───────────────┘
│
▼
Grill applies commands
(setpoint, cook mode, power)
│
▼
Wait interval, then POST again
- No authentication — any device that can reach the endpoint can send commands to the grill. This is why network isolation (VLAN + firewall rules) is recommended. See Network Hardening.
- No encryption — traffic is plain HTTP. On a local network this is acceptable; do not expose the endpoint to the internet.
- No replay protection — the grill applies whatever the last response says. The integration tracks user-set commands to avoid overriding the grill's own state.
If you want to build your own controller (not using Home Assistant), the minimum viable implementation is:
- Run an HTTP server on port 80
- Handle
POST /GrillService/Service - Parse the form-encoded body for telemetry
- Return a quoted command string
# Minimal example (Python/Flask)
from flask import Flask, request
app = Flask(__name__)
@app.route('/GrillService/Service', methods=['POST'])
def grill_service():
temp = request.form.get('Temp', '0')
power = request.form.get('Power', 'OFF')
print(f"Grill: {temp}°F, Power: {power}")
return '"setPoint=225&potStatus=&cookMode=1&zoneProbe=1&power=1"'
app.run(host='0.0.0.0', port=80)For a Docker-based implementation, see bawilson2/mak-controller which was the original proof-of-concept for local MAK grill control.