[BT] Device Tracker sync across gateways (#2094)

Device Tracker sync across gateways - OpenMQTTGateway & Theengs Gateway
This commit is contained in:
DigiH authored and GitHub committed 2024-10-28 11:25:38 -05:00
1 parent 952a65dd0f
commit 67e50642dd
4 files changed
+39 -3

No files matched your search

+29
View File
@@ -1269,6 +1269,27 @@ void PublishDeviceData(JsonObject& BLEdata) {
Log.notice(F("Not a sensor device filtered" CR));
return;
}
# if BLEDecoder
if (enableMultiGTWSync && BLEdata.containsKey("model_id") && BLEdata.containsKey("id")) {
// Publish tracker sync message
bool isTracker = false;
std::string tag = decoder.getTheengAttribute(BLEdata["model_id"].as<const char*>(), "tag");
if (tag.length() >= 4) {
isTracker = checkIfIsTracker(tag[3]);
}
if (isTracker) {
StaticJsonDocument<JSON_MSG_BUFFER> BLEdataBuffer;
JsonObject TrackerSyncdata = BLEdataBuffer.to<JsonObject>();
TrackerSyncdata["gatewayid"] = gateway_name;
TrackerSyncdata["trackerid"] = BLEdata["id"].as<const char*>();
String topic = String(mqtt_topic) + String(subjectTrackerSync);
TrackerSyncdata["topic"] = topic.c_str();
enqueueJsonObject(TrackerSyncdata);
}
}
# endif
} else {
Log.notice(F("Low rssi, device filtered" CR));
return;
@@ -1553,6 +1574,14 @@ void XtoBT(const char* topicOri, JsonObject& BTdata) { // json object decoding
Log.error(F("BLE busy - command not sent" CR));
gatewayState = GatewayState::ERROR;
}
} else if (strstr(topicOri, subjectTrackerSync) != NULL) {
if (BTdata.containsKey("gatewayid") && BTdata.containsKey("trackerid") && BTdata["gatewayid"] != gateway_name) {
BLEdevice* device = getDeviceByMac(BTdata["trackerid"].as<const char*>());
if (device != &NO_BT_DEVICE_FOUND && device->lastUpdate != 0) {
device->lastUpdate = 0;
Log.notice(F("Tracker %s disassociated by gateway %s" CR), BTdata["trackerid"].as<const char*>(), BTdata["gatewayid"].as<const char*>());
}
}
}
}
#endif