Servus,
Samstag hat es sich ergeben, daß wir bei Bruder gegrillt haben und das Thermometer lies sich nicht mehr verbinden. Grund. Für sein neues Handy ist die App nicht mehr verfügbar. BBQ mate wurde wohl eingestellt. Der Ehrgeiz war geweckt. Das muß doch gehen. Ich verfasse diesen Thread für mich so als Gedankenstütze und vielleicht nützt es ja mal irgendwann Jemanden.
Ausgangspunkt für mich war. Thermometer steht auf Grad Fahrenheit. War aber in nrf-Connect sichtbar. Nur irgendwie sinnvoll an Daten zu kommen schien aussichtslos. Also Netz umgedreht nach der alten App. Als die App gefunden war… Der Wendepunkt. Mit Jadx dekompilliert und das Ergebnis mal ChatGPT vorgeworfen. Lange Rede kurzer Sinn. Wir sind auf der Zielgerade.
Bitfolge 55AA0888AAAAAAAA zweimal senden stellt das Thermometer auf grad Celsius. 55AA088899AAAAAA wieder zurück auf Fahrenheit. Aktuell, stand heute 08.06.26 hab ich ein Testprogramm, per Arduino auf einen ESP32 gespielt. Auf der seriellen Konsole kommen die Sensorwerte sauber an.
#include <BLEDevice.h>
static BLEUUID serviceUUID("0000fff0-0000-1000-8000-00805f9b34fb");
static BLEUUID notifyUUID ("0000fff1-0000-1000-8000-00805f9b34fb");
static BLEUUID writeUUID ("0000fff2-0000-1000-8000-00805f9b34fb");
BLERemoteCharacteristic* writeChar = nullptr;
void printHex(uint8_t* data, size_t length) {
for (size_t i = 0; i < length; i++) {
if (data[i] < 16) Serial.print("0");
Serial.print(data[i], HEX);
}
}
void notifyCallback(
BLERemoteCharacteristic* chr,
uint8_t* data,
size_t length,
bool isNotify
) {
Serial.print("RX: ");
printHex(data, length);
Serial.println();
if (length == 7 &&
data[0] == 0x55 &&
data[1] == 0xAA &&
data[2] == 0x07) {
uint8_t channel = data[3];
int tempC = data[4] + data[5] * 255 - 50;
Serial.printf("Kanal %d: %d °C\n", channel, tempC);
}
}
class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice dev) {
if (dev.haveName() && dev.getName() == "BBQ mate") {
Serial.println("BBQ mate gefunden");
BLEDevice::getScan()->stop();
}
}
};
BLEAdvertisedDevice* findThermometer() {
BLEScan* scan = BLEDevice::getScan();
scan->setActiveScan(true);
BLEScanResults* results = scan->start(5, false);
for (int i = 0; i < results->getCount(); i++) {
BLEAdvertisedDevice dev = results->getDevice(i);
if (dev.haveName() && dev.getName() == "BBQ mate") {
Serial.println("BBQ mate gefunden");
return new BLEAdvertisedDevice(dev);
}
}
return nullptr;
}
void writeTwice(const uint8_t* data, size_t len) {
if (writeChar == nullptr) return;
writeChar->writeValue((uint8_t*)data, len, false);
delay(200);
writeChar->writeValue((uint8_t*)data, len, false);
}
void setCelsius() {
uint8_t cmd[] = {
0x55, 0xAA, 0x08, 0x88,
0xAA, 0xAA, 0xAA, 0xAA
};
writeTwice(cmd, sizeof(cmd));
Serial.println("Celsius-Befehl gesendet");
}
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("Starte BLE...");
BLEDevice::init("ESP32 BBQ Test");
BLEAdvertisedDevice* thermometer = findThermometer();
if (thermometer == nullptr) {
Serial.println("Kein BBQ mate gefunden");
return;
}
BLEClient* client = BLEDevice::createClient();
Serial.println("Verbinde...");
if (!client->connect(thermometer)) {
Serial.println("Verbindung fehlgeschlagen");
return;
}
Serial.println("Verbunden");
BLERemoteService* service = client->getService(serviceUUID);
if (service == nullptr) {
Serial.println("Service FFF0 nicht gefunden");
return;
}
BLERemoteCharacteristic* notifyChar =
service->getCharacteristic(notifyUUID);
writeChar =
service->getCharacteristic(writeUUID);
if (notifyChar == nullptr) {
Serial.println("Notify FFF1 nicht gefunden");
return;
}
if (writeChar == nullptr) {
Serial.println("Write FFF2 nicht gefunden");
return;
}
if (notifyChar->canNotify()) {
notifyChar->registerForNotify(notifyCallback);
Serial.println("Notifications aktiviert");
} else {
Serial.println("FFF1 kann keine Notifications");
}
delay(1000);
setCelsius();
}
void loop() {
delay(1000);
}
Mit Erfahrung kann man da vermutlich mehr raus lesen, als ich. Hab mich da auf GPT verlassen. Tut erstmal. Thermometer einschalten, ESP erkennt es, verbindet sich und liefert Rohwerte. Endausbau soll nun sein, daß in ESPHome zu überführen, Zieltemperatur für die 6 Kanäle setzen zu können und auf der alten OpenDTU im Display die Sensorwerte anzuzeigen.
Liebe Grüße Mike
