diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md
index 2249b9158..b585670a0 100644
--- a/CHANGELOG_LATEST.md
+++ b/CHANGELOG_LATEST.md
@@ -5,7 +5,7 @@
## **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.
-- 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
diff --git a/interface/package-lock.json b/interface/package-lock.json
index 59ff55056..6d51b4195 100644
--- a/interface/package-lock.json
+++ b/interface/package-lock.json
@@ -11,11 +11,11 @@
"@emotion/react": "^11.10.5",
"@emotion/styled": "^11.10.5",
"@msgpack/msgpack": "^2.8.0",
- "@mui/icons-material": "^5.10.16",
- "@mui/material": "^5.10.17",
+ "@mui/icons-material": "^5.11.0",
+ "@mui/material": "^5.11.0",
"@table-library/react-table-library": "4.0.23",
"@types/lodash": "^4.14.191",
- "@types/node": "^18.11.12",
+ "@types/node": "^18.11.16",
"@types/react": "^18.0.26",
"@types/react-dom": "^18.0.9",
"@types/react-router-dom": "^5.3.3",
@@ -31,7 +31,7 @@
"react-dom": "^18.2.0",
"react-dropzone": "^14.2.3",
"react-icons": "^4.7.1",
- "react-router-dom": "^6.4.5",
+ "react-router-dom": "^6.5.0",
"react-scripts": "5.0.1",
"sockette": "^2.0.6",
"typesafe-i18n": "^5.17.1",
@@ -3091,14 +3091,14 @@
}
},
"node_modules/@mui/base": {
- "version": "5.0.0-alpha.109",
- "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.109.tgz",
- "integrity": "sha512-UQxoONPI3ntzxcD/cbFHl+Lp2xsVj6HpKmU9QhUZ2kZ2K2yej2QJyU1gnADoWl/Hu94VrvwSSRnjTjR3HvXO/g==",
+ "version": "5.0.0-alpha.110",
+ "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.110.tgz",
+ "integrity": "sha512-q4TH9T3sTBknTXXTEf2zO8F3nbHg5iGgiaRx9XErTbXvHrmLrQXbQ4hmrLERocSTBFCFWkKyne/qZj0diWlPtA==",
"dependencies": {
- "@babel/runtime": "^7.20.1",
+ "@babel/runtime": "^7.20.6",
"@emotion/is-prop-valid": "^1.2.0",
- "@mui/types": "^7.2.2",
- "@mui/utils": "^5.10.16",
+ "@mui/types": "^7.2.3",
+ "@mui/utils": "^5.11.0",
"@popperjs/core": "^2.11.6",
"clsx": "^1.2.1",
"prop-types": "^15.8.1",
@@ -3123,20 +3123,20 @@
}
},
"node_modules/@mui/core-downloads-tracker": {
- "version": "5.10.17",
- "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.10.17.tgz",
- "integrity": "sha512-iNwUuMA30nrN0tiEkeD3zaczv7Tk2jlZIDbXRnijAsYXkZtl/xEzQsVRIPYRDuyEz6D18vQJhV8h7gPUXEubTg==",
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.11.0.tgz",
+ "integrity": "sha512-Bmogung451ezVv2YI1RvweOIVsTj2RQ4Fk61+e/+8LFPLTFEwVGbL0YhNy1VB5tri8pzGNV228kxtWVTFooQkg==",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/mui"
}
},
"node_modules/@mui/icons-material": {
- "version": "5.10.16",
- "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.10.16.tgz",
- "integrity": "sha512-jjCc0IF6iyLiucQCu5igg3fOscSqbbvRCmyRxXgzOcLR56B0sg2L8o+ZfJ0dAg59+wvgtXaxvjze/mJg0B4iWA==",
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.11.0.tgz",
+ "integrity": "sha512-I2LaOKqO8a0xcLGtIozC9xoXjZAto5G5gh0FYUMAlbsIHNHIjn4Xrw9rvjY20vZonyiGrZNMAlAXYkY6JvhF6A==",
"dependencies": {
- "@babel/runtime": "^7.20.1"
+ "@babel/runtime": "^7.20.6"
},
"engines": {
"node": ">=12.0.0"
@@ -3157,16 +3157,16 @@
}
},
"node_modules/@mui/material": {
- "version": "5.10.17",
- "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.10.17.tgz",
- "integrity": "sha512-Kuqgv1qI5HXnc/Xu426xhCGYBSKzplb+xFNLitbnIb92Qx8jmcpfNpFlDJa2kD2H6qP66rr/m4c/zMUfGX/xBQ==",
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.11.0.tgz",
+ "integrity": "sha512-8Zl34lb89rLKTTi50Kakki675/LLHMKKnkp8Ee3rAZ2qmisQlRODsGh1MBjENKp0vwhQnNSvlsCfJteVTfotPQ==",
"dependencies": {
- "@babel/runtime": "^7.20.1",
- "@mui/base": "5.0.0-alpha.109",
- "@mui/core-downloads-tracker": "^5.10.17",
- "@mui/system": "^5.10.17",
- "@mui/types": "^7.2.2",
- "@mui/utils": "^5.10.16",
+ "@babel/runtime": "^7.20.6",
+ "@mui/base": "5.0.0-alpha.110",
+ "@mui/core-downloads-tracker": "^5.11.0",
+ "@mui/system": "^5.11.0",
+ "@mui/types": "^7.2.3",
+ "@mui/utils": "^5.11.0",
"@types/react-transition-group": "^4.4.5",
"clsx": "^1.2.1",
"csstype": "^3.1.1",
@@ -3201,12 +3201,12 @@
}
},
"node_modules/@mui/private-theming": {
- "version": "5.10.16",
- "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.10.16.tgz",
- "integrity": "sha512-0MArkJaOHRCKqL/GWjngGZmyOeRz+uxffhx82bKcewr8swqV7xx7EFP02pk0L/gLdfcvYdqwH4YTVjG/+TaKrg==",
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.11.0.tgz",
+ "integrity": "sha512-UFQLb9x5Sj4pg2GhhCGw3Ls/y1Hw/tz9RsBrULvUF0Vgps1z19o7XTq2xqUvp7pN7fJTW7eVIT2gwVg2xlk8PQ==",
"dependencies": {
- "@babel/runtime": "^7.20.1",
- "@mui/utils": "^5.10.16",
+ "@babel/runtime": "^7.20.6",
+ "@mui/utils": "^5.11.0",
"prop-types": "^15.8.1"
},
"engines": {
@@ -3227,11 +3227,11 @@
}
},
"node_modules/@mui/styled-engine": {
- "version": "5.10.16",
- "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.10.16.tgz",
- "integrity": "sha512-ZMSjXvtiGwGDKqrSlXhpxK2voUaF2/lpC/pSTfFmZvKH9j9a9h1/iwo3ybgjFVYGgbfNeW4h0xEchiRohu9xsw==",
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.11.0.tgz",
+ "integrity": "sha512-AF06K60Zc58qf0f7X+Y/QjaHaZq16znliLnGc9iVrV/+s8Ln/FCoeNuFvhlCbZZQ5WQcJvcy59zp0nXrklGGPQ==",
"dependencies": {
- "@babel/runtime": "^7.20.1",
+ "@babel/runtime": "^7.20.6",
"@emotion/cache": "^11.10.5",
"csstype": "^3.1.1",
"prop-types": "^15.8.1"
@@ -3258,15 +3258,15 @@
}
},
"node_modules/@mui/system": {
- "version": "5.10.17",
- "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.10.17.tgz",
- "integrity": "sha512-UYzAOSK7uxkMsUssqrIUW3lnOuQpU8vqh4hLwfSw+GYAnQo3qjK4m4NhlDx+pFpsjjiGnr3K+vrSH+aIAMbcLg==",
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.11.0.tgz",
+ "integrity": "sha512-HFUT7Dlmyq6Wfuxsw8QBXZxXDYIQQaJ4YHaZd7s+nDMcjerLnILxjh2g3a6umtOUM+jEcRaFJAtvLZvlGfa5fw==",
"dependencies": {
- "@babel/runtime": "^7.20.1",
- "@mui/private-theming": "^5.10.16",
- "@mui/styled-engine": "^5.10.16",
- "@mui/types": "^7.2.2",
- "@mui/utils": "^5.10.16",
+ "@babel/runtime": "^7.20.6",
+ "@mui/private-theming": "^5.11.0",
+ "@mui/styled-engine": "^5.11.0",
+ "@mui/types": "^7.2.3",
+ "@mui/utils": "^5.11.0",
"clsx": "^1.2.1",
"csstype": "^3.1.1",
"prop-types": "^15.8.1"
@@ -3297,9 +3297,9 @@
}
},
"node_modules/@mui/types": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.2.tgz",
- "integrity": "sha512-siex8cZDtWeC916cXOoUOnEQQejuMYmHtc4hM6VkKVYaBICz3VIiqyiAomRboTQHt2jchxQ5Q5ATlbcDekTxDA==",
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.3.tgz",
+ "integrity": "sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw==",
"peerDependencies": {
"@types/react": "*"
},
@@ -3310,11 +3310,11 @@
}
},
"node_modules/@mui/utils": {
- "version": "5.10.16",
- "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.10.16.tgz",
- "integrity": "sha512-3MB/SGsgiiu9Z55CFmAfiONUoR7AAue/H4F6w3mc2LnhFQCsoVvXhioDPcsiRpUMIQr34jDPzGXdCuqWooPCXQ==",
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.11.0.tgz",
+ "integrity": "sha512-DP/YDaVVCVzJpZ5FFPLKNmaJkeaYRviTyIZkL/D5/FmPXQiA6ecd6z0/+VwoNQtp7aXAQWaRhvz4FM25yqFlHA==",
"dependencies": {
- "@babel/runtime": "^7.20.1",
+ "@babel/runtime": "^7.20.6",
"@types/prop-types": "^15.7.5",
"@types/react-is": "^16.7.1 || ^17.0.0",
"prop-types": "^15.8.1",
@@ -3458,9 +3458,9 @@
}
},
"node_modules/@remix-run/router": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.0.5.tgz",
- "integrity": "sha512-my0Mycd+jruq/1lQuO5LBB6WTlL/e8DTCYWp44DfMTDcXz8DcTlgF0ISaLsGewt+ctHN+yA8xMq3q/N7uWJPug==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.1.0.tgz",
+ "integrity": "sha512-rGl+jH/7x1KBCQScz9p54p0dtPLNeKGb3e0wD2H5/oZj41bwQUnXdzbj2TbUAFhvD7cp9EyEQA4dEgpUFa1O7Q==",
"engines": {
"node": ">=14"
}
@@ -4017,9 +4017,9 @@
"integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA=="
},
"node_modules/@types/node": {
- "version": "18.11.12",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.12.tgz",
- "integrity": "sha512-FgD3NtTAKvyMmD44T07zz2fEf+OKwutgBCEVM8GcvMGVGaDktiLNTDvPwC/LUe3PinMW+X6CuLOF2Ui1mAlSXg=="
+ "version": "18.11.16",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.16.tgz",
+ "integrity": "sha512-6T7P5bDkRhqRxrQtwj7vru+bWTpelgtcETAZEUSdq0YISKz8WKdoBukQLYQQ6DFHvU9JRsbFq0JH5C51X2ZdnA=="
},
"node_modules/@types/parse-json": {
"version": "4.0.0",
@@ -14561,11 +14561,11 @@
}
},
"node_modules/react-router": {
- "version": "6.4.5",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.4.5.tgz",
- "integrity": "sha512-1RQJ8bM70YEumHIlNUYc6mFfUDoWa5EgPDenK/fq0bxD8DYpQUi/S6Zoft+9DBrh2xmtg92N5HMAJgGWDhKJ5Q==",
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.5.0.tgz",
+ "integrity": "sha512-fqqUSU0NC0tSX0sZbyuxzuAzvGqbjiZItBQnyicWlOUmzhAU8YuLgRbaCL2hf3sJdtRy4LP/WBrWtARkMvdGPQ==",
"dependencies": {
- "@remix-run/router": "1.0.5"
+ "@remix-run/router": "1.1.0"
},
"engines": {
"node": ">=14"
@@ -14575,12 +14575,12 @@
}
},
"node_modules/react-router-dom": {
- "version": "6.4.5",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.4.5.tgz",
- "integrity": "sha512-a7HsgikBR0wNfroBHcZUCd9+mLRqZS8R5U1Z1mzLWxFXEkUT3vR1XXmSIVoVpxVX8Bar0nQYYYc9Yipq8dWwAA==",
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.5.0.tgz",
+ "integrity": "sha512-/XzRc5fq80gW1ctiIGilyKFZC/j4kfe75uivMsTChFbkvrK4ZrF3P3cGIc1f/SSkQ4JiJozPrf+AwUHHWVehVg==",
"dependencies": {
- "@remix-run/router": "1.0.5",
- "react-router": "6.4.5"
+ "@remix-run/router": "1.1.0",
+ "react-router": "6.5.0"
},
"engines": {
"node": ">=14"
@@ -19642,14 +19642,14 @@
"integrity": "sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ=="
},
"@mui/base": {
- "version": "5.0.0-alpha.109",
- "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.109.tgz",
- "integrity": "sha512-UQxoONPI3ntzxcD/cbFHl+Lp2xsVj6HpKmU9QhUZ2kZ2K2yej2QJyU1gnADoWl/Hu94VrvwSSRnjTjR3HvXO/g==",
+ "version": "5.0.0-alpha.110",
+ "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.110.tgz",
+ "integrity": "sha512-q4TH9T3sTBknTXXTEf2zO8F3nbHg5iGgiaRx9XErTbXvHrmLrQXbQ4hmrLERocSTBFCFWkKyne/qZj0diWlPtA==",
"requires": {
- "@babel/runtime": "^7.20.1",
+ "@babel/runtime": "^7.20.6",
"@emotion/is-prop-valid": "^1.2.0",
- "@mui/types": "^7.2.2",
- "@mui/utils": "^5.10.16",
+ "@mui/types": "^7.2.3",
+ "@mui/utils": "^5.11.0",
"@popperjs/core": "^2.11.6",
"clsx": "^1.2.1",
"prop-types": "^15.8.1",
@@ -19657,29 +19657,29 @@
}
},
"@mui/core-downloads-tracker": {
- "version": "5.10.17",
- "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.10.17.tgz",
- "integrity": "sha512-iNwUuMA30nrN0tiEkeD3zaczv7Tk2jlZIDbXRnijAsYXkZtl/xEzQsVRIPYRDuyEz6D18vQJhV8h7gPUXEubTg=="
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.11.0.tgz",
+ "integrity": "sha512-Bmogung451ezVv2YI1RvweOIVsTj2RQ4Fk61+e/+8LFPLTFEwVGbL0YhNy1VB5tri8pzGNV228kxtWVTFooQkg=="
},
"@mui/icons-material": {
- "version": "5.10.16",
- "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.10.16.tgz",
- "integrity": "sha512-jjCc0IF6iyLiucQCu5igg3fOscSqbbvRCmyRxXgzOcLR56B0sg2L8o+ZfJ0dAg59+wvgtXaxvjze/mJg0B4iWA==",
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.11.0.tgz",
+ "integrity": "sha512-I2LaOKqO8a0xcLGtIozC9xoXjZAto5G5gh0FYUMAlbsIHNHIjn4Xrw9rvjY20vZonyiGrZNMAlAXYkY6JvhF6A==",
"requires": {
- "@babel/runtime": "^7.20.1"
+ "@babel/runtime": "^7.20.6"
}
},
"@mui/material": {
- "version": "5.10.17",
- "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.10.17.tgz",
- "integrity": "sha512-Kuqgv1qI5HXnc/Xu426xhCGYBSKzplb+xFNLitbnIb92Qx8jmcpfNpFlDJa2kD2H6qP66rr/m4c/zMUfGX/xBQ==",
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.11.0.tgz",
+ "integrity": "sha512-8Zl34lb89rLKTTi50Kakki675/LLHMKKnkp8Ee3rAZ2qmisQlRODsGh1MBjENKp0vwhQnNSvlsCfJteVTfotPQ==",
"requires": {
- "@babel/runtime": "^7.20.1",
- "@mui/base": "5.0.0-alpha.109",
- "@mui/core-downloads-tracker": "^5.10.17",
- "@mui/system": "^5.10.17",
- "@mui/types": "^7.2.2",
- "@mui/utils": "^5.10.16",
+ "@babel/runtime": "^7.20.6",
+ "@mui/base": "5.0.0-alpha.110",
+ "@mui/core-downloads-tracker": "^5.11.0",
+ "@mui/system": "^5.11.0",
+ "@mui/types": "^7.2.3",
+ "@mui/utils": "^5.11.0",
"@types/react-transition-group": "^4.4.5",
"clsx": "^1.2.1",
"csstype": "^3.1.1",
@@ -19689,53 +19689,53 @@
}
},
"@mui/private-theming": {
- "version": "5.10.16",
- "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.10.16.tgz",
- "integrity": "sha512-0MArkJaOHRCKqL/GWjngGZmyOeRz+uxffhx82bKcewr8swqV7xx7EFP02pk0L/gLdfcvYdqwH4YTVjG/+TaKrg==",
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.11.0.tgz",
+ "integrity": "sha512-UFQLb9x5Sj4pg2GhhCGw3Ls/y1Hw/tz9RsBrULvUF0Vgps1z19o7XTq2xqUvp7pN7fJTW7eVIT2gwVg2xlk8PQ==",
"requires": {
- "@babel/runtime": "^7.20.1",
- "@mui/utils": "^5.10.16",
+ "@babel/runtime": "^7.20.6",
+ "@mui/utils": "^5.11.0",
"prop-types": "^15.8.1"
}
},
"@mui/styled-engine": {
- "version": "5.10.16",
- "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.10.16.tgz",
- "integrity": "sha512-ZMSjXvtiGwGDKqrSlXhpxK2voUaF2/lpC/pSTfFmZvKH9j9a9h1/iwo3ybgjFVYGgbfNeW4h0xEchiRohu9xsw==",
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.11.0.tgz",
+ "integrity": "sha512-AF06K60Zc58qf0f7X+Y/QjaHaZq16znliLnGc9iVrV/+s8Ln/FCoeNuFvhlCbZZQ5WQcJvcy59zp0nXrklGGPQ==",
"requires": {
- "@babel/runtime": "^7.20.1",
+ "@babel/runtime": "^7.20.6",
"@emotion/cache": "^11.10.5",
"csstype": "^3.1.1",
"prop-types": "^15.8.1"
}
},
"@mui/system": {
- "version": "5.10.17",
- "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.10.17.tgz",
- "integrity": "sha512-UYzAOSK7uxkMsUssqrIUW3lnOuQpU8vqh4hLwfSw+GYAnQo3qjK4m4NhlDx+pFpsjjiGnr3K+vrSH+aIAMbcLg==",
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.11.0.tgz",
+ "integrity": "sha512-HFUT7Dlmyq6Wfuxsw8QBXZxXDYIQQaJ4YHaZd7s+nDMcjerLnILxjh2g3a6umtOUM+jEcRaFJAtvLZvlGfa5fw==",
"requires": {
- "@babel/runtime": "^7.20.1",
- "@mui/private-theming": "^5.10.16",
- "@mui/styled-engine": "^5.10.16",
- "@mui/types": "^7.2.2",
- "@mui/utils": "^5.10.16",
+ "@babel/runtime": "^7.20.6",
+ "@mui/private-theming": "^5.11.0",
+ "@mui/styled-engine": "^5.11.0",
+ "@mui/types": "^7.2.3",
+ "@mui/utils": "^5.11.0",
"clsx": "^1.2.1",
"csstype": "^3.1.1",
"prop-types": "^15.8.1"
}
},
"@mui/types": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.2.tgz",
- "integrity": "sha512-siex8cZDtWeC916cXOoUOnEQQejuMYmHtc4hM6VkKVYaBICz3VIiqyiAomRboTQHt2jchxQ5Q5ATlbcDekTxDA==",
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.3.tgz",
+ "integrity": "sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw==",
"requires": {}
},
"@mui/utils": {
- "version": "5.10.16",
- "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.10.16.tgz",
- "integrity": "sha512-3MB/SGsgiiu9Z55CFmAfiONUoR7AAue/H4F6w3mc2LnhFQCsoVvXhioDPcsiRpUMIQr34jDPzGXdCuqWooPCXQ==",
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.11.0.tgz",
+ "integrity": "sha512-DP/YDaVVCVzJpZ5FFPLKNmaJkeaYRviTyIZkL/D5/FmPXQiA6ecd6z0/+VwoNQtp7aXAQWaRhvz4FM25yqFlHA==",
"requires": {
- "@babel/runtime": "^7.20.1",
+ "@babel/runtime": "^7.20.6",
"@types/prop-types": "^15.7.5",
"@types/react-is": "^16.7.1 || ^17.0.0",
"prop-types": "^15.8.1",
@@ -19818,9 +19818,9 @@
"integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw=="
},
"@remix-run/router": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.0.5.tgz",
- "integrity": "sha512-my0Mycd+jruq/1lQuO5LBB6WTlL/e8DTCYWp44DfMTDcXz8DcTlgF0ISaLsGewt+ctHN+yA8xMq3q/N7uWJPug=="
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.1.0.tgz",
+ "integrity": "sha512-rGl+jH/7x1KBCQScz9p54p0dtPLNeKGb3e0wD2H5/oZj41bwQUnXdzbj2TbUAFhvD7cp9EyEQA4dEgpUFa1O7Q=="
},
"@rollup/plugin-babel": {
"version": "5.3.1",
@@ -20232,9 +20232,9 @@
"integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA=="
},
"@types/node": {
- "version": "18.11.12",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.12.tgz",
- "integrity": "sha512-FgD3NtTAKvyMmD44T07zz2fEf+OKwutgBCEVM8GcvMGVGaDktiLNTDvPwC/LUe3PinMW+X6CuLOF2Ui1mAlSXg=="
+ "version": "18.11.16",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.16.tgz",
+ "integrity": "sha512-6T7P5bDkRhqRxrQtwj7vru+bWTpelgtcETAZEUSdq0YISKz8WKdoBukQLYQQ6DFHvU9JRsbFq0JH5C51X2ZdnA=="
},
"@types/parse-json": {
"version": "4.0.0",
@@ -27723,20 +27723,20 @@
"integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A=="
},
"react-router": {
- "version": "6.4.5",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.4.5.tgz",
- "integrity": "sha512-1RQJ8bM70YEumHIlNUYc6mFfUDoWa5EgPDenK/fq0bxD8DYpQUi/S6Zoft+9DBrh2xmtg92N5HMAJgGWDhKJ5Q==",
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.5.0.tgz",
+ "integrity": "sha512-fqqUSU0NC0tSX0sZbyuxzuAzvGqbjiZItBQnyicWlOUmzhAU8YuLgRbaCL2hf3sJdtRy4LP/WBrWtARkMvdGPQ==",
"requires": {
- "@remix-run/router": "1.0.5"
+ "@remix-run/router": "1.1.0"
}
},
"react-router-dom": {
- "version": "6.4.5",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.4.5.tgz",
- "integrity": "sha512-a7HsgikBR0wNfroBHcZUCd9+mLRqZS8R5U1Z1mzLWxFXEkUT3vR1XXmSIVoVpxVX8Bar0nQYYYc9Yipq8dWwAA==",
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.5.0.tgz",
+ "integrity": "sha512-/XzRc5fq80gW1ctiIGilyKFZC/j4kfe75uivMsTChFbkvrK4ZrF3P3cGIc1f/SSkQ4JiJozPrf+AwUHHWVehVg==",
"requires": {
- "@remix-run/router": "1.0.5",
- "react-router": "6.4.5"
+ "@remix-run/router": "1.1.0",
+ "react-router": "6.5.0"
}
},
"react-scripts": {
diff --git a/interface/package.json b/interface/package.json
index 4238aba64..8d95636ef 100644
--- a/interface/package.json
+++ b/interface/package.json
@@ -7,11 +7,11 @@
"@emotion/react": "^11.10.5",
"@emotion/styled": "^11.10.5",
"@msgpack/msgpack": "^2.8.0",
- "@mui/icons-material": "^5.10.16",
- "@mui/material": "^5.10.17",
+ "@mui/icons-material": "^5.11.0",
+ "@mui/material": "^5.11.0",
"@table-library/react-table-library": "4.0.23",
"@types/lodash": "^4.14.191",
- "@types/node": "^18.11.12",
+ "@types/node": "^18.11.16",
"@types/react": "^18.0.26",
"@types/react-dom": "^18.0.9",
"@types/react-router-dom": "^5.3.3",
@@ -27,7 +27,7 @@
"react-dom": "^18.2.0",
"react-dropzone": "^14.2.3",
"react-icons": "^4.7.1",
- "react-router-dom": "^6.4.5",
+ "react-router-dom": "^6.5.0",
"react-scripts": "5.0.1",
"sockette": "^2.0.6",
"typesafe-i18n": "^5.17.1",
diff --git a/interface/src/framework/mqtt/MqttSettingsForm.tsx b/interface/src/framework/mqtt/MqttSettingsForm.tsx
index 03f305508..ef78c8436 100644
--- a/interface/src/framework/mqtt/MqttSettingsForm.tsx
+++ b/interface/src/framework/mqtt/MqttSettingsForm.tsx
@@ -170,6 +170,7 @@ const MqttSettingsForm: FC = () => {
control={}
label={LL.MQTT_RETAIN_FLAG()}
/>
+
{LL.FORMATTING()}
@@ -214,41 +215,46 @@ const MqttSettingsForm: FC = () => {
}
label={LL.MQTT_PUBLISH_TEXT_3()}
/>
{data.ha_enabled && (
<>
-
-
- }
- label={LL.MQTT_MULTIPLE_INSTANCES()}
- />
-
-
-
+
+
+
+
+
+
+
+
+
+
>
)}
)}
-
+
{LL.MQTT_PUBLISH_INTERVALS()} (0=auto)
diff --git a/interface/src/i18n/de/index.ts b/interface/src/i18n/de/index.ts
index 5b55d8cb7..5ee053fca 100644
--- a/interface/src/i18n/de/index.ts
+++ b/interface/src/i18n/de/index.ts
@@ -249,7 +249,9 @@ const de: Translation = {
MQTT_INT_HEARTBEAT: 'Heartbeat',
MQTT_QUEUE: 'MQTT Queue',
DEFAULT: 'Standard',
- MQTT_MULTIPLE_INSTANCES: 'Erlaube EMS-ESP Mehrfachinstanzen',
+ MQTT_ENTITY_FORMAT: 'Entity ID format',
+ MQTT_ENTITY_FORMAT_0: 'Single instance, long name (depreciated)',
+ MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name',
MQTT_CLEAN_SESSION: 'Setze `Clean Session`',
MQTT_RETAIN_FLAG: 'Setze `Retain flag` immer',
INACTIVE: 'Inaktiv',
diff --git a/interface/src/i18n/en/index.ts b/interface/src/i18n/en/index.ts
index e28a3bd4d..95f386a5f 100644
--- a/interface/src/i18n/en/index.ts
+++ b/interface/src/i18n/en/index.ts
@@ -248,7 +248,9 @@ const en: Translation = {
MQTT_INT_HEARTBEAT: 'Heartbeat',
MQTT_QUEUE: 'MQTT Queue',
DEFAULT: 'Default',
- MQTT_MULTIPLE_INSTANCES: 'Enable Multiple Instances of EMS-ESP',
+ MQTT_ENTITY_FORMAT: 'Entity ID format',
+ MQTT_ENTITY_FORMAT_0: 'Single instance, long name (depreciated)',
+ MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name',
MQTT_CLEAN_SESSION: 'Set Clean Session',
MQTT_RETAIN_FLAG: 'Always set Retain flag',
INACTIVE: 'Inactive',
diff --git a/interface/src/i18n/fr/index.ts b/interface/src/i18n/fr/index.ts
index df1234972..8665ddb2a 100644
--- a/interface/src/i18n/fr/index.ts
+++ b/interface/src/i18n/fr/index.ts
@@ -248,7 +248,9 @@ const fr: Translation = {
MQTT_INT_HEARTBEAT: 'Battements',
MQTT_QUEUE: 'Queue MQTT',
DEFAULT: 'Défaut',
- MQTT_MULTIPLE_INSTANCES: 'Activer plusieurs instances de EMS-ESP',
+ MQTT_ENTITY_FORMAT: 'Entity ID format',
+ MQTT_ENTITY_FORMAT_0: 'Single instance, long name (depreciated)',
+ MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name',
MQTT_CLEAN_SESSION: 'Flag Clean Session',
MQTT_RETAIN_FLAG: 'Toujours activer le Retain Flag',
INACTIVE: 'Inactif',
diff --git a/interface/src/i18n/nl/index.ts b/interface/src/i18n/nl/index.ts
index 08553526f..41cfe4bae 100644
--- a/interface/src/i18n/nl/index.ts
+++ b/interface/src/i18n/nl/index.ts
@@ -248,7 +248,9 @@ const nl: Translation = {
MQTT_INT_HEARTBEAT: 'Heartbeat',
MQTT_QUEUE: 'MQTT Queue',
DEFAULT: 'Default',
- MQTT_MULTIPLE_INSTANCES: 'Enable Multiple Instances of EMS-ESP',
+ MQTT_ENTITY_FORMAT: 'Entity ID format',
+ MQTT_ENTITY_FORMAT_0: 'Single instance, long name (depreciated)',
+ MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name',
MQTT_CLEAN_SESSION: 'Clean Session aan',
MQTT_RETAIN_FLAG: 'Retain flag aan',
INACTIVE: 'Inactief',
diff --git a/interface/src/i18n/no/index.ts b/interface/src/i18n/no/index.ts
index d3474b5e6..2eaf3e2fd 100644
--- a/interface/src/i18n/no/index.ts
+++ b/interface/src/i18n/no/index.ts
@@ -248,7 +248,9 @@ const no: Translation = {
MQTT_INT_HEARTBEAT: 'Heartbeat',
MQTT_QUEUE: 'MQTT Queue',
DEFAULT: 'Standard',
- MQTT_MULTIPLE_INSTANCES: 'Enable Multiple Instances of EMS-ESP',
+ MQTT_ENTITY_FORMAT: 'Entity ID format',
+ MQTT_ENTITY_FORMAT_0: 'Single instance, long name (depreciated)',
+ MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name',
MQTT_CLEAN_SESSION: 'Benytt Clean Session',
MQTT_RETAIN_FLAG: 'Alltid sett Retain flag',
INACTIVE: 'Innaktiv',
diff --git a/interface/src/i18n/pl/index.ts b/interface/src/i18n/pl/index.ts
index dd4714de7..8e023ed85 100644
--- a/interface/src/i18n/pl/index.ts
+++ b/interface/src/i18n/pl/index.ts
@@ -248,7 +248,9 @@ const pl: BaseTranslation = {
MQTT_INT_HEARTBEAT: 'Heartbeat',
MQTT_QUEUE: 'Kolejka MQTT',
DEFAULT: '{{Pozostałe|Domyślna|}}',
- MQTT_MULTIPLE_INSTANCES: 'Enable Multiple Instances of EMS-ESP',
+ MQTT_ENTITY_FORMAT: 'Entity ID format',
+ MQTT_ENTITY_FORMAT_0: 'Single instance, long name (depreciated)',
+ MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name',
MQTT_CLEAN_SESSION: 'Ustawiaj flagę "Clean session"',
MQTT_RETAIN_FLAG: 'Ustawiaj flagę "Retain"',
INACTIVE: 'nieaktywny',
diff --git a/interface/src/i18n/se/index.ts b/interface/src/i18n/se/index.ts
index e302363dc..74a2898c2 100644
--- a/interface/src/i18n/se/index.ts
+++ b/interface/src/i18n/se/index.ts
@@ -248,7 +248,9 @@ const se: Translation = {
MQTT_INT_HEARTBEAT: 'Heartbeat',
MQTT_QUEUE: 'MQTT Queue',
DEFAULT: 'Standard',
- MQTT_MULTIPLE_INSTANCES: 'Enable Multiple Instances of EMS-ESP',
+ MQTT_ENTITY_FORMAT: 'Entity ID format',
+ MQTT_ENTITY_FORMAT_0: 'Single instance, long name (depreciated)',
+ MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name',
MQTT_CLEAN_SESSION: 'Använd "Clean Session"-flaggan',
MQTT_RETAIN_FLAG: 'Använd "Always Retain"-flaggan',
INACTIVE: 'Inaktiv',
diff --git a/lib/framework/MqttSettingsService.cpp b/lib/framework/MqttSettingsService.cpp
index 5e4c82814..a52af34f6 100644
--- a/lib/framework/MqttSettingsService.cpp
+++ b/lib/framework/MqttSettingsService.cpp
@@ -188,9 +188,8 @@ StateUpdateResult MqttSettings::update(JsonObject & root, MqttSettings & setting
newSettings.keepAlive = root["keep_alive"] | FACTORY_MQTT_KEEP_ALIVE;
newSettings.cleanSession = root["clean_session"] | FACTORY_MQTT_CLEAN_SESSION;
newSettings.multiple_instances = root["multiple_instances"] | FACTORY_MQTT_MULTIPLE_INSTANCES;
-
- newSettings.mqtt_qos = root["mqtt_qos"] | EMSESP_DEFAULT_MQTT_QOS;
- newSettings.mqtt_retain = root["mqtt_retain"] | EMSESP_DEFAULT_MQTT_RETAIN;
+ newSettings.mqtt_qos = root["mqtt_qos"] | EMSESP_DEFAULT_MQTT_QOS;
+ newSettings.mqtt_retain = root["mqtt_retain"] | EMSESP_DEFAULT_MQTT_RETAIN;
newSettings.publish_time_boiler = root["publish_time_boiler"] | EMSESP_DEFAULT_PUBLISH_TIME;
newSettings.publish_time_thermostat = root["publish_time_thermostat"] | EMSESP_DEFAULT_PUBLISH_TIME;
@@ -224,6 +223,10 @@ StateUpdateResult MqttSettings::update(JsonObject & root, MqttSettings & setting
changed = true;
}
+ if (newSettings.multiple_instances != settings.multiple_instances) {
+ changed = true;
+ }
+
// if both settings are stored from older version, HA has priority
if (newSettings.ha_enabled && newSettings.publish_single) {
newSettings.publish_single = false;
@@ -259,44 +262,38 @@ StateUpdateResult MqttSettings::update(JsonObject & root, MqttSettings & setting
if (newSettings.publish_time_boiler != settings.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) {
emsesp::EMSESP::mqtt_.set_publish_time_thermostat(newSettings.publish_time_thermostat);
- changed = true;
}
if (newSettings.publish_time_solar != settings.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) {
emsesp::EMSESP::mqtt_.set_publish_time_mixer(newSettings.publish_time_mixer);
- changed = true;
}
if (newSettings.publish_time_other != settings.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) {
emsesp::EMSESP::mqtt_.set_publish_time_sensor(newSettings.publish_time_sensor);
- changed = true;
}
if (newSettings.publish_time_heartbeat != settings.publish_time_heartbeat) {
emsesp::EMSESP::mqtt_.set_publish_time_heartbeat(newSettings.publish_time_heartbeat);
- changed = true;
}
+ // save the new settings
+ settings = newSettings;
+
if (changed) {
emsesp::EMSESP::mqtt_.reset_mqtt();
}
- settings = newSettings;
-
return StateUpdateResult::CHANGED;
}
diff --git a/lib/framework/MqttSettingsService.h b/lib/framework/MqttSettingsService.h
index 21ec908bd..cac21aa86 100644
--- a/lib/framework/MqttSettingsService.h
+++ b/lib/framework/MqttSettingsService.h
@@ -58,7 +58,7 @@ static String generateClientId() {
#endif
#ifndef FACTORY_MQTT_MULTIPLE_INSTANCES
-#define FACTORY_MQTT_MULTIPLE_INSTANCES false
+#define FACTORY_MQTT_MULTIPLE_INSTANCES true
#endif
class MqttSettings {
diff --git a/mock-api/server.js b/mock-api/server.js
index f73d04026..e2d06fef9 100644
--- a/mock-api/server.js
+++ b/mock-api/server.js
@@ -223,7 +223,7 @@ mqtt_settings = {
client_id: 'ems-esp',
keep_alive: 60,
clean_session: true,
- multiple_instances: false,
+ multiple_instances: true,
publish_time_boiler: 10,
publish_time_thermostat: 10,
publish_time_solar: 10,
diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp
index ffb02bb7c..da7c350f3 100644
--- a/src/analogsensor.cpp
+++ b/src/analogsensor.cpp
@@ -451,14 +451,15 @@ void AnalogSensor::publish_values(const bool force) {
}
config["val_tpl"] = str;
+ char uniq_s[70];
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 {
- snprintf(str, sizeof(str), "analogsensor_%d", sensor.gpio());
+ snprintf(uniq_s, sizeof(uniq_s), "analogsensor_%d", sensor.gpio());
}
- config["object_id"] = str;
- config["uniq_id"] = str; // same as object_id
+ config["object_id"] = uniq_s;
+ config["uniq_id"] = uniq_s; // same as object_id
snprintf(str, sizeof(str), "%s", sensor.name().c_str());
config["name"] = str;
diff --git a/src/dallassensor.cpp b/src/dallassensor.cpp
index d58f22d7c..59607909b 100644
--- a/src/dallassensor.cpp
+++ b/src/dallassensor.cpp
@@ -518,14 +518,15 @@ void DallasSensor::publish_values(const bool force) {
}
config["val_tpl"] = str;
+ char uniq_s[70];
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 {
- 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["uniq_id"] = str; // same as object_id
+ config["object_id"] = uniq_s;
+ config["uniq_id"] = uniq_s; // same as object_id
snprintf(str, sizeof(str), "%s", sensor.name().c_str());
config["name"] = str;
diff --git a/src/emsdevicevalue.cpp b/src/emsdevicevalue.cpp
index 20e4d463a..c3d2cc0fe 100644
--- a/src/emsdevicevalue.cpp
+++ b/src/emsdevicevalue.cpp
@@ -105,10 +105,9 @@ DeviceValue::DeviceValue(uint8_t device_type,
// must be an int of 4 bytes, 32bit aligned
const char * DeviceValue::DeviceValueUOM_s[] = {
- F_(uom_blank), F_(uom_degrees), F_(uom_degrees), F_(uom_percent), F_(uom_lmin), F_(uom_kwh), F_(uom_wh),
- FL_(hours)[0], FL_(minutes)[0], F_(uom_ua), F_(uom_bar), F_(uom_kw), F_(uom_w), F_(uom_kb),
- FL_(seconds)[0], F_(uom_dbm), F_(uom_fahrenheit), F_(uom_mv), F_(uom_sqm), F_(uom_m3),
- F_(uom_blank) // connectivity
+ F_(uom_blank), F_(uom_degrees), F_(uom_degrees), F_(uom_percent), F_(uom_lmin), F_(uom_kwh), F_(uom_wh), FL_(hours)[0],
+ FL_(minutes)[0], F_(uom_ua), F_(uom_bar), F_(uom_kw), F_(uom_w), F_(uom_kb), FL_(seconds)[0], F_(uom_dbm),
+ F_(uom_fahrenheit), F_(uom_mv), F_(uom_sqm), F_(uom_m3), F_(uom_blank)
};
diff --git a/src/helpers.cpp b/src/helpers.cpp
index 6865f9081..5b4cad590 100644
--- a/src/helpers.cpp
+++ b/src/helpers.cpp
@@ -678,6 +678,10 @@ std::string Helpers::toUpper(std::string const & s) {
// replace char in char string
void Helpers::replace_char(char * str, char find, char replace) {
+ if (str == nullptr) {
+ return;
+ }
+
int i = 0;
while (str[i] != '\0') {
diff --git a/src/locale_common.h b/src/locale_common.h
index fdc4b59fa..9c4879147 100644
--- a/src/locale_common.h
+++ b/src/locale_common.h
@@ -224,7 +224,7 @@ MAKE_PSTR(tag_boiler_data_ww_mqtt, "ww")
MAKE_PSTR(tag_device_data_ww_mqtt, "")
// Home Assistant - this is special and has no translations
-MAKE_PSTR_LIST(climate, "HA climate config creation")
+MAKE_PSTR_LIST(climate, "")
// syslog
MAKE_PSTR_LIST(list_syslog_level, "off", "emerg", "alert", "crit", "error", "warn", "notice", "info", "debug", "trace", "all")
diff --git a/src/mqtt.cpp b/src/mqtt.cpp
index c29c1099d..38817bdce 100644
--- a/src/mqtt.cpp
+++ b/src/mqtt.cpp
@@ -932,6 +932,7 @@ void Mqtt::publish_ha_sensor_config(DeviceValue & dv, const std::string & model,
publish_ha_sensor_config(dv.type,
dv.tag,
dv.get_fullname().c_str(),
+ (dv.fullname ? dv.fullname[0] : nullptr), // EN name
dv.device_type,
dv.short_name,
dv.uom,
@@ -952,7 +953,7 @@ void Mqtt::publish_system_ha_sensor_config(uint8_t type, const char * name, cons
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);
+ publish_ha_sensor_config(type, DeviceValueTAG::TAG_HEARTBEAT, name, name, EMSdevice::DeviceType::SYSTEM, entity, uom, false, false, nullptr, 0, 0, 0, dev_json);
}
// MQTT discovery configs
@@ -961,6 +962,7 @@ void Mqtt::publish_system_ha_sensor_config(uint8_t type, const char * name, cons
void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdevice::DeviceValueType
uint8_t tag, // EMSdevice::DeviceValueTAG
const char * const fullname, // fullname, already translated
+ const char * const en_name, // original name
const uint8_t device_type, // EMSdevice::DeviceType
const char * const entity, // same as shortname
const uint8_t uom, // EMSdevice::DeviceValueUOM (0=NONE)
@@ -972,7 +974,7 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev
const int16_t dv_set_max,
const JsonObject & dev_json) {
// ignore if name (fullname) is empty
- if (!fullname) {
+ if (!fullname || !en_name) {
return;
}
@@ -987,13 +989,22 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev
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];
if (Mqtt::multiple_instances()) {
- // prefix base name to each uniq_id
+ // 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);
} else {
- snprintf(uniq_id, sizeof(uniq_id), "%s_%s", device_name, entity_with_tag);
+ // old v3.4 style
+ // 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)
diff --git a/src/mqtt.h b/src/mqtt.h
index 348078196..e2de8bba4 100644
--- a/src/mqtt.h
+++ b/src/mqtt.h
@@ -95,6 +95,7 @@ class Mqtt {
static void publish_ha_sensor_config(uint8_t type,
uint8_t tag,
const char * const fullname,
+ const char * const en_name,
const uint8_t device_type,
const char * const entity,
const uint8_t uom,
diff --git a/src/shower.cpp b/src/shower.cpp
index fa43a6f05..61c5f9ab6 100644
--- a/src/shower.cpp
+++ b/src/shower.cpp
@@ -155,7 +155,11 @@ void Shower::set_shower_state(bool state, bool force) {
doc["name"] = "Shower Active";
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["object_id"] = str;
diff --git a/src/system.cpp b/src/system.cpp
index 5275a2a1a..b7e23086d 100644
--- a/src/system.cpp
+++ b/src/system.cpp
@@ -1059,11 +1059,11 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp
JsonObject node;
// System
- node = output.createNestedObject("System Info");
- node["version"] = EMSESP_APP_VERSION;
- node["platform"] = EMSESP_PLATFORM;
- node["uptime"] = uuid::log::format_timestamp_ms(uuid::get_uptime_ms(), 3);
- // node["uptime (seconds)"] = uuid::get_uptime_sec();
+ node = output.createNestedObject("System Info");
+ node["version"] = EMSESP_APP_VERSION;
+ node["platform"] = EMSESP_PLATFORM;
+ node["uptime"] = uuid::log::format_timestamp_ms(uuid::get_uptime_ms(), 3);
+ node["uptime (seconds)"] = uuid::get_uptime_sec();
#ifndef EMSESP_STANDALONE
node["free mem"] = ESP.getFreeHeap() / 1024; // kilobytes
node["max alloc"] = ESP.getMaxAllocHeap() / 1024; // kilobytes
diff --git a/src/test/test.h b/src/test/test.h
index e8d7a287e..5abd892bc 100644
--- a/src/test/test.h
+++ b/src/test/test.h
@@ -30,12 +30,12 @@ namespace emsesp {
// #define EMSESP_DEBUG_DEFAULT "solar"
// #define EMSESP_DEBUG_DEFAULT "mixer"
// #define EMSESP_DEBUG_DEFAULT "web"
-#define EMSESP_DEBUG_DEFAULT "mqtt"
+// #define EMSESP_DEBUG_DEFAULT "mqtt"
// #define EMSESP_DEBUG_DEFAULT "general"
// #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 "ha"
// #define EMSESP_DEBUG_DEFAULT "masked"
// #define EMSESP_DEBUG_DEFAULT "board_profile"
// #define EMSESP_DEBUG_DEFAULT "shower_alert"
diff --git a/src/version.h b/src/version.h
index 1a4fba9ca..de55b8304 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1,4 +1,4 @@
-#define EMSESP_APP_VERSION "3.5.0b11"
+#define EMSESP_APP_VERSION "3.5.0b12"
#if CONFIG_IDF_TARGET_ESP32C3
#define EMSESP_PLATFORM "ESP32-C3";