Skip to content

iGrill

iGrill Integration for Home Assistant (ESP32 based)

Integration used for ESP32: https://github.com/1mckenna/esp32_iGrill. See this article for more details.

Additional Resources

Alternatively, you can use a Raspberry based integration like https://github.com/bendikwa/igrill. See this forum post for more details.

Some installation hints were taken form the ESPHome Plant Sensor Setup repo.

Hardware

We are using an ESP32 from AliExpress: https://de.aliexpress.com/item/32864722159.html (model ESP-32 30PIN).

Base setup on Mac

Install the Arduino IDE:

brew install --cask arduino

Optionally, install Arduino Support for Visual Studio Code.

Inside the IDE install the ESP32 support:

Under the menu Arduino - Preferences... -> Additional Boards Manager URLs add the entry https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json from this repository list.

Then, under Tools > Board: ... > Boards Manager, find and install the entry esp32.

Select the correct development board: ESP32 Dev Module

For Tools -> Port, use /dev/cu.usbserial-00001.

Open Tools -> Serial Monitor and set the baud rate to 115200.

To test the setup, you can try the sketch File -> Examples -> ESP32 -> Time -> SimpleTime. Just add WIFI credentials in the Sketch, plug the board into USB, hold the BOOT button pressed on the ESP32 board and click on the Upload button (arrow to the right at the top of the sketch UI). After uploading the new sketch, you can press the ENABLE button on the board to restart the ESP32 and run the new uploaded sketch. The serial monitor should now show the time sync status.

Installation under Windows

For Windows, make sure to use a proper USB cable that not only provides power but also has wires for data. Otherwise it will create a conflict where your board is not properly recognized.

Install the serial driver from https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers.

iGrill installation

Clone the repository into the Arduino workspace folder:

cd ~/Documents/Arduino
git clone https://github.com/1mckenna/esp32_iGrill.git

# have it show up in the `src` folder as well
ln -s ~/Documents/Arduino/esp32_iGrill ~/src/esp32_iGrill

Restart the Arduino IDE for the changes to take effect. You should now find the sketch under File -> Sketchbook -> esp32_iGrill.

Now follow the instructions from the git repo.

To flash the software onto the ESP32, keep the BOOT button on the ESP32 board pressed until after you see the “Connecting….” message in your Arduino IDE. After uploading the new sketch, you can press the ENABLE button on the board to restart the ESP32 and run the new uploaded sketch.

You can only pair an iGrill to one device. If it has been paired to another device before, you must reset it by pressing the reset button inside the battery compartment. The iGrill will pair with the ESP32 automatically once it is in range.

