Inkbird IBT-4XS Cooking Thermometer: Perfecting BBQ with Home Assistant Integration

Inkbird IBT-4XS Cooking Thermometer: Perfecting BBQ with Home Assistant Integration

Introduction

As an amateur cook who enjoys grilling, I was on the hunt for a reliable thermometer to help me nail the perfect cook on various meats. Enter the Inkbird IBT-4XS Cooking Thermometer. With four probes and seamless Home Assistant integration, it’s been a game-changer for my BBQ sessions.

Get Yours Here

Why I Love the Inkbird IBT-4XS

  • Very Accurate: I’ve never overcooked or undercooked since I started using this.
  • Four Probes: Measure different meats simultaneously.
  • Home Assistant Integration: View all temperatures right on your dashboard.
  • Rechargeable Battery: Forget about buying batteries. A full charge lasts much longer than the claimed 20 hours.
  • Long Bluetooth Range: Monitor your BBQ from anywhere in the house.

Enhancing the Integration

To add the Inkbird thermometer to Home Assistant, you first need to install the Inkbird integration which will automatically find and set up the thermometer for you. After that, you’ll get four sensors in Home Assistant, one for each probe with the temperature. I decided to upgrade it a bit by:

  • Designing a nice layout in the dashboard. If you want to do what I’m doing here, you need the custom:mini-graph-card integration, card_mod integration, and browser_mod integration.
  • Clicking on any of the thermometer cards shows a popup that allows setting a temperature limit. Once the thermometer reaches that temperature, you get an alert.
  • There’s a timer on each of the thermometer cards to show you when each of them was connected.
  • They are only visible if they are working (meaning connected to the Inkbird unit and transmitting); otherwise, they’re hidden. The entire component is hidden if the thermometers aren’t connected.
  • I resorted to duplicating the same code four times here, once for each thermometer. If someone knows how to do this better, then I’ll be happy to hear.

Dashboard Code

