diff --git a/main/ZgatewayBT.ino b/main/ZgatewayBT.ino index 76fefafa..3060d023 100644 --- a/main/ZgatewayBT.ino +++ b/main/ZgatewayBT.ino @@ -222,6 +222,36 @@ void CLEARGRASSTRHDiscovery(char * mac){ devices.push_back(device); } +void CLEARGRASSTRHKPADiscovery(char * mac){ + #define CLEARGRASSTRHKPAparametersCount 3 + trc(F("CLEARGRASSTRHKPADiscovery")); + char * CLEARGRASSTRHKPAsensor[CLEARGRASSTRHKPAparametersCount][8] = { + {"sensor", "CLEARGRASSTRHKPA-pres", mac, "pressure","{{ value_json.pres | is_defined }}","", "", "kPa"} , + {"sensor", "CLEARGRASSTRHKPA-tem", mac,"temperature","{{ value_json.tem | is_defined }}","", "", "°C"} , + {"sensor", "CLEARGRASSTRHKPA-hum", mac,"humidity","{{ value_json.hum | is_defined }}","", "", "%"} + //component type,name,availability topic,device class,value template,payload on, payload off, unit of measurement + }; + + for (int i=0;i(),"fe95") != NULL){ //Mi FLora, Mi jia, Cleargrass, LYWDS02 + if (strstr(BLEdata["servicedatauuid"].as(),"fe95") != NULL ){ //Mi FLora, Mi jia, Cleargrass Method 1, LYWDS02 trc("Processing BLE device data"); int pos = -1; pos = strpos(service_data,"209800"); @@ -403,7 +433,7 @@ void MiBandDiscovery(char * mac){ pos = -1; pos = strpos(service_data,"304703"); if (pos != -1){ - trc(F("ClearGrass T RH data reading")); + trc(F("ClearGrass T RH data reading method 1")); //example "servicedata":"5030470340743e10342d58041002d6000a100164" #ifdef ZmqttDiscovery if(!isDiscovered(mac)) CLEARGRASSTRHDiscovery(mac); @@ -445,6 +475,20 @@ void MiBandDiscovery(char * mac){ #endif process_miband(service_data,mac); } + if (strstr(BLEdata["servicedata"].as(),"08094c") != NULL){ // Clear grass with air pressure//08094c0140342d580104d8000c020702612702015a + trc(F("Clear grass data with air pressure reading")); + //example "servicedata":08094c0140342d580104 c400 2402 0702 5d27 02015a + #ifdef ZmqttDiscovery + if(!isDiscovered(mac)) CLEARGRASSTRHKPADiscovery(mac); + #endif + process_cleargrass_air(service_data,mac); + } + if (strstr(BLEdata["servicedata"].as(),"080774") != NULL){ // Clear grass standard method 2/0807743e10342d580104c3002c0202012a + trc(F("Clear grass data reading method 2")); + //example "servicedata":0807743e10342d580104 c300 2c02 02012a + // no discovery as it is already available with method 1 + process_cleargrass(service_data,mac); + } }else{ trc("Low rssi, device filtered"); } @@ -648,7 +692,7 @@ void MiBandDiscovery(char * mac){ pos = -1; pos = strpos(d[5].extract,"304703"); if (pos != -1){ - trc("CLEARGRASSTRH data reading"); + trc("CLEARGRASSTRH data reading method 1"); #ifdef ZmqttDiscovery if(!isDiscovered(d[0].extract)) CLEARGRASSTRHDiscovery(d[0].extract); #endif @@ -674,6 +718,24 @@ void MiBandDiscovery(char * mac){ #endif process_milamp((char *)service_data.c_str(),d[0].extract); } + pos = -1; + pos = strpos(d[5].extract,"08094c"); // Clear grass with air pressure//08094c0140342d580104d8000c020702612702015a + if (pos != -1){ + trc(F("Clear grass data with air pressure reading")); + //example "servicedata":08094c0140342d580104 c400 2402 0702 5d27 02015a + #ifdef ZmqttDiscovery + if(!isDiscovered(d[0].extract)) CLEARGRASSTRHKPADiscovery(d[0].extract); + #endif + process_cleargrass_air((char *)service_data.c_str(),d[0].extract); + } + pos = -1; + pos = strpos(d[5].extract,"080774"); // Clear grass standard method 2/0807743e10342d580104c3002c0202012a + if (pos != -1){ + trc(F("Clear grass data reading method 2")); + //example "servicedata":0807743e10342d580104 c300 2c02 02012a + // no discovery as it is already available with method 1 + process_cleargrass((char *)service_data.c_str(),d[0].extract); + } return true; }else{ trc("Low rssi, device filtered"); @@ -714,17 +776,18 @@ bool process_sensors(int offset, char * rest_data, char * mac_adress){ trc("rest_data"); trc(rest_data); int data_length = 0; + trc("data_length"); + trc(rest_data[51 + offset]); switch (rest_data[51 + offset]) { case '1' : case '2' : case '3' : case '4' : data_length = ((rest_data[51 + offset] - '0') * 2); - trc("data_length"); - trc(data_length); + trc("valid data_length"); break; default: - trc("can't read data_length"); + trc("invalid data_length"); return false; } @@ -860,6 +923,57 @@ bool process_milamp(char * rest_data, char * mac_adress){ return true; } +bool process_cleargrass_air(char * rest_data, char * mac_adress){ + //example "servicedata":"08094c0140342d580104c400240207025d2702015a" + //decoding "08094c0140342d580104 temp:c400 hum:2402 0702 pressure:5d27 02015a" + trc("rest_data"); + trc(rest_data); + + trc(F("Creating BLE buffer")); + StaticJsonBuffer jsonBuffer; + JsonObject& BLEdata = jsonBuffer.createObject(); + + double value = 9999; + // humidity + value = value_from_service_data(rest_data, 20, 4); + BLEdata.set("tem", (double)value/10); + // temperature + value = value_from_service_data(rest_data, 24, 4); + BLEdata.set("hum", (double)value/10); + // air pressure + value = value_from_service_data(rest_data, 32, 4); + BLEdata.set("pres", (double)value/100); + + String mactopic(mac_adress); + mactopic = subjectBTtoMQTT + mactopic; + pub((char *)mactopic.c_str(),BLEdata); + return true; +} + + +bool process_cleargrass(char * rest_data, char * mac_adress){ + //example "servicedata":0807743e10342d580104 c300 2c02 02012a + trc("rest_data"); + trc(rest_data); + + trc(F("Creating BLE buffer")); + StaticJsonBuffer jsonBuffer; + JsonObject& BLEdata = jsonBuffer.createObject(); + + double value = 9999; + // humidity + value = value_from_service_data(rest_data, 20, 4); + BLEdata.set("tem", (double)value/10); + // temperature + value = value_from_service_data(rest_data, 24, 4); + BLEdata.set("hum", (double)value/10); + + String mactopic(mac_adress); + mactopic = subjectBTtoMQTT + mactopic; + pub((char *)mactopic.c_str(),BLEdata); + return true; +} + #ifdef subjectHomePresence void haRoomPresence(JsonObject& HomePresence){ int BLErssi = HomePresence["rssi"];