diff --git a/interface/package-lock.json b/interface/package-lock.json index 7a3848553..104a0b285 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -8,8 +8,8 @@ "name": "EMS-ESP", "version": "3.4.0", "dependencies": { - "@emotion/react": "^11.7.1", - "@emotion/styled": "^11.6.0", + "@emotion/react": "^11.8.1", + "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.4.2", "@mui/material": "^5.4.2", @@ -1857,9 +1857,9 @@ "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, "node_modules/@emotion/is-prop-valid": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.1.tgz", - "integrity": "sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.2.tgz", + "integrity": "sha512-3QnhqeL+WW88YjYbQL5gUIkthuMw7a0NGbZ7wfFVk2kg/CK5w8w5FFa0RzWjyY1+sujN0NWbtSHH6OJmWHtJpQ==", "dependencies": { "@emotion/memoize": "^0.7.4" } @@ -1870,15 +1870,16 @@ "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" }, "node_modules/@emotion/react": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.7.1.tgz", - "integrity": "sha512-DV2Xe3yhkF1yT4uAUoJcYL1AmrnO5SVsdfvu+fBuS7IbByDeTVx9+wFmvx9Idzv7/78+9Mgx2Hcmr7Fex3tIyw==", + "version": "11.8.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.8.1.tgz", + "integrity": "sha512-XGaie4nRxmtP1BZYBXqC5JGqMYF2KRKKI7vjqNvQxyRpekVAZhb6QqrElmZCAYXH1L90lAelADSVZC4PFsrJ8Q==", "dependencies": { "@babel/runtime": "^7.13.10", + "@emotion/babel-plugin": "^11.7.1", "@emotion/cache": "^11.7.1", "@emotion/serialize": "^1.0.2", "@emotion/sheet": "^1.1.0", - "@emotion/utils": "^1.0.0", + "@emotion/utils": "^1.1.0", "@emotion/weak-memoize": "^0.2.5", "hoist-non-react-statics": "^3.3.1" }, @@ -1913,15 +1914,15 @@ "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" }, "node_modules/@emotion/styled": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.6.0.tgz", - "integrity": "sha512-mxVtVyIOTmCAkFbwIp+nCjTXJNgcz4VWkOYQro87jE2QBTydnkiYusMrRGFtzuruiGK4dDaNORk4gH049iiQuw==", + "version": "11.8.1", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.8.1.tgz", + "integrity": "sha512-OghEVAYBZMpEquHZwuelXcRjRJQOVayvbmNR0zr174NHdmMgrNkLC6TljKC5h9lZLkN5WGrdUcrKlOJ4phhoTQ==", "dependencies": { "@babel/runtime": "^7.13.10", - "@emotion/babel-plugin": "^11.3.0", - "@emotion/is-prop-valid": "^1.1.1", + "@emotion/babel-plugin": "^11.7.1", + "@emotion/is-prop-valid": "^1.1.2", "@emotion/serialize": "^1.0.2", - "@emotion/utils": "^1.0.0" + "@emotion/utils": "^1.1.0" }, "peerDependencies": { "@babel/core": "^7.0.0", @@ -1943,9 +1944,9 @@ "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, "node_modules/@emotion/utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz", - "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", + "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" }, "node_modules/@emotion/weak-memoize": { "version": "0.2.5", @@ -18714,9 +18715,9 @@ "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" }, "@emotion/is-prop-valid": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.1.tgz", - "integrity": "sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.2.tgz", + "integrity": "sha512-3QnhqeL+WW88YjYbQL5gUIkthuMw7a0NGbZ7wfFVk2kg/CK5w8w5FFa0RzWjyY1+sujN0NWbtSHH6OJmWHtJpQ==", "requires": { "@emotion/memoize": "^0.7.4" } @@ -18727,15 +18728,16 @@ "integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==" }, "@emotion/react": { - "version": "11.7.1", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.7.1.tgz", - "integrity": "sha512-DV2Xe3yhkF1yT4uAUoJcYL1AmrnO5SVsdfvu+fBuS7IbByDeTVx9+wFmvx9Idzv7/78+9Mgx2Hcmr7Fex3tIyw==", + "version": "11.8.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.8.1.tgz", + "integrity": "sha512-XGaie4nRxmtP1BZYBXqC5JGqMYF2KRKKI7vjqNvQxyRpekVAZhb6QqrElmZCAYXH1L90lAelADSVZC4PFsrJ8Q==", "requires": { "@babel/runtime": "^7.13.10", + "@emotion/babel-plugin": "^11.7.1", "@emotion/cache": "^11.7.1", "@emotion/serialize": "^1.0.2", "@emotion/sheet": "^1.1.0", - "@emotion/utils": "^1.0.0", + "@emotion/utils": "^1.1.0", "@emotion/weak-memoize": "^0.2.5", "hoist-non-react-statics": "^3.3.1" } @@ -18758,15 +18760,15 @@ "integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==" }, "@emotion/styled": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.6.0.tgz", - "integrity": "sha512-mxVtVyIOTmCAkFbwIp+nCjTXJNgcz4VWkOYQro87jE2QBTydnkiYusMrRGFtzuruiGK4dDaNORk4gH049iiQuw==", + "version": "11.8.1", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.8.1.tgz", + "integrity": "sha512-OghEVAYBZMpEquHZwuelXcRjRJQOVayvbmNR0zr174NHdmMgrNkLC6TljKC5h9lZLkN5WGrdUcrKlOJ4phhoTQ==", "requires": { "@babel/runtime": "^7.13.10", - "@emotion/babel-plugin": "^11.3.0", - "@emotion/is-prop-valid": "^1.1.1", + "@emotion/babel-plugin": "^11.7.1", + "@emotion/is-prop-valid": "^1.1.2", "@emotion/serialize": "^1.0.2", - "@emotion/utils": "^1.0.0" + "@emotion/utils": "^1.1.0" } }, "@emotion/unitless": { @@ -18775,9 +18777,9 @@ "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, "@emotion/utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz", - "integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.1.0.tgz", + "integrity": "sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==" }, "@emotion/weak-memoize": { "version": "0.2.5", diff --git a/interface/package.json b/interface/package.json index 289c93418..eb29d0402 100644 --- a/interface/package.json +++ b/interface/package.json @@ -4,8 +4,8 @@ "private": true, "proxy": "http://localhost:3080", "dependencies": { - "@emotion/react": "^11.7.1", - "@emotion/styled": "^11.6.0", + "@emotion/react": "^11.8.1", + "@emotion/styled": "^11.8.1", "@msgpack/msgpack": "^2.7.2", "@mui/icons-material": "^5.4.2", "@mui/material": "^5.4.2", diff --git a/interface/src/framework/mqtt/MqttSettingsForm.tsx b/interface/src/framework/mqtt/MqttSettingsForm.tsx index e251bbcf9..fda328a59 100644 --- a/interface/src/framework/mqtt/MqttSettingsForm.tsx +++ b/interface/src/framework/mqtt/MqttSettingsForm.tsx @@ -193,8 +193,10 @@ const MqttSettingsForm: FC = () => { {data.publish_single && ( } - label="publish to command topics (ioBroker)" + control={ + + } + label="Publish to command topics (ioBroker)" /> )} @@ -203,14 +205,14 @@ const MqttSettingsForm: FC = () => { } - label="Enable MQTT Discovery (for Home Assistant, Domoticz)" + label="Enable MQTT Discovery (Home Assistant, Domoticz)" /> {data.ha_enabled && ( { InputProps={{ startAdornment: % }} - /> diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index db80f594f..ac18865e4 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -459,15 +459,7 @@ void Thermostat::publish_ha_config_hc(std::shared_ptr()); // publish the config payload with retain flag - - /* - // enable the a special "thermostat_hc" topic to take both mode strings and floats for each of the heating circuits - std::string topic2(Mqtt::MQTT_TOPIC_MAX_SIZE, '\0'); - snprintf(&topic2[0], topic2.capacity() + 1, "thermostat_hc%d", hc_num); - Mqtt::subscribe(EMSdevice::DeviceType::THERMOSTAT, topic2, [=](const char * m) { return thermostat_ha_cmd(m, hc_num); }); - */ } // for HA specifically when receiving over MQTT in the thermostat topic @@ -679,14 +671,22 @@ void Thermostat::process_RC10Monitor(std::shared_ptr telegram) { // add the HVAC/Climate HA component for the HC void Thermostat::add_ha_climate(std::shared_ptr hc) { - if (!Mqtt::ha_enabled() || (hc->ha_climate_created())) { + if (!Mqtt::ha_enabled()) { return; } - // only if it has a valid seltemp (roomtemp is optional) - if (Helpers::hasValue(hc->selTemp)) { + // note, this doesn't account for whether any of the device values have been excluded + if (hc->ha_climate_created()) { + // see if we've lost the selTemp (roomTemp/currTemp is optional and checked in the publish_ha_config_hc() function) + if (!Helpers::hasValue(hc->selTemp)) { + char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; + snprintf(topic, sizeof(topic), "climate/%s/thermostat_hc%d/config", Mqtt::base().c_str(), hc->hc_num()); + Mqtt::publish_ha(topic); + } + } else { + // create the climate component, only once publish_ha_config_hc(hc); - hc->ha_climate_created(true); // only create it once + hc->ha_climate_created(true); } } diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 17a0f4434..8d4cd336d 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -779,7 +779,7 @@ void EMSdevice::exclude_entity(uint8_t id) { for (auto & dv : devicevalues_) { if (dv.id == id) { #if defined(EMSESP_USE_SERIAL) - Serial.print("exclude_entity() Removing state for device value: "); + Serial.print("exclude_entity() Removing Visible for device value: "); Serial.println(read_flash_string(dv.full_name).c_str()); #endif dv.remove_state(DeviceValueState::DV_VISIBLE); // this will remove from MQTT payloads and showing in web & console @@ -1225,47 +1225,36 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c return has_values; } +// remove the Home Assistant configs for each device value/entity if its not visible or active +// this is called when an MQTT publish is done via an EMS Device in emsesp.cpp::publish_device_values() +void EMSdevice::mqtt_ha_entity_config_remove() { + for (auto & dv : devicevalues_) { + if (dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) + && ((!dv.has_state(DeviceValueState::DV_VISIBLE)) || (!dv.has_state(DeviceValueState::DV_ACTIVE)))) { + Mqtt::publish_ha_sensor_config(dv, "", "", true); // delete topic (remove = true) + dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); + } + } +} + // create the Home Assistant configs for each device value / entity -// this is called when an MQTT publish is done via an EMS Device in emsesp.cpp -void EMSdevice::publish_mqtt_ha_entity_config() { - // create the main device config if not already done, per device type - bool create_device_config = !ha_config_done(); +// this is called when an MQTT publish is done via an EMS Device in emsesp.cpp::publish_device_values() +void EMSdevice::mqtt_ha_entity_config_create() { + bool create_device_config = !ha_config_done(); // do we need to create the main Discovery device config with this entity? // check the state of each of the device values + // create the discovery topic if if hasn't already been created, not a command (like reset) and is active and visible for (auto & dv : devicevalues_) { - if (dv.has_state(DeviceValueState::DV_ACTIVE)) { - // entity has an active value (it means it contains a valid value) - - if (dv.has_state(DeviceValueState::DV_VISIBLE)) { - // visible - // if the HA config topic hasn't been created it, do it now (unless its a command like reset) - if (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) && dv.type != DeviceValueType::CMD) { - Mqtt::publish_ha_sensor_config(dv, name(), brand_to_string(), false, create_device_config); - dv.add_state(DeviceValueState::DV_HA_CONFIG_CREATED); - if (create_device_config) { - create_device_config = false; - } - } - } else { - // not visible. It must be on the entity exclusion list defined in the Customizations service - // if a HA config topic was created then remove it. This entity has become 'lost' - if (dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED)) { - Mqtt::publish_ha_sensor_config(dv, name(), brand_to_string(), true, create_device_config); // remove /config - dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); - } - } - } else { - // entity does not have an active value - // if a HA config topic was created then remove it. This entity has become 'lost' - // https://github.com/emsesp/EMS-ESP32/issues/196 - if (dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED)) { - Mqtt::publish_ha_sensor_config(dv, name(), brand_to_string(), true, create_device_config); // remove /config - dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); - } + if ((!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) && dv.type != DeviceValueType::CMD) && dv.has_state(DeviceValueState::DV_ACTIVE) + && dv.has_state(DeviceValueState::DV_VISIBLE)) { + // create_device_config is only done once for the EMS device. It can added to any entity, so we take the first + Mqtt::publish_ha_sensor_config(dv, name(), brand_to_string(), false, create_device_config); + dv.add_state(DeviceValueState::DV_HA_CONFIG_CREATED); + create_device_config = false; // only create the main config once } } - ha_config_done(true); // assume we've created the config + ha_config_done(!create_device_config); } // remove all config topics in HA diff --git a/src/emsdevice.h b/src/emsdevice.h index 1ae6b8fce..721cf3010 100644 --- a/src/emsdevice.h +++ b/src/emsdevice.h @@ -245,7 +245,8 @@ class EMSdevice { void publish_value(void * value); void publish_all_values(); - void publish_mqtt_ha_entity_config(); + void mqtt_ha_entity_config_create(); + void mqtt_ha_entity_config_remove(); const std::string telegram_type_name(std::shared_ptr telegram); diff --git a/src/emsesp.cpp b/src/emsesp.cpp index 7ea820c98..4bb24c723 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -560,13 +560,18 @@ void EMSESP::publish_device_values(uint8_t device_type) { // group by device type for (const auto & emsdevice : emsdevices) { if (emsdevice && (emsdevice->device_type() == device_type)) { - // specially for HA + // specially for MQTT Discovery // we may have some RETAINED /config topics that reference fields in the data payloads that no longer exist // remove them immediately to prevent HA from complaining // we need to do this first before the data payload is published, and only done once! - if (Mqtt::ha_enabled() && emsdevice->ha_config_firstrun()) { - emsdevice->ha_config_clear(); - emsdevice->ha_config_firstrun(false); + if (Mqtt::ha_enabled()) { + if (emsdevice->ha_config_firstrun()) { + emsdevice->ha_config_clear(); + emsdevice->ha_config_firstrun(false); + } else { + // see if we need to delete and /config topics before adding the payloads + emsdevice->mqtt_ha_entity_config_remove(); + } } // if its a boiler, generate json for each group and publish it directly. not nested @@ -629,7 +634,7 @@ void EMSESP::publish_device_values(uint8_t device_type) { // we want to create the /config topic after the data payload to prevent HA from throwing up a warning if (Mqtt::ha_enabled()) { - emsdevice->publish_mqtt_ha_entity_config(); + emsdevice->mqtt_ha_entity_config_create(); } } } diff --git a/src/mqtt.cpp b/src/mqtt.cpp index a69254977..3f642dcd3 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -63,12 +63,12 @@ MAKE_PSTR(icontime, "mdi:clock-outline") // DeviceValueUOM::SECONDS MIN MAKE_PSTR(iconkb, "mdi:memory") // DeviceValueUOM::KB MAKE_PSTR(iconlmin, "mdi:water-boiler") // DeviceValueUOM::LMIN // MAKE_PSTR(iconkwh, "mdi:transmission-tower") // DeviceValueUOM::KWH & WH -MAKE_PSTR(iconua, "mdi:lightning-bolt-circle") // DeviceValueUOM::UA +MAKE_PSTR(iconua, "mdi:lightning-bolt-circle") // DeviceValueUOM::UA // MAKE_PSTR(iconbar, "mdi:gauge") // DeviceValueUOM::BAR // MAKE_PSTR(iconkw, "mdi:omega") // DeviceValueUOM::KW & W // MAKE_PSTR(icondbm, "mdi:wifi-strength-2") // DeviceValueUOM::DBM -MAKE_PSTR(iconnum, "mdi:counter") // DeviceValueUOM::NONE -MAKE_PSTR(icondevice, "mdi:home-automation") // for devices in HA +MAKE_PSTR(iconnum, "mdi:counter") // DeviceValueUOM::NONE +MAKE_PSTR(icondevice, "mdi:home-automation") // for devices in HA uuid::log::Logger Mqtt::logger_{F_(mqtt), uuid::log::Facility::DAEMON}; @@ -892,19 +892,8 @@ void Mqtt::process_queue() { mqtt_messages_.pop_front(); // remove the message from the queue } -// publish HA sensor for System using the heartbeat tag -void Mqtt::publish_system_ha_sensor_config(uint8_t type, const __FlashStringHelper * name, const __FlashStringHelper * entity, const uint8_t uom) { - StaticJsonDocument doc; - JsonObject dev_json = doc.createNestedObject("dev"); - - JsonArray ids = dev_json.createNestedArray("ids"); - ids.add("ems-esp"); - - publish_ha_sensor_config(type, DeviceValueTAG::TAG_HEARTBEAT, name, EMSdevice::DeviceType::SYSTEM, entity, uom, false, false, false, nullptr, 0, 0, 0, dev_json); -} - // create's a ha sensor config topic from a device value object -// and also takes a flag to see whether it will also create the main HA device config +// and also takes a flag (create_device_config) used to also create the main HA device config. This is only needed for one entity void Mqtt::publish_ha_sensor_config(DeviceValue & dv, const std::string & model, const std::string & brand, const bool remove, const bool create_device_config) { StaticJsonDocument dev_json; @@ -934,7 +923,6 @@ void Mqtt::publish_ha_sensor_config(DeviceValue & dv, const std::string & model, dv.short_name, dv.uom, remove, - create_device_config, dv.has_cmd, dv.options, dv.options_size, @@ -943,17 +931,27 @@ void Mqtt::publish_ha_sensor_config(DeviceValue & dv, const std::string & model, dev_json.as()); } +// publish HA sensor for System using the heartbeat tag +void Mqtt::publish_system_ha_sensor_config(uint8_t type, const __FlashStringHelper * name, const __FlashStringHelper * entity, const uint8_t uom) { + StaticJsonDocument doc; + JsonObject dev_json = doc.createNestedObject("dev"); + + JsonArray ids = dev_json.createNestedArray("ids"); + ids.add("ems-esp"); + + publish_ha_sensor_config(type, DeviceValueTAG::TAG_HEARTBEAT, name, EMSdevice::DeviceType::SYSTEM, entity, uom, false, false, nullptr, 0, 0, 0, dev_json); +} + // MQTT discovery configs // entity must match the key/value pair in the *_data topic // note: some extra string copying done here, it looks messy but does help with heap fragmentation issues -void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdevice::DeviceValueType - uint8_t tag, // EMSdevice::DeviceValueTAG - const __FlashStringHelper * name, // fullname - const uint8_t device_type, // EMSdevice::DeviceType - const __FlashStringHelper * entity, // shortname - const uint8_t uom, // EMSdevice::DeviceValueUOM (0=NONE) - const bool remove, // true if we want to remove this topic - const bool create_device_config, // true if need to create main device config +void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdevice::DeviceValueType + uint8_t tag, // EMSdevice::DeviceValueTAG + const __FlashStringHelper * name, // fullname + const uint8_t device_type, // EMSdevice::DeviceType + const __FlashStringHelper * entity, // shortname + const uint8_t uom, // EMSdevice::DeviceValueUOM (0=NONE) + const bool remove, // true if we want to remove this topic const bool has_cmd, const __FlashStringHelper * const * options, uint8_t options_size, diff --git a/src/mqtt.h b/src/mqtt.h index 3295e4f6f..9fe8442f8 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -92,7 +92,6 @@ class Mqtt { static void publish_ha_sensor_config(DeviceValue & dv, const std::string & model, const std::string & brand, const bool remove, const bool create_device_config = false); - static void publish_ha_sensor_config(uint8_t type, uint8_t tag, const __FlashStringHelper * name, @@ -100,7 +99,6 @@ class Mqtt { const __FlashStringHelper * entity, const uint8_t uom, const bool remove, - const bool create_device_config, const bool has_cmd, const __FlashStringHelper * const * options, uint8_t options_size, diff --git a/src/test/test.cpp b/src/test/test.cpp index 5ff31d816..70d32ce92 100644 --- a/src/test/test.cpp +++ b/src/test/test.cpp @@ -496,19 +496,19 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const if (command == "ha") { shell.printfln(F("Testing HA mqtt discovery")); - // Mqtt::ha_enabled(true); - Mqtt::ha_enabled(false); + Mqtt::ha_enabled(true); + // Mqtt::ha_enabled(false); - // Mqtt::nested_format(1); // is nested - Mqtt::nested_format(2); // not nested + Mqtt::nested_format(1); // is nested + // Mqtt::nested_format(2); // not nested - // run_test("boiler"); + run_test("boiler"); run_test("thermostat"); - // run_test("solar"); - // run_test("mixer"); + run_test("solar"); + run_test("mixer"); shell.invoke_command("call system publish"); - // shell.invoke_command("show mqtt"); + shell.invoke_command("show mqtt"); // shell.invoke_command("call boiler fanwork"); // shell.invoke_command("call thermostat seltemp"); // sensor.thermostat_hc1_selected_room_temperature diff --git a/src/test/test.h b/src/test/test.h index f949b5f3b..9ca31dd36 100644 --- a/src/test/test.h +++ b/src/test/test.h @@ -35,8 +35,8 @@ namespace emsesp { // #define EMSESP_DEBUG_DEFAULT "boiler" // #define EMSESP_DEBUG_DEFAULT "mqtt2" // #define EMSESP_DEBUG_DEFAULT "mqtt_nested" -// #define EMSESP_DEBUG_DEFAULT "ha" -#define EMSESP_DEBUG_DEFAULT "exclude" +#define EMSESP_DEBUG_DEFAULT "ha" +// #define EMSESP_DEBUG_DEFAULT "exclude" // #define EMSESP_DEBUG_DEFAULT "board_profile" // #define EMSESP_DEBUG_DEFAULT "shower_alert" // #define EMSESP_DEBUG_DEFAULT "310" diff --git a/src/version.h b/src/version.h index ead90ccd1..c726fbf26 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.4.0b6" +#define EMSESP_APP_VERSION "3.4.0b7"