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, andbrowser_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.