The code I’m using for the card in the dashboard is:

  - type: conditional
    conditions:
      - condition: or
        conditions:
          - condition: numeric_state
            entity: sensor.ibbq_1d0f_temperature_probe_1
            above: 0
          - condition: numeric_state
            entity: sensor.ibbq_1d0f_temperature_probe_2
            above: 0
          - condition: numeric_state
            entity: sensor.ibbq_1d0f_temperature_probe_3
            above: 0
          - condition: numeric_state
            entity: sensor.ibbq_1d0f_temperature_probe_4
            above: 0
    card:
      type: horizontal-stack
      cards:
        - type: conditional
          conditions:
            - condition: numeric_state
              entity: sensor.ibbq_1d0f_temperature_probe_1
              above: 0
          card:
            type: custom:mini-graph-card
            smoothing: false
            points_per_hour: 120
            hours_to_show: 0.5
            font_size: 150
            name: Probe 1
            entities:
              - sensor.ibbq_1d0f_temperature_probe_1
            show:
              name_adaptive_color: true
              icon_adaptive_color: true
              points: false
              labels: false
              labels_secondary: false
            animate: true
            card_mod:
              style: |
                ha-card .states.flex::after {
                  color: white;
                  {% if is_state('input_boolean.kitchen_thermometer_1_toggle','on') %}
                    content: "{{states('input_number.kitchen_thermometer_probe_1') | int }}ºC | {{(as_datetime(as_timestamp(now())-as_timestamp(states('input_datetime.kitchen_thermometer_timer_1')))).strftime("%H:%M:%S")}}";
                  {% else %}
                    content: "{{(as_datetime(as_timestamp(now())-as_timestamp(states('input_datetime.kitchen_thermometer_timer_1')))).strftime("%H:%M:%S")}}";
                  {% endif %}
                    
                  //white-space: pre;
                  //background-color: rgba(50,50,50,0.1);
                  padding: 12px 0px 0px 0px;
                  margin-right: -5px;
                  border-radius: 5px;
                  font-size: 20px;
                }        
            tap_action:
              action: fire-dom-event
              browser_mod:
                service: script.set_thermometer_threshold_ui
                data:
                  probe_number: 1
                  browser_id: THIS
              target: {}
        - type: conditional
          conditions:
            - condition: numeric_state
              entity: sensor.ibbq_1d0f_temperature_probe_2
              above: 0
          card:
            type: custom:mini-graph-card
            smoothing: false
            points_per_hour: 60
            hours_to_show: 0.5
            font_size: 150
            name: Probe 2
            entities:
              - sensor.ibbq_1d0f_temperature_probe_2
            show:
              name_adaptive_color: true
              icon_adaptive_color: true
              points: false
              labels: false
              labels_secondary: false
            animate: true
            card_mod:
              style: |
                ha-card .states.flex::after {
                  color: white;
                  {% if is_state('input_boolean.kitchen_thermometer_2_toggle','on') %}
                    content: "{{states('input_number.kitchen_thermometer_probe_2') | int }}ºC | {{(as_datetime(as_timestamp(now())-as_timestamp(states('input_datetime.kitchen_thermometer_timer_2')))).strftime("%H:%M:%S")}}";
                  {% else %}
                    content: "{{(as_datetime(as_timestamp(now())-as_timestamp(states('input_datetime.kitchen_thermometer_timer_2')))).strftime("%H:%M:%S")}}";
                  {% endif %}
                  white-space: pre;
                  //background-color: rgba(50,50,50,0.1);
                  padding: 12px 0px 0px 0px;
                  margin-right: -5px;
                  border-radius: 5px;
                  font-size: 20px;
                }        
            tap_action:
              action: fire-dom-event
              browser_mod:
                service: script.set_thermometer_threshold_ui
                data:
                  probe_number: 2
                  browser_id: THIS
              target: {}
        - type: conditional
          conditions:
            - condition: numeric_state
              entity: sensor.ibbq_1d0f_temperature_probe_3
              above: 0
          card:
            type: custom:mini-graph-card
            smoothing: false
            points_per_hour: 60
            hours_to_show: 0.5
            font_size: 150
            name: Probe 3
            entities:
              - sensor.ibbq_1d0f_temperature_probe_3
            show:
              name_adaptive_color: true
              icon_adaptive_color: true
              points: false
              labels: false
              labels_secondary: false
            animate: true
            card_mod:
              style: |
                ha-card .states.flex::after {
                  color: white;
                  {% if is_state('input_boolean.kitchen_thermometer_3_toggle','on') %}
                    content: "{{states('input_number.kitchen_thermometer_probe_3') | int }}ºC | {{(as_datetime(as_timestamp(now())-as_timestamp(states('input_datetime.kitchen_thermometer_timer_3')))).strftime("%H:%M:%S")}}";
                  {% else %}
                    content: "{{(as_datetime(as_timestamp(now())-as_timestamp(states('input_datetime.kitchen_thermometer_timer_3')))).strftime("%H:%M:%S")}}";
                  {% endif %}
                  white-space: pre;
                  //background-color: rgba(50,50,50,0.1);
                  padding: 12px 0px 0px 0px;
                  margin-right: -5px;
                  border-radius: 5px;
                  font-size: 20px;
                }        
            tap_action:
              action: fire-dom-event
              browser_mod:
                service: script.set_thermometer_threshold_ui
                data:
                  probe_number: 3
                  browser_id: THIS
              target: {}
        - type: conditional
          conditions:
            - condition: numeric_state
              entity: sensor.ibbq_1d0f_temperature_probe_4
              above: 0
          card:
            type: custom:mini-graph-card
            smoothing: false
            points_per_hour: 60
            hours_to_show: 0.5
            font_size: 150
            name: Probe 4
            entities:
              - sensor.ibbq_1d0f_temperature_probe_4
            show:
              name_adaptive_color: true
              icon_adaptive_color: true
              points: false
              labels: false
              labels_secondary: false
            animate: true
            card_mod:
              style: |
                ha-card .states.flex::after {
                  color: white;
                  {% if is_state('input_boolean.kitchen_thermometer_4_toggle','on') %}
                    content: "{{states('input_number.kitchen_thermometer_probe_4') | int }}ºC | {{(as_datetime(as_timestamp(now())-as_timestamp(states('input_datetime.kitchen_thermometer_timer_4')))).strftime("%H:%M:%S")}}";
                  {% else %}
                    content: "{{(as_datetime(as_timestamp(now())-as_timestamp(states('input_datetime.kitchen_thermometer_timer_4')))).strftime("%H:%M:%S")}}";
                  {% endif %}
                  white-space: pre;
                  //background-color: rgba(50,50,50,0.1);
                  padding: 12px 0px 0px 0px;
                  margin-right: -5px;
                  border-radius: 5px;
                  font-size: 20px;
                }        
            tap_action:
              action: fire-dom-event
              browser_mod:
                service: script.set_thermometer_threshold_ui
                data:
                  probe_number: 4
                  browser_id: THIS
              target: {}

Setting Thresholds

The thermometer’s threshold is set with the following script:

alias: Set Thermometer Threshold UI
sequence:
  - service: browser_mod.popup
    data:
      browser_id: "{{ browser_id }}"
      dismissable: true
      content:
        type: vertical-stack
        cards:
          - type: custom:mushroom-number-card
            entity: input_number.kitchen_thermometer_probe_{{probe_number}}
            display_mode: slider
            icon_color: accent
            fill_container: false
          - type: grid
            square: false
            columns: 2
            cards:
              - type: custom:button-card
                entity: input_boolean.kitchen_thermometer_{{probe_number}}_toggle
                name: Enable
              - type: custom:button-card
                name: Ok
                icon: mdi:bookmark-plus
                tap_action:
                  action: call-service
                  service: browser_mod.close_popup
                  target: {}
      timeout: 30000
      title: Thermometer {{probe_number}} Threshold
