From 5e2d86e963dce80767993c78ade76257f12aaee7 Mon Sep 17 00:00:00 2001 From: Florian <1technophile@users.noreply.github.com> Date: Wed, 26 Aug 2020 17:24:23 -0500 Subject: [PATCH] Add publish only BLE sensors function (#741) don't publish the non identified BLE devices when requested (at build or by MQTT setting) --- docs/use/ble.md | 10 +++++++++- main/ZgatewayBT.ino | 31 ++++++++++++++++++++++--------- main/config_BT.h | 4 ++++ 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/docs/use/ble.md b/docs/use/ble.md index cdf1ebe..2533639 100644 --- a/docs/use/ble.md +++ b/docs/use/ble.md @@ -98,7 +98,15 @@ If you want to change the number of BLE scans that are done before a BLE connect `mosquitto_pub -t home/OpenMQTTGateway/commands/MQTTtoBT/config -m '{"scanbcnct":30}'` -The BLE connect will be done every 30 * (`TimeBtwRead` + `Scan_duration`), 30 * (55000 + 10000) = 1950000ms : +The BLE connect will be done every 30 * (`TimeBtwRead` + `Scan_duration`), 30 * (55000 + 10000) = 1950000ms + +## Setting if the gateway publish all the BLE devices scanned or only the detected sensors + +If you want to change this characteristic: + +`mosquitto_pub -t home/OpenMQTTGateway/commands/MQTTtoBT/config -m '{"onlysensors":true}'` + +The gateway will publish only the detected sensors like Mi Flora, Mi jia, LYWSD03MMC... and not the other BLE devices. This is usefull if you don't use the gateway for presence detection but only to retrieve sensors data. ## Setting the minimum RSSI accepted to publish device data diff --git a/main/ZgatewayBT.ino b/main/ZgatewayBT.ino index 56397a0..0c94094 100644 --- a/main/ZgatewayBT.ino +++ b/main/ZgatewayBT.ino @@ -434,8 +434,9 @@ class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks { if (advertisedDevice->haveTXPower()) BLEdata.set("txpower", (int8_t)advertisedDevice->getTXPower()); # ifdef subjectHomePresence - if (advertisedDevice->haveRSSI()) - haRoomPresence(BLEdata); // this device has an rssi in consequence we can use it for home assistant room presence component + if (advertisedDevice->haveRSSI() && !publishOnlySensors) { + haRoomPresence(BLEdata); // this device has an rssi and we don't want only sensors so in consequence we can use it for home assistant room presence component + } # endif if (advertisedDevice->haveServiceData()) { int serviceDataCount = advertisedDevice->getServiceDataCount(); @@ -677,6 +678,7 @@ void changelow_power_mode(int newLowPowerMode) { void setupBT() { Log.notice(F("BLE scans interval: %d" CR), BLEinterval); Log.notice(F("BLE scans number before connect: %d" CR), BLEscanBeforeConnect); + Log.notice(F("Publishing only BLE sensors: %T" CR), publishOnlySensors); Log.notice(F("minrssi: %d" CR), minRssi); Log.notice(F("Low Power Mode: %d" CR), low_power_mode); @@ -712,6 +714,7 @@ struct decompose d[6] = {{0, 12, true}, {12, 2, false}, {14, 2, false}, {16, 2, void setupBT() { Log.notice(F("BLE interval: %d" CR), BLEinterval); Log.notice(F("BLE scans number before connect: %d" CR), BLEscanBeforeConnect); + Log.notice(F("Publishing only BLE sensors: %T" CR), publishOnlySensors); Log.notice(F("minrssi: %d" CR), minRssi); softserial.begin(HMSerialSpeed); softserial.print(F("AT+ROLE1" CR)); @@ -802,7 +805,8 @@ bool BTtoMQTT() { BLEdata.set("rssi", (int)rssi); # ifdef subjectHomePresence - haRoomPresence(BLEdata); // this device has an rssi in consequence we can use it for home assistant room presence component + if (!publishOnlySensors) + haRoomPresence(BLEdata); // this device has an rssi and we don't want only sensors so in consequence we can use it for home assistant room presence component # endif Log.trace(F("Service data: %s" CR), restData.c_str()); BLEdata.set("servicedata", restData.c_str()); @@ -876,16 +880,18 @@ void launchDiscovery() { void PublishDeviceData(JsonObject& BLEdata) { if (abs((int)BLEdata["rssi"] | 0) < minRssi) { // process only the devices close enough JsonObject& BLEdataOut = process_bledata(BLEdata); + if (!publishOnlySensors || BLEdataOut.containsKey("model")) { # if !pubBLEServiceUUID - RemoveJsonPropertyIf(BLEdataOut, "servicedatauuid", BLEdataOut.containsKey("servicedatauuid")); + RemoveJsonPropertyIf(BLEdataOut, "servicedatauuid", BLEdataOut.containsKey("servicedatauuid")); # endif # if !pubKnownBLEServiceData - RemoveJsonPropertyIf(BLEdataOut, "servicedata", BLEdataOut.containsKey("model") && BLEdataOut.containsKey("servicedata")); + RemoveJsonPropertyIf(BLEdataOut, "servicedata", BLEdataOut.containsKey("model") && BLEdataOut.containsKey("servicedata")); # endif - String mactopic = BLEdataOut["id"].as(); - mactopic.replace(":", ""); - mactopic = subjectBTtoMQTT + String("/") + mactopic; - pub((char*)mactopic.c_str(), BLEdataOut); + String mactopic = BLEdataOut["id"].as(); + mactopic.replace(":", ""); + mactopic = subjectBTtoMQTT + String("/") + mactopic; + pub((char*)mactopic.c_str(), BLEdataOut); + } } else { Log.trace(F("Low rssi, device filtered" CR)); } @@ -1265,6 +1271,13 @@ void MQTTtoBT(char* topicOri, JsonObject& BTdata) { // json object decoding BLEscanBeforeConnect = (unsigned int)BTdata["scanbcnct"]; Log.notice(F("New scan number before connect: %d" CR), BLEscanBeforeConnect); } + // publish all BLE devices discovered or only the identified sensors (like temperature sensors) + if (BTdata.containsKey("onlysensors")) { + Log.trace(F("Do we publish only sensors" CR)); + Log.trace(F("Previous value: %T" CR), publishOnlySensors); + publishOnlySensors = (bool)BTdata["onlysensors"]; + Log.notice(F("New value onlysensors: %T" CR), publishOnlySensors); + } // MinRSSI set if (BTdata.containsKey("minrssi")) { // storing Min RSSI for further use if needed diff --git a/main/config_BT.h b/main/config_BT.h index 114bddb..46444ce 100644 --- a/main/config_BT.h +++ b/main/config_BT.h @@ -44,6 +44,9 @@ extern void MQTTtoBT(char* topicOri, JsonObject& RFdata); #ifndef TimeBtwRead # define TimeBtwRead 55555 //define default time between 2 scans #endif +#ifndef PublishOnlySensors +# define PublishOnlySensors false //true if we publish all BLE devices discovered or false only the identified sensors (like temperature sensors) +#endif #define HMSerialSpeed 9600 // Communication speed with the HM module, softwareserial doesn't support 115200 //#define HM_BLUE_LED_STOP true //uncomment to stop the blue led light of HM1X @@ -58,6 +61,7 @@ extern void MQTTtoBT(char* topicOri, JsonObject& RFdata); unsigned int BLEinterval = TimeBtwRead; //time between 2 scans unsigned int BLEscanBeforeConnect = ScanBeforeConnect; //Number of BLE scans between connection cycles +bool publishOnlySensors = PublishOnlySensors; #ifndef pubKnownBLEServiceData # define pubKnownBLEServiceData false // define true if you want to publish service data belonging to recognised sensors