Inkbird BT thermometer iBBQ with ESP32

Completely new to ESPHome…can you recommend me a board that you used and where to buy? It’s all confusing me.

I personally use an ESP32 dev board, this one:

But it depends where you live and where you want to order. Just look for a shop in your country, where you can get maker stuff. Where do you come from? Maybe even Amazon has one of these, in Germany they do. :slight_smile:

But in general, that’s the beauty of ESPHome, you can use nearly every ESP board. You just have to adjust the board type while creating your firmware. Take a look around in your country, and if are not sure, which board to use, post some links so others can take a look at. :slight_smile:

1 Like

When starting I would get an esp32 dev board with a usb connection. Easy to flash and easy to power. No soldering or wires to connect for this project :slight_smile:

EDIT: a lot of boards are ultimately source from China and have crap components, if you buy from this guy they will be better quality QuinLED-ESP32 - quinled.info

1 Like

@paddy0174 This is so Awesome. I have been trying with only mild success to integrate my Inkbird IBT-4XS into HA for a while. This connects my DIY bbq smoker to HA. ​I was using Inkbird_BLE2MQTT which used to work OK but recently wont connect to MQTT server. Your code worked first time!!! And has been up and running now for 24 hrs.

One question… I keep getting these weird signal dropouts. Like the connection is getting dropped and it the reports zero degrees. I tried removing the else statements in the esp32_ble_tracker lamba section but dropouts are still there. I have used ESPHome several times but I would still call myself a novice on its capabilities and am a user who needs a good “how to” to really get anything done.

Any advice on things to try to mitigate these dropouts? The devices are in the same small room btw so I dont think it is a range issue.

image

