INKBIRD IBT-2X-B Not found by Integration

Ok, I know that device supported with Inkbird integration, but looks like they changed topics or data, tried few days to discover device with various integrations.
Please add it to INKBIRD integration.

for now its what i’ve done:

I think trouble in what its found in BLE.
its not xBBQ, iBBQ, now its Inkbird@IBT-2X-B

here discover from Bluetooth

{"name":"Inkbird@IBT-2X-B","address":"40:F3:B0:36:1C:29","rssi":-60,"manufacturer_data":{"0":"0140f3b0361c29"},"service_data":{},"service_uuids":["0000ff00-0000-1000-8000-00805f9b34fb"],"source":"30:C9:22:EF:35:2E","connectable":true,"time":1750164124.2630298,"tx_power":null}

[01:41:29.3660] Normal: Scanner On.
[01:41:29.9610] Normal: Device Scanned.
[01:41:29.9610] Debug: [Callback] centralManager(central, didDiscover: peripheral, advertisementData: ["kCBAdvDataRxPrimaryPHY": 1, "kCBAdvDataManufacturerData": <00000140 f3b0361c 29>, "kCBAdvDataServiceUUIDs": <__NSArrayM 0x148c06a60>(
FF00
)
, "kCBAdvDataRxSecondaryPHY": 0, "kCBAdvDataIsConnectable": 1, "kCBAdvDataTimestamp": 771720089.9591891], rssi: -39)
[01:43:29.4000] Normal: Scanner Off.
[01:44:14.3040] Verbose: Connecting...
[01:44:14.3040] Debug: cbCentralManager.connect()
[01:44:15.1340] Debug: [Callback] centralManager(central, didConnect: peripheral)
[01:44:15.1340] Normal: Connected.
[01:44:15.1340] Verbose: Discovering Services...
[01:44:15.1340] Debug: peripheral.discoverServices(nil)
[01:44:15.1900] Debug: [Callback] peripheral(peripheral, didDiscoverServices: nil)
[01:44:15.1900] Normal: Discovered FF00 Services.
[01:44:15.1900] Verbose: Discovering Characteristics for FF00...
[01:44:15.1900] Debug: peripheral.discoverCharacteristics(nil, for: FF00)
[01:44:15.1910] Debug: [Callback] peripheral(peripheral, didDiscoverCharacteristicsFor: FF00, error: nil)
[01:44:15.1910] Verbose: Discovering Descriptors for Characteristic FF01...
[01:44:15.1910] Debug: peripheral.discoverDescriptors(for: FF01)
[01:44:15.1910] Verbose: Discovering Descriptors for Characteristic FF02...
[01:44:15.1910] Debug: peripheral.discoverDescriptors(for: FF02)
[01:44:15.1910] Verbose: Discovering Descriptors for Characteristic FF03...
[01:44:15.1910] Debug: peripheral.discoverDescriptors(for: FF03)
[01:44:15.1910] Verbose: Discovering Descriptors for Characteristic FF04...
[01:44:15.1910] Debug: peripheral.discoverDescriptors(for: FF04)
[01:44:15.1910] Verbose: Discovering Descriptors for Characteristic Battery Level...
[01:44:15.1910] Debug: peripheral.discoverDescriptors(for: 2A19)
[01:44:15.1910] Verbose: Discovering Descriptors for Characteristic FF07...
[01:44:15.1910] Debug: peripheral.discoverDescriptors(for: FF07)
[01:44:15.1910] Verbose: Discovering Descriptors for Characteristic FF08...
[01:44:15.1910] Debug: peripheral.discoverDescriptors(for: FF08)
[01:44:15.1910] Verbose: Discovering Descriptors for Characteristic FF09...
[01:44:15.1910] Debug: peripheral.discoverDescriptors(for: FF09)
[01:44:15.1910] Debug: [Callback] peripheral(peripheral, didDiscoverDescriptorsFor: FF01, error: nil)
[01:44:15.1920] Debug: [Callback] peripheral(peripheral, didDiscoverDescriptorsFor: FF02, error: nil)
[01:44:15.1930] Debug: [Callback] peripheral(peripheral, didDiscoverDescriptorsFor: FF03, error: nil)
[01:44:15.1930] Debug: [Callback] peripheral(peripheral, didDiscoverDescriptorsFor: FF04, error: nil)
[01:44:15.1940] Debug: [Callback] peripheral(peripheral, didDiscoverDescriptorsFor: 2A19, error: nil)
[01:44:15.1940] Debug: [Callback] peripheral(peripheral, didDiscoverDescriptorsFor: FF07, error: nil)
[01:44:15.1940] Normal: Discovered FF01, FF02, FF03, FF04, Battery Level, FF07, FF08, and FF09 Characteristics for Service FF00.
[01:44:15.1940] Normal: Discovered Client Characteristic Configuration Descriptors for Characteristic FF01
[01:44:15.1940] Debug: [Callback] peripheral(peripheral, didDiscoverDescriptorsFor: FF08, error: nil)
[01:44:15.1940] Normal: FF02 has no Descriptors.
[01:44:15.1940] Normal: Discovered Client Characteristic Configuration Descriptors for Characteristic FF03
[01:44:15.1950] Normal: Discovered Client Characteristic Configuration Descriptors for Characteristic FF04
[01:44:15.1950] Debug: [Callback] peripheral(peripheral, didDiscoverDescriptorsFor: FF09, error: nil)
[01:44:15.1950] Normal: Discovered Client Characteristic Configuration Descriptors for Characteristic Battery Level
[01:44:15.1950] Normal: Discovered Client Characteristic Configuration Descriptors for Characteristic FF07
[01:44:15.1950] Normal: Discovered Client Characteristic Configuration Descriptors for Characteristic FF08
[01:44:15.1950] Normal: Discovered Client Characteristic Configuration Descriptors for Characteristic FF09