Lovelace dashboard

  - title: BBQ
    path: bbq
    icon: 'mdi:grill'
    panel: false
    badges: []
    cards:
      - type: vertical-stack
        title: Weber iGrillv2
        cards:
          - type: entity-filter
            color_state: true
            entities:
              - entity: sensor.igrill_device_connectivity_status
                name: iGrill Status
                icon: 'mdi:access-point'
              - entity: sensor.esp32_igrill_ble_client
                name: ESP32 iGrill BLE Client
                icon: 'mdi:access-point'
            state_filter:
              - online
              - unknown
          - type: gauge
            title: Battery Level
            entity: sensor.igrill_d481ca216e3e_battery_level
            min: 0
            max: 100
            severity:
              red: 20
              green: 65
              amber: 50
          - type: horizontal-stack
            cards:
              - type: conditional
                conditions:
                  - entity: sensor.igrill_d481ca216e3e_probe_1
                    state_not: unavailable
                card:
                  type: gauge
                  title: Probe 1
                  entity: sensor.igrill_d481ca216e3e_probe_1
                  min: 60
                  max: 250
                  severity:
                    red: 190
                    green: 65
                    amber: 0
              - type: conditional
                conditions:
                  - entity: sensor.igrill_d481ca216e3e_probe_2
                    state_not: unavailable
                card:
                  type: gauge
                  title: Probe 2
                  entity: sensor.igrill_d481ca216e3e_probe_2
                  min: 60
                  max: 250
                  severity:
                    red: 190
                    green: 65
                    amber: 0
          - type: horizontal-stack
            cards:
              - type: conditional
                conditions:
                  - entity: sensor.igrill_d481ca216e3e_probe_3
                    state_not: unavailable
                card:
                  type: gauge
                  title: Probe 3
                  entity: sensor.igrill_d481ca216e3e_probe_3
                  min: 60
                  max: 300
                  severity:
                    red: 260
                    green: 65
                    amber: 200
              - type: conditional
                conditions:
                  - entity: sensor.igrill_d481ca216e3e_probe_4
                    state_not: unavailable
                card:
                  type: gauge
                  title: Probe 4
                  entity: sensor.igrill_d481ca216e3e_probe_4
                  min: 60
                  max: 300
                  severity:
                    red: 260
                    green: 65
                    amber: 200
      - type: vertical-stack
        cards:
          - type: entities
            title: Grill Target Temperatures
            show_header_toggle: false
            entities:
              - entity: input_number.igrill_alert_low
                name: Low
              - entity: input_number.igrill_alert_high
                name: High
            show_name: true
            show_icon: true
            show_state: true
          - type: entities
            title: Probe Temp Targets
            show_header_toggle: false
            entities:
              - entity: input_number.igrill_probe_1_target
                name: Probe 1
              - entity: input_number.igrill_probe_2_target
                name: Probe 2
              - entity: input_number.igrill_probe_3_target
                name: Probe 3
              - entity: input_number.igrill_probe_4_target
                name: Probe 4
            show_name: true
            show_icon: true
            show_state: true
          - type: glance
            entities:
              - entity: input_number.igrill_probe_1_target
                name: Probe 1
              - entity: input_number.igrill_probe_2_target
                name: Probe 2
              - entity: input_number.igrill_probe_3_target
                name: Probe 3
              - entity: input_number.igrill_probe_4_target
                name: Probe 4
            show_name: true
            show_icon: false
          - type: glance
            entities:
              - entity: sensor.target_alert_temp_probe_1
                name: Probe 1 State
              - entity: sensor.target_alert_temp_probe_2
                name: Probe 2 State
              - entity: sensor.target_alert_temp_probe_3
                name: Probe 3 State
              - entity: sensor.target_alert_temp_probe_4
                name: Probe 4 State
            show_name: false
            show_icon: false
      - type: history-graph
        title: History
        entities:
          - sensor.igrill_d481ca216e3e_probe_1
          - sensor.igrill_d481ca216e3e_probe_2
          - sensor.igrill_d481ca216e3e_probe_3
          - sensor.igrill_d481ca216e3e_probe_4
        hours_to_show: 14
        refresh_interval: 0
      - type: markdown
        content: >+
          <ha-icon icon="mdi:food-drumstick"></ha-icon> **Cook Type:**  Brisket

          <ha-icon icon="mdi:pine-tree-fire"></ha-icon> **Wood:** 50% Cherry/50%
          Mesquite

          <ha-icon icon="mdi:fire"></ha-icon> **Smoker Temp:** 250 °F

          <ha-icon icon="mdi:thermometer"></ha-icon> **Wrap Temp:** 170 °F

          <ha-icon icon="mdi:thermometer"></ha-icon> **Pull Temp:** 205 °F

          <ha-icon icon="mdi:clock"></ha-icon> **Rest Length:** 2 - 4 hrs

          <ha-icon icon="mdi:calendar"></ha-icon> **Date:**  2/7/2021

          <ha-icon icon="mdi:clock-in"></ha-icon> **Start Time:** 00:08

          <ha-icon icon="mdi:clock-out"></ha-icon> **Time Pulled:** 12:28

          <ha-icon icon="mdi:notebook-outline"></ha-icon> **Cook Notes:** N/A

        title: Cooking Notes
      - type: vertical-stack
        cards:
          - type: vertical-stack
            cards:
              - type: entities
                title: Temperature Alerting
                entities:
                  - entity: automation.monitor_grill_temp_alert
                    name: Monitor Grill High Temp
                    icon: 'mdi:thermometer-alert'
                  - entity: automation.monitor_grill_temp_normal
                    name: Monitor Grill Low Temp
                    icon: 'mdi:thermometer-alert'
                  - entity: automation.probe_1_target_temp
                    name: Monitor Probe 1 Temp
                    icon: 'mdi:thermometer-alert'
                  - entity: automation.probe_2_target_temp
                    name: Monitor Probe 2 Temp
                    icon: 'mdi:thermometer-alert'
                  - entity: automation.probe_3_target_temp
                    name: Monitor Probe 3 Temp
                    icon: 'mdi:thermometer-alert'
                  - entity: automation.probe_4_target_temp
                    name: Monitor Probe 4 Temp
                    icon: 'mdi:thermometer-alert'
                  - entity: automation.monitor_igrill_device_connectivity
                    icon: 'mdi:access-point'
                show_header_toggle: false
                state_color: true