[22:23:53][D][sensor:121]: ‘iBBQ Temperature Probe 1’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:23:55][D][sensor:121]: ‘iBBQ Temperature Probe 3’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:23:56][D][esp32_ble_tracker:628]: Found device 7E:E3:11:8C:05:BA RSSI=-86
[22:23:56][D][esp32_ble_tracker:649]: Address Type: RANDOM
[22:23:56][D][esp32_ble_tracker:653]: TX Power: 2
[22:23:56][D][sensor:121]: ‘iBBQ Temperature Probe 2’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:24:22][I][ble_adv:062]: New BLE device
[22:24:22][I][ble_adv:063]: address: B4:BC:7C:30:C6:76
[22:24:22][I][ble_adv:064]: name: iBBQ
[22:24:22][I][ble_adv:065]: Advertised service UUIDs:
[22:24:22][I][ble_adv:068]: - 0xFFF0
[22:24:22][I][ble_adv:071]: Advertised service data:
[22:24:22][I][ble_adv:077]: Advertised manufacturer data:
[22:24:22][I][ble_adv:080]: - 0x0000: (00.00.B4.BC.7C.30.C6.76.D2.00.D2.00.D2.00.D2.00 (16))
[22:24:22][I][ble_data:089]: - 21.000000 21.000000
[22:24:22][D][sensor:121]: ‘iBBQ Temperature Probe 1’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:24:22][D][sensor:121]: ‘iBBQ Temperature Probe 2’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:24:22][D][sensor:121]: ‘iBBQ Temperature Probe 3’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:24:22][D][sensor:121]: ‘iBBQ Temperature Probe 4’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:24:24][I][ble_adv:062]: New BLE device
[22:24:24][I][ble_adv:063]: address: B4:BC:7C:30:C6:76
[22:24:24][I][ble_adv:064]: name: iBBQ
[22:24:24][I][ble_adv:065]: Advertised service UUIDs:
[22:24:24][I][ble_adv:068]: - 0xFFF0
[22:24:24][I][ble_adv:071]: Advertised service data:
[22:24:24][I][ble_adv:077]: Advertised manufacturer data:
[22:24:24][I][ble_adv:080]: - 0x0000: (00.00.B4.BC.7C.30.C6.76.D2.00.D2.00.D2.00.D2.00 (16))
[22:24:24][I][ble_data:089]: - 21.000000 21.000000
[22:24:24][D][sensor:121]: ‘iBBQ Temperature Probe 1’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:24:24][D][sensor:121]: ‘iBBQ Temperature Probe 2’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:24:24][D][sensor:121]: ‘iBBQ Temperature Probe 3’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:24:24][D][sensor:121]: ‘iBBQ Temperature Probe 4’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:24:50][D][esp32_ble_tracker:628]: Found device A4:C1:38:B9:76:E9 RSSI=-84
[22:24:50][D][esp32_ble_tracker:649]: Address Type: PUBLIC
[22:24:50][D][esp32_ble_tracker:651]: Name: ‘ATC_B976E9’
[22:24:50][D][sensor:121]: ‘iBBQ Temperature Probe 4’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:24:53][D][sensor:121]: ‘iBBQ Temperature Probe 1’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:24:55][D][sensor:121]: ‘iBBQ Temperature Probe 3’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:24:56][D][sensor:121]: ‘iBBQ Temperature Probe 2’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:25:03][I][ble_adv:062]: New BLE device
[22:25:03][I][ble_adv:063]: address: B4:BC:7C:30:C6:76
[22:25:03][I][ble_adv:064]: name: iBBQ
[22:25:03][I][ble_adv:065]: Advertised service UUIDs:
[22:25:03][I][ble_adv:068]: - 0xFFF0
[22:25:03][I][ble_adv:071]: Advertised service data:
[22:25:03][I][ble_adv:077]: Advertised manufacturer data:
[22:25:03][I][ble_adv:080]: - 0x0000: (00.00.B4.BC.7C.30.C6.76.D2.00.D2.00.D2.00.D2.00 (16))
[22:25:03][I][ble_data:089]: - 21.000000 21.000000
[22:25:03][D][sensor:121]: ‘iBBQ Temperature Probe 1’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:25:03][D][sensor:121]: ‘iBBQ Temperature Probe 2’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:25:03][D][sensor:121]: ‘iBBQ Temperature Probe 3’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:25:03][D][sensor:121]: ‘iBBQ Temperature Probe 4’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:25:50][D][sensor:121]: ‘iBBQ Temperature Probe 4’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:25:53][D][sensor:121]: ‘iBBQ Temperature Probe 1’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:25:55][D][sensor:121]: ‘iBBQ Temperature Probe 3’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:25:56][D][sensor:121]: ‘iBBQ Temperature Probe 2’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:26:03][D][sensor:121]: ‘iBBQ Temperature Probe 1’: Sending state 0.00000 °C with 0 decimals of accuracy
[22:26:03][D][sensor:121]: ‘iBBQ Temperature Probe 2’: Sending state 0.00000 °C with 0 decimals of accuracy
[22:26:03][D][sensor:121]: ‘iBBQ Temperature Probe 3’: Sending state 0.00000 °C with 0 decimals of accuracy
[22:26:03][D][sensor:121]: ‘iBBQ Temperature Probe 4’: Sending state 0.00000 °C with 0 decimals of accuracy
[22:26:12][D][esp32_ble_tracker:180]: Starting scan…
[22:26:18][D][esp32_ble_tracker:628]: Found device 7E:E3:11:8C:05:BA RSSI=-86
[22:26:18][D][esp32_ble_tracker:649]: Address Type: RANDOM
[22:26:18][D][esp32_ble_tracker:653]: TX Power: 2
[22:26:21][D][esp32_ble_tracker:628]: Found device 68:72:C3:C3:1C:05 RSSI=-87
[22:26:21][D][esp32_ble_tracker:649]: Address Type: PUBLIC
[22:26:23][D][esp32_ble_tracker:628]: Found device 70:18:46:8F:FB:84 RSSI=-94
[22:26:23][D][esp32_ble_tracker:649]: Address Type: RANDOM
[22:26:23][D][esp32_ble_tracker:653]: TX Power: 2
[22:26:50][D][sensor:121]: ‘iBBQ Temperature Probe 4’: Sending state 0.00000 °C with 0 decimals of accuracy
[22:26:51][I][ble_adv:062]: New BLE device
[22:26:51][I][ble_adv:063]: address: B4:BC:7C:30:C6:76
[22:26:51][I][ble_adv:064]: name: iBBQ
[22:26:51][I][ble_adv:065]: Advertised service UUIDs:
[22:26:51][I][ble_adv:068]: - 0xFFF0
[22:26:51][I][ble_adv:071]: Advertised service data:
[22:26:51][I][ble_adv:077]: Advertised manufacturer data:
[22:26:51][I][ble_adv:080]: - 0x0000: (00.00.B4.BC.7C.30.C6.76.D2.00.D2.00.D2.00.D2.00 (16))
[22:26:51][I][ble_data:089]: - 21.000000 21.000000
[22:26:51][D][sensor:121]: ‘iBBQ Temperature Probe 1’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:26:51][D][sensor:121]: ‘iBBQ Temperature Probe 2’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:26:51][D][sensor:121]: ‘iBBQ Temperature Probe 3’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:26:51][D][sensor:121]: ‘iBBQ Temperature Probe 4’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:26:53][D][sensor:121]: ‘iBBQ Temperature Probe 1’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:26:55][D][sensor:121]: ‘iBBQ Temperature Probe 3’: Sending state 21.00000 °C with 0 decimals of accuracy
[22:26:56][D][sensor:121]: ‘iBBQ Temperature Probe 2’: Sending state 21.00000 °C with 0 decimals of accuracy

