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.