From 97bb03d703aaacadcb5e78c60a93babab26fbde6 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 15 Feb 2026 12:01:10 +0100 Subject: [PATCH 1/7] add missing check for number mode change --- src/ESP32React/MqttSettingsService.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ESP32React/MqttSettingsService.cpp b/src/ESP32React/MqttSettingsService.cpp index 1c07748f0..5bcaa9562 100644 --- a/src/ESP32React/MqttSettingsService.cpp +++ b/src/ESP32React/MqttSettingsService.cpp @@ -316,6 +316,10 @@ StateUpdateResult MqttSettings::update(JsonObject root, MqttSettings & settings) changed = true; } + if (newSettings.ha_number_mode != settings.ha_number_mode) { + changed = true; + } + if (newSettings.entity_format != settings.entity_format) { changed = true; } From e303972d263b6eb7a7f3a1e7ef2282d1d803ee2a Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 15 Feb 2026 12:01:50 +0100 Subject: [PATCH 2/7] update AsyncWebserver and pkg --- interface/pnpm-lock.yaml | 62 +++++++++++++++++++++++++--------------- platformio.ini | 2 +- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/interface/pnpm-lock.yaml b/interface/pnpm-lock.yaml index cefa009f5..84c3fb679 100644 --- a/interface/pnpm-lock.yaml +++ b/interface/pnpm-lock.yaml @@ -508,13 +508,9 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@isaacs/balanced-match@4.0.1': - resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} - engines: {node: 20 || >=22} - - '@isaacs/brace-expansion@5.0.1': - resolution: {integrity: sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==} - engines: {node: 20 || >=22} + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1062,6 +1058,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.2: + resolution: {integrity: sha512-x0K50QvKQ97fdEz2kPehIerj+YTeptKF9hyYkKf6egnwmMWAkADiO0QCzSp0R5xN8FTZgYaBfSaue46Ej62nMg==} + engines: {node: 20 || >=22} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -1101,6 +1101,10 @@ packages: brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@5.0.2: + resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} + engines: {node: 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -1155,8 +1159,8 @@ packages: resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} engines: {node: '>=0.10.0'} - caniuse-lite@1.0.30001769: - resolution: {integrity: sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==} + caniuse-lite@1.0.30001770: + resolution: {integrity: sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==} caw@2.0.1: resolution: {integrity: sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==} @@ -2077,6 +2081,10 @@ packages: resolution: {integrity: sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==} engines: {node: '>= 4'} + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} + engines: {node: 20 || >=22} + javascript-natural-sort@0.7.1: resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} @@ -2247,8 +2255,8 @@ packages: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} - minimatch@10.1.2: - resolution: {integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==} + minimatch@10.2.0: + resolution: {integrity: sha512-ugkC31VaVg9cF0DFVoADH12k6061zNZkZON+aX8AWsR9GhPcErkcMBceb6znR8wLERM2AkkOxy2nWRLpT9Jq5w==} engines: {node: 20 || >=22} minimatch@3.1.2: @@ -3432,7 +3440,7 @@ snapshots: dependencies: '@eslint/object-schema': 3.0.1 debug: 4.4.3 - minimatch: 10.1.2 + minimatch: 10.2.0 transitivePeerDependencies: - supports-color @@ -3466,11 +3474,7 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@isaacs/balanced-match@4.0.1': {} - - '@isaacs/brace-expansion@5.0.1': - dependencies: - '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@9.0.0': {} '@jridgewell/gen-mapping@0.3.13': dependencies: @@ -3805,7 +3809,7 @@ snapshots: '@types/minimatch@6.0.0': dependencies: - minimatch: 10.1.2 + minimatch: 10.2.0 '@types/node@25.2.3': dependencies: @@ -3986,6 +3990,10 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.2: + dependencies: + jackspeak: 4.2.3 + base64-js@1.5.1: {} baseline-browser-mapping@2.9.19: {} @@ -4039,6 +4047,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.2: + dependencies: + balanced-match: 4.0.2 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -4046,7 +4058,7 @@ snapshots: browserslist@4.28.1: dependencies: baseline-browser-mapping: 2.9.19 - caniuse-lite: 1.0.30001769 + caniuse-lite: 1.0.30001770 electron-to-chromium: 1.5.286 node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) @@ -4105,7 +4117,7 @@ snapshots: camelcase@2.1.1: {} - caniuse-lite@1.0.30001769: {} + caniuse-lite@1.0.30001770: {} caw@2.0.1: dependencies: @@ -4581,7 +4593,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.1.2 + minimatch: 10.2.0 natural-compare: 1.4.0 optionator: 0.9.4 transitivePeerDependencies: @@ -5116,6 +5128,10 @@ snapshots: has-to-string-tag-x: 1.4.1 is-object: 1.0.2 + jackspeak@4.2.3: + dependencies: + '@isaacs/cliui': 9.0.0 + javascript-natural-sort@0.7.1: {} jpegtran-bin@5.0.2: @@ -5274,9 +5290,9 @@ snapshots: mimic-response@1.0.1: {} - minimatch@10.1.2: + minimatch@10.2.0: dependencies: - '@isaacs/brace-expansion': 5.0.1 + brace-expansion: 5.0.2 minimatch@3.1.2: dependencies: diff --git a/platformio.ini b/platformio.ini index 19b466fdc..c0319c603 100644 --- a/platformio.ini +++ b/platformio.ini @@ -106,7 +106,7 @@ board_build.filesystem = littlefs lib_deps = bblanchon/ArduinoJson @ 7.4.2 ESP32Async/AsyncTCP @ 3.4.10 - ESP32Async/ESPAsyncWebServer @ 3.9.6 + ESP32Async/ESPAsyncWebServer @ 3.10.0 https://github.com/emsesp/EMS-ESP-Modules.git @ 1.0.8 From 27c471f45ff4370335851da38a0544917da7f645 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 15 Feb 2026 12:02:36 +0100 Subject: [PATCH 3/7] set model for ems-esp devices, #2958 --- src/core/mqtt.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/core/mqtt.cpp b/src/core/mqtt.cpp index d559efcac..225c7f56e 100644 --- a/src/core/mqtt.cpp +++ b/src/core/mqtt.cpp @@ -1545,9 +1545,7 @@ void Mqtt::add_ha_dev_section(JsonObject doc, const char * name, const bool crea // add mf (manufacturer/brand), mdl (model), sw (software version) and via_device dev_json["mf"] = brand != nullptr ? brand : "EMS-ESP"; - if (model != nullptr) { - dev_json["mdl"] = model; - } + dev_json["mdl"] = model != nullptr ? model : "EMS-ESP"; dev_json["sw"] = version != nullptr ? version : "v" + std::string(EMSESP_APP_VERSION); dev_json["via_device"] = Mqtt::basename(); } From 72f08a86cfc856643af12cee24cc3ff8e42106ca Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 15 Feb 2026 12:03:07 +0100 Subject: [PATCH 4/7] fix SRC climate, #2960 --- src/core/emsdevice.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/core/emsdevice.cpp b/src/core/emsdevice.cpp index dc558c413..12b594d41 100644 --- a/src/core/emsdevice.cpp +++ b/src/core/emsdevice.cpp @@ -2135,7 +2135,7 @@ void EMSdevice::mqtt_ha_entity_config_create() { if (needs_update) { const char * const ** mode_options = nullptr; - for (auto & d : devicevalues_) { + for (const auto & d : devicevalues_) { // make sure mode in same circuit is DeviceValueType::ENUM if ((d.tag == dv.tag) && (d.type == DeviceValueType::ENUM) && !strcmp(d.short_name, FL_(mode)[0]) && (d.options_size > 0)) { // get options @@ -2167,19 +2167,25 @@ void EMSdevice::mqtt_ha_entity_config_create() { } // SRC thermostats mapped to connect/src1/... always contains mode, seltemp, currtemp - if (dv.tag >= DeviceValueTAG::TAG_SRC1 && dv.tag <= DeviceValueTAG::TAG_SRC16 && !strcmp(dv.short_name, FL_(mode)[0])) { - // add icon if we have one - const char * icon = nullptr; - for (auto & d : devicevalues_) { - if (d.tag == dv.tag && !strcmp(d.short_name, FL_(icon)[0]) && (dv.type == DeviceValueType::ENUM)) { + if (dv.tag >= DeviceValueTAG::TAG_SRC1 && dv.tag <= DeviceValueTAG::TAG_SRC16 && !strcmp(dv.short_name, FL_(seltemp)[0])) { + // add modes and icon if we have one + const char * icon = nullptr; + const char * const ** mode_options = nullptr; + for (const auto & d : devicevalues_) { + if ((d.tag != dv.tag) || (d.type != DeviceValueType::ENUM)) { + continue; + } + if (!strcmp(d.short_name, FL_(mode)[0]) && (d.options_size > 0)) { + mode_options = d.options; + } + if (!strcmp(d.short_name, FL_(icon)[0])) { uint8_t val = *(uint8_t *)(d.value_p); if (val != 0 && val < d.options_size) { icon = d.options[val][0]; } - break; } } - Mqtt::publish_ha_climate_config(dv, true, dv.options, false, icon); + Mqtt::publish_ha_climate_config(dv, true, mode_options, false, icon); count++; } From a811670c5a2fa48b8b92d2618c2a1f228504f016 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 15 Feb 2026 12:03:33 +0100 Subject: [PATCH 5/7] 3.8.2-dev.6, changelog --- CHANGELOG_LATEST.md | 3 ++- src/emsesp_version.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 232b748fb..c537e0dc4 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -8,10 +8,11 @@ For more details go to [emsesp.org](https://emsesp.org/). - comfortpoint for BC400 [#2935](https://github.com/emsesp/EMS-ESP32/issues/2935) - customize device brand [#2784](https://github.com/emsesp/EMS-ESP32/issues/2784) +- set model for ems-esp devices temperature, analog, etc. [#2958](https://github.com/emsesp/EMS-ESP32/discussions/2958) ## Fixed -- SRC climate creation [#2936](https://github.com/emsesp/EMS-ESP32/issues/2936) +- SRC climate creation [#2936](https://github.com/emsesp/EMS-ESP32/issues/2936) and [#2960](https://github.com/emsesp/EMS-ESP32/issues/2960) ## Changed diff --git a/src/emsesp_version.h b/src/emsesp_version.h index 1d71f4366..3945693dd 100644 --- a/src/emsesp_version.h +++ b/src/emsesp_version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.8.2-dev.5" +#define EMSESP_APP_VERSION "3.8.2-dev.6" From 148a721e173928351b85cb03c87f12dc35babaf5 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 15 Feb 2026 16:49:21 +0100 Subject: [PATCH 6/7] read connect seltemp after mode/icon to create HA-climate --- src/devices/connect.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/devices/connect.cpp b/src/devices/connect.cpp index 4a96c0700..256d26d3f 100644 --- a/src/devices/connect.cpp +++ b/src/devices/connect.cpp @@ -129,15 +129,20 @@ void Connect::process_roomThermostat(std::shared_ptr telegram) { } has_update(telegram, rc->temp_, 0); has_update(telegram, rc->humidity_, 2); // could show -3 if not set - has_update(telegram, rc->seltemp_, 3); + // make sure we have read mode and icon, needed for ha climate + if (!Mqtt::ha_enabled() || (Helpers::hasValue(rc->mode_) && Helpers::hasValue(rc->icon_))) { + has_update(telegram, rc->seltemp_, 3); + } // calculate dew temperature - const float k2 = 17.62; - const float k3 = 243.12; - const float t = (float)rc->temp_ / 10; - const float h = (float)rc->humidity_ / 100; - int16_t dt = (10 * k3 * (((k2 * t) / (k3 + t)) + log(h)) / (((k2 * k3) / (k3 + t)) - log(h))); - has_update(rc->dewtemp_, dt); + if (rc->humidity_ >= 0 && rc->humidity_ <= 100) { + const float k2 = 17.62; + const float k3 = 243.12; + const float t = (float)rc->temp_ / 10; + const float h = (float)rc->humidity_ / 100; + int16_t dt = (10 * k3 * (((k2 * t) / (k3 + t)) + log(h)) / (((k2 * k3) / (k3 + t)) - log(h))); + has_update(rc->dewtemp_, dt); + } } // gateway(0x48) W gateway(0x50), ?(0x0B42), data: 01 // icon in offset 0 From 421da246edd143231af0b2c08c6058b8c9ff4262 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 16 Feb 2026 07:51:10 +0100 Subject: [PATCH 7/7] fix SRC seltemp offset for auto mode #2960 --- src/devices/connect.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/devices/connect.cpp b/src/devices/connect.cpp index 256d26d3f..2ae873c3c 100644 --- a/src/devices/connect.cpp +++ b/src/devices/connect.cpp @@ -226,8 +226,9 @@ bool Connect::set_seltemp(const char * value, const int8_t id) { } float v; if (Helpers::value2float(value, v)) { - // write_command(0xBB5 + rc->room(), rc->mode_ == 2 ? 1 : 3, v == -1 ? 0xFF : uint8_t(v * 2)); - write_command(0xBB5 + rc->room(), rc->mode_ == 0 ? 1 : 3, v == -1 ? 0xFF : uint8_t(v * 2)); + // depends on mode, auto (2 for enum_mode2, 0 for enum_mode8) set in offset 1 + write_command(0xBB5 + rc->room(), rc->mode_ == 2 ? 1 : 3, v == -1 ? 0xFF : uint8_t(v * 2)); + // write_command(0xBB5 + rc->room(), rc->mode_ == 0 ? 1 : 3, v == -1 ? 0xFF : uint8_t(v * 2)); return true; } return false;