Remove std::string as the model id and use decoder enum. (#1143)

* Remove std::string as the model id and use decoder enum.

* Update decoder version

* Check model id is in decoder range when launching discovery.

* Add BLEconnect enum MIN/MAX
This commit is contained in:
h2zero authored and GitHub committed 2022-01-24 20:09:15 -06:00
1 parent 91ab8dcdf1
commit e838d3cee0
5 files changed
+67 -44

No files matched your search

+3 -3
View File
@@ -145,10 +145,10 @@ void LYWSD03MMC_connect::notifyCB(NimBLERemoteCharacteristic* pChar, uint8_t* pD
for (std::vector<BLEdevice*>::iterator it = devices.begin(); it != devices.end(); ++it) {
BLEdevice* p = *it;
if ((strcmp(p->macAdr, (char*)mac_address.c_str()) == 0)) {
if (p->sensorModel_id.compare("LYWSD03MMC") == 0)
if (p->sensorModel_id == BLEconectable::id::LYWSD03MMC)
BLEdata["model"] = "LYWSD03MMC";
else if (p->sensorModel_id.compare("MHO_C401") == 0)
BLEdata["model"] = "MHO_C401";
else if (p->sensorModel_id == BLEconectable::id::MHO_C401)
BLEdata["model"] = "MHO-C401";
}
}
BLEdata["id"] = (char*)mac_address.c_str();
+51 -33
View File
@@ -81,7 +81,12 @@ vector<BLEAction> BLEactions;
vector<BLEdevice*> devices;
int newDevices = 0;
static BLEdevice NO_DEVICE_FOUND = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, false, false, false, false, ""};
static BLEdevice NO_DEVICE_FOUND = {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
false,
false,
false,
false,
TheengsDecoder::BLE_ID_NUM::UNKNOWN_MODEL};
static bool oneWhite = false;
int minRssi = abs(MinimumRSSI); //minimum rssi value
@@ -196,7 +201,7 @@ void pubBT(JsonObject& data) {
bool ProcessLock = false; // Process lock when we want to use a critical function like OTA for example
BLEdevice* getDeviceByMac(const char* mac);
void createOrUpdateDevice(const char* mac, uint8_t flags, std::string model);
void createOrUpdateDevice(const char* mac, uint8_t flags, int model);
BLEdevice* getDeviceByMac(const char* mac) {
Log.trace(F("getDeviceByMac %s" CR), mac);
@@ -219,13 +224,14 @@ bool updateWorB(JsonObject& BTdata, bool isWhite) {
for (int i = 0; i < size; i++) {
const char* mac = BTdata[jsonKey][i];
createOrUpdateDevice(mac, (isWhite ? device_flags_isWhiteL : device_flags_isBlackL), "");
createOrUpdateDevice(mac, (isWhite ? device_flags_isWhiteL : device_flags_isBlackL),
TheengsDecoder::BLE_ID_NUM::UNKNOWN_MODEL);
}
return true;
}
void createOrUpdateDevice(const char* mac, uint8_t flags, std::string model) {
void createOrUpdateDevice(const char* mac, uint8_t flags, int model) {
# ifdef ESP32
if (xSemaphoreTake(semaphoreCreateOrUpdateDevice, pdMS_TO_TICKS(30000)) == pdFALSE) {
Log.error(F("Semaphore NOT taken" CR));
@@ -256,7 +262,8 @@ void createOrUpdateDevice(const char* mac, uint8_t flags, std::string model) {
device->connect = true;
}
if (!model.empty()) device->sensorModel_id = model;
if (model != TheengsDecoder::BLE_ID_NUM::UNKNOWN_MODEL)
device->sensorModel_id = model;
if (flags & device_flags_isWhiteL || flags & device_flags_isBlackL) {
device->isWhtL = flags & device_flags_isWhiteL;
@@ -284,7 +291,7 @@ void dumpDevices() {
Log.trace(F("isWhtL %d" CR), p->isWhtL);
Log.trace(F("isBlkL %d" CR), p->isBlkL);
Log.trace(F("connect %d" CR), p->connect);
Log.trace(F("sensorModel_id %s" CR), p->sensorModel_id.c_str());
Log.trace(F("sensorModel_id %d" CR), p->sensorModel_id);
}
}
@@ -467,15 +474,16 @@ void BLEconnect() {
if (p->connect) {
Log.trace(F("Model to connect found: %s" CR), p->macAdr);
NimBLEAddress addr(std::string(p->macAdr));
if (p->sensorModel_id.compare("LYWSD03MMC") == 0 || p->sensorModel_id.compare("MHO-C401") == 0) {
if (p->sensorModel_id == BLEconectable::id::LYWSD03MMC ||
p->sensorModel_id == BLEconectable::id::MHO_C401) {
LYWSD03MMC_connect BLEclient(addr);
BLEclient.processActions(BLEactions);
BLEclient.publishData();
} else if (p->sensorModel_id.compare("DT24-BLE") == 0) {
} else if (p->sensorModel_id == BLEconectable::id::DT24_BLE) {
DT24_connect BLEclient(addr);
BLEclient.processActions(BLEactions);
BLEclient.publishData();
} else if (p->sensorModel_id.compare("HHCCJCY01HHCC") == 0) {
} else if (p->sensorModel_id == TheengsDecoder::BLE_ID_NUM::HHCCJCY01HHCC) {
HHCCJCY01HHCC_connect BLEclient(addr);
BLEclient.processActions(BLEactions);
BLEclient.publishData();
@@ -493,10 +501,10 @@ void BLEconnect() {
if (!it.complete && --it.ttl) {
swap.push_back(it);
} else if (memcmp(it.addr, p->macAdr, sizeof(it.addr)) == 0) {
if (p->sensorModel_id != "DT24-BLE" &&
p->sensorModel_id != "HHCCJCY01HHCC" &&
p->sensorModel_id != "LYWSD03MMC" &&
p->sensorModel_id != "MHO-C401") {
if (p->sensorModel_id != BLEconectable::id::DT24_BLE &&
p->sensorModel_id != TheengsDecoder::BLE_ID_NUM::HHCCJCY01HHCC &&
p->sensorModel_id != BLEconectable::id::LYWSD03MMC &&
p->sensorModel_id != BLEconectable::id::MHO_C401) {
// if irregulary connected to and connection failed clear the connect flag.
p->connect = false;
}
@@ -809,14 +817,16 @@ void launchBTDiscovery() {
# endif
BLEdevice* p = *it;
Log.trace(F("Device mac %s" CR), p->macAdr);
if (p->sensorModel_id.compare("") != 0 && !isDiscovered(p)) {
if (p->sensorModel_id != TheengsDecoder::BLE_ID_NUM::UNKNOWN_MODEL &&
p->sensorModel_id < BLEconectable::id::MIN && !isDiscovered(p)) {
String macWOdots = String(p->macAdr);
macWOdots.replace(":", "");
Log.trace(F("Looking for Model_id: %s" CR), p->sensorModel_id.c_str());
std::string properties = decoder.getTheengProperties(p->sensorModel_id.c_str());
Log.trace(F("Looking for Model_id: %d" CR), p->sensorModel_id);
std::string properties = decoder.getTheengProperties(p->sensorModel_id);
Log.trace(F("properties: %s" CR), properties.c_str());
std::string brand = decoder.getTheengAttribute(p->sensorModel_id.c_str(), "brand");
std::string model = decoder.getTheengAttribute(p->sensorModel_id.c_str(), "model");
std::string brand = decoder.getTheengAttribute(p->sensorModel_id, "brand");
std::string model = decoder.getTheengAttribute(p->sensorModel_id, "model");
std::string model_id = decoder.getTheengAttribute(p->sensorModel_id, "model_id");
if (!properties.empty()) {
StaticJsonDocument<JSON_MSG_BUFFER> jsonBuffer;
deserializeJson(jsonBuffer, properties);
@@ -825,7 +835,7 @@ void launchBTDiscovery() {
Log.trace("Unit: %s", prop.value()["unit"].as<const char*>());
Log.trace("Name: %s", prop.value()["name"].as<const char*>());
String discovery_topic = String(subjectBTtoMQTT) + "/" + macWOdots;
String entity_name = String(p->sensorModel_id.c_str()) + "-" + String(prop.key().c_str());
String entity_name = String(model_id.c_str()) + "-" + String(prop.key().c_str());
String unique_id = macWOdots + "-" + entity_name;
# if OpenHABDiscovery
String value_template = "{{ value_json." + String(prop.key().c_str()) + "}}";
@@ -837,19 +847,19 @@ void launchBTDiscovery() {
will_Topic, prop.value()["name"], value_template.c_str(),
"", "", prop.value()["unit"],
0, "", "", false, "",
model.c_str(), brand.c_str(), p->sensorModel_id.c_str(), macWOdots.c_str(), false,
model.c_str(), brand.c_str(), model_id.c_str(), macWOdots.c_str(), false,
stateClassMeasurement);
}
} else {
// Discovery of sensors from which we retrieve data only by connect
if (p->sensorModel_id.compare("DT24-BLE") == 0) {
DT24Discovery(macWOdots.c_str(), p->sensorModel_id.c_str());
if (p->sensorModel_id == BLEconectable::id::DT24_BLE) {
DT24Discovery(macWOdots.c_str(), "DT24-BLE");
}
if (p->sensorModel_id.compare("LYWSD03MMC") == 0) {
LYWSD03MMCDiscovery(macWOdots.c_str(), p->sensorModel_id.c_str());
if (p->sensorModel_id == BLEconectable::id::LYWSD03MMC) {
LYWSD03MMCDiscovery(macWOdots.c_str(), "LYWSD03MMC");
}
if (p->sensorModel_id.compare("MHO-C401") == 0) {
MHO_C401Discovery(macWOdots.c_str(), p->sensorModel_id.c_str());
if (p->sensorModel_id == BLEconectable::id::MHO_C401) {
MHO_C401Discovery(macWOdots.c_str(), "MHO-C401");
}
}
p->isDisc = true; // we don't need the semaphore and all the search magic via createOrUpdateDevice
@@ -897,19 +907,26 @@ void PublishDeviceData(JsonObject& BLEdata, bool processBLEData) {
void process_bledata(JsonObject& BLEdata) {
const char* mac = BLEdata["id"].as<const char*>();
if (decoder.decodeBLEJson(BLEdata)) { // Broadcaster devices
std::string model_id = BLEdata["model_id"];
Log.trace(F("Decoder found device: %s" CR), model_id.c_str());
if (model_id.compare("HHCCJCY01HHCC") == 0) {
int model_id = decoder.decodeBLEJson(BLEdata);
if (model_id >= 0) { // Broadcaster devices
Log.trace(F("Decoder found device: %s" CR), BLEdata["model_id"].as<const char*>());
if (model_id == TheengsDecoder::BLE_ID_NUM::HHCCJCY01HHCC) {
createOrUpdateDevice(mac, device_flags_connect, model_id); // Device that broadcast and can be connected
} else {
createOrUpdateDevice(mac, device_flags_init, model_id);
}
} else if (BLEdata.containsKey("name")) { // Connectable devices
std::string name = BLEdata["name"];
if (name.compare("LYWSD03MMC") == 0 || name.compare("DT24-BLE") == 0 || name.compare("MHO-C401") == 0) {
if (name.compare("LYWSD03MMC") == 0)
model_id = BLEconectable::id::LYWSD03MMC;
else if (name.compare("DT24-BLE") == 0)
model_id = BLEconectable::id::DT24_BLE;
else if (name.compare("MHO-C401") == 0)
model_id = BLEconectable::id::MHO_C401;
if (model_id > 0) {
Log.trace(F("Connectable device found: %s" CR), name.c_str());
createOrUpdateDevice(mac, device_flags_connect, name);
createOrUpdateDevice(mac, device_flags_connect, model_id);
}
} else {
Log.trace(F("No device found " CR));
@@ -991,7 +1008,8 @@ void MQTTtoBTAction(JsonObject& BTdata) {
return;
}
createOrUpdateDevice(action.addr, device_flags_connect, "");
createOrUpdateDevice(action.addr, device_flags_connect,
TheengsDecoder::BLE_ID_NUM::UNKNOWN_MODEL);
if (BTdata.containsKey("immediate") && BTdata["immediate"].as<bool>()) {
// Immediate action; we need to prevent the normal connection action and stop scanning
+12 -1
View File
@@ -168,7 +168,18 @@ struct BLEdevice {
bool isWhtL;
bool isBlkL;
bool connect;
std::string sensorModel_id;
int sensorModel_id;
};
class BLEconectable {
public:
enum id {
MIN = 1000,
LYWSD03MMC,
MHO_C401,
DT24_BLE,
MAX,
};
};
JsonObject& getBTJsonObject(const char* json = NULL, bool haPresenceEnabled = true);
-6
View File
@@ -1154,9 +1154,7 @@ void setup_wifimanager(bool reset_settings) {
WiFiManagerParameter custom_mqtt_pass("pass", "mqtt pass", mqtt_pass, parameters_size * 2);
WiFiManagerParameter custom_mqtt_topic("topic", "mqtt base topic", mqtt_topic, mqtt_topic_max_size);
WiFiManagerParameter custom_mqtt_secure("secure", "mqtt secure", "1", 1, mqtt_secure ? "type=\"checkbox\" checked" : "type=\"checkbox\"");
# ifdef ESP32 // not enough memory on ESP8266
WiFiManagerParameter custom_mqtt_cert("cert", "mqtt broker cert", mqtt_cert.c_str(), 2048);
# endif
WiFiManagerParameter custom_gateway_name("name", "gateway name", gateway_name, parameters_size * 2);
# endif
//WiFiManager
@@ -1185,9 +1183,7 @@ void setup_wifimanager(bool reset_settings) {
wifiManager.addParameter(&custom_mqtt_user);
wifiManager.addParameter(&custom_mqtt_pass);
wifiManager.addParameter(&custom_mqtt_secure);
# ifdef ESP32 // not enough memory on ESP8266
wifiManager.addParameter(&custom_mqtt_cert);
# endif
wifiManager.addParameter(&custom_gateway_name);
wifiManager.addParameter(&custom_mqtt_topic);
# endif
@@ -1241,7 +1237,6 @@ void setup_wifimanager(bool reset_settings) {
strcpy(gateway_name, custom_gateway_name.getValue());
mqtt_secure = *custom_mqtt_secure.getValue();
# ifdef ESP32 // not enough memory on ESP8266
int cert_len = strlen(custom_mqtt_cert.getValue());
if (cert_len) {
char* cert_in = (char*)custom_mqtt_cert.getValue();
@@ -1259,7 +1254,6 @@ void setup_wifimanager(bool reset_settings) {
mqtt_cert = cert_begin;
}
# endif
# endif
//save the custom parameters to FS
saveMqttConfig();
+1 -1
View File
@@ -129,7 +129,7 @@ somfy_remote=Somfy_Remote_Lib@0.3.0
rtl_433_ESP = https://github.com/NorthernMan54/rtl_433_ESP.git#v0.0.3
emodbus = miq19/eModbus@1.0.0
gfSunInverter = https://github.com/BlackSmith/GFSunInverter.git#v1.0.1
decoder = https://github.com/theengs/decoder.git#v0.1.6
decoder = https://github.com/theengs/decoder.git#v0.1.7
[env]
framework = arduino