A fully local Home Assistant integration for a Broil King iQue pellet smoker
(Mongoose OS firmware, ESP32). It talks to the grill directly over your LAN via
its JSON-RPC-over-WebSocket API - no cloud, no app, no AWS tokens. Reverse
engineered from the firmware's own init.js and the official app.
This integration was developed and tested against one grill only: a
Broil King Regal Pellet 500 Pro Smoker (2024 model) running the Broil_King
iQue firmware. It will most likely work on other iQue-based Broil King pellet
grills that expose the same local RPC API, but that is untested - temperature
ranges, command codes, or reported fields may differ on other models.
Use at your own risk: this integration can change your grill's setpoint and mode. Not affiliated with or endorsed by Broil King / Onward Manufacturing.
- HACS -> Integrations -> three-dot menu -> Custom repositories -> add this repo, category Integration.
- Install Broil King Smoker, restart Home Assistant.
- Settings -> Devices & Services -> Add Integration -> "Broil King Smoker".
- Enter the smoker's IP address (a device password is only needed if you set one in the iQue app).
Or copy custom_components/broilking/ into your HA config/custom_components/
manually and restart.
One "Broil King Smoker" device with:
- climate.broil_king_smoker - current grill temp, settable target temperature, on/off, and preset modes Smoke / Cook / High.
- sensor - Meat Probe 1 & 2 (and their targets, disabled by default), Cook Time, Preset Mode, Cook Timer Remaining.
- binary_sensor - Running, Low Fuel (pellet warning).
- number.broil_king_smoker_cook_timer - cook timer in minutes. Setting it arms the grill's own timer; 0 clears it.
Two-way. Writing the Cook Timer number sends the timer to the control board
(action 6), and the grill echoes the configured duration back in
alarm_Hour_Set / alarm_Minute_Set, so a timer set on the grill's own panel
or in the iQue app shows up in Home Assistant too. The board runs the countdown
itself and reports what is left in alarm_Hour / alarm_Minute, which is the
Cook Timer Remaining sensor - HA does not keep its own clock.
Temperatures are shown in your HA unit; internally the grill always uses Fahrenheit and the integration converts.
Optional, copy-paste recipes built on these entities live in
examples/: a settable meat-probe alarm and a low-pellet
alarm (Home Assistant package), plus a ready-made Lovelace dashboard.
-
Transport: WebSocket
ws://<grill-ip>/rpc, JSON-RPC, no authentication on the LAN. -
Custom methods reply asynchronously: the result is inside
response.error.messageas a double-encoded JSON string, anderror.code == 0means success. -
GetCurrentTemperaturesrequires{"reply":"full"}. -
Units: raw values are always Fahrenheit; convert with
(raw-32)*5/9. A probe reading of0= unplugged. -
Control frames go via
SendGenericCommand{"command":"...","pass":"..."}, each byte as"DDD "(zero-padded 3 decimal digits + space), without the checksum (firmware appends it). commType byte00. UART frame:E1 E1 | len(2) | 00 | func(2) | body | checksum.action frame (pre-checksum) meaning 0 E1 E1 00 09 00 30 02 vvpower off 1 E1 E1 00 0A 00 30 05 hi logrill setpoint, degrees F (16-bit) 2 E1 E1 00 0A 00 30 06 hi loprobe 1 target F 3 E1 E1 00 0A 00 30 09 hi loprobe 2 target F 4 E1 E1 00 09 00 30 03 vvdisplay unit 5 E1 E1 00 09 00 30 07 vvmode 0=Off 1=Smoke 2=Cook 3=High 6 E1 E1 00 0A 00 30 0A hh mmtimer 7 E1 E1 00 09 00 30 0B vvbacklight
The grill's local RPC is unauthenticated: anyone on the LAN can read its config
(incl. the WiFi password) and download its AWS IoT private key via FS.Get. Keep
it on a trusted / IoT VLAN.