Inkbird INT-11P-B BBQ Probe

I have an Inkbird INT-11P-B BBQ probe that doesn’t work with the Inkbird integration so I spent some time getting it working with ESP Home, here’s the config for anybody else that might find it useful.

If anybody can help me work out the probe battery level I’d appreciate that.

ble_client:
  - mac_address: "00:00:00:00:00:00"
    id: inkbird

switch:
  - platform: ble_client
    ble_client_id: inkbird
    name: "Enable Inkbird INT-11P-B"

sensor:
  - platform: ble_client
    type: characteristic
    ble_client_id: inkbird
    name: Inkbird Internal
    id: inkbird_internal
    service_uuid: 0000fff0-0000-1000-8000-00805f9b34fb
    characteristic_uuid: 0000fff1-0000-1000-8000-00805f9b34fb
    unit_of_measurement: '°C'
    lambda: |-
      // Display the hex string for debugging.
      std::vector<uint8_t> data = x;
      String hex_string = "";
      for (size_t i = 0; i < x.size(); ++i) {
        char hex_buffer[3];
        snprintf(hex_buffer, sizeof(hex_buffer), "%02X", data[i]);
        hex_string += hex_buffer;
        if (i % 2 == 1 && i != data.size() - 1) {
          hex_string += " ";  // Insert a space every two bytes
        }
      }
      uint8_t arr_size = x.size();
      ESP_LOGW("LOG_TAG", "INKBIRD Hexadecimal string: %s", hex_string.c_str());
      uint8_t value = x[1];
      return value;
    device_class: "temperature"
  - platform: ble_client
    type: characteristic
    ble_client_id: inkbird
    name: Inkbird Ambient
    id: inkbird_ambient
    service_uuid: 0000fff0-0000-1000-8000-00805f9b34fb
    characteristic_uuid: 0000fff1-0000-1000-8000-00805f9b34fb
    unit_of_measurement: '°C'
    lambda: |-
        uint8_t value = x[3];
        return value;
    filters:
      - filter_out: 0.0
    device_class: "temperature"
  - platform: ble_client
    type: characteristic
    ble_client_id: inkbird
    name: Inkbird Flags
    id: inkbird_flags
    service_uuid: 0000fff0-0000-1000-8000-00805f9b34fb
    characteristic_uuid: 0000fff1-0000-1000-8000-00805f9b34fb
    lambda: |-
        uint8_t value = x[2];
        return value;
  # This almost certainly relates to probe battery, possibly without the most significant bit?
  - platform: ble_client
    type: characteristic
    ble_client_id: inkbird
    name: Inkbird Unknown 4
    id: inkbird_unknown_4
    service_uuid: 0000fff0-0000-1000-8000-00805f9b34fb
    characteristic_uuid: 0000fff1-0000-1000-8000-00805f9b34fb
    lambda: |-
        uint8_t value = x[4];
        return value;
    device_class: voltage
  - platform: ble_client
    type: characteristic
    ble_client_id: inkbird
    name: Inkbird Probe Battery
    id: inkbird_probe_battery
    service_uuid: 0000fff0-0000-1000-8000-00805f9b34fb
    characteristic_uuid: 0000fff1-0000-1000-8000-00805f9b34fb
    lambda: |-
        uint8_t value = (x[4] & 0x7F);
        return value;
    unit_of_measurement: '%'
    device_class: battery
  - platform: ble_client
    type: characteristic
    ble_client_id: inkbird
    name: Inkbird Unknown 5
    id: inkbird_unknown_5
    service_uuid: 0000fff0-0000-1000-8000-00805f9b34fb
    characteristic_uuid: 0000fff1-0000-1000-8000-00805f9b34fb
    lambda: |-
        uint8_t value = x[5];
        return value;
    device_class: voltage
  - platform: ble_client
    type: characteristic
    ble_client_id: inkbird
    name: Inkbird Case Battery
    id: inkbird_case_battery
    service_uuid: 0000fff0-0000-1000-8000-00805f9b34fb
    characteristic_uuid: 0000fff1-0000-1000-8000-00805f9b34fb
    lambda: |-
        uint8_t value = x[5] >> 1;
        return value;
    unit_of_measurement: '%'
    device_class: battery
  - platform: ble_client
    type: characteristic
    ble_client_id: inkbird
    name: Inkbird Case Charging
    icon: mdi:battery-charging
    id: inkbird_case_charging
    service_uuid: 0000fff0-0000-1000-8000-00805f9b34fb
    characteristic_uuid: 0000fff1-0000-1000-8000-00805f9b34fb
    lambda: |-
        bool value = (x[5] & 0x01);
        return value;
  - platform: ble_client
    type: characteristic
    ble_client_id: inkbird
    name: Inkbird Probe Charging
    icon: mdi:battery-charging
    id: inkbird_probe_charging
    service_uuid: 0000fff0-0000-1000-8000-00805f9b34fb
    characteristic_uuid: 0000fff1-0000-1000-8000-00805f9b34fb
    lambda: |-
        bool value = (x[2] >> 7);
        return value;
4 Likes

Is it possible for you to document how you discovered how to do this? There are precious few examples of analysing ble messages and reducing it to esp code.

Sure, I’ll get something written up, I was lucky that the probe broadcasts its data and doesn’t have to be queried in this case which made it much easier.

I think the first lambda should be returning a temp.
Is it just x[1]?

I’ve just chucked the probe in my oven to test. Neither x[1] (internal?) nor x[3] (ambient) seem to return values over 127. In theory they could go up to 255, which wouldn’t be enough for the ambient sensor which specs say can range from 0-300.

However, if there were just some more significant bits somewhere, I’d expect these values to cycle round to 0 again, but they stay at 127.

Yep, that was a copy/paste fail. You’re right that I had x[1], I’ve updated it above.

Odd that you’re values aren’t going above 127 though, I not sure what’s going on there. Assuming you have this probe, the same as me?

Does the hex log give any clues?

Thanks for sharing this @Markg! My probe will be arriving… soon, will see if I can get your config working.

The Inkbird integration in Home Assistant core uses inkbird-ble/src/inkbird_ble/parser.py at cb5ceeac9d7a2dd6d923c8ca5b7ddd220ef798a3 · Bluetooth-Devices/inkbird-ble · GitHub to parse the advertisement packets - looks like it should be a fairly straightforward change to get your work translated into Python and added to that repo?

I have the same probe and would like to get it working in HA.
Is the code all written to the esp32 in esphome, I did try and compile on the older version of the code but got an error on the lambda section on ble_client.

I’ve tried again with the updated code and works aftering entering the correct mac address.

Yes I’m using esp32, what did you need to change? I may have messed up copying something else and will update the snippet above.

Great that you got it working!

That sounds like a good plan, I did take a look but couldn’t work it out, will take another look sometime if nobody beats me to it.

Same probe, I’ll try to take some logs when I have time. Nevertheless you can’t fit 0-300 in 8 bits, so there must be some more info somewhere, no?

Thanks for your work on this so far, it’s going to be great to have this hooked up to HA.

That’s a good point, I hadn’t checked the max temp of the probe and only really use it for low and slow bbq so didn’t notice. I wonder if it’ll use the last bit of the first byte for the ambient temp, which has always been a constant 0xAA when I’ve looked.