Avoid publishing of home presence data for HASS when WL or BL are set

This commit is contained in:
Florian committed 2019-06-21 20:22:11 +02:00
1 parent 1ef8fff99e
commit de93fd0da0
1 file changed
+42 -38
+42 -38
View File
@@ -64,39 +64,41 @@ vector<BLEdevice> devices;
mac_adress.replace(":",""); mac_adress.replace(":","");
mac_adress.toUpperCase(); mac_adress.toUpperCase();
String mactopic = subjectBTtoMQTT + mac_adress; String mactopic = subjectBTtoMQTT + mac_adress;
if (advertisedDevice.haveName()) BLEdata.set("name", (char *)advertisedDevice.getName().c_str()); char mac[mac_adress.length()+1];
if (advertisedDevice.haveManufacturerData()) BLEdata.set("manufacturerdata", (char *)advertisedDevice.getManufacturerData().c_str()); mac_adress.toCharArray(mac,mac_adress.length()+1);
if (advertisedDevice.haveRSSI()) BLEdata.set("rssi", (int) advertisedDevice.getRSSI()); trc("device detected");
if (advertisedDevice.haveTXPower()) BLEdata.set("txpower", (int8_t) advertisedDevice.getTXPower()); trc(mac);
#ifdef subjectHomePresence if((!oneWhite() || isWhite(mac)) && !isBlack(mac)){ //if not black listed mac we go AND if we have no white mac or this mac is white we go out
if (advertisedDevice.haveRSSI()) haRoomPresence(BLEdata);// this device has an rssi in consequence we can use it for home assistant room presence component if (advertisedDevice.haveName()) BLEdata.set("name", (char *)advertisedDevice.getName().c_str());
#endif if (advertisedDevice.haveManufacturerData()) BLEdata.set("manufacturerdata", (char *)advertisedDevice.getManufacturerData().c_str());
if (advertisedDevice.haveServiceData()){ if (advertisedDevice.haveRSSI()) BLEdata.set("rssi", (int) advertisedDevice.getRSSI());
char mac[mac_adress.length()+1]; if (advertisedDevice.haveTXPower()) BLEdata.set("txpower", (int8_t) advertisedDevice.getTXPower());
mac_adress.toCharArray(mac,mac_adress.length()+1); #ifdef subjectHomePresence
trc(F("Get services data :")); if (advertisedDevice.haveRSSI()) haRoomPresence(BLEdata);// this device has an rssi in consequence we can use it for home assistant room presence component
int serviceDataCount = advertisedDevice.getServiceDataCount(); #endif
trc(serviceDataCount); if (advertisedDevice.haveServiceData()){
for (int j = 0; j < serviceDataCount;j++){ trc(F("Get services data :"));
std::string serviceData = advertisedDevice.getServiceData(j); int serviceDataCount = advertisedDevice.getServiceDataCount();
int serviceDataLength = serviceData.length(); trc(serviceDataCount);
String returnedString = ""; for (int j = 0; j < serviceDataCount;j++){
for (int i=0; i<serviceDataLength; i++) std::string serviceData = advertisedDevice.getServiceData(j);
{ int serviceDataLength = serviceData.length();
int a = serviceData[i]; String returnedString = "";
if (a < 16) { for (int i=0; i<serviceDataLength; i++)
returnedString = returnedString + "0"; {
} int a = serviceData[i];
returnedString = returnedString + String(a,HEX); if (a < 16) {
} returnedString = returnedString + "0";
char service_data[returnedString.length()+1]; }
returnedString.toCharArray(service_data,returnedString.length()+1); returnedString = returnedString + String(a,HEX);
service_data[returnedString.length()] = '\0'; }
#ifdef pubBLEServiceData char service_data[returnedString.length()+1];
BLEdata.set("servicedata", service_data); returnedString.toCharArray(service_data,returnedString.length()+1);
BLEdata.set("servicedatauuid", (char *)advertisedDevice.getServiceDataUUID(j).toString().c_str()); service_data[returnedString.length()] = '\0';
#endif #ifdef pubBLEServiceData
if((!oneWhite() || isWhite(mac)) && !isBlack(mac)){ //if not black listed mac we go AND if we have no white mac or this mac is white we go out BLEdata.set("servicedata", service_data);
BLEdata.set("servicedatauuid", (char *)advertisedDevice.getServiceDataUUID(j).toString().c_str());
#endif
pub((char *)mactopic.c_str(),BLEdata); pub((char *)mactopic.c_str(),BLEdata);
if (strstr(BLEdata["servicedatauuid"].as<char*>(),"fe95") != NULL){ if (strstr(BLEdata["servicedatauuid"].as<char*>(),"fe95") != NULL){
trc("Processing BLE device data"); trc("Processing BLE device data");
@@ -139,9 +141,11 @@ vector<BLEdevice> devices;
#endif #endif
process_data(pos - 26,service_data,mac); process_data(pos - 26,service_data,mac);
} }
} }
} }
} }
}else{
trc(F("Filtered mac device"));
} }
} }
}; };
@@ -280,6 +284,9 @@ vector<BLEdevice> devices;
trc(F("Creating BLE buffer")); trc(F("Creating BLE buffer"));
StaticJsonBuffer<JSON_MSG_BUFFER> jsonBuffer; StaticJsonBuffer<JSON_MSG_BUFFER> jsonBuffer;
JsonObject& BLEdata = jsonBuffer.createObject(); JsonObject& BLEdata = jsonBuffer.createObject();
strupp(d[0].extract);
if(isBlack(d[0].extract)) return false; //if black listed mac we go out
if(oneWhite() && !isWhite(d[0].extract)) return false; //if we have at least one white mac and this mac is not white we go out
#ifdef subjectHomePresence #ifdef subjectHomePresence
String HomePresenceId; String HomePresenceId;
for (int i = 0; i<12; i++){ for (int i = 0; i<12; i++){
@@ -290,9 +297,6 @@ vector<BLEdevice> devices;
trc(HomePresenceId); trc(HomePresenceId);
BLEdata.set("id", (char *)HomePresenceId.c_str()); BLEdata.set("id", (char *)HomePresenceId.c_str());
#endif #endif
strupp(d[0].extract);
if(isBlack(d[0].extract)) return false; //if black listed mac we go out
if(oneWhite() && !isWhite(d[0].extract)) return false; //if we have at least one white mac and this mac is not white we go out
String topic = subjectBTtoMQTT + String(d[0].extract); String topic = subjectBTtoMQTT + String(d[0].extract);
int rssi = (int)strtol(d[2].extract, NULL, 16) - 256; int rssi = (int)strtol(d[2].extract, NULL, 16) - 256;
BLEdata.set("rssi", (int)rssi); BLEdata.set("rssi", (int)rssi);