fixes #1196 - use basename as ids in HA to support multiple EMS-ESP's

This commit is contained in:
Proddy
2023-06-24 13:28:48 +02:00
parent 27b9aa6ddd
commit 158617f56b
7 changed files with 23 additions and 21 deletions

View File

@@ -479,7 +479,7 @@ void AnalogSensor::publish_values(const bool force) {
StaticJsonDocument<EMSESP_JSON_SIZE_MEDIUM> config; StaticJsonDocument<EMSESP_JSON_SIZE_MEDIUM> config;
char stat_t[50]; 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; config["stat_t"] = stat_t;
char val_obj[50]; char val_obj[50];
@@ -570,7 +570,7 @@ void AnalogSensor::publish_values(const bool force) {
JsonObject dev = config.createNestedObject("dev"); JsonObject dev = config.createNestedObject("dev");
JsonArray ids = dev.createNestedArray("ids"); JsonArray ids = dev.createNestedArray("ids");
ids.add("ems-esp"); ids.add(Mqtt::basename());
// add "availability" section // add "availability" section
Mqtt::add_avty_to_doc(stat_t, config.as<JsonObject>(), val_cond); Mqtt::add_avty_to_doc(stat_t, config.as<JsonObject>(), val_cond);

View File

@@ -621,7 +621,7 @@ void Mqtt::ha_status() {
doc["uniq_id"] = uniq; doc["uniq_id"] = uniq;
doc["obj_id"] = uniq; doc["obj_id"] = uniq;
doc["stat_t"] = mqtt_base_ + "/status"; doc["stat_t"] = mqtt_basename_ + "/status";
doc["name"] = "EMS-ESP status"; doc["name"] = "EMS-ESP status";
doc["pl_on"] = "online"; doc["pl_on"] = "online";
doc["pl_off"] = "offline"; doc["pl_off"] = "offline";
@@ -633,7 +633,7 @@ void Mqtt::ha_status() {
// doc["json_attr_t"] = "~/heartbeat"; // store also as HA attributes // doc["json_attr_t"] = "~/heartbeat"; // store also as HA attributes
JsonObject dev = doc.createNestedObject("dev"); JsonObject dev = doc.createNestedObject("dev");
dev["name"] = "EMS-ESP"; dev["name"] = Mqtt::basename(); // take basename
dev["sw"] = "v" + std::string(EMSESP_APP_VERSION); dev["sw"] = "v" + std::string(EMSESP_APP_VERSION);
dev["mf"] = "proddy"; dev["mf"] = "proddy";
dev["mdl"] = "EMS-ESP"; 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()); dev["cu"] = "http://" + (EMSESP::system_.ethernet_connected() ? ETH.localIP().toString() : WiFi.localIP().toString());
#endif #endif
JsonArray ids = dev.createNestedArray("ids"); JsonArray ids = dev.createNestedArray("ids");
ids.add("ems-esp"); ids.add(Mqtt::basename());
char topic[MQTT_TOPIC_MAX_SIZE]; char topic[MQTT_TOPIC_MAX_SIZE];
snprintf(topic, sizeof(topic), "binary_sensor/%s/system_status/config", mqtt_basename_.c_str()); 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"); JsonArray ids = dev_json.createNestedArray("ids");
char ha_device[40]; char ha_device[40];
auto device_type_name = EMSdevice::device_type_2_device_name(dv.device_type); 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); ids.add(ha_device);
if (create_device_config) { if (create_device_config) {
auto cap_name = strdup(device_type_name); auto cap_name = strdup(device_type_name);
Helpers::CharToUpperUTF8(cap_name); // capitalize first letter 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["mf"] = brand;
dev_json["mdl"] = model; dev_json["mdl"] = model;
dev_json["via_device"] = "ems-esp"; 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"); JsonObject dev_json = doc.createNestedObject("dev");
JsonArray ids = dev_json.createNestedArray("ids"); 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); 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 "availability" section
add_avty_to_doc(stat_t, doc.as<JsonObject>(), val_cond); add_avty_to_doc(stat_t, doc.as<JsonObject>(), val_cond);
// TODO queue it or send it directly via publish?
queue_ha(topic, doc.as<JsonObject>()); queue_ha(topic, doc.as<JsonObject>());
} }
@@ -1408,7 +1407,10 @@ void Mqtt::publish_ha_climate_config(const uint8_t tag, const bool has_roomtemp,
JsonObject dev = doc.createNestedObject("dev"); JsonObject dev = doc.createNestedObject("dev");
JsonArray ids = dev.createNestedArray("ids"); 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 "availability" section
add_avty_to_doc(topic_t, doc.as<JsonObject>(), seltemp_cond, has_roomtemp ? currtemp_cond : nullptr, hc_mode_cond); add_avty_to_doc(topic_t, doc.as<JsonObject>(), seltemp_cond, has_roomtemp ? currtemp_cond : nullptr, hc_mode_cond);

View File

@@ -164,7 +164,7 @@ void Shower::set_shower_state(bool state, bool force) {
doc["object_id"] = str; doc["object_id"] = str;
char stat_t[50]; 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; doc["stat_t"] = stat_t;
if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { 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"); JsonObject dev = doc.createNestedObject("dev");
JsonArray ids = dev.createNestedArray("ids"); JsonArray ids = dev.createNestedArray("ids");
ids.add("ems-esp"); ids.add(Mqtt::basename());
// add "availability" section // add "availability" section
Mqtt::add_avty_to_doc(stat_t, doc.as<JsonObject>()); Mqtt::add_avty_to_doc(stat_t, doc.as<JsonObject>());

View File

@@ -511,7 +511,7 @@ void TemperatureSensor::publish_values(const bool force) {
config["dev_cla"] = "temperature"; config["dev_cla"] = "temperature";
char stat_t[50]; 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["stat_t"] = stat_t;
config["unit_of_meas"] = EMSdevice::uom_to_string(DeviceValueUOM::DEGREES); 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"); JsonObject dev = config.createNestedObject("dev");
JsonArray ids = dev.createNestedArray("ids"); JsonArray ids = dev.createNestedArray("ids");
ids.add("ems-esp"); ids.add(Mqtt::basename());
// add "availability" section // add "availability" section
Mqtt::add_avty_to_doc(stat_t, config.as<JsonObject>(), val_cond); Mqtt::add_avty_to_doc(stat_t, config.as<JsonObject>(), val_cond);

View File

@@ -294,7 +294,7 @@ void WebEntityService::publish(const bool force) {
if (Mqtt::ha_enabled() && !ha_registered_) { if (Mqtt::ha_enabled() && !ha_registered_) {
StaticJsonDocument<EMSESP_JSON_SIZE_MEDIUM> config; StaticJsonDocument<EMSESP_JSON_SIZE_MEDIUM> config;
char stat_t[50]; 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; config["stat_t"] = stat_t;
char val_obj[50]; char val_obj[50];
@@ -312,13 +312,14 @@ void WebEntityService::publish(const bool force) {
char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; char topic[Mqtt::MQTT_TOPIC_MAX_SIZE];
snprintf(topic, sizeof(topic), "sensor/%s/custom_%s/config", Mqtt::basename().c_str(), entityItem.name.c_str()); 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()); // snprintf(command_topic, sizeof(command_topic), "%s/custom/%s", Mqtt::basename().c_str(), entityItem.name.c_str());
// config["cmd_t"] = command_topic; // config["cmd_t"] = command_topic;
JsonObject dev = config.createNestedObject("dev"); JsonObject dev = config.createNestedObject("dev");
JsonArray ids = dev.createNestedArray("ids"); JsonArray ids = dev.createNestedArray("ids");
ids.add("ems-esp"); ids.add(Mqtt::basename());
// add "availability" section // add "availability" section
Mqtt::add_avty_to_doc(stat_t, config.as<JsonObject>(), val_cond); Mqtt::add_avty_to_doc(stat_t, config.as<JsonObject>(), val_cond);

View File

@@ -216,8 +216,7 @@ void WebLogService::setValues(AsyncWebServerRequest * request, JsonVariant & jso
auto && body = json.as<JsonObject>(); auto && body = json.as<JsonObject>();
// TODO refactor into one load and one save // TODO refactor into one load and one save method
uuid::log::Level level = body["level"]; uuid::log::Level level = body["level"];
log_level(level); log_level(level);

View File

@@ -237,7 +237,7 @@ void WebSchedulerService::publish(const bool force) {
if (Mqtt::ha_enabled() && force) { if (Mqtt::ha_enabled() && force) {
StaticJsonDocument<EMSESP_JSON_SIZE_MEDIUM> config; StaticJsonDocument<EMSESP_JSON_SIZE_MEDIUM> config;
char stat_t[50]; 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; config["stat_t"] = stat_t;
char val_obj[50]; char val_obj[50];
@@ -272,7 +272,7 @@ void WebSchedulerService::publish(const bool force) {
JsonObject dev = config.createNestedObject("dev"); JsonObject dev = config.createNestedObject("dev");
JsonArray ids = dev.createNestedArray("ids"); JsonArray ids = dev.createNestedArray("ids");
ids.add("ems-esp"); ids.add(Mqtt::basename());
// add "availability" section // add "availability" section
Mqtt::add_avty_to_doc(stat_t, config.as<JsonObject>(), val_cond); Mqtt::add_avty_to_doc(stat_t, config.as<JsonObject>(), val_cond);