Since I still not good in Code, I used AI to found services and connect it throughout ESPHOME

esphome:
  name: inkbird-ibt2x
  comment: "Inkbird IBT-2X BLE Temperature Monitor"

esp32:
  board: esp32dev
  framework:
    type: arduino
    version: recommended

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  manual_ip:
    static_ip: 192.168.31.205
    gateway: 192.168.31.1
    subnet: 255.255.255.0
    dns1: 192.168.31.1
    
logger:
  level: DEBUG

api:
  encryption:
    key: "***"

ota:
  - platform: esphome
    password: "***"

web_server:
  port: 80
  version: 3

esp32_ble_tracker:
  scan_parameters:
    interval: 1.2s
    window: 800ms
  on_ble_advertise:
    - mac_address: "40:F3:B0:36:1C:29"
      then:
        - lambda: |-
            if (x.get_name() != "Inkbird@IBT-2X-B") return;
            id(inkbird_rssi).publish_state(x.get_rssi());

ble_client:
  - mac_address: "40:F3:B0:36:1C:29"
    id: inkbird
    auto_connect: true
    on_connect:
      then:
        - lambda: |-
            ESP_LOGI("ble", "Connected, initializing device...");
            delay(1000);

            auto auth_characteristic = id(inkbird)->get_characteristic(
              esp32_ble_tracker::ESPBTUUID::from_raw("0000ff00-0000-1000-8000-00805f9b34fb"),
              esp32_ble_tracker::ESPBTUUID::from_raw("0000ff01-0000-1000-8000-00805f9b34fb"));
            if (auth_characteristic != nullptr) {
              uint8_t auth_msg[15] = {0x21, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0xb8, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00};
              auth_characteristic->write_value(auth_msg, sizeof(auth_msg));
              delay(1000);
            }

            auto settings_characteristic = id(inkbird)->get_characteristic(
              esp32_ble_tracker::ESPBTUUID::from_raw("0000ff00-0000-1000-8000-00805f9b34fb"),
              esp32_ble_tracker::ESPBTUUID::from_raw("0000ff02-0000-1000-8000-00805f9b34fb"));
            if (settings_characteristic != nullptr) {
              uint8_t celsius_msg[6] = {0x02, 0x00, 0x00, 0x00, 0x00, 0x00};
              settings_characteristic->write_value(celsius_msg, sizeof(celsius_msg));
              delay(500);
              
              uint8_t rt_msg[6] = {0x0B, 0x01, 0x00, 0x00, 0x00, 0x00};
              settings_characteristic->write_value(rt_msg, sizeof(rt_msg));
              delay(500);
            }

