Monitoring a BBQ with HA and CloudBBQ

When I first started learning to smoke meat, I would stay up all night to watch the cooker and ensure that the grill never got over about 230 degrees and the meat never got over about 195. Last year, I purchased a Tenergy Solis Digital Thermometer. This is a great little thermometer that has 6 probes. It has the ability to connect via Bluetooth to an app on my phone to monitor the temperatures remotely. It also has the ability to set thresholds that will cause alarm if the temperature goes outside of them. That allowed me enough probes to monitor the grill temperature and the temperature of up to 5 pork shoulders and the ability to not have to be right by the grill the whole time. The problem was, my bedroom and my office are just outside the range of the thermometer at the grill. I would frequently get alarms that I had lost connection. This was especially annoying when I would try to catch a couple of hours sleep while doing a cook (It can take up to 17 hours to cook a pork shoulder, so I usually plan my cook so the meat is coming off the cooker about an hour before we are ready to eat). So, I started looking for a solution that would give me better range and connectivity to HA (because everything should talk to HA, right!?).

After a lot of searching for other smart thermometers and DIY projects, I found CloudBBQ. This project uses a Raspberry Pi to create a Bluetooth to MQTT bridge for my thermometer. The project was built to connect to Adafruit IO, but I found it was easily configurable to connect to my Mosquitto broker I have loaded on HassIO. Since I’m still pretty new to MQTT, it took me awhile to figure out the correct settings in the cloudbbq config file, but once I did, cloudbbq started publishing temperatures to Mosquitto. Below is an example of the config file I used. Since this is inside my home network, behind my firewall, I’m currently running this using mqtt instead of mqtts. I have intentions of switching over to mqtts in the near future.

{
     "mqtt": {
          "username" : "[Mosquitto Username]",
          "key" : "[Mosquitto Password]",
          "protocol" : "mqtt",
          "url" : "[Mosquitto Server IP Address]:[Mosquitto Port]",
          "topics":[
               "ibbq/ibbq1",
               "ibbq/ibbq2",
               "ibbq/ibbq3",
               "ibbq/ibbq4",
               "ibbq/ibbq5",
               "ibbq/ibbq6"
          ],
          "probeMessagePerPublish":12
     }
}

My next goal was to create sensors in HA for each probe and build out a dashboard, automation, and notifications. A big shout out goes to @stogs for the great write up of his Weber iGrill 2 integration. I borrowed liberally from his dashboard setup and YAML to setup my sensors and automations. I swapped out the notifications @stogs uses for Pushover notifications since I have an Android based phone instead of an iPhone.

Now, not only can I go anywhere in the house and still monitor the grill, I can leave the house, if I need to.

6 Likes

Sensors.yaml

- platform: mqtt
  name: "iBBQ Probe 1"
  state_topic: "ibbq/ibbq1"
  unit_of_measurement: "°F"
  device_class: "temperature"
  value_template: "{{ value_json.value }}"
  icon: mdi:thermometer
  
- platform: mqtt
  name: "iBBQ Probe 2"
  state_topic: "ibbq/ibbq2"
  unit_of_measurement: "°F"
  device_class: "temperature"
  value_template: "{{ value_json.value }}"
  icon: mdi:thermometer
  
- platform: mqtt
  name: "iBBQ Probe 3"
  state_topic: "ibbq/ibbq3"
  unit_of_measurement: "°F"
  device_class: "temperature"
  value_template: "{{ value_json.value }}"
  icon: mdi:thermometer
  
- platform: mqtt
  name: "iBBQ Probe 4"
  state_topic: "ibbq/ibbq4"
  unit_of_measurement: "°F"
  device_class: "temperature"
  value_template: "{{ value_json.value }}"
  icon: mdi:thermometer
  
- platform: mqtt
  name: "iBBQ Probe 5"
  state_topic: "ibbq/ibbq5"
  unit_of_measurement: "°F"
  device_class: "temperature"
  value_template: "{{ value_json.value }}"
  icon: mdi:thermometer
  
- platform: mqtt
  name: "iBBQ Probe 6"
  state_topic: "ibbq/ibbq6"
  unit_of_measurement: "°F"
  device_class: "temperature"
  value_template: "{{ value_json.value }}"
  icon: mdi:thermometer
  
- platform: sonarr
  api_key: !secret sonarr_api
  
- platform: template
  sensors:
    grill_alert_temp:
      value_template:
        '{% if (states.sensor.ibbq_probe_6.state | int) < (states.input_number.grill_alert_low.state | int) or (states.sensor.ibbq_probe_6.state | int)  > (states.input_number.grill_alert_high.state | int) %}
          Alert
         {% else %}
          Normal
         {% endif %}'
      friendly_name: Grill Temp Alert
      icon_template:
        '{% if (states.sensor.ibbq_probe_6.state | int) < (states.input_number.grill_alert_low.state | int) or (states.sensor.ibbq_probe_6.state | int)  > (states.input_number.grill_alert_high.state | int) %}
          mdi:alert-circle
         {% else %}
          mdi:alert-circle-check
         {% endif %}'
      
    target_alert_temp_probe_1:
      value_template:
        '{% if (states.sensor.ibbq_probe_1.state | int) >= (states.input_number.grill_probe_1_target.state | int) %}
          Alert
         {% else %}
          Normal
         {% endif %}'
      friendly_name: Probe 1 Target Alert
      icon_template:
        '{% if (states.sensor.ibbq_probe_1.state | int) >= (states.input_number.grill_probe_1_target.state | int) %}
          mdi:alert-circle
         {% else %}
          mdi:alert-circle-check
         {% endif %}'
      
    target_alert_temp_probe_2:
      value_template:
        '{% if (states.sensor.ibbq_probe_2.state | int) >= (states.input_number.grill_probe_2_target.state | int) %}
          Alert
         {% else %}
          Normal
         {% endif %}'
      friendly_name: Probe 2 Target Alert
      icon_template:
        '{% if (states.sensor.ibbq_probe_2.state | int) >= (states.input_number.grill_probe_2_target.state | int) %}
          mdi:alert-circle
         {% else %}
          mdi:alert-circle-check
         {% endif %}'
      
    target_alert_temp_probe_3:
      value_template:
        '{% if (states.sensor.ibbq_probe_3.state | int) >= (states.input_number.grill_probe_3_target.state | int) %}
          Alert
         {% else %}
          Normal
         {% endif %}'
      friendly_name: Probe 4 Target Alert
      icon_template:
        '{% if (states.sensor.ibbq_probe_3.state | int) >= (states.input_number.grill_probe_3_target.state | int) %}
          mdi:alert-circle
         {% else %}
          mdi:alert-circle-check
         {% endif %}'
      
    target_alert_temp_probe_4:
      value_template:
        '{% if (states.sensor.ibbq_probe_4.state | int) >= (states.input_number.grill_probe_4_target.state | int) %}
          Alert
         {% else %}
          Normal
         {% endif %}'
      friendly_name: Probe 4 Target Alert
      icon_template:
        '{% if (states.sensor.ibbq_probe_4.state | int) >= (states.input_number.grill_probe_4_target.state | int) %}
          mdi:alert-circle
         {% else %}
          mdi:alert-circle-check
         {% endif %}'
      
    target_alert_temp_probe_5:
      value_template:
        '{% if (states.sensor.ibbq_probe_5.state | int) >= (states.input_number.grill_probe_5_target.state | int) %}
          Alert
         {% else %}
          Normal
         {% endif %}'
      friendly_name: Probe 5 Target Alert
      icon_template:
        '{% if (states.sensor.ibbq_probe_5.state | int) >= (states.input_number.grill_probe_5_target.state | int) %}
          mdi:alert-circle
         {% else %}
          mdi:alert-circle-check
         {% endif %}'

Input_Number.yaml

grill_alert_low:
  name: Grill Low Temp
  initial: 150
  min: 100
  max: 500
  step: 5
  icon: mdi:thermometer-alert
  unit_of_measurement: "°F"
grill_alert_high:
  name: Grill High Temp
  initial: 340
  min: 100
  max: 500
  step: 5
  icon: mdi:thermometer-alert
  unit_of_measurement: "°F"
grill_probe_1_target:
  name: Probe 1 Target Temp
  initial: 160
  min: 60
  max: 250
  step: 1
  icon: mdi:target
  unit_of_measurement: "°F"
grill_probe_2_target:
  name: Probe 2 Target Temp
  initial: 160
  min: 60
  max: 250
  step: 1
  icon: mdi:target
  unit_of_measurement: "°F"
grill_probe_3_target:
  name: Probe 3 Target Temp
  initial: 160
  min: 60
  max: 250
  step: 1
  icon: mdi:target
  unit_of_measurement: "°F"
grill_probe_4_target:
  name: Probe 4 Target Temp
  initial: 160
  min: 60
  max: 250
  step: 1
  icon: mdi:target
  unit_of_measurement: "°F"
grill_probe_5_target:
  name: Probe 5 Target Temp
  initial: 160
  min: 60
  max: 250
  step: 1
  icon: mdi:target
  unit_of_measurement: "°F"

Automations.yaml

Change [LINK TO BBQ DASHBOARD] to your URL.

- alias: "Monitor Grill Temp Alert"
  trigger:
    - platform: state
      entity_id: sensor.grill_alert_temp
      to: 'Alert'
  action:
    - service: notify.NOTIFIER_NAME
      data:
        message: "Grill temp outside limits. Currently {{ states.sensor.ibbq_probe_6.state }} F"
        title: "Grill Temp"
        data:
          url: "[LINK TO BBQ DASHBOARD]"
          sound: pianobar
          priority: 0

- alias: "Monitor Grill Temp Normal"
  trigger:
    - platform: state
      entity_id: sensor.grill_alert_temp
      to: 'Normal'
  action:
    - service: notify.NOTIFIER_NAME
      data:
        message: "Grill temp within limits. Currently {{ states.sensor.ibbq_probe_6.state }} F"
        title: "Grill Temp"
        data:
          url: "[LINK TO BBQ DASHBOARD]"
          sound: pianobar
          priority: 0

- alias: "Probe 1 Target Temp"
  trigger:
    - platform: state
      entity_id: sensor.target_alert_temp_probe_1
      to: 'Alert'
  action:
    - service: notify.NOTIFIER_NAME
      data:
        message: "Probe 1 has reached the target temp. Currently {{ states.sensor.ibbq_probe_1.state }} F"
        title: "Target Temperature"
        data:
          url: "[LINK TO BBQ DASHBOARD]"
          sound: pianobar
          priority: 0

- alias: "Probe 2 Target Temp"
  trigger:
    - platform: state
      entity_id: sensor.target_alert_temp_probe_2
      to: 'Alert'
  action:
    - service: notify.NOTIFIER_NAME
      data:
        message: "Probe 2 has reached the target temp. Currently {{ states.sensor.ibbq_probe_2.state }} F"
        title: "Target Temperature"
        data:
          url: "[LINK TO BBQ DASHBOARD]"
          sound: pianobar
          priority: 0

- alias: "Probe 3 Target Temp"
  trigger:
    - platform: state
      entity_id: sensor.target_alert_temp_probe_3
      to: 'Alert'
  action:
    - service: notify.NOTIFIER_NAME
      data:
        message: "Probe 3 has reached the target temp. Currently {{ states.sensor.ibbq_probe_3.state }} F"
        title: "Target Temperature"
        data:
          url: "[LINK TO BBQ DASHBOARD]"
          sound: pianobar
          priority: 0
        
- alias: "Probe 4 Target Temp"
  trigger:
    - platform: state
      entity_id: sensor.target_alert_temp_probe_4
      to: 'Alert'
  action:
    - service: notify.NOTIFIER_NAME
      data:
        message: "Probe 4 has reached the target temp. Currently {{ states.sensor.ibbq_probe_4.state }} F"
        title: "Target Temperature"
        data:
          url: "[LINK TO BBQ DASHBOARD]"
          sound: pianobar
          priority: 0
        
- alias: "Probe 5 Target Temp"
  trigger:
    - platform: state
      entity_id: sensor.target_alert_temp_probe_5
      to: 'Alert'
  action:
    - service: notify.NOTIFIER_NAME
      data:
        message: "Probe 5 has reached the target temp. Currently {{ states.sensor.ibbq_probe_5.state }} F"
        title: "Target Temperature"
        data:
          url: "[LINK TO BBQ DASHBOARD]"
          sound: pianobar
          priority: 0

Good info. thanks.