mode: single
fields:
  probe_number:
    selector:
      number:
        min: 1
        max: 4
        mode: box
    name: Probe Number
    required: true

Creating Helpers

To make this work, you need to create the following helpers:

  • input_number.kitchen_thermometer_probe_1
  • input_number.kitchen_thermometer_probe_2
  • input_number.kitchen_thermometer_probe_3
  • input_number.kitchen_thermometer_probe_4
  • input_boolean.kitchen_thermometer_1_toggle
  • input_boolean.kitchen_thermometer_2_toggle
  • input_boolean.kitchen_thermometer_3_toggle
  • input_boolean.kitchen_thermometer_4_toggle
  • input_datetime.kitchen_thermometer_timer_1
  • input_datetime.kitchen_thermometer_timer_2
  • input_datetime.kitchen_thermometer_timer_3
  • input_datetime.kitchen_thermometer_timer_4

Alert Automation

The alert is set using the following automation:

alias: Kitchen Thermometers Alert
description: ""
trigger:
  - alias: Probe1 over limit
    platform: numeric_state
    entity_id:
      - sensor.ibbq_1d0f_temperature_probe_1
    above: input_number.kitchen_thermometer_probe_1
    id: probe1
    for:
      hours: 0
      minutes: 0
      seconds: 10
  - platform: numeric_state
    entity_id:
      - sensor.ibbq_1d0f_temperature_probe_2
    above: input_number.kitchen_thermometer_probe_2
    alias: Probe2 over limit
    id: probe2
    for:
      hours: 0
      minutes: 0
      seconds: 10
  - platform: numeric_state
    entity_id:
      - sensor.ibbq_1d0f_temperature_probe_3
    above: input_number.kitchen_thermometer_probe_3
    alias: Probe3 over limit
    id: probe3
    for:
      hours: 0
      minutes: 0
      seconds: 10
  - platform: numeric_state
    entity_id:
      - sensor.ibbq_1d0f_temperature_probe_4
    above: input_number.kitchen_thermometer_probe_4
    alias: Probe4 over limit
    id: probe4
    for:
      hours: 0
      minutes: 0
      seconds: 10
condition:
  - condition: or
    conditions:
      - condition: and
        conditions:
          - condition: trigger
            id:
              - probe1
          - condition: state
            entity_id: input_boolean.kitchen_thermometer_1_toggle
            state: "on"
      - condition: and
        conditions:
          - condition: trigger
            id:
              - probe2
          - condition: state
            entity_id: input_boolean.kitchen_thermometer_2_toggle
            state: "on"
      - condition: and
        conditions:
          - condition: trigger
            id:
              - probe3
          - condition: state
            entity_id: input_boolean.kitchen_thermometer_3_toggle
            state: "on"
      - condition: and
        conditions:
          - condition: trigger
            id:
              - probe4
          - condition: state
            entity_id: input_boolean.kitchen_thermometer_4_toggle
            state: "on"
action:
  - service: notify.alexa_media
    data:
      message: Your thermometer is above the defined level
      target: media_player.kitchen_echo
      data:
        type: announce
  - delay:
      hours: 0
      minutes: 1
      seconds: 0
      milliseconds: 0
mode: single

Starting Timers For Thermometer Probes

Timers can be started with this automation:

alias: Kitchen Thermometer Start Timer
description: ""
trigger:
  - platform: numeric_state
    entity_id:
      - sensor.ibbq_1d0f_temperature_probe_1
      - sensor.ibbq_1d0f_temperature_probe_2
      - sensor.ibbq_1d0f_temperature_probe_3
      - sensor.ibbq_1d0f_temperature_probe_4
    above: 0
condition: []
action:
  - service: input_datetime.set_datetime
    metadata: {}
    data:
      timestamp: "{{as_timestamp(now())}}"
    target:
      entity_id: input_datetime.kitchen_thermometer_timer_{{trigger.entity_id[-1:]}}
mode: queued
max: 10

Conclusion

This automation triggers an alert when any probe exceeds its set threshold and the toggle is on. You can adapt the notify service to fit your setup. For instance, you might prefer to receive a message in a different app or a notification through another service.

By integrating and customizing the Inkbird thermometer with Home Assistant, you can gain better insights and control over your cooking or any other activity requiring precise temperature monitoring. The combination of graphical representation, thresholds, and alerts ensures that you are always informed and can take action when needed.


Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply