[RTL] Correct string handling for type key in NAMING_KEYS (#1960)

* Correct string handling for type key in NAMING_KEYS

Extend class structure RTL_433device and modify code to create correct state topic in discovery message to support sensors, that send type key as well as sensors, that don't. Actually only TPMS sensors use type=TPMS.

* Try to correct format failure.

* Remove trailing spaces
This commit is contained in:
riegelbrau authored and GitHub committed 2024-06-12 06:11:02 -05:00
1 parent db8e850570
commit 23b3123b97
2 files changed
+30 -15

No files matched your search

+22 -9
View File
@@ -66,11 +66,12 @@ void dumpRTL_433Devices() {
RTL_433device* p = *it;
DISCOVERY_TRACE_LOG(F("uniqueId %s" CR), p->uniqueId);
DISCOVERY_TRACE_LOG(F("modelName %s" CR), p->modelName);
DISCOVERY_TRACE_LOG(F("type %s" CR), p->type);
DISCOVERY_TRACE_LOG(F("isDisc %d" CR), p->isDisc);
}
}
void createOrUpdateDeviceRTL_433(const char* id, const char* model, uint8_t flags) {
void createOrUpdateDeviceRTL_433(const char* id, const char* model, const char* type, uint8_t flags) {
if (xSemaphoreTake(semaphorecreateOrUpdateDeviceRTL_433, pdMS_TO_TICKS(30000)) == pdFALSE) {
Log.error(F("[rtl_433] semaphorecreateOrUpdateDeviceRTL_433 Semaphore NOT taken" CR));
return;
@@ -85,8 +86,12 @@ void createOrUpdateDeviceRTL_433(const char* id, const char* model, uint8_t flag
Log.warning(F("[rtl_433] Device id %s exceeds available space" CR), id); // Remove from production release ?
};
if (strlcpy(device->modelName, model, modelNameSize) > modelNameSize) {
Log.warning(F("[rtl_433] Device model %s exceeds available space" CR), id); // Remove from production release ?
Log.warning(F("[rtl_433] Device model %s exceeds available space" CR), model); // Remove from production release ?
};
if (strlcpy(device->type, type, typeSize) > typeSize) {
Log.warning(F("[rtl_433] Device type %s exceeds available space" CR), type); // Remove from production release ?
}
DISCOVERY_TRACE_LOG(F("[rtl_433] Device type is %s." CR), device->type); // Remove from production release ?
device->isDisc = flags & device_flags_isDisc;
RTL_433devices.push_back(device);
newRTL_433Devices++;
@@ -135,10 +140,16 @@ void launchRTL_433Discovery(bool overrideDiscovery) {
# if valueAsATopic
// Remove the key from the unique id to extract the device id
String idWoKeyAndModel = idWoKey;
idWoKeyAndModel.remove(0, strlen(pdevice->modelName));
idWoKeyAndModel.replace("-", "/");
if (strcmp(pdevice->type, "null")) {
idWoKeyAndModel.remove(0, (strlen(pdevice->modelName) + strlen(pdevice->type) + 1)); // type is present
topic = topic + "/" + String(pdevice->type) + "/" + String(pdevice->modelName);
} else {
idWoKeyAndModel.remove(0, (strlen(pdevice->modelName)));
topic = topic + "/" + String(pdevice->modelName);
}
DISCOVERY_TRACE_LOG(F("idWoKeyAndModel %s" CR), idWoKeyAndModel.c_str());
topic = topic + "/" + String(pdevice->modelName) + idWoKeyAndModel;
idWoKeyAndModel.replace("-", "/");
topic = topic + idWoKeyAndModel;
# endif
if (strcmp(parameters[i][0], "battery_ok") == 0) {
if (strcmp(pdevice->modelName, "Govee-Water") == 0 || strcmp(pdevice->modelName, "Govee-Contact") == 0 || strcmp(pdevice->modelName, "Archos-TBH") == 0 || strcmp(pdevice->modelName, "FineOffset-WH31L") == 0 || strcmp(pdevice->modelName, "Fineoffset-WH45") == 0 || strcmp(pdevice->modelName, "Fineoffset-WN34") == 0 || strcmp(pdevice->modelName, "Fineoffset-WS80") == 0 || strcmp(pdevice->modelName, "Fineoffset-WH0290") == 0 || strcmp(pdevice->modelName, "Fineoffset-WH51") == 0 || strcmp(pdevice->modelName, "Kedsum-TH") == 0 || strcmp(pdevice->modelName, "AVE") == 0 || strcmp(pdevice->modelName, "TPMS") == 0) {
@@ -232,7 +243,7 @@ void launchRTL_433Discovery(bool overrideDiscovery) {
}
}
void storeRTL_433Discovery(JsonObject& RFrtl_433_ESPdata, const char* model, const char* uniqueid) {
void storeRTL_433Discovery(JsonObject& RFrtl_433_ESPdata, const char* model, const char* type, const char* uniqueid) {
//Sanitize model name
String modelSanitized = model;
modelSanitized.replace(" ", "_");
@@ -246,7 +257,7 @@ void storeRTL_433Discovery(JsonObject& RFrtl_433_ESPdata, const char* model, con
for (int i = 0; i < numRows; i++) {
if (RFrtl_433_ESPdata.containsKey(parameters[i][0])) {
String key_id = String(uniqueid) + "-" + String(parameters[i][0]);
createOrUpdateDeviceRTL_433((char*)key_id.c_str(), (char*)modelSanitized.c_str(), device_flags_init);
createOrUpdateDeviceRTL_433((char*)key_id.c_str(), (char*)modelSanitized.c_str(), (char*)type, device_flags_init);
}
}
}
@@ -264,6 +275,8 @@ void rtl_433_Callback(char* message) {
unsigned long MQTTvalue = (int)RFrtl_433_ESPdata["id"] + round((float)RFrtl_433_ESPdata["temperature_C"]);
String topic = subjectRTL_433toMQTT;
String model = RFrtl_433_ESPdata["model"];
String type = RFrtl_433_ESPdata["type"];
Log.notice(F("type: %s" CR), type.c_str());
String uniqueid;
const char naming_keys[5][8] = {"type", "model", "subtype", "channel", "id"}; // from rtl_433_mqtt_hass.py
@@ -284,11 +297,11 @@ void rtl_433_Callback(char* message) {
uniqueid.replace("/", "-");
// Log.notice(F("uniqueid: %s" CR), uniqueid.c_str());
DISCOVERY_TRACE_LOG(F("uniqueid: %s" CR), uniqueid.c_str());
if (!isAduplicateSignal(MQTTvalue)) {
# ifdef ZmqttDiscovery
if (SYSConfig.discovery)
storeRTL_433Discovery(RFrtl_433_ESPdata, (char*)model.c_str(), (char*)uniqueid.c_str());
storeRTL_433Discovery(RFrtl_433_ESPdata, (char*)model.c_str(), (char*)type.c_str(), (char*)uniqueid.c_str());
# endif
//RFrtl_433_ESPdata["origin"] = (char*)topic.c_str();
//handleJsonEnqueue(RFrtl_433_ESPdata);