Chinese bluetooth BBQ meat probe with ESP32

I’ve built a BBQ meter using an esp32-wroom-32u. I have 5 hardwired meat probes (1 X BBQ and 4 X Meat Probes) and the ability to control a fan or an element. I am now trying to also add a 6th probe but wireless (bluetooth).

I’m using this chinese bluetooth probe (this one) probe and I’m getting this:

[17:40:43][I][ble_adv:021]: New BLE device
[17:40:43][I][ble_adv:022]:   address: 2A:03:DC:52:36:1B
[17:40:43][I][ble_adv:023]:   name: BBQ ProbeE 75323
[17:40:43][I][ble_adv:024]:   Advertised service UUIDs:
[17:40:43][I][ble_adv:035]:     - 0x2A03: (length 6)
[17:41:21][I][ble_adv:021]: New BLE device
[17:41:21][I][ble_adv:022]:   address: 2A:03:DC:52:36:1B
[17:41:21][I][ble_adv:023]:   name: BBQ ProbeE 75323
[17:41:22][I][ble_adv:024]:   Advertised service UUIDs:
[17:41:29][I][ble_adv:021]: New BLE device
[17:41:29][I][ble_adv:022]:   address: 2A:03:DC:52:36:1B
[17:41:29][I][ble_adv:023]:   name: BBQ ProbeE 75323
[17:41:29][I][ble_adv:024]:   Advertised service UUIDs:
[17:41:29][I][ble_adv:027]:     - 0xFB00
[17:41:30][I][ble_adv:029]:   Advertised service data:
[17:41:30][I][ble_adv:033]:   Advertised manufacturer data:
[17:41:30][I][ble_adv:035]:     - 0x2A03: (length 6)
[17:41:52][I][ble_adv:022]:   address: 2A:03:DC:52:36:1B
[17:41:52][I][ble_adv:023]:   name: BBQ ProbeE 75323
[17:41:52][I][ble_adv:024]:   Advertised service UUIDs:
[17:41:52][I][ble_adv:027]:     - 0x180A
[18:10:31][I][ble_adv:021]: New BLE device
[18:10:31][I][ble_adv:022]:   address: 2A:03:DC:52:36:1B
[18:10:31][I][ble_adv:023]:   name: BBQ ProbeE 75323
[18:10:31][I][ble_adv:024]:   Advertised service UUIDs:
[18:10:31][I][ble_adv:027]:     - 0x180A
[18:10:31][I][ble_adv:027]:     - 0xFB00
[18:10:31][I][ble_adv:030]:   Advertised service data:
[18:10:31][I][ble_adv:039]:     - 0x2A03: (1B.36.52.DC.03.2A (6))

How can I get actual data from it (temperatures)?
[18:07:44][D][sensor:125]: 'Probe BLE': Sending state 0.00000 °C with 0 decimals of accuracy

My code:

esp32_ble_tracker:
  on_ble_advertise:
    - mac_address: 2A:03:DC:52:36:1B
      then:
        - script.stop: timer
        - lambda: |-
            if (x.get_name() != "BBQ ProbeE 75323") return;
            
            ESP_LOGI("ble_adv", "New BLE device");
            ESP_LOGI("ble_adv", "  address: %s", x.address_str().c_str());
            ESP_LOGI("ble_adv", "  name: %s", x.get_name().c_str());
            ESP_LOGI("ble_adv", "  Advertised service UUIDs:");
            
            for (auto uuid : x.get_service_uuids()) {
              ESP_LOGI("ble_adv", "    - %s", uuid.to_string().c_str());
            }
            
            ESP_LOGI("ble_adv", "  Advertised service data:");
            
            for (auto data : x.get_service_datas()) {
              ESP_LOGI("ble_adv", "    - %s: (length %i)", data.uuid.to_string().c_str(), data.data.size());
            }
            
            ESP_LOGI("ble_adv", "  Advertised manufacturer data:");
            
            for (auto data : x.get_manufacturer_datas()) {
              ESP_LOGI("ble_adv", "    - %s: (%s)", data.uuid.to_string().c_str(), hexencode(data.data).c_str());
              
              if (data.uuid.contains(0, 0)) {
    
                int probe0 = (data.data[1] << 8) + data.data[0];
                    
                ESP_LOGI("ble_data", "    - %f %f", probe0 / 10.0);
    
                if (probe0 < 60000) {
                  id(ble_sensor_1).publish_state(probe0 / 10.0);
                } else {
                  id(ble_sensor_1).publish_state(0);                
                }

              }
            }
        - script.execute: timer