The dropouts are due to the timer expiring before the next BLE broadcast comes in. I had to change the timer to 120s and mode: restart. My unit seems to send the broadcast between 90seconds and 140 seconds so if the timer expires before it comes in the temp goes to 0C. Also without the mode restart the time will expire and often did right after another packet came in.

I now have my ESP32 with a PID controlling a servo so I should be able to have it control the air damper on the smoker to control the temperature.

Now if they will add writing to BLE characteristics I’ll change to using the notify for the temperature characteristic so I will get updates more often. Anyone know where in the future writing to characteristics might be?

1 Like

Thank you! Worked just fine with IBT-4XS.
mac adress of Inkbird can be found with apps like nRF Connect.

Finished my interface. Now I have everything I want from wireless thermometer.
Heavy based on this:

and this:

3 Likes

Truly fantastic, it works perfectly. Can the sampling rate be increased?

Nice project.

Any chance you can share your YAML for your dashboard?

Oh yes that would be awesome ! :pray:
Thank you so much paddy0174 for this project ! I’ll try it !

sure. Here is lovelace part:

  - icon: mdi:grill
    title: Grill
    cards:
      - type: vertical-stack
        cards:
          - type: horizontal-stack
            cards:
              - type: vertical-stack
                cards:
                  - type: gauge
                    name: Probe 1
                    entity: sensor.ibbq_temperature_probe_1
                    needle: true
                    min: 0
                    max: 300
                    severity:
                      green: 93
                      yellow: 130
                      red: 200
                  - type: glance
                    entities:
                      - entity: sensor.target_alert_temp_probe_1
                    show_name: false
                    show_icon: false
              - type: vertical-stack
                cards:
                  - type: gauge
                    name: Probe 2
                    entity: sensor.ibbq_temperature_probe_2
                    needle: true
                    min: 0
                    max: 120
                    severity:
                      green: 0
                      yellow: 75
                      red: 97
                  - type: glance
                    entities:
                      - entity: sensor.target_alert_temp_probe_2
                    show_name: false
                    show_icon: false
          - type: horizontal-stack
            cards:
              - type: vertical-stack
                cards:
                  - type: gauge
                    name: Probe 3
                    entity: sensor.ibbq_temperature_probe_3
                    needle: true
                    min: 0
                    max: 120
                    severity:
                      green: 0
                      yellow: 75
                      red: 97
                  - type: glance
                    entities:
                      - entity: sensor.target_alert_temp_probe_3
                    show_name: false
                    show_icon: false
              - type: vertical-stack
                cards:
                  - type: gauge
                    name: Probe 4
                    entity: sensor.ibbq_temperature_probe_4
                    needle: true
                    min: 0
                    max: 120
                    severity:
                      green: 0
                      yellow: 75
                      red: 97
                  - type: glance
                    entities:
                      - entity: sensor.target_alert_temp_probe_4
                    show_name: false
                    show_icon: false

      - type: vertical-stack
        cards:
          - type: vertical-stack
            cards:
              - type: entities
                title: Setting Grill Targets
                show_header_toggle: false
                entities:
                  - entity: input_number.grill_alert_low
                    name: Low
                  - entity: input_number.grill_alert_high
                    name: High

          - type: vertical-stack
            cards:
              - type: entities
                title: Setting Probe Targets
                show_header_toggle: false
                entities:
                  - entity: input_number.grill_probe_2_target
                    name: Probe 2
                  - entity: input_number.grill_probe_3_target
                    name: Probe 3
                  - entity: input_number.grill_probe_4_target
                    name: Probe 4
              - type: glance
                columns: 1
                entities:
                  - entity: automation.gril_uvedomleniia
                    tap_action:
                      action: toggle
                show_name: false
                show_icon: false

      - type: vertical-stack
        cards:
          - type: vertical-stack
            cards:
              - type: entities
                title: Setting graph timing
                show_header_toggle: false
                entities:
                  - entity: input_number.grill_graph_time
                    name: Hours to show

      - type: "custom:config-template-card"
        variables:
          - "states['input_number.grill_graph_time'].state"
        entities:
          - input_number.grill_graph_time
        card:
          type: custom:mini-graph-card
          name: BBQ
          icon: mdi:grill
          hours_to_show: "${vars[0]}"
          hour24: true
          points_per_hour: 30
          show:
            legend: true
            labels: true
            labels_secondary: true
          entities:
            - entity: sensor.ibbq_temperature_probe_1
              name: Grill temperature
            - sensor.ibbq_temperature_probe_2
            - sensor.ibbq_temperature_probe_3
            - sensor.ibbq_temperature_probe_4