sensor:
  - platform: ble_client
    type: characteristic
    ble_client_id: inkbird
    name: "INKBIRD Temperature Probe 1"
    service_uuid: "0000ff00-0000-1000-8000-00805f9b34fb"
    characteristic_uuid: "0000ff01-0000-1000-8000-00805f9b34fb"
    unit_of_measurement: "°C"
    accuracy_decimals: 1
    update_interval: 60s
    filters:
      - sliding_window_moving_average:
          window_size: 5
          send_every: 2
    lambda: |-
      if (x.size() >= 4) {
        int16_t raw_temp = (x[1] << 8) | x[0];
        float temp_c = raw_temp / 10.0;
        if (temp_c > 60) {
          temp_c = (temp_c - 32) * 5/9;
        }
        return temp_c;
      }
      return NAN;

  - platform: ble_client
    type: characteristic
    ble_client_id: inkbird
    name: "INKBIRD Temperature Probe 2"
    service_uuid: "0000ff00-0000-1000-8000-00805f9b34fb"
    characteristic_uuid: "0000ff01-0000-1000-8000-00805f9b34fb"
    unit_of_measurement: "°C"
    accuracy_decimals: 1
    update_interval: 60s
    filters:
      - sliding_window_moving_average:
          window_size: 5
          send_every: 2
    lambda: |-
      if (x.size() >= 4) {
        int16_t raw_temp = (x[3] << 8) | x[2];
        float temp_c = raw_temp / 10.0;
        if (temp_c > 60) {
          temp_c = (temp_c - 32) * 5/9;
        }
        return temp_c;
      }
      return NAN;

  - platform: template
    name: "INKBIRD RSSI"
    id: inkbird_rssi
    unit_of_measurement: "dBm"
    accuracy_decimals: 0
    update_interval: 30s

binary_sensor:
  - platform: status
    name: "INKBIRD Connected"
    entity_category: diagnostic

number:
  - platform: template
    name: "Probe 1 Low Threshold"
    id: target_temp_low_1
    min_value: 0 
    max_value: 250  
    step: 0.5
    unit_of_measurement: "°C"
    optimistic: true

  - platform: template
    name: "Probe 1 High Threshold"
    id: target_temp_high_1
    min_value: 0 
    max_value: 250  
    step: 0.5
    unit_of_measurement: "°C"
    optimistic: true

  - platform: template
    name: "Probe 2 Low Threshold"
    id: target_temp_low_2
    min_value: 0 
    max_value: 250  
    step: 0.5
    unit_of_measurement: "°C"
    optimistic: true

  - platform: template
    name: "Probe 2 High Threshold"
    id: target_temp_high_2
    min_value: 0 
    max_value: 250  
    step: 0.5
    unit_of_measurement: "°C"
    optimistic: true

script:
  - id: set_target_temps_probe1
    mode: queued
    then:
      - lambda: |-
          int16_t low_temp = static_cast<int16_t>(id(target_temp_low_1).state * 10);
          int16_t high_temp = static_cast<int16_t>(id(target_temp_high_1).state * 10);
          
          uint8_t msg[6] = {
            0x01, 0x00,
            static_cast<uint8_t>(low_temp & 0xFF),
            static_cast<uint8_t>((low_temp >> 8) & 0xFF),
            static_cast<uint8_t>(high_temp & 0xFF),
            static_cast<uint8_t>((high_temp >> 8) & 0xFF)
          };
          
          auto target_char = id(inkbird)->get_characteristic(
            esp32_ble_tracker::ESPBTUUID::from_raw("0000ff00-0000-1000-8000-00805f9b34fb"),
            esp32_ble_tracker::ESPBTUUID::from_raw("0000ff02-0000-1000-8000-00805f9b34fb"));
          if (target_char != nullptr) {
            target_char->write_value(msg, sizeof(msg));
          }

  - id: set_target_temps_probe2
    mode: queued
    then:
      - lambda: |-
          int16_t low_temp = static_cast<int16_t>(id(target_temp_low_2).state * 10);
          int16_t high_temp = static_cast<int16_t>(id(target_temp_high_2).state * 10);
          
          uint8_t msg[6] = {
            0x02, 0x00,
            static_cast<uint8_t>(low_temp & 0xFF),
            static_cast<uint8_t>((low_temp >> 8) & 0xFF),
            static_cast<uint8_t>(high_temp & 0xFF),
            static_cast<uint8_t>((high_temp >> 8) & 0xFF)
          };
          
          auto target_char = id(inkbird)->get_characteristic(
            esp32_ble_tracker::ESPBTUUID::from_raw("0000ff00-0000-1000-8000-00805f9b34fb"),
            esp32_ble_tracker::ESPBTUUID::from_raw("0000ff02-0000-1000-8000-00805f9b34fb"));
          if (target_char != nullptr) {
            target_char->write_value(msg, sizeof(msg));
          }

button:
  - platform: template
    name: "Set Probe 1 Temperatures"
    on_press:
      then:
        - script.execute: set_target_temps_probe1

  - platform: template
    name: "Set Probe 2 Temperatures"
    on_press:
      then:
        - script.execute: set_target_temps_probe2

Hope it will be supported soon.