From 158617f56be67c6036fd42dcb9ecf1a3356f33c3 Mon Sep 17 00:00:00 2001 From: Proddy Date: Sat, 24 Jun 2023 13:28:48 +0200 Subject: [PATCH] fixes #1196 - use basename as ids in HA to support multiple EMS-ESP's --- src/analogsensor.cpp | 4 ++-- src/mqtt.cpp | 18 ++++++++++-------- src/shower.cpp | 4 ++-- src/temperaturesensor.cpp | 4 ++-- src/web/WebEntityService.cpp | 7 ++++--- src/web/WebLogService.cpp | 3 +-- src/web/WebSchedulerService.cpp | 4 ++-- 7 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp index 160c12004..f37c0947a 100644 --- a/src/analogsensor.cpp +++ b/src/analogsensor.cpp @@ -479,7 +479,7 @@ void AnalogSensor::publish_values(const bool force) { StaticJsonDocument config; char stat_t[50]; - snprintf(stat_t, sizeof(stat_t), "%s/analogsensor_data", Mqtt::base().c_str()); // use base path + snprintf(stat_t, sizeof(stat_t), "%s/analogsensor_data", Mqtt::basename().c_str()); // use basename config["stat_t"] = stat_t; char val_obj[50]; @@ -570,7 +570,7 @@ void AnalogSensor::publish_values(const bool force) { JsonObject dev = config.createNestedObject("dev"); JsonArray ids = dev.createNestedArray("ids"); - ids.add("ems-esp"); + ids.add(Mqtt::basename()); // add "availability" section Mqtt::add_avty_to_doc(stat_t, config.as(), val_cond); diff --git a/src/mqtt.cpp b/src/mqtt.cpp index eaba3391f..1b1cea873 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -621,7 +621,7 @@ void Mqtt::ha_status() { doc["uniq_id"] = uniq; doc["obj_id"] = uniq; - doc["stat_t"] = mqtt_base_ + "/status"; + doc["stat_t"] = mqtt_basename_ + "/status"; doc["name"] = "EMS-ESP status"; doc["pl_on"] = "online"; doc["pl_off"] = "offline"; @@ -633,7 +633,7 @@ void Mqtt::ha_status() { // doc["json_attr_t"] = "~/heartbeat"; // store also as HA attributes JsonObject dev = doc.createNestedObject("dev"); - dev["name"] = "EMS-ESP"; + dev["name"] = Mqtt::basename(); // take basename dev["sw"] = "v" + std::string(EMSESP_APP_VERSION); dev["mf"] = "proddy"; dev["mdl"] = "EMS-ESP"; @@ -641,7 +641,7 @@ void Mqtt::ha_status() { dev["cu"] = "http://" + (EMSESP::system_.ethernet_connected() ? ETH.localIP().toString() : WiFi.localIP().toString()); #endif JsonArray ids = dev.createNestedArray("ids"); - ids.add("ems-esp"); + ids.add(Mqtt::basename()); char topic[MQTT_TOPIC_MAX_SIZE]; snprintf(topic, sizeof(topic), "binary_sensor/%s/system_status/config", mqtt_basename_.c_str()); @@ -910,13 +910,13 @@ void Mqtt::publish_ha_sensor_config(DeviceValue & dv, const char * model, const JsonArray ids = dev_json.createNestedArray("ids"); char ha_device[40]; auto device_type_name = EMSdevice::device_type_2_device_name(dv.device_type); - snprintf(ha_device, sizeof(ha_device), "ems-esp-%s", device_type_name); + snprintf(ha_device, sizeof(ha_device), "%s-%s", Mqtt::basename().c_str(), device_type_name); ids.add(ha_device); if (create_device_config) { auto cap_name = strdup(device_type_name); Helpers::CharToUpperUTF8(cap_name); // capitalize first letter - dev_json["name"] = std::string("EMS-ESP ") + cap_name; + dev_json["name"] = Mqtt::basename() + " " + cap_name; dev_json["mf"] = brand; dev_json["mdl"] = model; dev_json["via_device"] = "ems-esp"; @@ -955,7 +955,7 @@ void Mqtt::publish_system_ha_sensor_config(uint8_t type, const char * name, cons JsonObject dev_json = doc.createNestedObject("dev"); JsonArray ids = dev_json.createNestedArray("ids"); - ids.add("ems-esp"); + ids.add(Mqtt::basename()); publish_ha_sensor_config(type, DeviceValueTAG::TAG_HEARTBEAT, name, name, EMSdevice::DeviceType::SYSTEM, entity, uom, false, false, nullptr, 0, 0, 0, 0, dev_json); } @@ -1302,7 +1302,6 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev // add "availability" section add_avty_to_doc(stat_t, doc.as(), val_cond); - // TODO queue it or send it directly via publish? queue_ha(topic, doc.as()); } @@ -1408,7 +1407,10 @@ void Mqtt::publish_ha_climate_config(const uint8_t tag, const bool has_roomtemp, JsonObject dev = doc.createNestedObject("dev"); JsonArray ids = dev.createNestedArray("ids"); - ids.add("ems-esp-thermostat"); + + char ha_device[40]; + snprintf(ha_device, sizeof(ha_device), "%s-thermostat", Mqtt::basename().c_str()); + ids.add(ha_device); // add "availability" section add_avty_to_doc(topic_t, doc.as(), seltemp_cond, has_roomtemp ? currtemp_cond : nullptr, hc_mode_cond); diff --git a/src/shower.cpp b/src/shower.cpp index 847801d13..477230671 100644 --- a/src/shower.cpp +++ b/src/shower.cpp @@ -164,7 +164,7 @@ void Shower::set_shower_state(bool state, bool force) { doc["object_id"] = str; char stat_t[50]; - snprintf(stat_t, sizeof(stat_t), "%s/shower_active", Mqtt::base().c_str()); // use base path + snprintf(stat_t, sizeof(stat_t), "%s/shower_active", Mqtt::basename().c_str()); doc["stat_t"] = stat_t; if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { @@ -181,7 +181,7 @@ void Shower::set_shower_state(bool state, bool force) { JsonObject dev = doc.createNestedObject("dev"); JsonArray ids = dev.createNestedArray("ids"); - ids.add("ems-esp"); + ids.add(Mqtt::basename()); // add "availability" section Mqtt::add_avty_to_doc(stat_t, doc.as()); diff --git a/src/temperaturesensor.cpp b/src/temperaturesensor.cpp index ea313a0c2..a13b848db 100644 --- a/src/temperaturesensor.cpp +++ b/src/temperaturesensor.cpp @@ -511,7 +511,7 @@ void TemperatureSensor::publish_values(const bool force) { config["dev_cla"] = "temperature"; char stat_t[50]; - snprintf(stat_t, sizeof(stat_t), "%s/temperaturesensor_data", Mqtt::base().c_str()); // use base path + snprintf(stat_t, sizeof(stat_t), "%s/temperaturesensor_data", Mqtt::basename().c_str()); config["stat_t"] = stat_t; config["unit_of_meas"] = EMSdevice::uom_to_string(DeviceValueUOM::DEGREES); @@ -543,7 +543,7 @@ void TemperatureSensor::publish_values(const bool force) { JsonObject dev = config.createNestedObject("dev"); JsonArray ids = dev.createNestedArray("ids"); - ids.add("ems-esp"); + ids.add(Mqtt::basename()); // add "availability" section Mqtt::add_avty_to_doc(stat_t, config.as(), val_cond); diff --git a/src/web/WebEntityService.cpp b/src/web/WebEntityService.cpp index a52d8fc1b..457c3e1d1 100644 --- a/src/web/WebEntityService.cpp +++ b/src/web/WebEntityService.cpp @@ -294,7 +294,7 @@ void WebEntityService::publish(const bool force) { if (Mqtt::ha_enabled() && !ha_registered_) { StaticJsonDocument config; char stat_t[50]; - snprintf(stat_t, sizeof(stat_t), "%s/custom_data", Mqtt::base().c_str()); + snprintf(stat_t, sizeof(stat_t), "%s/custom_data", Mqtt::basename().c_str()); config["stat_t"] = stat_t; char val_obj[50]; @@ -312,13 +312,14 @@ void WebEntityService::publish(const bool force) { char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; snprintf(topic, sizeof(topic), "sensor/%s/custom_%s/config", Mqtt::basename().c_str(), entityItem.name.c_str()); - //char command_topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; + + // char command_topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; // snprintf(command_topic, sizeof(command_topic), "%s/custom/%s", Mqtt::basename().c_str(), entityItem.name.c_str()); // config["cmd_t"] = command_topic; JsonObject dev = config.createNestedObject("dev"); JsonArray ids = dev.createNestedArray("ids"); - ids.add("ems-esp"); + ids.add(Mqtt::basename()); // add "availability" section Mqtt::add_avty_to_doc(stat_t, config.as(), val_cond); diff --git a/src/web/WebLogService.cpp b/src/web/WebLogService.cpp index 1800f0c25..33fc6a170 100644 --- a/src/web/WebLogService.cpp +++ b/src/web/WebLogService.cpp @@ -216,8 +216,7 @@ void WebLogService::setValues(AsyncWebServerRequest * request, JsonVariant & jso auto && body = json.as(); - // TODO refactor into one load and one save - + // TODO refactor into one load and one save method uuid::log::Level level = body["level"]; log_level(level); diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp index 22ffed2f4..753cd9a82 100644 --- a/src/web/WebSchedulerService.cpp +++ b/src/web/WebSchedulerService.cpp @@ -237,7 +237,7 @@ void WebSchedulerService::publish(const bool force) { if (Mqtt::ha_enabled() && force) { StaticJsonDocument config; char stat_t[50]; - snprintf(stat_t, sizeof(stat_t), "%s/scheduler_data", Mqtt::base().c_str()); + snprintf(stat_t, sizeof(stat_t), "%s/scheduler_data", Mqtt::basename().c_str()); config["stat_t"] = stat_t; char val_obj[50]; @@ -272,7 +272,7 @@ void WebSchedulerService::publish(const bool force) { JsonObject dev = config.createNestedObject("dev"); JsonArray ids = dev.createNestedArray("ids"); - ids.add("ems-esp"); + ids.add(Mqtt::basename()); // add "availability" section Mqtt::add_avty_to_doc(stat_t, config.as(), val_cond);