I added the following:
ESP_LOGI("ble_data", "0 - %f %f", data.data[0]);

And got:

[19:32:06][I][ble_data:042]: 0    - 1.999355 1.802914
[19:33:49][I][ble_data:042]: 0    - 1.985104 1.802948
[19:37:41][I][ble_data:042]: 0    - 1.988010 1.802914
[19:38:19][I][ble_data:042]: 0    - 1.983585 1.802914
[19:38:53][I][ble_data:042]: 0    - 1.983089 1.802914

No clue what I am doing :slight_smile:

these are the numbers I am getting (first column is the temps from the actual app, the hex is from readings via nrf connect:

image

I have a couple of these. I’ll have a play.

Someone seemed to have decoded it on my GitHub thread: Chinese ble bbq probe · Discussion #149 · theengs/decoder · GitHub

Now need to replicate this in esphome.

Hello,

I was looking at the same probes, and have one of them now. Did you ever manage to finish an integration for them? Especially now with the new Bluetooth proxy features in Home Assistant this would be a great addition, but I thought I would ask first before trying to reinvent the wheel.

Thanks!

No i haven’t had a chance to get into this project. Will have to get back at it during the next bbq season.

1 Like

It’s always BBQ season… :wink:

4 Likes

The information within this post along with the decoding info from github made it very easy to integrate, here is my integration in case someone needs it:

esp32_ble_tracker:
ble_client:
  - mac_address: 2A:03:AA:37:05:DD
    id: bbq_probe

sensor:
  - platform: ble_client
    type: characteristic
    ble_client_id: bbq_probe
    name: "BBQ Internal Temperature"
    notify: true
    accuracy_decimals: 0
    service_uuid: 'FB00'
    characteristic_uuid: 'FB02'
    icon: 'mdi:thermometer'
    unit_of_measurement: "°C"
    lambda: |-
      if (x.size() >= 4) {
        uint8_t byte3 = x[2];
        uint8_t byte4 = x[3];
        
        // Reverse the bytes
        uint16_t reversed_bytes = (byte4 << 8) | byte3;

        // Convert to decimal, subtract 400, divide by 10
        float result = (static_cast<float>(reversed_bytes) - 400.0) / 10.0;

        return result;
      } else {
        return 0;
      }
    

  - platform: ble_client
    type: characteristic
    ble_client_id: bbq_probe
    name: "BBQ External Temperature"
    notify: true
    accuracy_decimals: 0
    service_uuid: 'FB00'
    characteristic_uuid: 'FB02'
    icon: 'mdi:thermometer'
    unit_of_measurement: "°C"
    lambda: |-
      if (x.size() >= 6) {
        uint8_t byte5 = x[4];
        uint8_t byte6 = x[5];

        // Reverse the bytes
        uint16_t reversed_bytes = (byte6 << 8) | byte5;

        // Convert to decimal, subtract 400, divide by 10
        float result = (static_cast<float>(reversed_bytes) - 400.0) / 10.0;

        return result;
      } else {
        return 0;
      }
1 Like

Gotta say, easy is a relative term. But, of course, thanks a lot, I’ll have a try again with this. :slight_smile:

Thanks for your code, I am trying to implement your solution.

It compiles with out errors, it also looks like the ESP32 can get a connection. But it will not read the data.

Any idea what the error is?

[09:28:04][W][esp32_ble_client:215]: [1] [2A:03:BF:EE:CD:A4] esp_ble_gattc_get_descr_by_char_handle error, status=10
[09:28:04][W][esp32_ble_client:215]: [1] [2A:03:BF:EE:CD:A4] esp_ble_gattc_get_descr_by_char_handle error, status=10
[09:28:19][W][ble_sensor:080]: Error reading char at handle 22, status=2
[09:28:19][W][ble_sensor:080]: Error reading char at handle 22, status=2

Now it is working, I had to comment out a other bluetooth sensor.

Still get: “Error reading char at handle 22, status=2”

Not sure what the error indicates or how to fix it.

I’ve ordered some probes to test too.

Has anyone managed to develop this further (perhaps grab the battery level too?).

Looks like it’s time to get back to this project :slight_smile:

1 Like