I actually just finished building my own sensor device using a nodemcu. If I had know about the Tenergy (and known it could be bridged to MQTT…) I likely would have went with that.

The issues I had with my current sensor is the lack of HA integration and most importantly the range for the remote device was horrible.

Now using wifi I can reach the sensor on my phone anywhere in my house or yard that I have a wifi signal from a webserver that I created on the device and it can talk directly to HA over MQTT so I can have all of the greatness of HA automations and notifications too. Mine was a little cheaper overall than the Tenergy but I only have one food probe (in addition to the smoker box temperature probe too - so two probes total) but that’s typically enough for what I need. That’s a nice advantage of the Tenergy over mine tho.

It would concern me tho that they say that there is a potential issue with the probes melting inside a closed grill. My probes are all metal so i don’t have to worry about that.

The range issue is another concern I would have with the Tenergy tho. It says it can reach up to 100 feet but typical bluetooth range from what I’ve seen is only about 30 feet at best with an unobstructed line of sight. so i’m not sure i would trust that number.

But another advantage of the Tenergy over mine is there’s no soldering required! :laughing:

Again thanks for the info and happy smoking! :slightly_smiling_face:

I"ve used the Tenergy for quite awhile now. I only use it for smoking, so the temp rarely gets over 250 degrees. I haven’t had any issues with melting. I would guess that might become a concern if you are using it to grill at high temps.

I think I would like to try building a fully WiFi thermometer next. I have some ESP32 boards laying around that might work well with the right sensors.

If you need any input feel free to ask.

There are some home brewing (beer) software packages that might help with monitoring and charting. If you smoke with electric, you potentially temp control that as well
Look at Fermentrack and one of the following
Brewpiless
Brewpi remix
They use arduino or ESP boards to monitor temps and control relays based on temps. Fermentrack provides a nice interface and logging with the ability to post to various web svcs.

(Sorry, for intruding, I’m not a HA user or smoker, but was referred to this thread because I’m looking for a way to monitor whether the grill is left on)

1 Like

@uSlackr. Thanks. I just started playing with ESP boards. I’m going to check out Fermentrack.

1 Like

Hey Nathan,

I spend more than a week now trying to follow your manual but with no success.
Is it possible to ask you for a support session by WhatsApp or some other way?

Sorry for the delay. I’ve been travelling. CloudBBQ is not my project. I wrote some yaml to listen to it and collect the data. You might want to reach out to the CloudBBQ creator.

I have RTL_433 running on a Pi 0 and use it with both Acurite outdoor themperature/humidity sensors and two maverick et-732 thermometers. Interface to HA is through mosquitto mqtt broker HA supervisor add in.

Hello everybody, I’m looking for a way to get my inkbird bluetooth thermometer (which at the moment is connected via bluetooth to BBQgo app on my smartphone) visible on Home assistant. I’m also creating a home control dashboard based on an old tablet that’s going to be held on a wall in the kitchen. So I’m thinking: would it be possible to use the tablet as a bridge to connect the BT Thermometer to Home Assistant? I haven’t found anything about it. Any Ideas?
Thank you in advance

I have an Inkbird bluetooth bbq thermometer, model IBT-4XS. Has anyone successfully added this type of device to HA. Any assistance on an integration would be appreciated.

1 Like

I’ve not played with the Inkbird. You might give what I put together a try and see how the Inkbird publishes its readings. You might get lucky.

Hey Dormani

I had luck with running the below sketch on an ESP32 for my inkbird 4 channel I used Nathans setup above which were very helpful.

BLE MQTT ESP32

Thermometer link

Thanks Climber10293 for your response. What application did you use to upload the sketch to the ESP32. I have tried to load the files into ARDUINO 1.8.9 but have been unsuccessful. Any further help from you would be greatly appreciated.
Thanks again.

Oh yes this one took me a bit to figure out so I am using Arduino but you have to adjust the partition size in the tools menu.

I believe the one I show in the picture works but you may have to try a few of them to get it to work.

Also this is the ESP 32 package I bought it this helps.

Using a ESP32 is pretty cool. I have a few sitting around. I’m going to have to try this.

I have a spare one lying around also. I am still having an issue trying to load the sketch into Arduino program. Comes up with an error message that it will only "öpen sketches and other files ending in .ino or .pde" Any suggestions or am I missing the obvious here?