Fix discovery of connectable devices (#1173)

This commit is contained in:
Amy Nagle authored and GitHub committed 2022-03-04 16:22:35 -06:00
1 parent 9059547d12
commit 0e45f7cca0
1 file changed
+34 -35
+34 -35
View File
@@ -844,41 +844,43 @@ void launchBTDiscovery() {
# endif # endif
BLEdevice* p = *it; BLEdevice* p = *it;
Log.trace(F("Device mac %s" CR), p->macAdr); Log.trace(F("Device mac %s" CR), p->macAdr);
if (p->sensorModel_id > TheengsDecoder::BLE_ID_NUM::UNKNOWN_MODEL && if (!isDiscovered(p)) {
p->sensorModel_id < TheengsDecoder::BLE_ID_NUM::BLE_ID_MAX &&
!isDiscovered(p)) {
String macWOdots = String(p->macAdr); String macWOdots = String(p->macAdr);
macWOdots.replace(":", ""); macWOdots.replace(":", "");
Log.trace(F("Looking for Model_id: %d" CR), p->sensorModel_id); if (p->sensorModel_id > TheengsDecoder::BLE_ID_NUM::UNKNOWN_MODEL &&
std::string properties = decoder.getTheengProperties(p->sensorModel_id); p->sensorModel_id < TheengsDecoder::BLE_ID_NUM::BLE_ID_MAX) {
Log.trace(F("properties: %s" CR), properties.c_str()); Log.trace(F("Looking for Model_id: %d" CR), p->sensorModel_id);
std::string brand = decoder.getTheengAttribute(p->sensorModel_id, "brand"); std::string properties = decoder.getTheengProperties(p->sensorModel_id);
std::string model = decoder.getTheengAttribute(p->sensorModel_id, "model"); Log.trace(F("properties: %s" CR), properties.c_str());
std::string model_id = decoder.getTheengAttribute(p->sensorModel_id, "model_id"); std::string brand = decoder.getTheengAttribute(p->sensorModel_id, "brand");
if (!properties.empty()) { std::string model = decoder.getTheengAttribute(p->sensorModel_id, "model");
StaticJsonDocument<JSON_MSG_BUFFER> jsonBuffer; std::string model_id = decoder.getTheengAttribute(p->sensorModel_id, "model_id");
deserializeJson(jsonBuffer, properties); if (!properties.empty()) {
for (JsonPair prop : jsonBuffer["properties"].as<JsonObject>()) { StaticJsonDocument<JSON_MSG_BUFFER> jsonBuffer;
Log.trace("Key: %s", prop.key().c_str()); deserializeJson(jsonBuffer, properties);
Log.trace("Unit: %s", prop.value()["unit"].as<const char*>()); for (JsonPair prop : jsonBuffer["properties"].as<JsonObject>()) {
Log.trace("Name: %s", prop.value()["name"].as<const char*>()); Log.trace("Key: %s", prop.key().c_str());
String discovery_topic = String(subjectBTtoMQTT) + "/" + macWOdots; Log.trace("Unit: %s", prop.value()["unit"].as<const char*>());
String entity_name = String(model_id.c_str()) + "-" + String(prop.key().c_str()); Log.trace("Name: %s", prop.value()["name"].as<const char*>());
String unique_id = macWOdots + "-" + String(prop.key().c_str()); String discovery_topic = String(subjectBTtoMQTT) + "/" + macWOdots;
String entity_name = String(model_id.c_str()) + "-" + String(prop.key().c_str());
String unique_id = macWOdots + "-" + String(prop.key().c_str());
# if OpenHABDiscovery # if OpenHABDiscovery
String value_template = "{{ value_json." + String(prop.key().c_str()) + "}}"; String value_template = "{{ value_json." + String(prop.key().c_str()) + "}}";
# else # else
String value_template = "{{ value_json." + String(prop.key().c_str()) + " | is_defined }}"; String value_template = "{{ value_json." + String(prop.key().c_str()) + " | is_defined }}";
# endif # endif
createDiscovery("sensor", createDiscovery("sensor",
discovery_topic.c_str(), entity_name.c_str(), unique_id.c_str(), discovery_topic.c_str(), entity_name.c_str(), unique_id.c_str(),
will_Topic, prop.value()["name"], value_template.c_str(), will_Topic, prop.value()["name"], value_template.c_str(),
"", "", prop.value()["unit"], "", "", prop.value()["unit"],
0, "", "", false, "", 0, "", "", false, "",
model.c_str(), brand.c_str(), model_id.c_str(), macWOdots.c_str(), false, model.c_str(), brand.c_str(), model_id.c_str(), macWOdots.c_str(), false,
stateClassMeasurement); stateClassMeasurement);
}
} }
} else { } else if (p->sensorModel_id > BLEconectable::id::MIN &&
p->sensorModel_id < BLEconectable::id::MAX) {
// Discovery of sensors from which we retrieve data only by connect // Discovery of sensors from which we retrieve data only by connect
if (p->sensorModel_id == BLEconectable::id::DT24_BLE) { if (p->sensorModel_id == BLEconectable::id::DT24_BLE) {
DT24Discovery(macWOdots.c_str(), "DT24-BLE"); DT24Discovery(macWOdots.c_str(), "DT24-BLE");
@@ -892,15 +894,12 @@ void launchBTDiscovery() {
if (p->sensorModel_id == BLEconectable::id::XMWSDJ04MMC) { if (p->sensorModel_id == BLEconectable::id::XMWSDJ04MMC) {
XMWSDJ04MMCDiscovery(macWOdots.c_str(), "XMWSDJ04MMC"); XMWSDJ04MMCDiscovery(macWOdots.c_str(), "XMWSDJ04MMC");
} }
} else {
Log.trace(F("Device UNKNOWN_MODEL %s" CR), p->macAdr);
} }
p->isDisc = true; // we don't need the semaphore and all the search magic via createOrUpdateDevice p->isDisc = true; // we don't need the semaphore and all the search magic via createOrUpdateDevice
} else { } else {
if (!isDiscovered(p)) { Log.trace(F("Device already discovered %s" CR), p->macAdr);
Log.trace(F("Device UNKNOWN_MODEL %s" CR), p->macAdr);
p->isDisc = true;
} else {
Log.trace(F("Device already discovered %s" CR), p->macAdr);
}
} }
} }
} }