From 10f0d4cff488ef68e9e874c2bee9518ea5174d35 Mon Sep 17 00:00:00 2001 From: Florian <1technophile@users.noreply.github.com> Date: Sun, 31 Oct 2021 16:51:05 -0500 Subject: [PATCH] Theengs decoder integration (#1092) * Use Theengs Decoder for BLE device decoding --- main/ZgatewayBT.ino | 699 ++------------------------------------------ main/config_BT.h | 4 + platformio.ini | 41 ++- 3 files changed, 54 insertions(+), 690 deletions(-) diff --git a/main/ZgatewayBT.ino b/main/ZgatewayBT.ino index eef6f88..5a6ee75 100644 --- a/main/ZgatewayBT.ino +++ b/main/ZgatewayBT.ino @@ -56,7 +56,10 @@ SemaphoreHandle_t semaphoreCreateOrUpdateDevice; # include # endif +# include + # include + using namespace std; # define device_flags_init 0 << 0 @@ -65,6 +68,8 @@ using namespace std; # define device_flags_isBlackL 1 << 2 # define device_flags_connect 1 << 3 +TheengsDecoder decoder; + struct decompose { int start; int len; @@ -671,9 +676,7 @@ class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks { BLEdata["name"] = (char*)advertisedDevice->getName().c_str(); if (advertisedDevice->haveManufacturerData()) { char* manufacturerdata = BLEUtils::buildHexData(NULL, (uint8_t*)advertisedDevice->getManufacturerData().data(), advertisedDevice->getManufacturerData().length()); - Log.trace(F("Manufacturer Data: %s" CR), manufacturerdata); BLEdata["manufacturerdata"] = manufacturerdata; - free(manufacturerdata); } if (advertisedDevice->haveRSSI()) BLEdata["rssi"] = (int)advertisedDevice->getRSSI(); @@ -1104,8 +1107,19 @@ void PublishDeviceData(JsonObject& BLEdata, bool processBLEData) { # endif # if !pubKnownBLEServiceData RemoveJsonPropertyIf(BLEdata, "servicedata", BLEdata.containsKey("model") && BLEdata.containsKey("servicedata")); +# endif +# if !pubBLEManufacturerData + RemoveJsonPropertyIf(BLEdata, "manufacturerdata", BLEdata.containsKey("model") && BLEdata.containsKey("manufacturerdata")); # endif pubBT(BLEdata); + } else { +# if !pubUnknownBLEServiceData + Log.trace(F("Unknown service data, removing it" CR)); + RemoveJsonPropertyIf(BLEdata, "servicedata", BLEdata.containsKey("servicedata")); +# endif +# if !pubUnknownBLEManufacturerData + RemoveJsonPropertyIf(BLEdata, "manufacturerdata", BLEdata.containsKey("model") && BLEdata.containsKey("manufacturerdata")); +# endif } } else if (BLEdata.containsKey("distance")) { pubBT(BLEdata); @@ -1114,683 +1128,12 @@ void PublishDeviceData(JsonObject& BLEdata, bool processBLEData) { } } -JsonObject& process_bledata(JsonObject& BLEdata) { - const char* mac = BLEdata["id"].as(); - BLEdevice* device = getDeviceByMac(mac); - if (BLEdata.containsKey("servicedata")) { - Log.trace(F("Checking BLE service data validity" CR)); - const char* service_uuid = (const char*)BLEdata["servicedatauuid"]; - const char* service_data = (const char*)(BLEdata["servicedata"] | ""); - int service_len = strlen(service_data); - if (valid_service_data(service_data, service_len)) { - Log.trace(F("Searching BLE device data %s size %d" CR), service_data, strlen(service_data)); - Log.trace(F("Is it a mokoBeacon?" CR)); - if (strcmp(service_uuid, "0xff01") == NULL) { - createOrUpdateDevice(mac, device_flags_init, MOKOBEACON); - return process_mokobeacon(BLEdata); - } - Log.trace(F("Is it a mokoBeaconX Pro?" CR)); - if (strcmp(service_uuid, "0xfeab") == NULL) { - createOrUpdateDevice(mac, device_flags_init, MOKOBEACONXPRO); - return process_mokobeaconXPro(BLEdata); - } - Log.trace(F("Is it a mi flora ?" CR)); - if (strstr(service_data, "209800") != NULL) { - Log.trace(F("mi flora data reading" CR)); - BLEdata["model"] = "HHCCJCY01HHCC"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_connect, HHCCJCY01HHCC); - return process_sensors(2, BLEdata); - } - Log.trace(F("Is it a vegtrug ?" CR)); - if (service_len > ServicedataMinLength && strstr(service_data, "20bc03") != NULL) { - Log.trace(F("vegtrug data reading" CR)); - BLEdata["model"] = "VEGTRUG"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, VEGTRUG); - return process_sensors(2, BLEdata); - } - Log.trace(F("Is it a LYWSDCGQ?" CR)); - if (service_len > ServicedataMinLength && strstr(service_data, "20aa01") != NULL) { - Log.trace(F("LYWSDCGQ data reading" CR)); - BLEdata["model"] = "LYWSDCGQ"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, LYWSDCGQ); - return process_sensors(0, BLEdata); - } - Log.trace(F("Is it a JQJCY01YM?" CR)); - if (service_len > ServicedataMinLength && strstr(service_data, "20df02") != NULL) { - Log.trace(F("JQJCY01YM data reading" CR)); - BLEdata["model"] = "JQJCY01YM"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, JQJCY01YM); - return process_sensors(0, BLEdata); - } - Log.trace(F("Is it a LYWSD02?" CR)); - if (service_len > ServicedataMinLength && strstr(service_data, "205b04") != NULL) { - Log.trace(F("LYWSD02 data reading" CR)); - BLEdata["model"] = "LYWSD02"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, LYWSD02); - return process_sensors(2, BLEdata); - } - Log.trace(F("Is it a MUE4094RT?" CR)); - if (strstr(service_data, "4030dd") != NULL) { - Log.trace(F("MUE4094RT data reading" CR)); - BLEdata["model"] = "MUE4094RT"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, MUE4094RT); - return process_milamp(BLEdata); - } - Log.trace(F("Is it a CGP1W?" CR)); - if (service_len > ServicedataMinLength && strncmp(service_data, "0809", 4) == 0) { - Log.trace(F("CGP1W data reading" CR)); - BLEdata["model"] = "CGP1W"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, CGP1W); - return process_cleargrass(BLEdata, true); - } - Log.trace(F("Is it a CGG1" CR)); - // One type of the advertising packet format started with 50204703 or 50304703, where 4703 is a type of a sensor - // Another type of the advertising packet started with 0807 or 8816 - if ((service_len > ServicedataMinLength && strncmp(&service_data[2], "4703", 4) == 0) || (strncmp(service_data, "0807", 4) == 0) || (strncmp(service_data, "8816", 4) == 0)) { - Log.trace(F("CGG1 data reading" CR)); - BLEdata["model"] = "CGG1"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, CGG1); - return strncmp(&service_data[2], "4703", 4) == 0 ? process_sensors(0, BLEdata) : process_cleargrass(BLEdata, false); - } - Log.trace(F("Is it a CGD1?" CR)); - if ((service_len > ServicedataMinLength && (strstr(service_data, "080caf") != NULL || strstr(service_data, "080c09") != NULL)) || (service_len > ServicedataMinLength - 6 && strstr(service_data, "080cd0") != NULL)) { - Log.trace(F("CGD1 data reading" CR)); - BLEdata["model"] = "CGD1"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, CGD1); - return process_cleargrass(BLEdata, false); - } - Log.trace(F("Is it a CGDK2?" CR)); - if (service_len > ServicedataMinLength && strncmp(&service_data[0], "8810", 4) == 0) { - Log.trace(F("CGDK2 data reading" CR)); - BLEdata["model"] = "CGDK2"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, CGDK2); - return process_cleargrass(BLEdata, false); - } - Log.trace(F("Is it a CGPR1?" CR)); - if ((service_len > ServicedataMinLength) && (strncmp(&service_data[0], "4812", 4) == 0 || strncmp(&service_data[0], "0812", 4) == 0)) { - Log.trace(F("CGPR1 data reading" CR)); - BLEdata["model"] = "CGPR1"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, CGPR1); - return process_cgpr1(BLEdata); - } - Log.trace(F("Is it a CGH1?" CR)); - if (service_len > ServicedataMinLength && (strncmp(&service_data[0], "c804", 4) == 0 || strncmp(&service_data[0], "8804", 4) == 0 || strncmp(&service_data[0], "0804", 4) == 0 || strncmp(&service_data[0], "4804", 4) == 0)) { - Log.trace(F("CGH1 data reading" CR)); - BLEdata["model"] = "CGH1"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, CGH1); - return process_cgh1(BLEdata); - } - Log.trace(F("Is it a MHO_C401?" CR)); - if (strstr(service_data, "588703") != NULL) { - Log.trace(F("MHO_C401 add to list for future connect" CR)); - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_connect, MHO_C401); - } - Log.trace(F("Is it a LYWSD03MMC?" CR)); - if (strstr(service_data, "585b05") != NULL) { - Log.trace(F("LYWSD03MMC add to list for future connect" CR)); - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_connect, LYWSD03MMC); - } - Log.trace(F("Is it a custom (pvvx) LYWSD03MMC?" CR)); - if (service_len >= 30 && strncmp(service_data + 6, "38c1a4", 6) == 0) { - Log.trace(F("LYWSD03MMC PVVX" CR)); - BLEdata["model"] = "LYWSD03MMC_PVVX"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, LYWSD03MMC_PVVX); - return process_pvvx(BLEdata); - } - Log.trace(F("Is it a custom (atc1441) LYWSD03MMC?" CR)); - if (strstr(service_data, "a4c138") != NULL) { - Log.trace(F("LYWSD03MMC ATC" CR)); - BLEdata["model"] = "LYWSD03MMC_ATC"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, LYWSD03MMC_ATC); - return process_atc(BLEdata); - } - if (BLEdata.containsKey("servicedatauuid")) { - const char* service_datauuid = (const char*)(BLEdata["servicedatauuid"] | ""); - Log.trace(F("servicedatauuid %s" CR), service_datauuid); - Log.trace(F("Is it a MiBand?" CR)); - if (strstr(service_datauuid, "fee0") != NULL) { - Log.trace(F("Mi Band data reading" CR)); - BLEdata["model"] = "MIBAND"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, MIBAND); - return process_miband(BLEdata); - } - Log.trace(F("Is it a XMTZC04HM?" CR)); - if (strstr(service_datauuid, "181d") != NULL) { - Log.trace(F("XMTZC04HM data reading" CR)); - BLEdata["model"] = "XMTZC04HM"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, XMTZC04HM); - return process_scale_v1(BLEdata); - } - Log.trace(F("Is it a XMTZC05HM?" CR)); - if (strstr(service_datauuid, "181b") != NULL) { - Log.trace(F("XMTZC05HM data reading" CR)); - BLEdata["model"] = "XMTZC05HM"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, XMTZC05HM); - return process_scale_v2(BLEdata); - } - // || strstr(service_datauuid, "0x2080") != NULL - Log.trace(F("Is it an EddystoneTLM?" CR)); - if (strncmp(&service_data[0], "20", 2) == 0 && strstr(service_datauuid, "0xfeaa") != NULL) { - Log.trace(F("Eddystone TLM" CR)); - BLEdata["model"] = "EDDYSTONE_TLM"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, EDDYSTONE_TLM); - return process_eddystonetlm(BLEdata); - } - } - } else { - Log.trace(F("Non valid service data, removing it" CR)); - BLEdata.remove("servicedata"); - } - -# if !pubUnknownBLEServiceData - Log.trace(F("Unknown service data, removing it" CR)); - BLEdata.remove("servicedata"); -# endif +void process_bledata(JsonObject& BLEdata) { + if (decoder.decodeBLEJson(BLEdata)) { + Log.trace(F("1decoder found device: %s" CR), BLEdata["model"].as()); + } else { + Log.trace(F("No device found " CR)); } - - if (BLEdata.containsKey("manufacturerdata")) { - const char* manufacturerdata = (const char*)(BLEdata["manufacturerdata"] | ""); - Log.trace(F("manufacturerdata %s" CR), manufacturerdata); - if (BLEdata.containsKey("name")) { - const char* name = (const char*)(BLEdata["name"] | ""); - Log.trace(F("name %s" CR), name); - Log.trace(F("Is it a INKBIRD IBS-TH1?" CR)); - if (strcmp(name, "sps") == 0) { - Log.trace(F("INKBIRD TH1 data reading" CR)); - BLEdata["model"] = "IBS-TH1"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, IBSTH1); - return process_inkbird_th1(BLEdata); - } - Log.trace(F("Is it a INKBIRD IBS-TH2?" CR)); - if (strcmp(name, "tps") == 0) { - Log.trace(F("INKBIRD TH2 data reading" CR)); - BLEdata["model"] = "IBS-TH2"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, IBSTH2); - return process_inkbird_th2(BLEdata); - } - Log.trace(F("Is it a INKBIRD IBT-4XS?" CR)); - if (strcmp(name, "iBBQ") == 0) { - Log.trace(F("INKBIRD IBT-4XS data reading" CR)); - BLEdata["model"] = "IBT-4XS"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, IBT4XS); - return process_inkbird_4xs(BLEdata); - } - Log.trace(F("Is it a DT24?" CR)); - if (strcmp(name, "DT24-BLE") == 0) { - Log.trace(F("DT24 data reading data reading" CR)); - BLEdata["model"] = "DT24"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_connect, DT24); - return BLEdata; - } - Log.trace(F("Is it a TPMS? %u" CR), strlen(manufacturerdata)); - if (strlen(manufacturerdata) == 36 && strstr(name, "TPMS") != NULL) { - Log.trace(F("TPMS data reading" CR)); - BLEdata["model"] = "TPMS"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, TPMS); - return process_tpms(BLEdata); - } - } - Log.trace(F("Is it a iNode Energy Meter?" CR)); - if (strlen(manufacturerdata) == 26 && ((long)value_from_hex_data(manufacturerdata, 0, 4, true) & 0xFFF9) == 0x8290) { - Log.trace(F("iNode Energy Meter data reading" CR)); - BLEdata["model"] = "INODE_EM"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, INODE_EM); - return process_inode_em(BLEdata); - } - Log.trace(F("Is it a WS02?" CR)); - if (strlen(manufacturerdata) >= 40 && (strstr(manufacturerdata, "100000001a11") != NULL)) { - Log.trace(F("WS02 data reading data reading" CR)); - BLEdata["model"] = "WS02"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, WS02); - return process_ws02(BLEdata); - } - Log.trace(F("Is it an iBeacon? %u" CR), strlen(manufacturerdata)); - if (strlen(manufacturerdata) == 50 && strncmp(&manufacturerdata[0], "4c00", 4) == NULL) { - Log.trace(F("iBeacon data reading" CR)); - BLEdata["model"] = "IBEACON"; - if (device->sensorModel == -1) - createOrUpdateDevice(mac, device_flags_init, IBEACON); - return process_ibeacon(BLEdata); - } -# if !pubBLEManufacturerData - Log.trace(F("Remove manufacturer data" CR)); - BLEdata.remove("manufacturerdata"); -# endif - } - - return BLEdata; -} - -JsonObject& process_sensors(int offset, JsonObject& BLEdata) { - const char* servicedata = BLEdata["servicedata"].as(); - int data_length = 0; - - switch (servicedata[27 + offset]) { - case '1': - case '2': - case '3': - case '4': - data_length = ((servicedata[27 + offset] - '0') * 2); - Log.trace(F("Valid data_length: %d" CR), data_length); - break; - default: - Log.trace(F("Invalid data_length, not enriching the device data" CR)); - return BLEdata; - } - - double value = 9999; - value = (double)value_from_hex_data(servicedata, 28 + offset, data_length, true); - - // Mi flora provides tem(perature), (earth) moi(sture), fer(tility) and lux (illuminance) - // Mi Jia provides tem(perature), batt(erry) and hum(idity) - // following the value of digit 23 + offset we determine the type of data we get from the sensor - switch (servicedata[23 + offset]) { - case '0': - BLEdata["for"] = (double)value / 100; - break; - case '4': - BLEdata["tempc"] = (double)value / 10; - BLEdata["tempf"] = (double)convertTemp_CtoF(value / 10); - break; - case '6': - BLEdata["hum"] = (double)value / 10; - break; - case '7': - BLEdata["lux"] = (double)value; - break; - case '8': - BLEdata["moi"] = (double)value; - break; - case '9': - BLEdata["fer"] = (double)value; - break; - case 'a': - BLEdata["batt"] = (double)value; - break; - case 'd': - // temperature - value = (double)value_from_hex_data(servicedata, 28 + offset, 4, true); - BLEdata["tempc"], (double)value / 10; - BLEdata["tempf"], (double)convertTemp_CtoF(value / 10); - // humidity - value = (double)value_from_hex_data(servicedata, 32 + offset, 4, true); - BLEdata["hum"] = (double)value / 10; - break; - default: - Log.trace(F("can't read values" CR)); - } - - return BLEdata; -} - -JsonObject& process_scale_v1(JsonObject& BLEdata) { - const char* servicedata = BLEdata["servicedata"].as(); - - if (servicedata[0] == '2') { // stabilized - double weight = 0; - if (servicedata[1] == '2') { //kg - weight = (double)value_from_hex_data(servicedata, 2, 4, true) / 200; - BLEdata["unit"] = "kg"; - } else if (servicedata[1] == '3') { //lbs - weight = (double)value_from_hex_data(servicedata, 2, 4, true) / 100; - BLEdata["unit"] = "lbs"; - } else { //unknown unit - BLEdata["unit"] = "unknown"; - } - //Set Json value - BLEdata["weight"] = (double)weight; - } - - return BLEdata; -} - -JsonObject& process_scale_v2(JsonObject& BLEdata) { - const char* servicedata = BLEdata["servicedata"].as(); - - double weight = 0; - if (servicedata[1] == '2') { //kg - weight = (double)value_from_hex_data(servicedata, 22, 4, true) / 200; - BLEdata["unit"] = "kg"; - } else if (servicedata[1] == '3') { //lbs - weight = (double)value_from_hex_data(servicedata, 22, 4, true) / 100; - BLEdata["unit"] = "lbs"; - } else { //unknown unit - BLEdata["unit"] = "unknown"; - } - double impedance = (double)value_from_hex_data(servicedata, 18, 4, true); - - //Set Json values - BLEdata["weight"] = (double)weight; - BLEdata["impedance"] = (double)impedance; - - return BLEdata; -} - -JsonObject& process_eddystonetlm(JsonObject& BLEdata) { - const char* servicedata = BLEdata["servicedata"].as(); - - BLEdata["volt"] = (float)value_from_hex_data(servicedata, 4, 4, false) / 1000; - BLEdata["tempc"] = (float)value_from_hex_data(servicedata, 8, 2, false); - BLEdata["tempf"] = (float)convertTemp_CtoF(value_from_hex_data(servicedata, 8, 2, false)); - BLEdata["count"] = value_from_hex_data(servicedata, 12, 8, false); - BLEdata["time"] = value_from_hex_data(servicedata, 20, 8, false) / 100; - - return BLEdata; -} - -JsonObject& process_inkbird_th1(JsonObject& BLEdata) { - const char* manufacturerdata = BLEdata["manufacturerdata"].as(); - - double temperature = (double)value_from_hex_data(manufacturerdata, 0, 4, true) / 100; - double humidity = (double)value_from_hex_data(manufacturerdata, 4, 4, true) / 100; - double battery = (double)value_from_hex_data(manufacturerdata, 14, 2, true); - - //Set Json values - BLEdata["tempc"] = (double)temperature; - BLEdata["tempf"] = (double)convertTemp_CtoF(temperature); - BLEdata["hum"] = (double)humidity; - BLEdata["batt"] = (double)battery; - - return BLEdata; -} - -JsonObject& process_inkbird_th2(JsonObject& BLEdata) { - const char* manufacturerdata = BLEdata["manufacturerdata"].as(); - - double temperature = (double)value_from_hex_data(manufacturerdata, 0, 4, true) / 100; - double battery = (double)value_from_hex_data(manufacturerdata, 14, 2, true); - - //Set Json values - BLEdata["tempc"] = (double)temperature; - BLEdata["tempf"] = (double)convertTemp_CtoF(temperature); - BLEdata["batt"] = (double)battery; - - return BLEdata; -} - -JsonObject& process_inkbird_4xs(JsonObject& BLEdata) { - const char* manufacturerdata = BLEdata["manufacturerdata"].as(); - - double temperature = (double)value_from_hex_data(manufacturerdata, 20, 4, true) / 10; - double temperature2 = (double)value_from_hex_data(manufacturerdata, 24, 4, true) / 10; - double temperature3 = (double)value_from_hex_data(manufacturerdata, 28, 4, true) / 10; - double temperature4 = (double)value_from_hex_data(manufacturerdata, 32, 4, true) / 10; - - //Set Json values - BLEdata["tempc"] = (double)temperature; - BLEdata["tempf"] = (double)convertTemp_CtoF(temperature); - BLEdata["tempc2"] = (double)temperature2; - BLEdata["tempf2"] = (double)convertTemp_CtoF(temperature2); - BLEdata["tempc3"] = (double)temperature3; - BLEdata["tempf3"] = (double)convertTemp_CtoF(temperature3); - BLEdata["tempc4"] = (double)temperature4; - BLEdata["tempf4"] = (double)convertTemp_CtoF(temperature4); - - return BLEdata; -} - -JsonObject& process_miband(JsonObject& BLEdata) { - const char* servicedata = BLEdata["servicedata"].as(); - - double steps = (double)value_from_hex_data(servicedata, 0, 4, true); - - //Set Json value - BLEdata["steps"] = (double)steps; - - return BLEdata; -} - -JsonObject& process_milamp(JsonObject& BLEdata) { - const char* servicedata = BLEdata["servicedata"].as(); - - long darkness = (double)value_from_hex_data(servicedata, 8, 2, true); - - //Set Json value - BLEdata["presence"] = (bool)"true"; - BLEdata["darkness"] = (long)darkness; - - return BLEdata; -} - -JsonObject& process_cleargrass(JsonObject& BLEdata, boolean air) { - const char* servicedata = BLEdata["servicedata"].as(); - - double value = 9999; - // temperature - value = (double)value_from_hex_data(servicedata, 20, 4, true); - BLEdata["tempc"] = (double)value / 10; - BLEdata["tempf"] = (double)convertTemp_CtoF(value / 10); - // humidity - value = (double)value_from_hex_data(servicedata, 24, 4, true); - BLEdata["hum"] = (double)value / 10; - if (air) { - // air pressure - value = (double)value_from_hex_data(servicedata, 32, 4, true); - BLEdata["pres"] = (double)value / 100; - } - - return BLEdata; -} - -JsonObject& process_cgpr1(JsonObject& BLEdata) { - const char* servicedata = BLEdata["servicedata"].as(); - int value = -1; - if (strncmp(&servicedata[0], "0812", 4) == 0) { // lux - value = value_from_hex_data(servicedata, 33, 4, true); - if (value >= 0) - BLEdata["lux"] = value; - } else if (strncmp(&servicedata[0], "4812", 4) == 0) { // presence - value = value_from_hex_data(servicedata, 21, 1, false); - if (value == 0) - BLEdata["pres"] = false; - if (value == 1) - BLEdata["pres"] = true; - } - - return BLEdata; -} - -JsonObject& process_cgh1(JsonObject& BLEdata) { - const char* servicedata = BLEdata["servicedata"].as(); - int value = -1; - if (strncmp(&servicedata[0], "0804", 4) == 0 || strncmp(&servicedata[0], "8804", 4) == 0) { // state - value = value_from_hex_data(servicedata, 33, 1, false); - } else if (strncmp(&servicedata[0], "4804", 4) == 0 || strncmp(&servicedata[0], "c804", 4) == 0) { // action - value = value_from_hex_data(servicedata, 21, 1, false); - } - - if (value == 0) - BLEdata["open"] = true; - if (value == 1) - BLEdata["open"] = false; - - return BLEdata; -} - -JsonObject& process_atc(JsonObject& BLEdata) { - const char* servicedata = BLEdata["servicedata"].as(); - - double temperature = (double)value_from_hex_data(servicedata, 12, 4, false) / 10; - double humidity = (double)value_from_hex_data(servicedata, 16, 2, false); - double battery = (double)value_from_hex_data(servicedata, 18, 2, false); - double voltage = (double)value_from_hex_data(servicedata, 20, 4, false) / 1000; - - //Set Json values - BLEdata["tempc"] = (double)temperature; - BLEdata["tempf"] = (double)convertTemp_CtoF(temperature); - BLEdata["hum"] = (double)humidity; - BLEdata["batt"] = (double)battery; - BLEdata["volt"] = (double)voltage; - - return BLEdata; -} - -JsonObject& process_pvvx(JsonObject& BLEdata) { - const char* servicedata = BLEdata["servicedata"].as(); - - double temperature = (double)value_from_hex_data(servicedata, 12, 4, true) / 100; - double humidity = (double)value_from_hex_data(servicedata, 16, 4, true) / 100; - double battery = (double)value_from_hex_data(servicedata, 24, 2, false); - double voltage = (double)value_from_hex_data(servicedata, 20, 4, true) / 1000; - - //Set Json values - BLEdata["tempc"] = (double)temperature; - BLEdata["tempf"] = (double)convertTemp_CtoF(temperature); - BLEdata["hum"] = (double)humidity; - BLEdata["batt"] = (double)battery; - BLEdata["volt"] = (double)voltage; - - return BLEdata; -} - -JsonObject& process_inode_em(JsonObject& BLEdata) { - const char* manufacturerdata = BLEdata["manufacturerdata"].as(); - - long impPerKWh = value_from_hex_data(manufacturerdata, 16, 4, true) & 0x3FFF; - double power = ((double)value_from_hex_data(manufacturerdata, 4, 4, true) / impPerKWh) * 60000; - double energy = (double)value_from_hex_data(manufacturerdata, 8, 8, true) / impPerKWh; - long battery = ((value_from_hex_data(manufacturerdata, 20, 2, true) >> 4) - 2) * 10; - - //Set Json values - BLEdata["power"] = (double)power; - BLEdata["energy"] = (double)energy; - BLEdata["batt"] = battery; - - return BLEdata; -} - -JsonObject& process_ws02(JsonObject& BLEdata) { - const char* manufacturerdata = BLEdata["manufacturerdata "].as(); - - double temperature = (double)value_from_hex_data(manufacturerdata, 20, 4, true) / 16; - double humidity = (double)value_from_hex_data(manufacturerdata, 24, 4, true) / 16; - double voltage = (double)value_from_hex_data(manufacturerdata, 16, 4, true) / 1000; - - //Set Json values - BLEdata["tempc"] = (double)temperature; - BLEdata["tempf"] = (double)convertTemp_CtoF(temperature); - BLEdata["hum"] = (double)humidity; - BLEdata["volt"] = (double)voltage; - - return BLEdata; -} - -JsonObject& process_mokobeacon(JsonObject& BLEdata) { - const char* servicedata = BLEdata["servicedata"].as(); - - long battery = value_from_hex_data(servicedata, 0, 2, false); - int x_axis = (int)value_from_hex_data(servicedata, 14, 4, false); - int y_axis = (int)value_from_hex_data(servicedata, 18, 4, false); - int z_axis = (int)value_from_hex_data(servicedata, 22, 4, false); - - BLEdata["x_axis"] = x_axis; - BLEdata["y_axis"] = y_axis; - BLEdata["z_axis"] = z_axis; - BLEdata["batt"] = battery; - - return BLEdata; -} - -JsonObject& process_mokobeaconXPro(JsonObject& BLEdata) { - const char* servicedata = BLEdata["servicedata"].as(); - int length = strlen(servicedata); - - if (length >= 24) { - if (strncmp(servicedata, "40", 2) == NULL) { - double voltage = (double)value_from_hex_data(servicedata, 6, 4, false) / 1000; - BLEdata["volt"] = (double)voltage; - - } else if (strncmp(servicedata, "60", 2) == NULL) { - int x_axis = (int)value_from_hex_data(servicedata, 12, 4, false); - int y_axis = (int)value_from_hex_data(servicedata, 16, 4, false); - int z_axis = (int)value_from_hex_data(servicedata, 20, 4, false); - if (length > 24) { - double voltage = (double)value_from_hex_data(servicedata, 24, 4, false) / 1000; - BLEdata["volt"] = (double)voltage; - } - - BLEdata["x_axis"] = x_axis; - BLEdata["y_axis"] = y_axis; - BLEdata["z_axis"] = z_axis; - return BLEdata; - - } else if (strncmp(servicedata, "70", 2) == NULL) { - double temperature = (double)value_from_hex_data(servicedata, 6, 4, false) / 10; - double humidity = (double)value_from_hex_data(servicedata, 10, 4, false) / 10; - double voltage = (double)value_from_hex_data(servicedata, 14, 4, false) / 1000; - - BLEdata["tempc"] = (double)temperature; - BLEdata["tempf"] = (double)convertTemp_CtoF(temperature); - BLEdata["hum"] = (double)humidity; - BLEdata["volt"] = (double)voltage; - return BLEdata; - } - } - return BLEdata; -} - -JsonObject& process_ibeacon(JsonObject& BLEdata) { - const char* manufacturerdata = BLEdata["manufacturerdata"].as(); - char mfid[5] = {NULL}; - char proxUUID[33] = {NULL}; - strncpy(&mfid[0], manufacturerdata, 4); - strncpy(&proxUUID[0], manufacturerdata + 8, 32); - BLEdata["mfid"] = mfid; - BLEdata["uuid"] = proxUUID; - BLEdata["major"] = (uint16_t)value_from_hex_data(manufacturerdata, 40, 4, false, false); - BLEdata["minor"] = (uint16_t)value_from_hex_data(manufacturerdata, 44, 4, false, false); - BLEdata["power"] = (int8_t)value_from_hex_data(manufacturerdata, 48, 4, false); - - return BLEdata; -} - -JsonObject& process_tpms(JsonObject& BLEdata) { - const char* manufacturerdata = BLEdata["manufacturerdata"].as(); - - int id = (int)value_from_hex_data(manufacturerdata, 5, 1, false); - double pressure = (double)value_from_hex_data(manufacturerdata, 16, 8, true) / 1000; - double temperature = (double)value_from_hex_data(manufacturerdata, 24, 8, true) / 100; - int battery = (int)value_from_hex_data(manufacturerdata, 32, 2, true); - int alarm = (int)value_from_hex_data(manufacturerdata, 35, 1, false); - - BLEdata["count"] = (int)id + 1; - BLEdata["pres"] = (double)pressure; - BLEdata["tempc"] = (double)temperature; - BLEdata["tempf"] = (double)convertTemp_CtoF(temperature); - BLEdata["batt"] = (int)battery; - if (alarm == 1) - BLEdata["alarm"] = true; - if (alarm == 0) - BLEdata["alarm"] = false; - - return BLEdata; } void hass_presence(JsonObject& HomePresence) { diff --git a/main/config_BT.h b/main/config_BT.h index 6ecf2c4..2692096 100644 --- a/main/config_BT.h +++ b/main/config_BT.h @@ -116,6 +116,10 @@ bool hassPresence = HassPresence; # define pubBLEManufacturerData false // define true if you want to publish the manufacturer's data (sometimes contains characters that aren't valid with receiving client) #endif +#ifndef pubUnknownBLEManufacturerData +# define pubUnknownBLEManufacturerData true // define true if you want to publish the manufacturer's data (sometimes contains characters that aren't valid with receiving client) +#endif + #ifndef pubBLEServiceUUID # define pubBLEServiceUUID false // define true if you want to publish the service UUID data #endif diff --git a/platformio.ini b/platformio.ini index 2e6aa83..212f450 100644 --- a/platformio.ini +++ b/platformio.ini @@ -124,6 +124,7 @@ somfy_remote=Somfy_Remote_Lib@0.3.0 rtl_433_ESP = https://github.com/NorthernMan54/rtl_433_ESP#e03f689 emodbus = miq19/eModbus@1.0.0 gfSunInverter = https://github.com/BlackSmith/GFSunInverter.git#v1.0.1 +decoder = https://github.com/theengs/decoder.git#v0.1.2 [env] framework = arduino @@ -139,7 +140,7 @@ build_flags = monitor_speed = 115200 [com] -esp8266_platform = espressif8266@2.6.3 +esp8266_platform = espressif8266@3.2.0 esp32_platform = espressif32@3.3.1 atmelavr_platform = atmelavr@3.3.0 @@ -205,6 +206,7 @@ board_build.partitions = min_spiffs.csv lib_deps = ${com-esp.lib_deps} ${libraries.ble} + ${libraries.decoder} ${libraries.irremoteesp} ${libraries.lora} ${libraries.rfm69} @@ -356,6 +358,7 @@ board_build.partitions = min_spiffs.csv lib_deps = ${com-esp.lib_deps} ${libraries.ble} + ${libraries.decoder} build_flags = ${com-esp.build_flags} '-DZgatewayBT="BT"' @@ -370,6 +373,7 @@ board_build.partitions = min_spiffs.csv lib_deps = ${com-esp.lib_deps} ${libraries.ble} + ${libraries.decoder} build_flags = ${com-esp.build_flags} '-DZgatewayBT="BT"' @@ -387,6 +391,7 @@ board_build.partitions = min_spiffs.csv lib_deps = ${com-esp.lib_deps} ${libraries.ble} + ${libraries.decoder} build_flags = ${com-esp.build_flags} '-DZgatewayBT="BT"' @@ -401,6 +406,7 @@ board_build.partitions = min_spiffs.csv lib_deps = ${com-esp.lib_deps} ${libraries.ble} + ${libraries.decoder} build_flags = ${com-esp.build_flags} '-DZgatewayBT="BT"' @@ -427,6 +433,7 @@ board_build.partitions = min_spiffs.csv lib_deps = ${com-esp.lib_deps} ${libraries.ble} + ${libraries.decoder} build_flags = ${com-esp.build_flags} '-DZgatewayBT="BT"' @@ -442,6 +449,7 @@ board_build.partitions = min_spiffs.csv lib_deps = ${com-esp.lib_deps} ${libraries.ble} + ${libraries.decoder} build_flags = ${com-esp.build_flags} '-DZgatewayBT="BT"' @@ -458,6 +466,7 @@ board_build.partitions = min_spiffs.csv lib_deps = ${com-esp.lib_deps} ${libraries.ble} + ${libraries.decoder} build_flags = ${com-esp.build_flags} '-DZgatewayBT="BT"' @@ -473,6 +482,7 @@ board_build.partitions = min_spiffs.csv lib_deps = ${com-esp.lib_deps} ${libraries.ble} + ${libraries.decoder} ${libraries.irremoteesp} build_flags = ${com-esp.build_flags} @@ -493,6 +503,7 @@ lib_deps = ${com-esp.lib_deps} ${libraries.m5stack} ${libraries.ble} + ${libraries.decoder} build_flags = ${com-esp.build_flags} '-DZgatewayBT="BT"' @@ -512,6 +523,7 @@ board_build.partitions = min_spiffs.csv lib_deps = ${com-esp.lib_deps} ${libraries.ble} + ${libraries.decoder} ${libraries.m5stickc} ${libraries.irremoteesp} build_flags = @@ -538,6 +550,7 @@ board_build.partitions = min_spiffs.csv lib_deps = ${com-esp.lib_deps} ${libraries.ble} + ${libraries.decoder} ${libraries.m5stickcp} ${libraries.irremoteesp} build_flags = @@ -564,6 +577,7 @@ board_build.partitions = min_spiffs.csv lib_deps = ${com-esp.lib_deps} ${libraries.ble} + ${libraries.decoder} ${libraries.irremoteesp} build_flags = ${com-esp.build_flags} @@ -633,6 +647,7 @@ board_build.partitions = min_spiffs.csv lib_deps = ${com-esp.lib_deps} ${libraries.ble} + ${libraries.decoder} ${libraries.lora} build_flags = ${com-esp.build_flags} @@ -674,7 +689,7 @@ platform = ${com.esp8266_platform} board = nodemcuv2 lib_deps = ${com-esp.lib_deps} - ${libraries.esppilight} + ;${libraries.esppilight} ${libraries.irremoteesp} ${libraries.rfm69} ${libraries.rfm69spi} @@ -682,18 +697,19 @@ lib_deps = ; ${libraries.newremoteswitch} ${libraries.bme280} ${libraries.bmp180} - ${libraries.htu21} + ;${libraries.htu21} ${libraries.ahtx0} ${libraries.unifiedsensor} ${libraries.dht} ${libraries.tsl2561} - ${libraries.ina226} + ;${libraries.ina226} ${libraries.esp8266_mdns} ${libraries.wire} ${libraries.fastled} ${libraries.onewire} ${libraries.dallastemperature} - ${libraries.rfWeatherStation} + ;${libraries.rfWeatherStation} + ${libraries.decoder} build_flags = ${com-esp.build_flags} ; '-DZgatewayRF="RF"' @@ -704,13 +720,13 @@ build_flags = '-DZactuatorONOFF="ONOFF"' '-DZactuatorFASTLED="FASTLED"' ;'-DZactuatorPWM="PWM"' - '-DZsensorINA226="INA226"' + ;'-DZsensorINA226="INA226"' '-DZsensorHCSR501="HCSR501"' '-DZsensorHCSR04="HCSR04"' '-DZsensorADC="ADC"' '-DZsensorBH1750="BH1750"' '-DZsensorBME280="BME280"' - '-DZsensorHTU21="HTU21"' + ;'-DZsensorHTU21="HTU21"' '-DZsensorAHTx0="AHTx0"' '-DZsensorTSL2561="TSL2561"' '-DZsensorDHT="DHT"' @@ -718,12 +734,11 @@ build_flags = '-DZgatewayRFM69="RFM69"' '-DZsensorGPIOInput="GPIOInput"' '-DZsensorGPIOKeyCode="GPIOKeyCode"' - '-DZgatewayWeatherStation="WeatherStation"' + ;'-DZgatewayWeatherStation="WeatherStation"' '-DsimplePublishing=true' '-DGateway_Name="OpenMQTTGateway_ESP8266_ALL"' board_build.flash_mode = dout - [env:nodemcuv2-2g] platform = ${com.esp8266_platform} board = nodemcuv2 @@ -732,7 +747,7 @@ lib_deps = ${libraries.a6lib} build_flags = ${com-esp.build_flags} - '-DZgatewayBT="2G"' + '-DZgateway2G="2G"' '-DGateway_Name="OpenMQTTGateway_ESP8266_2G"' board_build.flash_mode = dout @@ -743,6 +758,7 @@ lib_deps = ${com-esp.lib_deps} ${libraries.wire} ${libraries.esp8266_mdns} + ${libraries.decoder} build_flags = ${com-esp.build_flags} '-DZgatewayBT="BT"' @@ -918,7 +934,7 @@ build_flags = board_build.flash_mode = dout [env:nodemcuv2-pilight] -platform = ${com.esp8266_platform} +platform = espressif8266@^2 board = nodemcuv2 lib_deps = ${com-esp.lib_deps} @@ -1007,6 +1023,7 @@ lib_deps = ${libraries.dallastemperature} ${libraries.rfWeatherStation} ${libraries.stl} + ${libraries.decoder} build_flags = ${com-arduino.build_flags} '-DZgatewayRF="RF"' @@ -1059,7 +1076,7 @@ build_flags = '-DZactuatorFASTLED="FASTLED"' [env:sonoff-rfbridge-direct] -platform = ${com.esp8266_platform} +platform = espressif8266@^2 board = esp8285 lib_deps = ${com-esp.lib_deps}