thats configuration.yaml

  - platform: template
    sensors:
      target_alert_temp_probe_1:
        friendly_name: "Grill Temp Alert"
        value_template: >-
          {% if (states.sensor.ibbq_temperature_probe_1.state | int) < (states.input_number.grill_alert_low.state | int) or (states.sensor.ibbq_temperature_probe_1.state | int)  > (states.input_number.grill_alert_high.state | int) %}
            Alert
          {% else %}
            Normal
          {% endif %}
      target_alert_temp_probe_2:
        friendly_name: "Probe 2 Target Alert"
        value_template: >-
          {% if (states.sensor.ibbq_temperature_probe_2.state | int) >= (states.input_number.grill_probe_2_target.state | int) %}
            Alert
          {% else %}
            Normal
          {% endif %}
      target_alert_temp_probe_3:
        friendly_name: "Probe 3 Target Alert"
        value_template: >-
          {% if (states.sensor.ibbq_temperature_probe_3.state | int) >= (states.input_number.grill_probe_3_target.state | int) %}
            Alert
          {% else %}
            Normal
          {% endif %}
      target_alert_temp_probe_4:
        friendly_name: "Probe 4 Target Alert"
        value_template: >-
          {% if (states.sensor.ibbq_temperature_probe_4.state | int) >= (states.input_number.grill_probe_4_target.state | int) %}
            Alert
          {% else %}
            Normal
          {% endif %}
      grill_alert_low:
        friendly_name: "Grill Low Temp"
        unit_of_measurement: "ºC"
        value_template: "{{ (((states('input_number.grill_alert_low') | float)))|round(1)}}"
      grill_alert_high:
        friendly_name: "Grill High Temp"
        unit_of_measurement: "ºC"
        value_template: "{{ (((states('input_number.grill_alert_high') | float)))|round(1)}}"
      grill_probe_2_target:
        friendly_name: "Probe 2 Target Temp"
        unit_of_measurement: "ºC"
        value_template: "{{ (((states('input_number.grill_probe_2_target') | float)))|round(1)}}"
      grill_probe_3_target:
        friendly_name: "Probe 3 Target Temp"
        unit_of_measurement: "ºC"
        value_template: "{{ (((states('input_number.grill_probe_3_target') | float)))|round(1)}}"
      grill_probe_4_target:
        friendly_name: "Probe 4 Target Temp"
        unit_of_measurement: "ºC"
        value_template: "{{ (((states('input_number.grill_probe_4_target') | float)))|round(1)}}"
input_number:
  grill_alert_low:
    name: Grill Low Temp
    initial: 65
    min: 18
    max: 260
    step: 1
  grill_alert_high:
    name: Grill High Temp
    initial: 170
    min: 18
    max: 260
    step: 1
  grill_probe_2_target:
    name: Probe 2 Target Temp
    initial: 70
    min: 15
    max: 125
    step: 1
  grill_probe_3_target:
    name: Probe 3 Target Temp
    initial: 70
    min: 15
    max: 125
    step: 1
  grill_probe_4_target:
    name: Probe 4 Target Temp
    initial: 70
    min: 15
    max: 125
    step: 1
  grill_graph_time:
    name: Hours to show
    initial: 5
    min: 1
    max: 24
    step: 1
5 Likes

Thanks. I couldn’t figure out the glance portion.

Thank you for the code.
I get a message error (fyi: I’m using only 2 probes)

I installed the config template card through HACS, and checked that the file is present in /config/www/community/config-template-card/config-template-card.js

Another point:
I added sensor: at the beginning of your code in the configuration.yaml. Am I right ?

I can’t wait to use this project in my garden :wink:

If you have only two probes please remove half of the code from lovelace and config sections.
About missing card: check that Configuration - Dashboard - Resources. I’ve included resources with little different path maybe that will work:

lovelace:
  mode: yaml
  resources:
    - url: /local/community/config-template-card/config-template-card.js
      type: module

You can’t have two sensor sections so you add everything to your existing sensors section.

It appears you have an automation tied to the “Off” button. I am curious what that automation does?
Thank you.

If first probe (grill temp) goes out of range or other 3 reach goal i’l get notification.

2 Likes

Thank you so much. This interface is awesome, I cannot wait to get it up and running. I have a Weber iGrill connect to a raspberri pi that is sending mqtt to HA. One problem I have is, the temp in my interface shows up as UNKNOWN when I hgave my pi powered off. What I would like it to show, is a default of 0 degrees. Would you know how I can put code in my configuration to default to 0 degrees if there is no MQTT transactions? It causes problems with the gauges when non-numeric data is present(UNKNOWN)

sensor:
  - platform: mqtt
    state_topic: "bbq/grill/probe1"
    name: "Probe 1"
    qos: 0
    unit_of_measurement: "°F"

Thank you so much.
It works.
Only the notification is missing for the lovelace side.
On the esp side, I get huge dropouts, like @mazcoder have.

try use

value_template

welcome. For notifications you need to make Notification automation (i’m using telegram bot for notifications).
as of dropouts try @AlfaElan solution, works pretty stable:

script:
  - id: timer
    mode: restart
    then:
      - delay: 120s
1 Like