From ccbb56d4031dd47b690e646f228d35982e337ee5 Mon Sep 17 00:00:00 2001 From: Proddy Date: Wed, 14 Dec 2022 22:07:42 +0100 Subject: [PATCH 1/6] add v3.4 entity id flag to MQTT settings --- interface/package-lock.json | 202 +++++++++--------- interface/package.json | 6 +- .../src/framework/mqtt/MqttSettingsForm.tsx | 8 + interface/src/i18n/de/index.ts | 1 + interface/src/i18n/en/index.ts | 1 + interface/src/i18n/nl/index.ts | 1 + interface/src/i18n/no/index.ts | 1 + interface/src/i18n/pl/index.ts | 1 + interface/src/i18n/se/index.ts | 1 + interface/src/types/mqtt.ts | 1 + lib/framework/MqttSettingsService.cpp | 7 +- lib/framework/MqttSettingsService.h | 7 + lib_standalone/ESP8266React.h | 1 + mock-api/server.js | 1 + src/mqtt.cpp | 17 +- src/mqtt.h | 6 + src/system.cpp | 1 + src/version.h | 2 +- 18 files changed, 154 insertions(+), 111 deletions(-) diff --git a/interface/package-lock.json b/interface/package-lock.json index 59ff55056..d954a2317 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.15", "@types/react": "^18.0.26", "@types/react-dom": "^18.0.9", "@types/react-router-dom": "^5.3.3", @@ -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", @@ -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.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.15.tgz", + "integrity": "sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -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", @@ -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.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.15.tgz", + "integrity": "sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw==" }, "@types/parse-json": { "version": "4.0.0", diff --git a/interface/package.json b/interface/package.json index 4238aba64..bda56b4c0 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.15", "@types/react": "^18.0.26", "@types/react-dom": "^18.0.9", "@types/react-router-dom": "^5.3.3", diff --git a/interface/src/framework/mqtt/MqttSettingsForm.tsx b/interface/src/framework/mqtt/MqttSettingsForm.tsx index 03f305508..f3059463a 100644 --- a/interface/src/framework/mqtt/MqttSettingsForm.tsx +++ b/interface/src/framework/mqtt/MqttSettingsForm.tsx @@ -233,6 +233,14 @@ const MqttSettingsForm: FC = () => { label={LL.MQTT_MULTIPLE_INSTANCES()} /> + + + } + label={LL.MQTT_ENTITY_FULLNAME()} + /> + Date: Thu, 15 Dec 2022 21:51:11 +0100 Subject: [PATCH 2/6] merge multiple_instances with entity_format --- .../src/framework/mqtt/MqttSettingsForm.tsx | 62 +++++++++---------- interface/src/i18n/de/index.ts | 5 +- interface/src/i18n/en/index.ts | 5 +- interface/src/i18n/nl/index.ts | 5 +- interface/src/i18n/no/index.ts | 5 +- interface/src/i18n/pl/index.ts | 5 +- interface/src/i18n/se/index.ts | 5 +- interface/src/types/mqtt.ts | 1 - lib/framework/MqttSettingsService.cpp | 2 - lib/framework/MqttSettingsService.h | 7 --- lib_standalone/ESP8266React.h | 1 - mock-api/server.js | 1 - src/mqtt.cpp | 16 ++--- src/mqtt.h | 5 -- src/system.cpp | 1 - 15 files changed, 52 insertions(+), 74 deletions(-) diff --git a/interface/src/framework/mqtt/MqttSettingsForm.tsx b/interface/src/framework/mqtt/MqttSettingsForm.tsx index f3059463a..85f468771 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,49 +215,46 @@ const MqttSettingsForm: FC = () => { } label={LL.MQTT_PUBLISH_TEXT_3()} /> {data.ha_enabled && ( <> - - - } - label={LL.MQTT_MULTIPLE_INSTANCES()} - /> - - - - } - label={LL.MQTT_ENTITY_FULLNAME()} - /> - - - + + + + + + + {LL.MQTT_ENTITY_FORMAT_0()} + {LL.MQTT_ENTITY_FORMAT_1()} + + )} )} - + {LL.MQTT_PUBLISH_INTERVALS()} (0=auto) diff --git a/interface/src/i18n/de/index.ts b/interface/src/i18n/de/index.ts index acf30a622..f480b9c51 100644 --- a/interface/src/i18n/de/index.ts +++ b/interface/src/i18n/de/index.ts @@ -249,8 +249,9 @@ const de: Translation = { MQTT_INT_HEARTBEAT: 'Heartbeat', MQTT_QUEUE: 'MQTT Queue', DEFAULT: 'Standard', - MQTT_MULTIPLE_INSTANCES: 'Erlaube EMS-ESP Mehrfachinstanzen', - MQTT_ENTITY_FULLNAME: 'Use v3.4 style Entity IDs', + MQTT_ENTITY_FORMAT: 'Entity ID format', + MQTT_ENTITY_FORMAT_0: 'Single instance, long name', + 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 6be5a0c59..e76450b70 100644 --- a/interface/src/i18n/en/index.ts +++ b/interface/src/i18n/en/index.ts @@ -248,8 +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_FULLNAME: 'Use v3.4 style Entity IDs', + MQTT_ENTITY_FORMAT: 'Entity ID format', + MQTT_ENTITY_FORMAT_0: 'Single instance, long name', + 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/nl/index.ts b/interface/src/i18n/nl/index.ts index 8df8dfb45..dc250c99b 100644 --- a/interface/src/i18n/nl/index.ts +++ b/interface/src/i18n/nl/index.ts @@ -248,8 +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_FULLNAME: 'Use v3.4 style Entity IDs', + MQTT_ENTITY_FORMAT: 'Entity ID format', + MQTT_ENTITY_FORMAT_0: 'Single instance, long name', + 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 b6fc323dd..b9e7db89c 100644 --- a/interface/src/i18n/no/index.ts +++ b/interface/src/i18n/no/index.ts @@ -248,8 +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_FULLNAME: 'Use v3.4 style Entity IDs', + MQTT_ENTITY_FORMAT: 'Entity ID format', + MQTT_ENTITY_FORMAT_0: 'Single instance, long name', + 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 ba6023d2d..ed542e798 100644 --- a/interface/src/i18n/pl/index.ts +++ b/interface/src/i18n/pl/index.ts @@ -248,8 +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_FULLNAME: 'Use v3.4 style Entity IDs', + MQTT_ENTITY_FORMAT: 'Entity ID format', + MQTT_ENTITY_FORMAT_0: 'Single instance, long name', + 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 b5e9090b7..99e33eebc 100644 --- a/interface/src/i18n/se/index.ts +++ b/interface/src/i18n/se/index.ts @@ -248,8 +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_FULLNAME: 'Use v3.4 style Entity IDs', + MQTT_ENTITY_FORMAT: 'Entity ID format', + MQTT_ENTITY_FORMAT_0: 'Single instance, long name', + 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/interface/src/types/mqtt.ts b/interface/src/types/mqtt.ts index ad9a23531..ee69da5b5 100644 --- a/interface/src/types/mqtt.ts +++ b/interface/src/types/mqtt.ts @@ -30,7 +30,6 @@ export interface MqttSettings { keep_alive: number; clean_session: boolean; multiple_instances: boolean; - entity_fullname: boolean; publish_time_boiler: number; publish_time_thermostat: number; publish_time_solar: number; diff --git a/lib/framework/MqttSettingsService.cpp b/lib/framework/MqttSettingsService.cpp index 0ad414553..aa6198706 100644 --- a/lib/framework/MqttSettingsService.cpp +++ b/lib/framework/MqttSettingsService.cpp @@ -155,7 +155,6 @@ void MqttSettings::read(MqttSettings & settings, JsonObject & root) { root["keep_alive"] = settings.keepAlive; root["clean_session"] = settings.cleanSession; root["multiple_instances"] = settings.multiple_instances; - root["entity_fullname"] = settings.entity_fullname; // added by proddy for EMS-ESP root["publish_time_boiler"] = settings.publish_time_boiler; @@ -189,7 +188,6 @@ 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.entity_fullname = root["entity_fullname"] | FACTORY_MQTT_ENTITY_FULLNAME; newSettings.mqtt_qos = root["mqtt_qos"] | EMSESP_DEFAULT_MQTT_QOS; newSettings.mqtt_retain = root["mqtt_retain"] | EMSESP_DEFAULT_MQTT_RETAIN; diff --git a/lib/framework/MqttSettingsService.h b/lib/framework/MqttSettingsService.h index 934edd4ff..21ec908bd 100644 --- a/lib/framework/MqttSettingsService.h +++ b/lib/framework/MqttSettingsService.h @@ -61,10 +61,6 @@ static String generateClientId() { #define FACTORY_MQTT_MULTIPLE_INSTANCES false #endif -#ifndef FACTORY_MQTT_ENTITY_FULLNAME -#define FACTORY_MQTT_ENTITY_FULLNAME false -#endif - class MqttSettings { public: // host and port - if enabled @@ -86,9 +82,6 @@ class MqttSettings { // multiple instances bool multiple_instances; - // use v3.4 entity fullnames in Discovery - bool entity_fullname; - // proddy EMS-ESP specific String base; uint16_t publish_time_boiler; diff --git a/lib_standalone/ESP8266React.h b/lib_standalone/ESP8266React.h index 2efdf9be5..f0e8b3817 100644 --- a/lib_standalone/ESP8266React.h +++ b/lib_standalone/ESP8266React.h @@ -82,7 +82,6 @@ class DummySettings { uint16_t keepAlive = 60; bool cleanSession = false; bool multiple_instances = false; - bool entity_fullname = false; uint16_t publish_time_boiler = 10; uint16_t publish_time_thermostat = 10; diff --git a/mock-api/server.js b/mock-api/server.js index 51ae2706a..f73d04026 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -224,7 +224,6 @@ mqtt_settings = { keep_alive: 60, clean_session: true, multiple_instances: false, - entity_fullname: false, publish_time_boiler: 10, publish_time_thermostat: 10, publish_time_solar: 10, diff --git a/src/mqtt.cpp b/src/mqtt.cpp index 442f28a7b..d279fc931 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -39,7 +39,6 @@ uint32_t Mqtt::publish_time_other_; uint32_t Mqtt::publish_time_heartbeat_; bool Mqtt::mqtt_enabled_; bool Mqtt::multiple_instances_; -bool Mqtt::entity_fullname_; bool Mqtt::ha_enabled_; uint8_t Mqtt::nested_format_; std::string Mqtt::discovery_prefix_; @@ -432,7 +431,6 @@ void Mqtt::load_settings() { send_response_ = mqttSettings.send_response; discovery_prefix_ = mqttSettings.discovery_prefix.c_str(); multiple_instances_ = mqttSettings.multiple_instances; - entity_fullname_ = mqttSettings.entity_fullname; // convert to milliseconds publish_time_boiler_ = mqttSettings.publish_time_boiler * 1000; @@ -993,18 +991,12 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev // build unique identifier which will be used in the topic, also used as object_id char uniq_id[70]; - char entityid[50]; - if (Mqtt::entity_fullname()) { - strlcpy(entityid, en_name, sizeof(entityid)); // old v3.4 style - } else { - strlcpy(entityid, entity_with_tag, sizeof(entityid)); - } - if (Mqtt::multiple_instances()) { - // prefix base name to each uniq_id - snprintf(uniq_id, sizeof(uniq_id), "%s_%s_%s", mqtt_basename_.c_str(), device_name, entityid); + // 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, entityid); + // old v3.4 style + snprintf(uniq_id, sizeof(uniq_id), "%s_%s", device_name, en_name); } // 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 47e813e46..e2de8bba4 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -185,10 +185,6 @@ class Mqtt { return multiple_instances_; } - static bool entity_fullname() { - return entity_fullname_; - } - static void nested_format(uint8_t nested_format) { nested_format_ = nested_format; } @@ -327,7 +323,6 @@ class Mqtt { static bool ha_enabled_; static uint8_t nested_format_; static bool multiple_instances_; - static bool entity_fullname_; static std::string discovery_prefix_; static bool publish_single_; static bool publish_single2cmd_; diff --git a/src/system.cpp b/src/system.cpp index 4cee96913..a66a5c8d1 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1153,7 +1153,6 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp node["keep alive"] = settings.keepAlive; node["clean session"] = settings.cleanSession; node["multiple instances"] = settings.multiple_instances; - node["entity fullname"] = settings.entity_fullname; node["base"] = settings.base; node["discovery prefix"] = settings.discovery_prefix; node["nested format"] = settings.nested_format; From 1e78979ed0092330c68ed770ac0ae21445a247fa Mon Sep 17 00:00:00 2001 From: Proddy Date: Thu, 15 Dec 2022 23:14:44 +0100 Subject: [PATCH 3/6] default multiple_instances is enabled --- lib/framework/MqttSettingsService.h | 2 +- mock-api/server.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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, From b6de431a56d64a3ccf2793e9411ac13bd2c21987 Mon Sep 17 00:00:00 2001 From: Proddy Date: Thu, 15 Dec 2022 23:19:53 +0100 Subject: [PATCH 4/6] add French MQTT entity format strings (in EN) --- interface/src/i18n/fr/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/src/i18n/fr/index.ts b/interface/src/i18n/fr/index.ts index df1234972..659c96359 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', + MQTT_ENTITY_FORMAT_1: 'Multiple instances, short name', MQTT_CLEAN_SESSION: 'Flag Clean Session', MQTT_RETAIN_FLAG: 'Toujours activer le Retain Flag', INACTIVE: 'Inactif', From 147be12583b41d031081dbdbee63b3e09dc6d84d Mon Sep 17 00:00:00 2001 From: Proddy Date: Fri, 16 Dec 2022 22:57:59 +0100 Subject: [PATCH 5/6] fixes for #804 --- CHANGELOG_LATEST.md | 2 +- .../src/framework/mqtt/MqttSettingsForm.tsx | 4 ++-- interface/src/i18n/de/index.ts | 2 +- interface/src/i18n/en/index.ts | 2 +- interface/src/i18n/fr/index.ts | 2 +- interface/src/i18n/nl/index.ts | 2 +- interface/src/i18n/no/index.ts | 2 +- interface/src/i18n/pl/index.ts | 2 +- interface/src/i18n/se/index.ts | 2 +- lib/framework/MqttSettingsService.cpp | 16 +++++++--------- src/analogsensor.cpp | 9 +++++---- src/dallassensor.cpp | 9 +++++---- src/emsdevicevalue.cpp | 7 +++---- src/helpers.cpp | 4 ++++ src/locale_common.h | 2 +- src/mqtt.cpp | 19 +++++++++++++++++-- src/shower.cpp | 6 +++++- src/system.cpp | 10 +++++----- src/test/test.h | 4 ++-- 19 files changed, 64 insertions(+), 42 deletions(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 2249b9158..b9f9cd22f 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. +- Since 3.5.0b11 we have added support for multiple EMS-ESPs [#759] as an optional setting in MQTT. When this is enabled, which is now the default, all MQTT Discovery Entity IDs will include the base name and the shortname of the EMS-ESP device entity. For example what was previously `sensor.boiler_actual_boiler_temperature` will 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/src/framework/mqtt/MqttSettingsForm.tsx b/interface/src/framework/mqtt/MqttSettingsForm.tsx index 85f468771..ef78c8436 100644 --- a/interface/src/framework/mqtt/MqttSettingsForm.tsx +++ b/interface/src/framework/mqtt/MqttSettingsForm.tsx @@ -245,8 +245,8 @@ const MqttSettingsForm: FC = () => { margin="normal" select > - {LL.MQTT_ENTITY_FORMAT_0()} - {LL.MQTT_ENTITY_FORMAT_1()} + {LL.MQTT_ENTITY_FORMAT_0()} + {LL.MQTT_ENTITY_FORMAT_1()} diff --git a/interface/src/i18n/de/index.ts b/interface/src/i18n/de/index.ts index f480b9c51..5ee053fca 100644 --- a/interface/src/i18n/de/index.ts +++ b/interface/src/i18n/de/index.ts @@ -250,7 +250,7 @@ const de: Translation = { MQTT_QUEUE: 'MQTT Queue', DEFAULT: 'Standard', 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_CLEAN_SESSION: 'Setze `Clean Session`', MQTT_RETAIN_FLAG: 'Setze `Retain flag` immer', diff --git a/interface/src/i18n/en/index.ts b/interface/src/i18n/en/index.ts index e76450b70..95f386a5f 100644 --- a/interface/src/i18n/en/index.ts +++ b/interface/src/i18n/en/index.ts @@ -249,7 +249,7 @@ const en: Translation = { MQTT_QUEUE: 'MQTT Queue', DEFAULT: 'Default', 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_CLEAN_SESSION: 'Set Clean Session', MQTT_RETAIN_FLAG: 'Always set Retain flag', diff --git a/interface/src/i18n/fr/index.ts b/interface/src/i18n/fr/index.ts index 659c96359..8665ddb2a 100644 --- a/interface/src/i18n/fr/index.ts +++ b/interface/src/i18n/fr/index.ts @@ -249,7 +249,7 @@ const fr: Translation = { MQTT_QUEUE: 'Queue MQTT', DEFAULT: 'Défaut', 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_CLEAN_SESSION: 'Flag Clean Session', MQTT_RETAIN_FLAG: 'Toujours activer le Retain Flag', diff --git a/interface/src/i18n/nl/index.ts b/interface/src/i18n/nl/index.ts index dc250c99b..41cfe4bae 100644 --- a/interface/src/i18n/nl/index.ts +++ b/interface/src/i18n/nl/index.ts @@ -249,7 +249,7 @@ const nl: Translation = { MQTT_QUEUE: 'MQTT Queue', DEFAULT: 'Default', 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_CLEAN_SESSION: 'Clean Session aan', MQTT_RETAIN_FLAG: 'Retain flag aan', diff --git a/interface/src/i18n/no/index.ts b/interface/src/i18n/no/index.ts index b9e7db89c..2eaf3e2fd 100644 --- a/interface/src/i18n/no/index.ts +++ b/interface/src/i18n/no/index.ts @@ -249,7 +249,7 @@ const no: Translation = { MQTT_QUEUE: 'MQTT Queue', DEFAULT: 'Standard', 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_CLEAN_SESSION: 'Benytt Clean Session', MQTT_RETAIN_FLAG: 'Alltid sett Retain flag', diff --git a/interface/src/i18n/pl/index.ts b/interface/src/i18n/pl/index.ts index ed542e798..8e023ed85 100644 --- a/interface/src/i18n/pl/index.ts +++ b/interface/src/i18n/pl/index.ts @@ -249,7 +249,7 @@ const pl: BaseTranslation = { MQTT_QUEUE: 'Kolejka MQTT', DEFAULT: '{{Pozostałe|Domyślna|}}', 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_CLEAN_SESSION: 'Ustawiaj flagę "Clean session"', MQTT_RETAIN_FLAG: 'Ustawiaj flagę "Retain"', diff --git a/interface/src/i18n/se/index.ts b/interface/src/i18n/se/index.ts index 99e33eebc..74a2898c2 100644 --- a/interface/src/i18n/se/index.ts +++ b/interface/src/i18n/se/index.ts @@ -249,7 +249,7 @@ const se: Translation = { MQTT_QUEUE: 'MQTT Queue', DEFAULT: 'Standard', 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_CLEAN_SESSION: 'Använd "Clean Session"-flaggan', MQTT_RETAIN_FLAG: 'Använd "Always Retain"-flaggan', diff --git a/lib/framework/MqttSettingsService.cpp b/lib/framework/MqttSettingsService.cpp index aa6198706..a52af34f6 100644 --- a/lib/framework/MqttSettingsService.cpp +++ b/lib/framework/MqttSettingsService.cpp @@ -223,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; @@ -258,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/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 d279fc931..2b36aba8d 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -974,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; } @@ -990,13 +990,28 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev } // build unique identifier which will be used in the topic, 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 and use the shortname snprintf(uniq_id, sizeof(uniq_id), "%s_%s_%s", mqtt_basename_.c_str(), device_name, entity_with_tag); } else { // old v3.4 style - snprintf(uniq_id, sizeof(uniq_id), "%s_%s", device_name, en_name); + // if there is no en_name take the shortname + if (en_name == nullptr || strlen(en_name) == 0) { + strlcpy(uniq_id, entity, sizeof(uniq_id)); + } else { + // 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/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" From 4b7bbb3d502b6f6eb44db9bac493180c95672a7c Mon Sep 17 00:00:00 2001 From: Proddy Date: Sat, 17 Dec 2022 11:05:20 +0100 Subject: [PATCH 6/6] minor cleanup and testing --- CHANGELOG_LATEST.md | 2 +- interface/package-lock.json | 64 ++++++++++++++++++------------------- interface/package.json | 4 +-- src/mqtt.cpp | 23 +++++-------- 4 files changed, 43 insertions(+), 50 deletions(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index b9f9cd22f..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] as an optional setting in MQTT. When this is enabled, which is now the default, all MQTT Discovery Entity IDs will include the base name and the shortname of the EMS-ESP device entity. For example what was previously `sensor.boiler_actual_boiler_temperature` will 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. +- 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 d954a2317..6d51b4195 100644 --- a/interface/package-lock.json +++ b/interface/package-lock.json @@ -15,7 +15,7 @@ "@mui/material": "^5.11.0", "@table-library/react-table-library": "4.0.23", "@types/lodash": "^4.14.191", - "@types/node": "^18.11.15", + "@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", @@ -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.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.15.tgz", - "integrity": "sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw==" + "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" @@ -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.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.15.tgz", - "integrity": "sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw==" + "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 bda56b4c0..8d95636ef 100644 --- a/interface/package.json +++ b/interface/package.json @@ -11,7 +11,7 @@ "@mui/material": "^5.11.0", "@table-library/react-table-library": "4.0.23", "@types/lodash": "^4.14.191", - "@types/node": "^18.11.15", + "@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/src/mqtt.cpp b/src/mqtt.cpp index 2b36aba8d..38817bdce 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -989,28 +989,21 @@ 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 - // and becomes the Entity ID in HA + // 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 and use the shortname snprintf(uniq_id, sizeof(uniq_id), "%s_%s_%s", mqtt_basename_.c_str(), device_name, entity_with_tag); } else { // old v3.4 style - // if there is no en_name take the shortname - if (en_name == nullptr || strlen(en_name) == 0) { - strlcpy(uniq_id, entity, sizeof(uniq_id)); + // 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 { - // 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()); - } + snprintf(uniq_id, sizeof(uniq_id), "%s_%s_%s", device_name, EMSdevice::tag_to_string(tag).c_str(), Helpers::toLower(uniq_s).c_str()); } }