This commit is contained in:
MichaelDvP
2022-12-17 11:14:53 +01:00
20 changed files with 92 additions and 76 deletions

View File

@@ -5,7 +5,7 @@
## **IMPORTANT! BREAKING CHANGES** ## **IMPORTANT! BREAKING CHANGES**
- When upgrading to v3.5 for the first time from v3.4 on a BBQKees Gateway board you will need to use the [EMS-EPS Flasher](https://github.com/emsesp/EMS-ESP-Flasher/releases) to correctly re-partition the flash. Make sure you backup the settings and customizations from the WebUI (System->Upload/Download) and restore after the upgrade. - When upgrading to v3.5 for the first time from v3.4 on a BBQKees Gateway board you will need to use the [EMS-EPS Flasher](https://github.com/emsesp/EMS-ESP-Flasher/releases) to correctly re-partition the flash. Make sure you backup the settings and customizations from the WebUI (System->Upload/Download) and restore after the upgrade.
- Since 3.5.0b11 we have added support for multiple EMS-ESPs [#759] and also renamed the HA Entity IDs. For example what was previously `sensor.boiler_actual_boiler_temperature` is now using the shortname form `sensor.boiler_boiltemp` as opposed to the English description. Unfortunately this does means any HA dashboards, automation scripts and integrations (e.g. Grafana) need to be adjusted accordingly. - Support for multiple EMS-ESPs [#759] has been added as an optional setting for MQTT. When enabled, which is now the default, all MQTT Discovery Entity IDs will include the MQTT base name and the shortname of the EMS-ESP device entity. For example what was previously `sensor.boiler_actual_boiler_temperature` will now become `sensor.ems_esp_boiler_boiltemp`. If you still want to use the old format and retain the history and script compatibility in Home Assistant then set this back to the old format.
## Added ## Added

View File

@@ -15,7 +15,7 @@
"@mui/material": "^5.11.0", "@mui/material": "^5.11.0",
"@table-library/react-table-library": "4.0.23", "@table-library/react-table-library": "4.0.23",
"@types/lodash": "^4.14.191", "@types/lodash": "^4.14.191",
"@types/node": "^18.11.15", "@types/node": "^18.11.16",
"@types/react": "^18.0.26", "@types/react": "^18.0.26",
"@types/react-dom": "^18.0.9", "@types/react-dom": "^18.0.9",
"@types/react-router-dom": "^5.3.3", "@types/react-router-dom": "^5.3.3",
@@ -31,7 +31,7 @@
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-dropzone": "^14.2.3", "react-dropzone": "^14.2.3",
"react-icons": "^4.7.1", "react-icons": "^4.7.1",
"react-router-dom": "^6.4.5", "react-router-dom": "^6.5.0",
"react-scripts": "5.0.1", "react-scripts": "5.0.1",
"sockette": "^2.0.6", "sockette": "^2.0.6",
"typesafe-i18n": "^5.17.1", "typesafe-i18n": "^5.17.1",
@@ -3458,9 +3458,9 @@
} }
}, },
"node_modules/@remix-run/router": { "node_modules/@remix-run/router": {
"version": "1.0.5", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.0.5.tgz", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.1.0.tgz",
"integrity": "sha512-my0Mycd+jruq/1lQuO5LBB6WTlL/e8DTCYWp44DfMTDcXz8DcTlgF0ISaLsGewt+ctHN+yA8xMq3q/N7uWJPug==", "integrity": "sha512-rGl+jH/7x1KBCQScz9p54p0dtPLNeKGb3e0wD2H5/oZj41bwQUnXdzbj2TbUAFhvD7cp9EyEQA4dEgpUFa1O7Q==",
"engines": { "engines": {
"node": ">=14" "node": ">=14"
} }
@@ -4017,9 +4017,9 @@
"integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA=="
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "18.11.15", "version": "18.11.16",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.15.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.16.tgz",
"integrity": "sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw==" "integrity": "sha512-6T7P5bDkRhqRxrQtwj7vru+bWTpelgtcETAZEUSdq0YISKz8WKdoBukQLYQQ6DFHvU9JRsbFq0JH5C51X2ZdnA=="
}, },
"node_modules/@types/parse-json": { "node_modules/@types/parse-json": {
"version": "4.0.0", "version": "4.0.0",
@@ -14561,11 +14561,11 @@
} }
}, },
"node_modules/react-router": { "node_modules/react-router": {
"version": "6.4.5", "version": "6.5.0",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.4.5.tgz", "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.5.0.tgz",
"integrity": "sha512-1RQJ8bM70YEumHIlNUYc6mFfUDoWa5EgPDenK/fq0bxD8DYpQUi/S6Zoft+9DBrh2xmtg92N5HMAJgGWDhKJ5Q==", "integrity": "sha512-fqqUSU0NC0tSX0sZbyuxzuAzvGqbjiZItBQnyicWlOUmzhAU8YuLgRbaCL2hf3sJdtRy4LP/WBrWtARkMvdGPQ==",
"dependencies": { "dependencies": {
"@remix-run/router": "1.0.5" "@remix-run/router": "1.1.0"
}, },
"engines": { "engines": {
"node": ">=14" "node": ">=14"
@@ -14575,12 +14575,12 @@
} }
}, },
"node_modules/react-router-dom": { "node_modules/react-router-dom": {
"version": "6.4.5", "version": "6.5.0",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.4.5.tgz", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.5.0.tgz",
"integrity": "sha512-a7HsgikBR0wNfroBHcZUCd9+mLRqZS8R5U1Z1mzLWxFXEkUT3vR1XXmSIVoVpxVX8Bar0nQYYYc9Yipq8dWwAA==", "integrity": "sha512-/XzRc5fq80gW1ctiIGilyKFZC/j4kfe75uivMsTChFbkvrK4ZrF3P3cGIc1f/SSkQ4JiJozPrf+AwUHHWVehVg==",
"dependencies": { "dependencies": {
"@remix-run/router": "1.0.5", "@remix-run/router": "1.1.0",
"react-router": "6.4.5" "react-router": "6.5.0"
}, },
"engines": { "engines": {
"node": ">=14" "node": ">=14"
@@ -19818,9 +19818,9 @@
"integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw=="
}, },
"@remix-run/router": { "@remix-run/router": {
"version": "1.0.5", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.0.5.tgz", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.1.0.tgz",
"integrity": "sha512-my0Mycd+jruq/1lQuO5LBB6WTlL/e8DTCYWp44DfMTDcXz8DcTlgF0ISaLsGewt+ctHN+yA8xMq3q/N7uWJPug==" "integrity": "sha512-rGl+jH/7x1KBCQScz9p54p0dtPLNeKGb3e0wD2H5/oZj41bwQUnXdzbj2TbUAFhvD7cp9EyEQA4dEgpUFa1O7Q=="
}, },
"@rollup/plugin-babel": { "@rollup/plugin-babel": {
"version": "5.3.1", "version": "5.3.1",
@@ -20232,9 +20232,9 @@
"integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA=="
}, },
"@types/node": { "@types/node": {
"version": "18.11.15", "version": "18.11.16",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.15.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.16.tgz",
"integrity": "sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw==" "integrity": "sha512-6T7P5bDkRhqRxrQtwj7vru+bWTpelgtcETAZEUSdq0YISKz8WKdoBukQLYQQ6DFHvU9JRsbFq0JH5C51X2ZdnA=="
}, },
"@types/parse-json": { "@types/parse-json": {
"version": "4.0.0", "version": "4.0.0",
@@ -27723,20 +27723,20 @@
"integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==" "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A=="
}, },
"react-router": { "react-router": {
"version": "6.4.5", "version": "6.5.0",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.4.5.tgz", "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.5.0.tgz",
"integrity": "sha512-1RQJ8bM70YEumHIlNUYc6mFfUDoWa5EgPDenK/fq0bxD8DYpQUi/S6Zoft+9DBrh2xmtg92N5HMAJgGWDhKJ5Q==", "integrity": "sha512-fqqUSU0NC0tSX0sZbyuxzuAzvGqbjiZItBQnyicWlOUmzhAU8YuLgRbaCL2hf3sJdtRy4LP/WBrWtARkMvdGPQ==",
"requires": { "requires": {
"@remix-run/router": "1.0.5" "@remix-run/router": "1.1.0"
} }
}, },
"react-router-dom": { "react-router-dom": {
"version": "6.4.5", "version": "6.5.0",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.4.5.tgz", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.5.0.tgz",
"integrity": "sha512-a7HsgikBR0wNfroBHcZUCd9+mLRqZS8R5U1Z1mzLWxFXEkUT3vR1XXmSIVoVpxVX8Bar0nQYYYc9Yipq8dWwAA==", "integrity": "sha512-/XzRc5fq80gW1ctiIGilyKFZC/j4kfe75uivMsTChFbkvrK4ZrF3P3cGIc1f/SSkQ4JiJozPrf+AwUHHWVehVg==",
"requires": { "requires": {
"@remix-run/router": "1.0.5", "@remix-run/router": "1.1.0",
"react-router": "6.4.5" "react-router": "6.5.0"
} }
}, },
"react-scripts": { "react-scripts": {

View File

@@ -11,7 +11,7 @@
"@mui/material": "^5.11.0", "@mui/material": "^5.11.0",
"@table-library/react-table-library": "4.0.23", "@table-library/react-table-library": "4.0.23",
"@types/lodash": "^4.14.191", "@types/lodash": "^4.14.191",
"@types/node": "^18.11.15", "@types/node": "^18.11.16",
"@types/react": "^18.0.26", "@types/react": "^18.0.26",
"@types/react-dom": "^18.0.9", "@types/react-dom": "^18.0.9",
"@types/react-router-dom": "^5.3.3", "@types/react-router-dom": "^5.3.3",
@@ -27,7 +27,7 @@
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-dropzone": "^14.2.3", "react-dropzone": "^14.2.3",
"react-icons": "^4.7.1", "react-icons": "^4.7.1",
"react-router-dom": "^6.4.5", "react-router-dom": "^6.5.0",
"react-scripts": "5.0.1", "react-scripts": "5.0.1",
"sockette": "^2.0.6", "sockette": "^2.0.6",
"typesafe-i18n": "^5.17.1", "typesafe-i18n": "^5.17.1",

View File

@@ -245,8 +245,8 @@ const MqttSettingsForm: FC = () => {
margin="normal" margin="normal"
select select
> >
<MenuItem value="false">{LL.MQTT_ENTITY_FORMAT_0()}</MenuItem> <MenuItem value={false as any}>{LL.MQTT_ENTITY_FORMAT_0()}</MenuItem>
<MenuItem value="true">{LL.MQTT_ENTITY_FORMAT_1()}</MenuItem> <MenuItem value={true as any}>{LL.MQTT_ENTITY_FORMAT_1()}</MenuItem>
</ValidatedTextField> </ValidatedTextField>
</Grid> </Grid>
</Grid> </Grid>

View File

@@ -115,7 +115,7 @@ const de: Translation = {
TEMPERATURE: 'Temperatur', TEMPERATURE: 'Temperatur',
PHY_TYPE: 'Eth PHY Typ', PHY_TYPE: 'Eth PHY Typ',
DISABLED: 'deaktiviert', DISABLED: 'deaktiviert',
TX_MODE: 'Tx Mode', TX_MODE: 'Tx Modus',
HARDWARE: 'Hardware', HARDWARE: 'Hardware',
EMS_BUS: '{{BUS|EMS BUS}}', EMS_BUS: '{{BUS|EMS BUS}}',
GENERAL_OPTIONS: 'Allgemeine Optionen', GENERAL_OPTIONS: 'Allgemeine Optionen',
@@ -249,9 +249,9 @@ const de: Translation = {
MQTT_INT_HEARTBEAT: 'Heartbeat', MQTT_INT_HEARTBEAT: 'Heartbeat',
MQTT_QUEUE: 'MQTT Queue', MQTT_QUEUE: 'MQTT Queue',
DEFAULT: 'Standard', DEFAULT: 'Standard',
MQTT_ENTITY_FORMAT: 'Entity ID format', MQTT_ENTITY_FORMAT: 'Entitäts-ID Format',
MQTT_ENTITY_FORMAT_0: 'Single instance, long name', MQTT_ENTITY_FORMAT_0: 'Einzelinstanz, Langname (veraltet)',
MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name', MQTT_ENTITY_FORMAT_1: 'Mehrfachinstanzen, MQTT-Namen',
MQTT_CLEAN_SESSION: 'Setze `Clean Session`', MQTT_CLEAN_SESSION: 'Setze `Clean Session`',
MQTT_RETAIN_FLAG: 'Setze `Retain flag` immer', MQTT_RETAIN_FLAG: 'Setze `Retain flag` immer',
INACTIVE: 'Inaktiv', INACTIVE: 'Inaktiv',

View File

@@ -249,7 +249,7 @@ const en: Translation = {
MQTT_QUEUE: 'MQTT Queue', MQTT_QUEUE: 'MQTT Queue',
DEFAULT: 'Default', DEFAULT: 'Default',
MQTT_ENTITY_FORMAT: 'Entity ID format', MQTT_ENTITY_FORMAT: 'Entity ID format',
MQTT_ENTITY_FORMAT_0: 'Single instance, long name', MQTT_ENTITY_FORMAT_0: 'Single instance, long name (depreciated)',
MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name', MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name',
MQTT_CLEAN_SESSION: 'Set Clean Session', MQTT_CLEAN_SESSION: 'Set Clean Session',
MQTT_RETAIN_FLAG: 'Always set Retain flag', MQTT_RETAIN_FLAG: 'Always set Retain flag',

View File

@@ -249,7 +249,7 @@ const fr: Translation = {
MQTT_QUEUE: 'Queue MQTT', MQTT_QUEUE: 'Queue MQTT',
DEFAULT: 'Défaut', DEFAULT: 'Défaut',
MQTT_ENTITY_FORMAT: 'Entity ID format', MQTT_ENTITY_FORMAT: 'Entity ID format',
MQTT_ENTITY_FORMAT_0: 'Single instance, long name', MQTT_ENTITY_FORMAT_0: 'Single instance, long name (depreciated)',
MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name', MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name',
MQTT_CLEAN_SESSION: 'Flag Clean Session', MQTT_CLEAN_SESSION: 'Flag Clean Session',
MQTT_RETAIN_FLAG: 'Toujours activer le Retain Flag', MQTT_RETAIN_FLAG: 'Toujours activer le Retain Flag',

View File

@@ -249,7 +249,7 @@ const nl: Translation = {
MQTT_QUEUE: 'MQTT Queue', MQTT_QUEUE: 'MQTT Queue',
DEFAULT: 'Default', DEFAULT: 'Default',
MQTT_ENTITY_FORMAT: 'Entity ID format', MQTT_ENTITY_FORMAT: 'Entity ID format',
MQTT_ENTITY_FORMAT_0: 'Single instance, long name', MQTT_ENTITY_FORMAT_0: 'Single instance, long name (depreciated)',
MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name', MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name',
MQTT_CLEAN_SESSION: 'Clean Session aan', MQTT_CLEAN_SESSION: 'Clean Session aan',
MQTT_RETAIN_FLAG: 'Retain flag aan', MQTT_RETAIN_FLAG: 'Retain flag aan',

View File

@@ -249,7 +249,7 @@ const no: Translation = {
MQTT_QUEUE: 'MQTT Queue', MQTT_QUEUE: 'MQTT Queue',
DEFAULT: 'Standard', DEFAULT: 'Standard',
MQTT_ENTITY_FORMAT: 'Entity ID format', MQTT_ENTITY_FORMAT: 'Entity ID format',
MQTT_ENTITY_FORMAT_0: 'Single instance, long name', MQTT_ENTITY_FORMAT_0: 'Single instance, long name (depreciated)',
MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name', MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name',
MQTT_CLEAN_SESSION: 'Benytt Clean Session', MQTT_CLEAN_SESSION: 'Benytt Clean Session',
MQTT_RETAIN_FLAG: 'Alltid sett Retain flag', MQTT_RETAIN_FLAG: 'Alltid sett Retain flag',

View File

@@ -249,7 +249,7 @@ const pl: BaseTranslation = {
MQTT_QUEUE: 'Kolejka MQTT', MQTT_QUEUE: 'Kolejka MQTT',
DEFAULT: '{{Pozostałe|Domyślna|}}', DEFAULT: '{{Pozostałe|Domyślna|}}',
MQTT_ENTITY_FORMAT: 'Entity ID format', MQTT_ENTITY_FORMAT: 'Entity ID format',
MQTT_ENTITY_FORMAT_0: 'Single instance, long name', MQTT_ENTITY_FORMAT_0: 'Single instance, long name (depreciated)',
MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name', MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name',
MQTT_CLEAN_SESSION: 'Ustawiaj flagę "Clean session"', MQTT_CLEAN_SESSION: 'Ustawiaj flagę "Clean session"',
MQTT_RETAIN_FLAG: 'Ustawiaj flagę "Retain"', MQTT_RETAIN_FLAG: 'Ustawiaj flagę "Retain"',

View File

@@ -249,7 +249,7 @@ const se: Translation = {
MQTT_QUEUE: 'MQTT Queue', MQTT_QUEUE: 'MQTT Queue',
DEFAULT: 'Standard', DEFAULT: 'Standard',
MQTT_ENTITY_FORMAT: 'Entity ID format', MQTT_ENTITY_FORMAT: 'Entity ID format',
MQTT_ENTITY_FORMAT_0: 'Single instance, long name', MQTT_ENTITY_FORMAT_0: 'Single instance, long name (depreciated)',
MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name', MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name',
MQTT_CLEAN_SESSION: 'Använd "Clean Session"-flaggan', MQTT_CLEAN_SESSION: 'Använd "Clean Session"-flaggan',
MQTT_RETAIN_FLAG: 'Använd "Always Retain"-flaggan', MQTT_RETAIN_FLAG: 'Använd "Always Retain"-flaggan',

View File

@@ -223,6 +223,10 @@ StateUpdateResult MqttSettings::update(JsonObject & root, MqttSettings & setting
changed = true; changed = true;
} }
if (newSettings.multiple_instances != settings.multiple_instances) {
changed = true;
}
// if both settings are stored from older version, HA has priority // if both settings are stored from older version, HA has priority
if (newSettings.ha_enabled && newSettings.publish_single) { if (newSettings.ha_enabled && newSettings.publish_single) {
newSettings.publish_single = false; newSettings.publish_single = false;
@@ -258,44 +262,38 @@ StateUpdateResult MqttSettings::update(JsonObject & root, MqttSettings & setting
if (newSettings.publish_time_boiler != settings.publish_time_boiler) { if (newSettings.publish_time_boiler != settings.publish_time_boiler) {
emsesp::EMSESP::mqtt_.set_publish_time_boiler(newSettings.publish_time_boiler); emsesp::EMSESP::mqtt_.set_publish_time_boiler(newSettings.publish_time_boiler);
changed = true;
} }
if (newSettings.publish_time_thermostat != settings.publish_time_thermostat) { if (newSettings.publish_time_thermostat != settings.publish_time_thermostat) {
emsesp::EMSESP::mqtt_.set_publish_time_thermostat(newSettings.publish_time_thermostat); emsesp::EMSESP::mqtt_.set_publish_time_thermostat(newSettings.publish_time_thermostat);
changed = true;
} }
if (newSettings.publish_time_solar != settings.publish_time_solar) { if (newSettings.publish_time_solar != settings.publish_time_solar) {
emsesp::EMSESP::mqtt_.set_publish_time_solar(newSettings.publish_time_solar); emsesp::EMSESP::mqtt_.set_publish_time_solar(newSettings.publish_time_solar);
changed = true;
} }
if (newSettings.publish_time_mixer != settings.publish_time_mixer) { if (newSettings.publish_time_mixer != settings.publish_time_mixer) {
emsesp::EMSESP::mqtt_.set_publish_time_mixer(newSettings.publish_time_mixer); emsesp::EMSESP::mqtt_.set_publish_time_mixer(newSettings.publish_time_mixer);
changed = true;
} }
if (newSettings.publish_time_other != settings.publish_time_other) { if (newSettings.publish_time_other != settings.publish_time_other) {
emsesp::EMSESP::mqtt_.set_publish_time_other(newSettings.publish_time_other); emsesp::EMSESP::mqtt_.set_publish_time_other(newSettings.publish_time_other);
changed = true;
} }
if (newSettings.publish_time_sensor != settings.publish_time_sensor) { if (newSettings.publish_time_sensor != settings.publish_time_sensor) {
emsesp::EMSESP::mqtt_.set_publish_time_sensor(newSettings.publish_time_sensor); emsesp::EMSESP::mqtt_.set_publish_time_sensor(newSettings.publish_time_sensor);
changed = true;
} }
if (newSettings.publish_time_heartbeat != settings.publish_time_heartbeat) { if (newSettings.publish_time_heartbeat != settings.publish_time_heartbeat) {
emsesp::EMSESP::mqtt_.set_publish_time_heartbeat(newSettings.publish_time_heartbeat); emsesp::EMSESP::mqtt_.set_publish_time_heartbeat(newSettings.publish_time_heartbeat);
changed = true;
} }
// save the new settings
settings = newSettings;
if (changed) { if (changed) {
emsesp::EMSESP::mqtt_.reset_mqtt(); emsesp::EMSESP::mqtt_.reset_mqtt();
} }
settings = newSettings;
return StateUpdateResult::CHANGED; return StateUpdateResult::CHANGED;
} }

View File

@@ -451,14 +451,15 @@ void AnalogSensor::publish_values(const bool force) {
} }
config["val_tpl"] = str; config["val_tpl"] = str;
char uniq_s[70];
if (Mqtt::multiple_instances()) { if (Mqtt::multiple_instances()) {
snprintf(str, sizeof(str), "%s_analogsensor_%d", Mqtt::basename().c_str(), sensor.gpio()); snprintf(uniq_s, sizeof(uniq_s), "%s_analogsensor_%d", Mqtt::basename().c_str(), sensor.gpio());
} else { } else {
snprintf(str, sizeof(str), "analogsensor_%d", sensor.gpio()); snprintf(uniq_s, sizeof(uniq_s), "analogsensor_%d", sensor.gpio());
} }
config["object_id"] = str; config["object_id"] = uniq_s;
config["uniq_id"] = str; // same as object_id config["uniq_id"] = uniq_s; // same as object_id
snprintf(str, sizeof(str), "%s", sensor.name().c_str()); snprintf(str, sizeof(str), "%s", sensor.name().c_str());
config["name"] = str; config["name"] = str;

View File

@@ -518,14 +518,15 @@ void DallasSensor::publish_values(const bool force) {
} }
config["val_tpl"] = str; config["val_tpl"] = str;
char uniq_s[70];
if (Mqtt::multiple_instances()) { if (Mqtt::multiple_instances()) {
snprintf(str, sizeof(str), "%s_dallassensor_%s", Mqtt::basename().c_str(), sensor.id().c_str()); snprintf(uniq_s, sizeof(uniq_s), "%s_dallassensor_%s", Mqtt::basename().c_str(), sensor.id().c_str());
} else { } else {
snprintf(str, sizeof(str), "dallassensor_%s", sensor.id().c_str()); snprintf(uniq_s, sizeof(uniq_s), "dallassensor_%s", sensor.id().c_str());
} }
config["object_id"] = str; config["object_id"] = uniq_s;
config["uniq_id"] = str; // same as object_id config["uniq_id"] = uniq_s; // same as object_id
snprintf(str, sizeof(str), "%s", sensor.name().c_str()); snprintf(str, sizeof(str), "%s", sensor.name().c_str());
config["name"] = str; config["name"] = str;

View File

@@ -678,6 +678,10 @@ std::string Helpers::toUpper(std::string const & s) {
// replace char in char string // replace char in char string
void Helpers::replace_char(char * str, char find, char replace) { void Helpers::replace_char(char * str, char find, char replace) {
if (str == nullptr) {
return;
}
int i = 0; int i = 0;
while (str[i] != '\0') { while (str[i] != '\0') {

View File

@@ -225,7 +225,7 @@ MAKE_PSTR(tag_boiler_data_ww_mqtt, "ww")
MAKE_PSTR(tag_device_data_ww_mqtt, "") MAKE_PSTR(tag_device_data_ww_mqtt, "")
// Home Assistant - this is special and has no translations // Home Assistant - this is special and has no translations
MAKE_PSTR_LIST(climate, "HA climate config creation") MAKE_PSTR_LIST(climate, "")
// syslog // syslog
MAKE_PSTR_LIST(list_syslog_level, "off", "emerg", "alert", "crit", "error", "warn", "notice", "info", "debug", "trace", "all") MAKE_PSTR_LIST(list_syslog_level, "off", "emerg", "alert", "crit", "error", "warn", "notice", "info", "debug", "trace", "all")

View File

@@ -974,7 +974,7 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev
const int16_t dv_set_max, const int16_t dv_set_max,
const JsonObject & dev_json) { const JsonObject & dev_json) {
// ignore if name (fullname) is empty // ignore if name (fullname) is empty
if (!fullname) { if (!fullname || !en_name) {
return; return;
} }
@@ -989,14 +989,22 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev
snprintf(entity_with_tag, sizeof(entity_with_tag), "%s", entity); snprintf(entity_with_tag, sizeof(entity_with_tag), "%s", entity);
} }
// build unique identifier which will be used in the topic, also used as object_id // build unique identifier also used as object_id and becomes the Entity ID in HA
char uniq_id[70]; char uniq_id[70];
if (Mqtt::multiple_instances()) { if (Mqtt::multiple_instances()) {
// prefix base name to each uniq_id and use the shortname // prefix base name to each uniq_id and use the shortname
snprintf(uniq_id, sizeof(uniq_id), "%s_%s_%s", mqtt_basename_.c_str(), device_name, entity_with_tag); snprintf(uniq_id, sizeof(uniq_id), "%s_%s_%s", mqtt_basename_.c_str(), device_name, entity_with_tag);
} else { } else {
// old v3.4 style // old v3.4 style
snprintf(uniq_id, sizeof(uniq_id), "%s_%s", device_name, en_name); // take en_name and replace all spaces and lowercase it
char uniq_s[40];
strlcpy(uniq_s, en_name, sizeof(uniq_s));
Helpers::replace_char(uniq_s, ' ', '_');
if (EMSdevice::tag_to_string(tag).empty()) {
snprintf(uniq_id, sizeof(uniq_id), "%s_%s", device_name, Helpers::toLower(uniq_s).c_str());
} else {
snprintf(uniq_id, sizeof(uniq_id), "%s_%s_%s", device_name, EMSdevice::tag_to_string(tag).c_str(), Helpers::toLower(uniq_s).c_str());
}
} }
// build a config topic that will be prefix onto a HA type (e.g. number, switch) // build a config topic that will be prefix onto a HA type (e.g. number, switch)

View File

@@ -155,7 +155,11 @@ void Shower::set_shower_state(bool state, bool force) {
doc["name"] = "Shower Active"; doc["name"] = "Shower Active";
char str[70]; char str[70];
snprintf(str, sizeof(str), "%s_shower_active", Mqtt::basename().c_str()); if (Mqtt::multiple_instances()) {
snprintf(str, sizeof(str), "%s_shower_active", Mqtt::basename().c_str());
} else {
snprintf(str, sizeof(str), "shower_active"); // v3.4 compatible
}
doc["uniq_id"] = str; doc["uniq_id"] = str;
doc["object_id"] = str; doc["object_id"] = str;

View File

@@ -1059,11 +1059,11 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp
JsonObject node; JsonObject node;
// System // System
node = output.createNestedObject("System Info"); node = output.createNestedObject("System Info");
node["version"] = EMSESP_APP_VERSION; node["version"] = EMSESP_APP_VERSION;
node["platform"] = EMSESP_PLATFORM; node["platform"] = EMSESP_PLATFORM;
node["uptime"] = uuid::log::format_timestamp_ms(uuid::get_uptime_ms(), 3); node["uptime"] = uuid::log::format_timestamp_ms(uuid::get_uptime_ms(), 3);
// node["uptime (seconds)"] = uuid::get_uptime_sec(); node["uptime (seconds)"] = uuid::get_uptime_sec();
#ifndef EMSESP_STANDALONE #ifndef EMSESP_STANDALONE
node["free mem"] = ESP.getFreeHeap() / 1024; // kilobytes node["free mem"] = ESP.getFreeHeap() / 1024; // kilobytes
node["max alloc"] = ESP.getMaxAllocHeap() / 1024; // kilobytes node["max alloc"] = ESP.getMaxAllocHeap() / 1024; // kilobytes

View File

@@ -30,12 +30,12 @@ namespace emsesp {
// #define EMSESP_DEBUG_DEFAULT "solar" // #define EMSESP_DEBUG_DEFAULT "solar"
// #define EMSESP_DEBUG_DEFAULT "mixer" // #define EMSESP_DEBUG_DEFAULT "mixer"
// #define EMSESP_DEBUG_DEFAULT "web" // #define EMSESP_DEBUG_DEFAULT "web"
#define EMSESP_DEBUG_DEFAULT "mqtt" // #define EMSESP_DEBUG_DEFAULT "mqtt"
// #define EMSESP_DEBUG_DEFAULT "general" // #define EMSESP_DEBUG_DEFAULT "general"
// #define EMSESP_DEBUG_DEFAULT "boiler" // #define EMSESP_DEBUG_DEFAULT "boiler"
// #define EMSESP_DEBUG_DEFAULT "mqtt2" // #define EMSESP_DEBUG_DEFAULT "mqtt2"
// #define EMSESP_DEBUG_DEFAULT "mqtt_nested" // #define EMSESP_DEBUG_DEFAULT "mqtt_nested"
// #define EMSESP_DEBUG_DEFAULT "ha" #define EMSESP_DEBUG_DEFAULT "ha"
// #define EMSESP_DEBUG_DEFAULT "masked" // #define EMSESP_DEBUG_DEFAULT "masked"
// #define EMSESP_DEBUG_DEFAULT "board_profile" // #define EMSESP_DEBUG_DEFAULT "board_profile"
// #define EMSESP_DEBUG_DEFAULT "shower_alert" // #define EMSESP_DEBUG_DEFAULT "shower_alert"