From 11782eef8b6213605f0d0b5808f34ad74ea036dd Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Thu, 9 Oct 2025 10:53:03 +0200 Subject: [PATCH 01/13] SRC #2636, add childlock, icons, fix long names --- src/core/locale_common.h | 3 ++ src/core/locale_translations.h | 18 ++++++- src/devices/connect.cpp | 99 +++++++++++++++++++++++----------- src/devices/connect.h | 10 +++- 4 files changed, 98 insertions(+), 32 deletions(-) diff --git a/src/core/locale_common.h b/src/core/locale_common.h index f3c5cdbd0..b7689701a 100644 --- a/src/core/locale_common.h +++ b/src/core/locale_common.h @@ -402,6 +402,9 @@ MAKE_ENUM(enum_ventMode, FL_(auto), FL_(off), FL_(L1), FL_(L2), FL_(L3), FL_(L4) // water MAKE_ENUM(enum_errorDisp, FL_(off), FL_(normal), FL_(inverted)) +// SRC plus +MAKE_ENUM(enum_icons, FL_(none), FL_(chefhat), FL_(sofasingle), FL_(bowlmix), FL_(bedsingle), FL_(beddouble), FL_(teddybear), FL_(shower), FL_(laptop), FL_(door), FL_(palette), FL_(washingmachine), FL_(bookshelf)) + #pragma GCC diagnostic pop // clang-format on \ No newline at end of file diff --git a/src/core/locale_translations.h b/src/core/locale_translations.h index e9c345485..e260431f4 100644 --- a/src/core/locale_translations.h +++ b/src/core/locale_translations.h @@ -336,6 +336,20 @@ MAKE_WORD_TRANSLATION(sleep, "sleep", "Einschlafen", "slaapmodus", "sova", "sen" MAKE_WORD_TRANSLATION(partymode, "party", "Party", "party", "party", "impreza", "", "", "parti", "festa", "párty režim", "") // TODO translate MAKE_WORD_TRANSLATION(fireplace, "fireplace", "Kamin", "haard", "Kamin", "kominek", "", "", "şömine", "camino", "krb", "") // TODO translate +// SRC plus +MAKE_WORD_TRANSLATION(chefhat, "mdi:chef-hat") +MAKE_WORD_TRANSLATION(sofasingle, "mdi:sofa-single-outline") +MAKE_WORD_TRANSLATION(bowlmix, "mdi:bowl-mix-outline") +MAKE_WORD_TRANSLATION(bedsingle, "mdi:bed-single-outline") +MAKE_WORD_TRANSLATION(beddouble, "mdi:bed-double-outline") +MAKE_WORD_TRANSLATION(teddybear, "mdi:teddy-bear") +MAKE_WORD_TRANSLATION(shower, "mdi:shower") +MAKE_WORD_TRANSLATION(laptop, "mdi:laptop") +MAKE_WORD_TRANSLATION(door, "mdi:door") +MAKE_WORD_TRANSLATION(palette, "mdi:palette-outline") +MAKE_WORD_TRANSLATION(washingmachine, "mdi:washing-machine") +MAKE_WORD_TRANSLATION(bookshelf, "mdi:bookshelf") + // MQTT Discovery - this is special device entity for 'climate' MAKE_TRANSLATION(haclimate, "haclimate", "mqtt discovery current room temperature", "Discovery aktuelle Raumtemperatur", "Discovery huidige kamertemperatuur", "MQTT Discovery för aktuell rumstemperatur", "termostat w HA", "HA Avlest temp", "", "Güncel osa sıcaklığı", "verifica temperatura ambiente attuale", "mqtt discovery aktuálna teplota v miestnosti", "mqtt discovery aktuální pokojová teplota") // TODO translate @@ -933,8 +947,10 @@ MAKE_TRANSLATION(status, "status", "status", "Status", "Status", "Status", "stat // RF sensor, id 0x40, telegram 0x435 MAKE_TRANSLATION(RFTemp, "rftemp", "RF room temperature sensor", "RF Raumtemperatursensor", "RF ruimtetemperatuur sensor", "RF Rumsgivare Temperatur", "bezprzewodowy czujnik temperatury pomieszczenia", "RF romsgiver temp", "capteur de température de pièce RF", "RF oda sıcaklık sensörü", "Sensore di temperatura ambiente RF", "RF snímač izbovej teploty", "RF senzor teploty místnosti") -// gateway thermostat +// connect SRC plus thermostat MAKE_TRANSLATION(name, "name", "name", "Name") +MAKE_TRANSLATION(childlock, "childlock", "child lock", "Kindersicherung") +MAKE_TRANSLATION(icon, "icon", "icon", "Icon") // ventilation MAKE_TRANSLATION(outFresh, "outfresh", "outdoor fresh air", "Außenlufttemp.", "temperatuur buitenlucht", "Utelufttemperatur", "świeże powietrze z zewnątrz", "", "", "dış ortam taze hava", "aria fresca esterna", "čerstvý vzduch vonku", "venkovní čerstvý vzduch") // TODO translate diff --git a/src/devices/connect.cpp b/src/devices/connect.cpp index eaa82d3d4..c8995be18 100644 --- a/src/devices/connect.cpp +++ b/src/devices/connect.cpp @@ -24,30 +24,31 @@ REGISTER_FACTORY(Connect, EMSdevice::DeviceType::CONNECT); Connect::Connect(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const char * name, uint8_t flags, uint8_t brand) : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { - if (device_id == 0x50) { // RF Base - register_telegram_type(0xD1, "RFOutdoorTemp", false, MAKE_PF_CB(process_OutdoorTemp)); - register_telegram_type(0x06, "RCTime", false, MAKE_PF_CB(process_RCTime)); - - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dateTime_, DeviceValueType::STRING, FL_(tpl_datetime), FL_(dateTime), DeviceValueUOM::NONE); - register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, - &outdoorTemp_, - DeviceValueType::INT16, - DeviceValueNumOp::DV_NUMOP_DIV10, - FL_(outdoorTemp), - DeviceValueUOM::DEGREES); - // Roomthermostats - for (uint8_t i = 0; i < 16; i++) { - register_telegram_type(0x0BDD + i, "Room", false, MAKE_PF_CB(process_roomThermostat)); // broadcasted - register_telegram_type(0x0B3D + i, "Roomname", false, MAKE_PF_CB(process_roomThermostatName)); // fetch for active circuits - register_telegram_type(0x0BB5 + i, "Roomsettings", false, MAKE_PF_CB(process_roomThermostatMode)); // fetch for active circuits - register_telegram_type(0x1230 + i, "Roomparams", false, MAKE_PF_CB(process_roomThermostatParam)); // fetch for active circuits - register_telegram_type(0x1244 + i, "Roomdata", false, MAKE_PF_CB(process_roomThermostatData)); // broadcasted - } - // register_telegram_type(0xDB65, "Roomschedule", true, MAKE_PF_CB(process_roomSchedule)); - // 0x2040, broadcast 36 bytes: - // data: 0E 60 00 DF 0D AF 0A 46 0A 46 02 9A 1C 53 1C 53 12 AD 12 AD 00 00 13 C2 - // data: 1F 37 1F 37 00 00 00 00 18 97 11 27 (offset 24) + if (device_id == 0x02) { // Modems have no entities + return; } + register_telegram_type(0xD1, "RFOutdoorTemp", false, MAKE_PF_CB(process_OutdoorTemp)); + register_telegram_type(0x06, "RCTime", false, MAKE_PF_CB(process_RCTime)); + + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, &dateTime_, DeviceValueType::STRING, FL_(tpl_datetime), FL_(dateTime), DeviceValueUOM::NONE); + register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, + &outdoorTemp_, + DeviceValueType::INT16, + DeviceValueNumOp::DV_NUMOP_DIV10, + FL_(outdoorTemp), + DeviceValueUOM::DEGREES); + // Roomthermostats + for (uint8_t i = 0; i < 16; i++) { + register_telegram_type(0x0BDD + i, "Room", false, MAKE_PF_CB(process_roomThermostat)); // broadcasted + register_telegram_type(0x0B3D + i, "Roomname", false, MAKE_PF_CB(process_roomThermostatName)); // fetch for active circuits + register_telegram_type(0x0BB5 + i, "Roomsettings", false, MAKE_PF_CB(process_roomThermostatSettings)); // fetch for active circuits + register_telegram_type(0x1230 + i, "Roomparams", false, MAKE_PF_CB(process_roomThermostatParam)); // fetch for active circuits + register_telegram_type(0x1244 + i, "Roomdata", false, MAKE_PF_CB(process_roomThermostatData)); // broadcasted + } + register_telegram_type(0xDB65, "Roomschedule", true, MAKE_PF_CB(process_roomSchedule)); + // 0x2040, broadcast 36 bytes: + // data: 0E 60 00 DF 0D AF 0A 46 0A 46 02 9A 1C 53 1C 53 12 AD 12 AD 00 00 13 C2 + // data: 1F 37 1F 37 00 00 00 00 18 97 11 27 (offset 24) } /* * OutdoorTemp - type 0xD1 - external temperature @@ -85,9 +86,11 @@ void Connect::register_device_values_room(std::shared_ptr register_device_value(tag, &room->humidity_, DeviceValueType::INT8, FL_(airHumidity), DeviceValueUOM::PERCENT); register_device_value(tag, &room->dewtemp_, DeviceValueType::INT16, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(dewTemperature), DeviceValueUOM::DEGREES); register_device_value( - tag, &room->seltemp_, DeviceValueType::UINT8, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(seltemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_seltemp)); + tag, &room->seltemp_, DeviceValueType::UINT8, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(seltemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_seltemp), 5, 30); register_device_value(tag, &room->mode_, DeviceValueType::ENUM, FL_(enum_mode8), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); register_device_value(tag, &room->name_, DeviceValueType::STRING, FL_(name), DeviceValueUOM::NONE, MAKE_CF_CB(set_name)); + register_device_value(tag, &room->childlock_, DeviceValueType::BOOL, FL_(childlock), DeviceValueUOM::NONE, MAKE_CF_CB(set_childlock)); + register_device_value(tag, &room->icon_, DeviceValueType::ENUM, FL_(enum_icons), FL_(icon), DeviceValueUOM::NONE, MAKE_CF_CB(set_icon), 0, 12); } std::shared_ptr Connect::room_circuit(const uint8_t num, const bool create) { @@ -132,30 +135,34 @@ void Connect::process_roomThermostat(std::shared_ptr telegram) { has_update(rc->dewtemp_, dt); } -// gateway(0x48) W gateway(0x50), ?(0x0B42), data: 01 +// gateway(0x48) W gateway(0x50), ?(0x0B42), data: 01 // icon in ofset 0 // gateway(0x48) W gateway(0x50), ?(0x0B42), data: 00 4B 00 FC 00 63 00 68 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 (offset 1) void Connect::process_roomThermostatName(std::shared_ptr telegram) { auto rc = room_circuit(telegram->type_id - 0xB3D); if (rc == nullptr) { return; } - + has_update(rc->icon_, 0); for (uint8_t i = telegram->offset; i < telegram->message_length + telegram->offset && i < 100; i++) { if ((i > 1) && (i % 2) == 0) { - rc->name_[(i - 2) / 2] = telegram->message_data[i]; + rc->name_[(i - 2) / 2] = telegram->message_data[i - telegram->offset]; } } rc->name_[50] = '\0'; // make sure name is terminated } -// settings 0-mode, 1-tempautotemp, 3 - manualtemp, 6,7 - ? -void Connect::process_roomThermostatMode(std::shared_ptr telegram) { +// settings 0-mode, 1-tempautotemp, 3 - manualtemp, 6 - ?, 7 - childlock +// 0x0BB5, ff: data: 00 FF 00 24 01 FF 24 00 +void Connect::process_roomThermostatSettings(std::shared_ptr telegram) { auto rc = room_circuit(telegram->type_id - 0xBB5); if (rc == nullptr) { return; } - // has_enumupdate(telegram, rc->mode_, 0, {3, 1, 0}); + // has_enumupdate(telegram, rc->mode_, 0, {3, 1, 0}); // modes off, manual auto has_update(telegram, rc->mode_, 0); + // has_update(telegram, rc->tempautotemp_, 1); // FF means off + // has_update(telegram, rc->manualtemp_, 3); + has_update(telegram, rc->childlock_, 7); } // unknown telegrams, needs fetch @@ -174,6 +181,13 @@ void Connect::process_roomThermostatData(std::shared_ptr telegra } } +// schedule for all thermostats +void Connect::process_roomSchedule(std::shared_ptr telegram) { + toggle_fetch(telegram->type_id, false); // fetch only once + auto length = ((telegram->offset + telegram->message_length) > 126) ? 126 - telegram->offset : telegram->message_length; + memcpy(&schedule_[telegram->offset], telegram->message_data, length); +} + // Settings: bool Connect::set_mode(const char * value, const int8_t id) { @@ -225,5 +239,30 @@ bool Connect::set_name(const char * value, const int8_t id) { return true; } +bool Connect::set_childlock(const char * value, const int8_t id) { + auto rc = room_circuit(id - DeviceValueTAG::TAG_SRC1); + if (rc == nullptr) { + return false; + } + bool b; + if (Helpers::value2bool(value, b)) { + write_command(0xBB5 + rc->room(), b ? 1 : 0, 7, 0xBB5 + rc->room()); + return true; + } + return false; +} + +bool Connect::set_icon(const char * value, const int8_t id) { + auto rc = room_circuit(id - DeviceValueTAG::TAG_SRC1); + if (rc == nullptr) { + return false; + } + uint8_t v; + if (Helpers::value2enum(value, v, FL_(enum_icons))) { + write_command(0x0B3D + rc->room(), 0, v, 0x0B3D + rc->room()); + return true; + } + return false; +} } // namespace emsesp diff --git a/src/devices/connect.h b/src/devices/connect.h index 61df040c9..18940dc3f 100644 --- a/src/devices/connect.h +++ b/src/devices/connect.h @@ -39,6 +39,10 @@ class Connect : public EMSdevice { uint8_t mode_; char name_[51]; int16_t dewtemp_; + uint8_t childlock_; + uint8_t icon_; + // uint8_t tempautotemp_; + // uint8_t manualtemp_; uint8_t room() { return room_; @@ -54,12 +58,15 @@ class Connect : public EMSdevice { void register_device_values_room(std::shared_ptr room); void process_roomThermostat(std::shared_ptr telegram); void process_roomThermostatName(std::shared_ptr telegram); - void process_roomThermostatMode(std::shared_ptr telegram); + void process_roomThermostatSettings(std::shared_ptr telegram); void process_roomThermostatParam(std::shared_ptr telegram); void process_roomThermostatData(std::shared_ptr telegram); + void process_roomSchedule(std::shared_ptr telegram); bool set_mode(const char * value, const int8_t id); bool set_seltemp(const char * value, const int8_t id); bool set_name(const char * value, const int8_t id); + bool set_childlock(const char * value, const int8_t id); + bool set_icon(const char * value, const int8_t id); std::vector> room_circuits_; @@ -67,6 +74,7 @@ class Connect : public EMSdevice { void process_RCTime(std::shared_ptr telegram); int16_t outdoorTemp_; char dateTime_[30]; // date and time stamp + uint8_t schedule_[126]; // telegram copy }; } // namespace emsesp From 036e2917a53c6b795040dc0d6587b10ed2e8f3eb Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sun, 12 Oct 2025 11:35:24 +0200 Subject: [PATCH 02/13] SRC plus: mqtt subscribe, modbus --- interface/package.json | 4 +- interface/pnpm-lock.yaml | 80 +++++++++++++++++++-------------------- src/core/device_library.h | 1 + src/core/emsesp.cpp | 8 +++- src/devices/connect.cpp | 2 +- 5 files changed, 50 insertions(+), 45 deletions(-) diff --git a/interface/package.json b/interface/package.json index 332ff89f4..8e417f884 100644 --- a/interface/package.json +++ b/interface/package.json @@ -49,7 +49,7 @@ "@preact/compat": "^18.3.1", "@preact/preset-vite": "^2.10.2", "@trivago/prettier-plugin-sort-imports": "^5.2.2", - "@types/node": "^24.7.0", + "@types/node": "^24.7.2", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.1", "concurrently": "^9.2.1", @@ -63,5 +63,5 @@ "vite-plugin-imagemin": "^0.6.1", "vite-tsconfig-paths": "^5.1.4" }, - "packageManager": "pnpm@10.18.1+sha512.77a884a165cbba2d8d1c19e3b4880eee6d2fcabd0d879121e282196b80042351d5eb3ca0935fa599da1dc51265cc68816ad2bddd2a2de5ea9fdf92adbec7cd34" + "packageManager": "pnpm@10.18.2" } diff --git a/interface/pnpm-lock.yaml b/interface/pnpm-lock.yaml index d2303c938..f5f47a495 100644 --- a/interface/pnpm-lock.yaml +++ b/interface/pnpm-lock.yaml @@ -80,13 +80,13 @@ importers: version: 18.3.1(preact@10.27.2) '@preact/preset-vite': specifier: ^2.10.2 - version: 2.10.2(@babel/core@7.28.4)(preact@10.27.2)(vite@7.1.9(@types/node@24.7.0)(terser@5.44.0)) + version: 2.10.2(@babel/core@7.28.4)(preact@10.27.2)(vite@7.1.9(@types/node@24.7.2)(terser@5.44.0)) '@trivago/prettier-plugin-sort-imports': specifier: ^5.2.2 version: 5.2.2(prettier@3.6.2) '@types/node': - specifier: ^24.7.0 - version: 24.7.0 + specifier: ^24.7.2 + version: 24.7.2 '@types/react': specifier: ^19.2.2 version: 19.2.2 @@ -116,13 +116,13 @@ importers: version: 8.46.0(eslint@9.37.0)(typescript@5.9.3) vite: specifier: ^7.1.9 - version: 7.1.9(@types/node@24.7.0)(terser@5.44.0) + version: 7.1.9(@types/node@24.7.2)(terser@5.44.0) vite-plugin-imagemin: specifier: ^0.6.1 - version: 0.6.1(vite@7.1.9(@types/node@24.7.0)(terser@5.44.0)) + version: 0.6.1(vite@7.1.9(@types/node@24.7.2)(terser@5.44.0)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@24.7.0)(terser@5.44.0)) + version: 5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@24.7.2)(terser@5.44.0)) packages: @@ -851,8 +851,8 @@ packages: resolution: {integrity: sha512-zmPitbQ8+6zNutpwgcQuLcsEpn/Cj54Kbn7L5pX0Os5kdWplB7xPgEh/g+SWOB/qmows2gpuCaPyduq8ZZRnxA==} deprecated: This is a stub types definition. minimatch provides its own type definitions, so you do not need this installed. - '@types/node@24.7.0': - resolution: {integrity: sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==} + '@types/node@24.7.2': + resolution: {integrity: sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -1014,8 +1014,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.8.14: - resolution: {integrity: sha512-GM9c0cWWR8Ga7//Ves/9KRgTS8nLausCkP3CGiFLrnwA2CDUluXgaQqvrULoR2Ujrd/mz/lkX87F5BHFsNr5sQ==} + baseline-browser-mapping@2.8.16: + resolution: {integrity: sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==} hasBin: true bin-build@3.0.0: @@ -1104,8 +1104,8 @@ packages: resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} engines: {node: '>=0.10.0'} - caniuse-lite@1.0.30001749: - resolution: {integrity: sha512-0rw2fJOmLfnzCRbkm8EyHL8SvI2Apu5UbnQuTsJ0ClgrH8hcwFooJ1s5R0EP8o8aVrFu8++ae29Kt9/gZAZp/Q==} + caniuse-lite@1.0.30001750: + resolution: {integrity: sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ==} caw@2.0.1: resolution: {integrity: sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==} @@ -1324,8 +1324,8 @@ packages: duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} - electron-to-chromium@1.5.233: - resolution: {integrity: sha512-iUdTQSf7EFXsDdQsp8MwJz5SVk4APEFqXU/S47OtQ0YLqacSwPXdZ5vRlMX3neb07Cy2vgioNuRnWUXFwuslkg==} + electron-to-chromium@1.5.234: + resolution: {integrity: sha512-RXfEp2x+VRYn8jbKfQlRImzoJU01kyDvVPBmG39eU2iuRVhuS6vQNocB8J0/8GrIMLnPzgz4eW6WiRnJkTuNWg==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3575,18 +3575,18 @@ snapshots: dependencies: preact: 10.27.2 - '@preact/preset-vite@2.10.2(@babel/core@7.28.4)(preact@10.27.2)(vite@7.1.9(@types/node@24.7.0)(terser@5.44.0))': + '@preact/preset-vite@2.10.2(@babel/core@7.28.4)(preact@10.27.2)(vite@7.1.9(@types/node@24.7.2)(terser@5.44.0))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.4) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.4) - '@prefresh/vite': 2.4.10(preact@10.27.2)(vite@7.1.9(@types/node@24.7.0)(terser@5.44.0)) + '@prefresh/vite': 2.4.10(preact@10.27.2)(vite@7.1.9(@types/node@24.7.2)(terser@5.44.0)) '@rollup/pluginutils': 4.2.1 babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.4) debug: 4.4.3 picocolors: 1.1.1 - vite: 7.1.9(@types/node@24.7.0)(terser@5.44.0) - vite-prerender-plugin: 0.5.12(vite@7.1.9(@types/node@24.7.0)(terser@5.44.0)) + vite: 7.1.9(@types/node@24.7.2)(terser@5.44.0) + vite-prerender-plugin: 0.5.12(vite@7.1.9(@types/node@24.7.2)(terser@5.44.0)) transitivePeerDependencies: - preact - supports-color @@ -3599,7 +3599,7 @@ snapshots: '@prefresh/utils@1.2.1': {} - '@prefresh/vite@2.4.10(preact@10.27.2)(vite@7.1.9(@types/node@24.7.0)(terser@5.44.0))': + '@prefresh/vite@2.4.10(preact@10.27.2)(vite@7.1.9(@types/node@24.7.2)(terser@5.44.0))': dependencies: '@babel/core': 7.28.4 '@prefresh/babel-plugin': 0.5.2 @@ -3607,7 +3607,7 @@ snapshots: '@prefresh/utils': 1.2.1 '@rollup/pluginutils': 4.2.1 preact: 10.27.2 - vite: 7.1.9(@types/node@24.7.0)(terser@5.44.0) + vite: 7.1.9(@types/node@24.7.2)(terser@5.44.0) transitivePeerDependencies: - supports-color @@ -3712,7 +3712,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 6.0.0 - '@types/node': 24.7.0 + '@types/node': 24.7.2 '@types/imagemin-gifsicle@7.0.4': dependencies: @@ -3741,19 +3741,19 @@ snapshots: '@types/imagemin@7.0.1': dependencies: - '@types/node': 24.7.0 + '@types/node': 24.7.2 '@types/json-schema@7.0.15': {} '@types/keyv@3.1.4': dependencies: - '@types/node': 24.7.0 + '@types/node': 24.7.2 '@types/minimatch@6.0.0': dependencies: minimatch: 10.0.3 - '@types/node@24.7.0': + '@types/node@24.7.2': dependencies: undici-types: 7.14.0 @@ -3775,11 +3775,11 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 24.7.0 + '@types/node': 24.7.2 '@types/svgo@2.6.4': dependencies: - '@types/node': 24.7.0 + '@types/node': 24.7.2 '@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(typescript@5.9.3)': dependencies: @@ -3936,7 +3936,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.8.14: {} + baseline-browser-mapping@2.8.16: {} bin-build@3.0.0: dependencies: @@ -3993,9 +3993,9 @@ snapshots: browserslist@4.26.3: dependencies: - baseline-browser-mapping: 2.8.14 - caniuse-lite: 1.0.30001749 - electron-to-chromium: 1.5.233 + baseline-browser-mapping: 2.8.16 + caniuse-lite: 1.0.30001750 + electron-to-chromium: 1.5.234 node-releases: 2.0.23 update-browserslist-db: 1.1.3(browserslist@4.26.3) @@ -4053,7 +4053,7 @@ snapshots: camelcase@2.1.1: {} - caniuse-lite@1.0.30001749: {} + caniuse-lite@1.0.30001750: {} caw@2.0.1: dependencies: @@ -4340,7 +4340,7 @@ snapshots: duplexer3@0.1.5: {} - electron-to-chromium@1.5.233: {} + electron-to-chromium@1.5.234: {} emoji-regex@8.0.0: {} @@ -5936,7 +5936,7 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-plugin-imagemin@0.6.1(vite@7.1.9(@types/node@24.7.0)(terser@5.44.0)): + vite-plugin-imagemin@0.6.1(vite@7.1.9(@types/node@24.7.2)(terser@5.44.0)): dependencies: '@types/imagemin': 7.0.1 '@types/imagemin-gifsicle': 7.0.4 @@ -5961,11 +5961,11 @@ snapshots: imagemin-webp: 6.1.0 jpegtran-bin: 6.0.1 pathe: 0.2.0 - vite: 7.1.9(@types/node@24.7.0)(terser@5.44.0) + vite: 7.1.9(@types/node@24.7.2)(terser@5.44.0) transitivePeerDependencies: - supports-color - vite-prerender-plugin@0.5.12(vite@7.1.9(@types/node@24.7.0)(terser@5.44.0)): + vite-prerender-plugin@0.5.12(vite@7.1.9(@types/node@24.7.2)(terser@5.44.0)): dependencies: kolorist: 1.8.0 magic-string: 0.30.19 @@ -5973,20 +5973,20 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.6 stack-trace: 1.0.0-pre2 - vite: 7.1.9(@types/node@24.7.0)(terser@5.44.0) + vite: 7.1.9(@types/node@24.7.2)(terser@5.44.0) - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@24.7.0)(terser@5.44.0)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@24.7.2)(terser@5.44.0)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 7.1.9(@types/node@24.7.0)(terser@5.44.0) + vite: 7.1.9(@types/node@24.7.2)(terser@5.44.0) transitivePeerDependencies: - supports-color - typescript - vite@7.1.9(@types/node@24.7.0)(terser@5.44.0): + vite@7.1.9(@types/node@24.7.2)(terser@5.44.0): dependencies: esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) @@ -5995,7 +5995,7 @@ snapshots: rollup: 4.52.4 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.7.0 + '@types/node': 24.7.2 fsevents: 2.3.3 terser: 5.44.0 diff --git a/src/core/device_library.h b/src/core/device_library.h index 917b9f6ae..aa0177d2c 100644 --- a/src/core/device_library.h +++ b/src/core/device_library.h @@ -203,6 +203,7 @@ {163, DeviceType::WATER, "SM100, MS100", DeviceFlags::EMS_DEVICE_FLAG_SM100}, {164, DeviceType::WATER, "SM200, MS200", DeviceFlags::EMS_DEVICE_FLAG_SM100}, {248, DeviceType::MIXER, "HM210", DeviceFlags::EMS_DEVICE_FLAG_MMPLUS} +{17, DeviceType::CONNECT, "MX400", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x50 Wirelss Base // {157, DeviceType::THERMOSTAT, "RC120", DeviceFlags::EMS_DEVICE_FLAG_CR120} #endif diff --git a/src/core/emsesp.cpp b/src/core/emsesp.cpp index 8f45309e1..ee1c68efe 100644 --- a/src/core/emsesp.cpp +++ b/src/core/emsesp.cpp @@ -362,6 +362,10 @@ void EMSESP::dump_all_entities(uuid::console::Shell & shell) { if (device.device_type == DeviceType::HEATSOURCE) { device_id = EMSdevice::EMS_DEVICE_ID_AHS1; } + // For MX400 SRC plus base + if (device.device_type == DeviceType::CONNECT && device.product_id == 17) { + device_id = EMSdevice::EMS_DEVICE_ID_RFBASE; + } // add the device and print out all the entities // for testing the mixer use ... if (device.product_id == 69) { @@ -1414,8 +1418,8 @@ bool EMSESP::add_device(const uint8_t device_id, const uint8_t product_id, const LOG_INFO("Detected EMS device: %s (0x%02X)", EMSdevice::device_type_2_device_name(device_type), device_id); // register the MQTT subscribe topic for this device - // except for connect, controller and gateway - if ((device_type == DeviceType::CONNECT) || (device_type == DeviceType::CONTROLLER) || (device_type == DeviceType::GATEWAY)) { + // except for controller and gateway + if ((device_type == DeviceType::CONTROLLER) || (device_type == DeviceType::GATEWAY)) { return true; } diff --git a/src/devices/connect.cpp b/src/devices/connect.cpp index c8995be18..f9db117a7 100644 --- a/src/devices/connect.cpp +++ b/src/devices/connect.cpp @@ -24,7 +24,7 @@ REGISTER_FACTORY(Connect, EMSdevice::DeviceType::CONNECT); Connect::Connect(uint8_t device_type, uint8_t device_id, uint8_t product_id, const char * version, const char * name, uint8_t flags, uint8_t brand) : EMSdevice(device_type, device_id, product_id, version, name, flags, brand) { - if (device_id == 0x02) { // Modems have no entities + if (device_id != EMSdevice::EMS_DEVICE_ID_RFBASE) { // Modems have no entities return; } register_telegram_type(0xD1, "RFOutdoorTemp", false, MAKE_PF_CB(process_OutdoorTemp)); From f0f40bbcac70a79f66150b888cee26e6bd87566b Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 13 Oct 2025 08:39:10 +0200 Subject: [PATCH 03/13] fix src commands, icon --- src/core/command.cpp | 10 +++++----- src/core/emsdevice.cpp | 2 +- src/core/locale_translations.h | 24 ++++++++++++------------ src/devices/connect.cpp | 4 ++-- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/core/command.cpp b/src/core/command.cpp index 22876611f..ad4cc1fe6 100644 --- a/src/core/command.cpp +++ b/src/core/command.cpp @@ -271,12 +271,12 @@ const char * Command::parse_command_string(const char * command, int8_t & id) { } else if (!strncmp(lowerCmd, "hs", 2) && command[2] >= '1' && command[2] <= '9') { id = command[2] - '1' + DeviceValueTAG::TAG_HS1; //20; command += 3; - } else if (!strncmp(lowerCmd, "src", 3) && command[2] == '1' && command[3] >= '0' && command[3] <= '6') { - id = command[3] - '0' + DeviceValueTAG::TAG_SRC10; //46; + } else if (!strncmp(lowerCmd, "src", 3) && command[3] == '1' && command[4] >= '0' && command[4] <= '6') { + id = command[4] - '0' + DeviceValueTAG::TAG_SRC10; //46; + command += 5; + } else if (!strncmp(lowerCmd, "src", 3) && command[3] >= '1' && command[3] <= '9') { + id = command[3] - '1' + DeviceValueTAG::TAG_SRC1; //36; command += 4; - } else if (!strncmp(lowerCmd, "src", 3) && command[2] >= '1' && command[2] <= '9') { - id = command[2] - '1' + DeviceValueTAG::TAG_SRC1; //36; - command += 3; } else if (!strncmp(lowerCmd, "dhw", 3)) { // no number id = DeviceValueTAG::TAG_DHW1; command += 3; diff --git a/src/core/emsdevice.cpp b/src/core/emsdevice.cpp index 1ff7452a9..f8b3e703e 100644 --- a/src/core/emsdevice.cpp +++ b/src/core/emsdevice.cpp @@ -1902,7 +1902,7 @@ void EMSdevice::mqtt_ha_entity_config_create() { count++; } // SRC thermostats mapped to connect/src1/... - if (dv.tag >= DeviceValueTAG::TAG_SRC1 && !strcmp(dv.short_name, FL_(roomtemp)[0])) { + if (dv.tag >= DeviceValueTAG::TAG_SRC1 && dv.tag <= DeviceValueTAG::TAG_SRC16 && !strcmp(dv.short_name, FL_(roomtemp)[0])) { Mqtt::publish_ha_climate_config(dv.tag, true, false, dv.min, dv.max); } diff --git a/src/core/locale_translations.h b/src/core/locale_translations.h index e260431f4..df326cc0f 100644 --- a/src/core/locale_translations.h +++ b/src/core/locale_translations.h @@ -337,18 +337,18 @@ MAKE_WORD_TRANSLATION(partymode, "party", "Party", "party", "party", "impreza", MAKE_WORD_TRANSLATION(fireplace, "fireplace", "Kamin", "haard", "Kamin", "kominek", "", "", "şömine", "camino", "krb", "") // TODO translate // SRC plus -MAKE_WORD_TRANSLATION(chefhat, "mdi:chef-hat") -MAKE_WORD_TRANSLATION(sofasingle, "mdi:sofa-single-outline") -MAKE_WORD_TRANSLATION(bowlmix, "mdi:bowl-mix-outline") -MAKE_WORD_TRANSLATION(bedsingle, "mdi:bed-single-outline") -MAKE_WORD_TRANSLATION(beddouble, "mdi:bed-double-outline") -MAKE_WORD_TRANSLATION(teddybear, "mdi:teddy-bear") -MAKE_WORD_TRANSLATION(shower, "mdi:shower") -MAKE_WORD_TRANSLATION(laptop, "mdi:laptop") -MAKE_WORD_TRANSLATION(door, "mdi:door") -MAKE_WORD_TRANSLATION(palette, "mdi:palette-outline") -MAKE_WORD_TRANSLATION(washingmachine, "mdi:washing-machine") -MAKE_WORD_TRANSLATION(bookshelf, "mdi:bookshelf") +MAKE_WORD_TRANSLATION(chefhat, "mdi:chef-hat", "mdi:chef-hat") +MAKE_WORD_TRANSLATION(sofasingle, "mdi:sofa-single-outline", "mdi:sofa-single-outline") +MAKE_WORD_TRANSLATION(bowlmix, "mdi:bowl-mix-outline", "mdi:bowl-mix-outline") +MAKE_WORD_TRANSLATION(bedsingle, "mdi:bed-single-outline", "mdi:bed-single-outline") +MAKE_WORD_TRANSLATION(beddouble, "mdi:bed-double-outline", "mdi:bed-double-outline") +MAKE_WORD_TRANSLATION(teddybear, "mdi:teddy-bear", "mdi:teddy-bear") +MAKE_WORD_TRANSLATION(shower, "mdi:shower", "mdi:shower") +MAKE_WORD_TRANSLATION(laptop, "mdi:laptop", "mdi:laptop") +MAKE_WORD_TRANSLATION(door, "mdi:door", "mdi:door") +MAKE_WORD_TRANSLATION(palette, "mdi:palette-outline", "mdi:palette-outline") +MAKE_WORD_TRANSLATION(washingmachine, "mdi:washing-machine", "mdi:washing-machine") +MAKE_WORD_TRANSLATION(bookshelf, "mdi:bookshelf", "mdi:bookshelf") // MQTT Discovery - this is special device entity for 'climate' MAKE_TRANSLATION(haclimate, "haclimate", "mqtt discovery current room temperature", "Discovery aktuelle Raumtemperatur", "Discovery huidige kamertemperatuur", "MQTT Discovery för aktuell rumstemperatur", "termostat w HA", "HA Avlest temp", "", "Güncel osa sıcaklığı", "verifica temperatura ambiente attuale", "mqtt discovery aktuálna teplota v miestnosti", "mqtt discovery aktuální pokojová teplota") // TODO translate diff --git a/src/devices/connect.cpp b/src/devices/connect.cpp index f9db117a7..268b24558 100644 --- a/src/devices/connect.cpp +++ b/src/devices/connect.cpp @@ -90,7 +90,7 @@ void Connect::register_device_values_room(std::shared_ptr register_device_value(tag, &room->mode_, DeviceValueType::ENUM, FL_(enum_mode8), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); register_device_value(tag, &room->name_, DeviceValueType::STRING, FL_(name), DeviceValueUOM::NONE, MAKE_CF_CB(set_name)); register_device_value(tag, &room->childlock_, DeviceValueType::BOOL, FL_(childlock), DeviceValueUOM::NONE, MAKE_CF_CB(set_childlock)); - register_device_value(tag, &room->icon_, DeviceValueType::ENUM, FL_(enum_icons), FL_(icon), DeviceValueUOM::NONE, MAKE_CF_CB(set_icon), 0, 12); + register_device_value(tag, &room->icon_, DeviceValueType::ENUM, FL_(enum_icons), FL_(icon), DeviceValueUOM::NONE, MAKE_CF_CB(set_icon)); } std::shared_ptr Connect::room_circuit(const uint8_t num, const bool create) { @@ -142,7 +142,7 @@ void Connect::process_roomThermostatName(std::shared_ptr telegra if (rc == nullptr) { return; } - has_update(rc->icon_, 0); + has_update(telegram, rc->icon_, 0); for (uint8_t i = telegram->offset; i < telegram->message_length + telegram->offset && i < 100; i++) { if ((i > 1) && (i % 2) == 0) { rc->name_[(i - 2) / 2] = telegram->message_data[i - telegram->offset]; From 47b3e4bf00b4c4f817a1902c318add64a95aecb2 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 13 Oct 2025 19:58:25 +0200 Subject: [PATCH 04/13] fix srcx/seltemp --- src/core/command.cpp | 2 ++ src/devices/connect.cpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/command.cpp b/src/core/command.cpp index ad4cc1fe6..2a58aef7e 100644 --- a/src/core/command.cpp +++ b/src/core/command.cpp @@ -570,6 +570,8 @@ std::string Command::tagged_cmd(const std::string & cmd, const uint8_t flag) { return "hs." + cmd; case CommandFlag::CMD_FLAG_AHS: return "ahs." + cmd; + case CommandFlag::CMD_FLAG_SRC: + return "src." + cmd; default: return cmd; } diff --git a/src/devices/connect.cpp b/src/devices/connect.cpp index 268b24558..0d619ce75 100644 --- a/src/devices/connect.cpp +++ b/src/devices/connect.cpp @@ -86,7 +86,7 @@ void Connect::register_device_values_room(std::shared_ptr register_device_value(tag, &room->humidity_, DeviceValueType::INT8, FL_(airHumidity), DeviceValueUOM::PERCENT); register_device_value(tag, &room->dewtemp_, DeviceValueType::INT16, DeviceValueNumOp::DV_NUMOP_DIV10, FL_(dewTemperature), DeviceValueUOM::DEGREES); register_device_value( - tag, &room->seltemp_, DeviceValueType::UINT8, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(seltemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_seltemp), 5, 30); + tag, &room->seltemp_, DeviceValueType::UINT8, DeviceValueNumOp::DV_NUMOP_DIV2, FL_(selRoomTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_seltemp), 5, 30); register_device_value(tag, &room->mode_, DeviceValueType::ENUM, FL_(enum_mode8), FL_(mode), DeviceValueUOM::NONE, MAKE_CF_CB(set_mode)); register_device_value(tag, &room->name_, DeviceValueType::STRING, FL_(name), DeviceValueUOM::NONE, MAKE_CF_CB(set_name)); register_device_value(tag, &room->childlock_, DeviceValueType::BOOL, FL_(childlock), DeviceValueUOM::NONE, MAKE_CF_CB(set_childlock)); From 12b06aa657863378d160e07bcd2b9f11c46110a3 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Mon, 13 Oct 2025 21:46:22 +0200 Subject: [PATCH 05/13] fix mqtt climatefor SRC --- src/core/emsdevice.cpp | 2 +- src/core/mqtt.cpp | 14 ++++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/core/emsdevice.cpp b/src/core/emsdevice.cpp index f8b3e703e..d94cea415 100644 --- a/src/core/emsdevice.cpp +++ b/src/core/emsdevice.cpp @@ -1902,7 +1902,7 @@ void EMSdevice::mqtt_ha_entity_config_create() { count++; } // SRC thermostats mapped to connect/src1/... - if (dv.tag >= DeviceValueTAG::TAG_SRC1 && dv.tag <= DeviceValueTAG::TAG_SRC16 && !strcmp(dv.short_name, FL_(roomtemp)[0])) { + if (dv.tag >= DeviceValueTAG::TAG_SRC1 && dv.tag <= DeviceValueTAG::TAG_SRC16 && !strcmp(dv.short_name, FL_(roomTemp)[0])) { Mqtt::publish_ha_climate_config(dv.tag, true, false, dv.min, dv.max); } diff --git a/src/core/mqtt.cpp b/src/core/mqtt.cpp index 37e25a22b..880d51f78 100644 --- a/src/core/mqtt.cpp +++ b/src/core/mqtt.cpp @@ -1238,9 +1238,10 @@ void Mqtt::add_ha_classes(JsonObject doc, const uint8_t device_type, const uint8 } bool Mqtt::publish_ha_climate_config(const int8_t tag, const bool has_roomtemp, const bool remove, const int16_t min, const uint32_t max) { - uint8_t hc_num = tag < DeviceValueTAG::TAG_HS1 ? tag : tag - DeviceValueTAG::TAG_HS1 + 1; - const char * devicename = tag < DeviceValueTAG::TAG_HS1 ? "thermostat" : "connect"; - const char * tagname = tag < DeviceValueTAG::TAG_HS1 ? "hc" : "hs"; + uint8_t hc_num = tag < DeviceValueTAG::TAG_SRC1 ? tag : tag - DeviceValueTAG::TAG_SRC1 + 1; + const char * tagname = tag < DeviceValueTAG::TAG_SRC1 ? "hc" : "src"; + const uint device_type = tag < DeviceValueTAG::TAG_SRC1 ? EMSdevice::DeviceType::THERMOSTAT : EMSdevice::DeviceType::CONNECT; + const char * devicename = EMSdevice::device_type_2_device_name(device_type); char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; char topic_t[Mqtt::MQTT_TOPIC_MAX_SIZE]; @@ -1274,7 +1275,7 @@ bool Mqtt::publish_ha_climate_config(const int8_t tag, const bool has_roomtemp, snprintf(currtemp_s, sizeof(currtemp_s), "value_json.%s%d.currtemp", tagname, hc_num); snprintf(currtemp_cond, sizeof(currtemp_cond), "value_json.%s%d is defined and %s is defined", tagname, hc_num, currtemp_s); } - snprintf(topic_t, sizeof(topic_t), "~/%s", Mqtt::tag_to_topic(EMSdevice::DeviceType::THERMOSTAT, DeviceValueTAG::TAG_NONE).c_str()); + snprintf(topic_t, sizeof(topic_t), "~/%s", Mqtt::tag_to_topic(device_type, DeviceValueTAG::TAG_NONE).c_str()); } else { // single format snprintf(hc_mode_s, sizeof(hc_mode_s), "value_json.mode"); @@ -1286,10 +1287,7 @@ bool Mqtt::publish_ha_climate_config(const int8_t tag, const bool has_roomtemp, snprintf(currtemp_s, sizeof(currtemp_s), "value_json.currtemp"); snprintf(currtemp_cond, sizeof(currtemp_cond), "%s is defined", currtemp_s); } - snprintf(topic_t, - sizeof(topic_t), - "~/%s", - Mqtt::tag_to_topic(tag < DeviceValueTAG::TAG_HS1 ? EMSdevice::DeviceType::THERMOSTAT : EMSdevice::DeviceType::CONNECT, tag).c_str()); + snprintf(topic_t, sizeof(topic_t), "~/%s", Mqtt::tag_to_topic(device_type, tag).c_str()); } snprintf(mode_str_tpl, From 9d0405898432ca03943160446299ee1e44c2729e Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Tue, 14 Oct 2025 08:30:52 +0200 Subject: [PATCH 06/13] add back `obj_id` for HA test --- src/core/analogsensor.cpp | 3 +- src/core/mqtt.cpp | 45 ++++++++++++++++-------------- src/core/shower.cpp | 10 ++++--- src/core/temperaturesensor.cpp | 5 ++-- src/web/WebCustomEntityService.cpp | 3 +- src/web/WebSchedulerService.cpp | 7 +++-- 6 files changed, 41 insertions(+), 32 deletions(-) diff --git a/src/core/analogsensor.cpp b/src/core/analogsensor.cpp index a1a39b6a7..771c876e6 100644 --- a/src/core/analogsensor.cpp +++ b/src/core/analogsensor.cpp @@ -701,6 +701,7 @@ void AnalogSensor::publish_values(const bool force) { } config["uniq_id"] = uniq_s; + config["obj_id"] = uniq_s; char name[50]; snprintf(name, sizeof(name), "%s", sensor.name().c_str()); @@ -773,7 +774,7 @@ void AnalogSensor::publish_values(const bool force) { // add default_entity_id std::string topic_str(topic); - doc["default_entity_id"] = topic_str.substr(0, topic_str.find("/")) + "." + uniq_s; + doc["def_ent_id"] = topic_str.substr(0, topic_str.find("/")) + "." + uniq_s; Mqtt::add_ha_dev_section(config.as(), "Analog Sensors", nullptr, nullptr, nullptr, false); Mqtt::add_ha_avail_section(config.as(), stat_t, !is_ha_device_created, val_cond); diff --git a/src/core/mqtt.cpp b/src/core/mqtt.cpp index 880d51f78..8e5c40032 100644 --- a/src/core/mqtt.cpp +++ b/src/core/mqtt.cpp @@ -528,15 +528,16 @@ void Mqtt::ha_status() { strcpy(uniq, "system_status"); } - doc["uniq_id"] = uniq; - doc["default_entity_id"] = (std::string) "binary_sensor." + uniq; - doc["stat_t"] = Mqtt::base() + "/status"; - doc["name"] = "System status"; - doc["pl_on"] = "online"; - doc["pl_off"] = "offline"; - doc["stat_cla"] = "measurement"; - doc["dev_cla"] = "connectivity"; - doc["ent_cat"] = "diagnostic"; + doc["uniq_id"] = uniq; + doc["onj_id"] = uniq; + doc["def_ent_id"] = (std::string) "binary_sensor." + uniq; + doc["stat_t"] = Mqtt::base() + "/status"; + doc["name"] = "System status"; + doc["pl_on"] = "online"; + doc["pl_off"] = "offline"; + doc["stat_cla"] = "measurement"; + doc["dev_cla"] = "connectivity"; + doc["ent_cat"] = "diagnostic"; // doc["avty_t"] = "~/status"; // commented out, as it causes errors in HA sometimes // doc["json_attr_t"] = "~/heartbeat"; // store also as HA attributes @@ -980,11 +981,12 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev // build the full payload JsonDocument doc; doc["uniq_id"] = uniq_id; + doc["onj_id"] = uniq_id; // set the entity_id. This is breaking change in HA 2025.10.0 - see https://github.com/home-assistant/core/pull/151775 // extract the string from topic up to the / using std::string std::string topic_str(topic); - doc["default_entity_id"] = topic_str.substr(0, topic_str.find("/")) + "." + uniq_id; + doc["def_ent_id"] = topic_str.substr(0, topic_str.find("/")) + "." + uniq_id; char sample_val[30] = "0"; // sample, correct(!) entity value, used only to prevent warning/error in HA if real value is not published yet @@ -1316,15 +1318,16 @@ bool Mqtt::publish_ha_climate_config(const int8_t tag, const bool has_roomtemp, JsonDocument doc; - doc["~"] = Mqtt::base(); - doc["uniq_id"] = uniq_id_s; - doc["default_entity_id"] = (std::string) "climate." + uniq_id_s; - doc["name"] = name_s; - doc["mode_stat_t"] = topic_t; - doc["mode_stat_tpl"] = mode_str_tpl; - doc["temp_cmd_t"] = temp_cmd_s; - doc["temp_stat_t"] = topic_t; - doc["temp_stat_tpl"] = (std::string) "{{" + seltemp_s + " if " + seltemp_cond + " else 0}}"; + doc["~"] = Mqtt::base(); + doc["uniq_id"] = uniq_id_s; + doc["obj_id"] = uniq_id_s; + doc["def_ent_id"] = (std::string) "climate." + uniq_id_s; + doc["name"] = name_s; + doc["mode_stat_t"] = topic_t; + doc["mode_stat_tpl"] = mode_str_tpl; + doc["temp_cmd_t"] = temp_cmd_s; + doc["temp_stat_t"] = topic_t; + doc["temp_stat_tpl"] = (std::string) "{{" + seltemp_s + " if " + seltemp_cond + " else 0}}"; if (has_roomtemp) { doc["curr_temp_t"] = topic_t; @@ -1337,8 +1340,8 @@ bool Mqtt::publish_ha_climate_config(const int8_t tag, const bool has_roomtemp, doc["mode_cmd_t"] = mode_cmd_s; // add hvac_action - https://github.com/emsesp/EMS-ESP32/discussions/2562 - doc["action_topic"] = "~/boiler_data"; - doc["action_template"] = "{% if value_json.hpactivity=='cooling'%}cooling{%elif value_json.heatingactive=='on'%}heating{%else%}idle{%endif%}"; + doc["act_t"] = "~/boiler_data"; + doc["act_tpl"] = "{% if value_json.hpactivity=='cooling'%}cooling{%elif value_json.heatingactive=='on'%}heating{%else%}idle{%endif%}"; // the HA climate component only responds to auto, heat and off JsonArray modes = doc["modes"].to(); diff --git a/src/core/shower.cpp b/src/core/shower.cpp index 3946171f3..fa3f5d673 100644 --- a/src/core/shower.cpp +++ b/src/core/shower.cpp @@ -205,8 +205,9 @@ void Shower::create_ha_discovery() { } else { snprintf(str, sizeof(str), "shower_active"); // v3.4 compatible } - doc["uniq_id"] = str; - doc["default_entity_id"] = (std::string) "binary_sensor." + str; + doc["uniq_id"] = str; + doc["obj_id"] = str; + doc["def_ent_id"] = (std::string) "binary_sensor." + str; snprintf(stat_t, sizeof(stat_t), "%s/shower_active", Mqtt::base().c_str()); doc["stat_t"] = stat_t; @@ -223,8 +224,9 @@ void Shower::create_ha_discovery() { snprintf(str, sizeof(str), "%s_shower_duration", Mqtt::basename().c_str()); - doc["uniq_id"] = str; - doc["default_entity_id"] = (std::string) "sensor." + str; + doc["uniq_id"] = str; + doc["obj_id"] = str; + doc["def_ent_id"] = (std::string) "sensor." + str; snprintf(stat_t, sizeof(stat_t), "%s/shower_data", Mqtt::base().c_str()); doc["stat_t"] = stat_t; diff --git a/src/core/temperaturesensor.cpp b/src/core/temperaturesensor.cpp index 8e17ef4f4..039cda598 100644 --- a/src/core/temperaturesensor.cpp +++ b/src/core/temperaturesensor.cpp @@ -531,8 +531,9 @@ void TemperatureSensor::publish_values(const bool force) { snprintf(uniq_s, sizeof(uniq_s), "%s_%s", F_(temperaturesensor), sensor.id().c_str()); } - config["uniq_id"] = uniq_s; - config["default_entity_id"] = (std::string) "sensor." + uniq_s; + config["uniq_id"] = uniq_s; + config["obj_id"] = uniq_s; + config["def_ent_id"] = (std::string) "sensor." + uniq_s; char name[50]; snprintf(name, sizeof(name), "%s", sensor.name().c_str()); diff --git a/src/web/WebCustomEntityService.cpp b/src/web/WebCustomEntityService.cpp index 8311ce2c5..61c8e8c77 100644 --- a/src/web/WebCustomEntityService.cpp +++ b/src/web/WebCustomEntityService.cpp @@ -430,6 +430,7 @@ void WebCustomEntityService::publish(const bool force) { snprintf(uniq_s, sizeof(uniq_s), "%s_%s", F_(custom), entityItem.name.c_str()); config["uniq_id"] = uniq_s; + config["obj_id"] = uniq_s; config["name"] = entityItem.name.c_str(); char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; @@ -462,7 +463,7 @@ void WebCustomEntityService::publish(const bool force) { // add default_entity_id std::string topic_str(topic); - config["default_entity_id"] = topic_str.substr(0, topic_str.find("/")) + "." + uniq_s; + config["def_ent_id"] = topic_str.substr(0, topic_str.find("/")) + "." + uniq_s; Mqtt::add_ha_classes(config.as(), EMSdevice::DeviceType::SYSTEM, entityItem.value_type, entityItem.uom); Mqtt::add_ha_dev_section(config.as(), "Custom Entities", nullptr, nullptr, nullptr, false); diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp index 73813042e..e78aac6c6 100644 --- a/src/web/WebSchedulerService.cpp +++ b/src/web/WebSchedulerService.cpp @@ -282,9 +282,10 @@ void WebSchedulerService::publish(const bool force) { char uniq_s[70]; snprintf(uniq_s, sizeof(uniq_s), "%s_%s", F_(scheduler), scheduleItem.name.c_str()); - config["uniq_id"] = uniq_s; - config["name"] = scheduleItem.name.c_str(); - config["default_entity_id"] = (std::string) "switch." + uniq_s; + config["uniq_id"] = uniq_s; + config["obj_id"] = uniq_s; + config["name"] = scheduleItem.name.c_str(); + config["def_ent_id"] = (std::string) "switch." + uniq_s; char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; char command_topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; From 187b163ffda3263edf45f7192bf50a19d90a69ba Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Tue, 14 Oct 2025 18:56:19 +0200 Subject: [PATCH 07/13] add testdata, use selRoomTemp for climate --- src/core/emsdevice.cpp | 2 +- src/core/mqtt.cpp | 8 ++++---- src/test/test.cpp | 20 ++++++++++++++++++++ src/test/test.h | 1 + 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/core/emsdevice.cpp b/src/core/emsdevice.cpp index d94cea415..36992c1e8 100644 --- a/src/core/emsdevice.cpp +++ b/src/core/emsdevice.cpp @@ -1902,7 +1902,7 @@ void EMSdevice::mqtt_ha_entity_config_create() { count++; } // SRC thermostats mapped to connect/src1/... - if (dv.tag >= DeviceValueTAG::TAG_SRC1 && dv.tag <= DeviceValueTAG::TAG_SRC16 && !strcmp(dv.short_name, FL_(roomTemp)[0])) { + if (dv.tag >= DeviceValueTAG::TAG_SRC1 && dv.tag <= DeviceValueTAG::TAG_SRC16 && !strcmp(dv.short_name, FL_(selRoomTemp)[0])) { Mqtt::publish_ha_climate_config(dv.tag, true, false, dv.min, dv.max); } diff --git a/src/core/mqtt.cpp b/src/core/mqtt.cpp index 8e5c40032..130838116 100644 --- a/src/core/mqtt.cpp +++ b/src/core/mqtt.cpp @@ -1240,10 +1240,10 @@ void Mqtt::add_ha_classes(JsonObject doc, const uint8_t device_type, const uint8 } bool Mqtt::publish_ha_climate_config(const int8_t tag, const bool has_roomtemp, const bool remove, const int16_t min, const uint32_t max) { - uint8_t hc_num = tag < DeviceValueTAG::TAG_SRC1 ? tag : tag - DeviceValueTAG::TAG_SRC1 + 1; - const char * tagname = tag < DeviceValueTAG::TAG_SRC1 ? "hc" : "src"; - const uint device_type = tag < DeviceValueTAG::TAG_SRC1 ? EMSdevice::DeviceType::THERMOSTAT : EMSdevice::DeviceType::CONNECT; - const char * devicename = EMSdevice::device_type_2_device_name(device_type); + uint8_t hc_num = tag < DeviceValueTAG::TAG_SRC1 ? tag : tag - DeviceValueTAG::TAG_SRC1 + 1; + const char * tagname = tag < DeviceValueTAG::TAG_SRC1 ? "hc" : "src"; + const uint8_t device_type = tag < DeviceValueTAG::TAG_SRC1 ? EMSdevice::DeviceType::THERMOSTAT : EMSdevice::DeviceType::CONNECT; + const char * devicename = EMSdevice::device_type_2_device_name(device_type); char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; char topic_t[Mqtt::MQTT_TOPIC_MAX_SIZE]; diff --git a/src/test/test.cpp b/src/test/test.cpp index ac46e17ae..59927e424 100644 --- a/src/test/test.cpp +++ b/src/test/test.cpp @@ -260,6 +260,26 @@ bool Test::test(const std::string & cmd, int8_t id1, int8_t id2) { return true; } + if (cmd == "src") { + EMSESP::logger().notice("Adding SRC plus thermostat..."); + + add_device(0x50, 17); // MX400 module + uart_telegram("50 00 FF 00 0A DD 00 E6 36 2A"); // monitor, temperatures + uart_telegram("50 00 FF 00 0A B5 00 FF 00 24 01 FF 24 00"); // mode, childlock + // switchprogram + uart_telegram("50 00 FF 00 0A 65 2A 00 3C 2A FF FF 2A FF FF 2A FF FF 2A FF FF 2A FF FF"); + uart_telegram("50 00 FF 12 0A 65 2A 00 3C 2A FF FF 2A FF FF 2A FF FF 2A FF FF 2A FF FF"); + uart_telegram("50 00 FF 24 0A 65 2A 00 3C 2A FF FF 2A FF FF 2A FF FF 2A FF FF 2A FF FF"); + uart_telegram("50 00 FF 36 0A 65 2A 00 3C 2A FF FF 2A FF FF 2A FF FF 2A FF FF 2A FF FF"); + uart_telegram("50 00 FF 48 0A 65 2A 00 3C 2A FF FF 2A FF FF 2A FF FF 2A FF FF 2A FF FF"); + uart_telegram("50 00 FF 5A 0A 65 2A 00 3C 2A FF FF 2A FF FF 2A FF FF 2A FF FF 2A FF FF"); + uart_telegram("50 00 FF 6C 0A 65 2A 00 3C 20 01 08 2A FF FF 2A FF FF 2A FF FF 2A FF FF"); + // icon ,name + uart_telegram("50 00 FF 00 0A 3D 01 00 4B 00 FC 00 63 00 68 00 65 00 00 00 00 00 00 00 00 00"); + + return true; + } + #endif return false; diff --git a/src/test/test.h b/src/test/test.h index 952730d6a..77e1da771 100644 --- a/src/test/test.h +++ b/src/test/test.h @@ -63,6 +63,7 @@ namespace emsesp { // #define EMSESP_DEBUG_DEFAULT "upload" // #define EMSESP_DEBUG_DEFAULT "hpmode" #define EMSESP_DEBUG_DEFAULT "shuntingyard" +// #define EMSESP_DEBUG_DEFAULT "src" #ifndef EMSESP_DEBUG_DEFAULT #define EMSESP_DEBUG_DEFAULT "general" From 96e5251050435a3764cd138cf92772aff3b1a34a Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 15 Oct 2025 07:58:14 +0200 Subject: [PATCH 08/13] typo --- src/core/mqtt.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/mqtt.cpp b/src/core/mqtt.cpp index 130838116..5904664fc 100644 --- a/src/core/mqtt.cpp +++ b/src/core/mqtt.cpp @@ -529,7 +529,7 @@ void Mqtt::ha_status() { } doc["uniq_id"] = uniq; - doc["onj_id"] = uniq; + doc["obj_id"] = uniq; doc["def_ent_id"] = (std::string) "binary_sensor." + uniq; doc["stat_t"] = Mqtt::base() + "/status"; doc["name"] = "System status"; @@ -981,7 +981,7 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev // build the full payload JsonDocument doc; doc["uniq_id"] = uniq_id; - doc["onj_id"] = uniq_id; + doc["obj_id"] = uniq_id; // set the entity_id. This is breaking change in HA 2025.10.0 - see https://github.com/home-assistant/core/pull/151775 // extract the string from topic up to the / using std::string From 88e4ba7ecf59bc37480ff5ac7cb2d9103224910e Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 15 Oct 2025 09:03:45 +0200 Subject: [PATCH 09/13] update pkg --- interface/package.json | 8 +- interface/pnpm-lock.yaml | 402 +++++++++++++++++++-------------------- 2 files changed, 205 insertions(+), 205 deletions(-) diff --git a/interface/package.json b/interface/package.json index 8e417f884..f03121112 100644 --- a/interface/package.json +++ b/interface/package.json @@ -51,17 +51,17 @@ "@trivago/prettier-plugin-sort-imports": "^5.2.2", "@types/node": "^24.7.2", "@types/react": "^19.2.2", - "@types/react-dom": "^19.2.1", + "@types/react-dom": "^19.2.2", "concurrently": "^9.2.1", "eslint": "^9.37.0", "eslint-config-prettier": "^10.1.8", "prettier": "^3.6.2", "rollup-plugin-visualizer": "^6.0.4", "terser": "^5.44.0", - "typescript-eslint": "^8.46.0", - "vite": "^7.1.9", + "typescript-eslint": "^8.46.1", + "vite": "^7.1.10", "vite-plugin-imagemin": "^0.6.1", "vite-tsconfig-paths": "^5.1.4" }, - "packageManager": "pnpm@10.18.2" + "packageManager": "pnpm@10.18.3" } diff --git a/interface/pnpm-lock.yaml b/interface/pnpm-lock.yaml index f5f47a495..25ad8cdb5 100644 --- a/interface/pnpm-lock.yaml +++ b/interface/pnpm-lock.yaml @@ -80,7 +80,7 @@ importers: version: 18.3.1(preact@10.27.2) '@preact/preset-vite': specifier: ^2.10.2 - version: 2.10.2(@babel/core@7.28.4)(preact@10.27.2)(vite@7.1.9(@types/node@24.7.2)(terser@5.44.0)) + version: 2.10.2(@babel/core@7.28.4)(preact@10.27.2)(vite@7.1.10(@types/node@24.7.2)(terser@5.44.0)) '@trivago/prettier-plugin-sort-imports': specifier: ^5.2.2 version: 5.2.2(prettier@3.6.2) @@ -91,8 +91,8 @@ importers: specifier: ^19.2.2 version: 19.2.2 '@types/react-dom': - specifier: ^19.2.1 - version: 19.2.1(@types/react@19.2.2) + specifier: ^19.2.2 + version: 19.2.2(@types/react@19.2.2) concurrently: specifier: ^9.2.1 version: 9.2.1 @@ -112,17 +112,17 @@ importers: specifier: ^5.44.0 version: 5.44.0 typescript-eslint: - specifier: ^8.46.0 - version: 8.46.0(eslint@9.37.0)(typescript@5.9.3) + specifier: ^8.46.1 + version: 8.46.1(eslint@9.37.0)(typescript@5.9.3) vite: - specifier: ^7.1.9 - version: 7.1.9(@types/node@24.7.2)(terser@5.44.0) + specifier: ^7.1.10 + version: 7.1.10(@types/node@24.7.2)(terser@5.44.0) vite-plugin-imagemin: specifier: ^0.6.1 - version: 0.6.1(vite@7.1.9(@types/node@24.7.2)(terser@5.44.0)) + version: 0.6.1(vite@7.1.10(@types/node@24.7.2)(terser@5.44.0)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@24.7.2)(terser@5.44.0)) + version: 5.1.4(typescript@5.9.3)(vite@7.1.10(@types/node@24.7.2)(terser@5.44.0)) packages: @@ -285,68 +285,68 @@ packages: '@emotion/weak-memoize@0.4.0': resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} - '@esbuild/aix-ppc64@0.25.10': - resolution: {integrity: sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==} + '@esbuild/aix-ppc64@0.25.11': + resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.10': - resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} + '@esbuild/android-arm64@0.25.11': + resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.10': - resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} + '@esbuild/android-arm@0.25.11': + resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.10': - resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} + '@esbuild/android-x64@0.25.11': + resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.10': - resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} + '@esbuild/darwin-arm64@0.25.11': + resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.10': - resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} + '@esbuild/darwin-x64@0.25.11': + resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.10': - resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} + '@esbuild/freebsd-arm64@0.25.11': + resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.10': - resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} + '@esbuild/freebsd-x64@0.25.11': + resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.10': - resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} + '@esbuild/linux-arm64@0.25.11': + resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.10': - resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} + '@esbuild/linux-arm@0.25.11': + resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.10': - resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} + '@esbuild/linux-ia32@0.25.11': + resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -357,92 +357,92 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.10': - resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} + '@esbuild/linux-loong64@0.25.11': + resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.10': - resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} + '@esbuild/linux-mips64el@0.25.11': + resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.10': - resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} + '@esbuild/linux-ppc64@0.25.11': + resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.10': - resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} + '@esbuild/linux-riscv64@0.25.11': + resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.10': - resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} + '@esbuild/linux-s390x@0.25.11': + resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.10': - resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} + '@esbuild/linux-x64@0.25.11': + resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.10': - resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} + '@esbuild/netbsd-arm64@0.25.11': + resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.10': - resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} + '@esbuild/netbsd-x64@0.25.11': + resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.10': - resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} + '@esbuild/openbsd-arm64@0.25.11': + resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.10': - resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} + '@esbuild/openbsd-x64@0.25.11': + resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.10': - resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} + '@esbuild/openharmony-arm64@0.25.11': + resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.10': - resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} + '@esbuild/sunos-x64@0.25.11': + resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.10': - resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} + '@esbuild/win32-arm64@0.25.11': + resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.10': - resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} + '@esbuild/win32-ia32@0.25.11': + resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.10': - resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} + '@esbuild/win32-x64@0.25.11': + resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -860,8 +860,8 @@ packages: '@types/prop-types@15.7.15': resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - '@types/react-dom@19.2.1': - resolution: {integrity: sha512-/EEvYBdT3BflCWvTMO7YkYBHVE9Ci6XdqZciZANQgKpaiDRGOLIlRo91jbTNRQjgPFWVaRxcYc0luVNFitz57A==} + '@types/react-dom@19.2.2': + resolution: {integrity: sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==} peerDependencies: '@types/react': ^19.2.0 @@ -879,63 +879,63 @@ packages: '@types/svgo@2.6.4': resolution: {integrity: sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==} - '@typescript-eslint/eslint-plugin@8.46.0': - resolution: {integrity: sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==} + '@typescript-eslint/eslint-plugin@8.46.1': + resolution: {integrity: sha512-rUsLh8PXmBjdiPY+Emjz9NX2yHvhS11v0SR6xNJkm5GM1MO9ea/1GoDKlHHZGrOJclL/cZ2i/vRUYVtjRhrHVQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.46.0 + '@typescript-eslint/parser': ^8.46.1 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.46.0': - resolution: {integrity: sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==} + '@typescript-eslint/parser@8.46.1': + resolution: {integrity: sha512-6JSSaBZmsKvEkbRUkf7Zj7dru/8ZCrJxAqArcLaVMee5907JdtEbKGsZ7zNiIm/UAkpGUkaSMZEXShnN2D1HZA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.46.0': - resolution: {integrity: sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==} + '@typescript-eslint/project-service@8.46.1': + resolution: {integrity: sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.46.0': - resolution: {integrity: sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==} + '@typescript-eslint/scope-manager@8.46.1': + resolution: {integrity: sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.46.0': - resolution: {integrity: sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==} + '@typescript-eslint/tsconfig-utils@8.46.1': + resolution: {integrity: sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.46.0': - resolution: {integrity: sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==} + '@typescript-eslint/type-utils@8.46.1': + resolution: {integrity: sha512-+BlmiHIiqufBxkVnOtFwjah/vrkF4MtKKvpXrKSPLCkCtAp8H01/VV43sfqA98Od7nJpDcFnkwgyfQbOG0AMvw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.46.0': - resolution: {integrity: sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==} + '@typescript-eslint/types@8.46.1': + resolution: {integrity: sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.46.0': - resolution: {integrity: sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==} + '@typescript-eslint/typescript-estree@8.46.1': + resolution: {integrity: sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.46.0': - resolution: {integrity: sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==} + '@typescript-eslint/utils@8.46.1': + resolution: {integrity: sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.46.0': - resolution: {integrity: sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==} + '@typescript-eslint/visitor-keys@8.46.1': + resolution: {integrity: sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} acorn-jsx@5.3.2: @@ -1324,8 +1324,8 @@ packages: duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} - electron-to-chromium@1.5.234: - resolution: {integrity: sha512-RXfEp2x+VRYn8jbKfQlRImzoJU01kyDvVPBmG39eU2iuRVhuS6vQNocB8J0/8GrIMLnPzgz4eW6WiRnJkTuNWg==} + electron-to-chromium@1.5.237: + resolution: {integrity: sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1480,8 +1480,8 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.25.10: - resolution: {integrity: sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==} + esbuild@0.25.11: + resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} engines: {node: '>=18'} hasBin: true @@ -2904,8 +2904,8 @@ packages: peerDependencies: typescript: '>=3.5.1' - typescript-eslint@8.46.0: - resolution: {integrity: sha512-6+ZrB6y2bT2DX3K+Qd9vn7OFOJR+xSLDj+Aw/N3zBwUt27uTw2sw2TE2+UcY1RiyBZkaGbTkVg9SSdPNUG6aUw==} + typescript-eslint@8.46.1: + resolution: {integrity: sha512-VHgijW803JafdSsDO8I761r3SHrgk4T00IdyQ+/UsthtgPRsBWQLqoSxOolxTpxRKi1kGXK0bSz4CoAc9ObqJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2976,8 +2976,8 @@ packages: vite: optional: true - vite@7.1.9: - resolution: {integrity: sha512-4nVGliEpxmhCL8DslSAUdxlB6+SMrhB0a1v5ijlh1xB1nEPuy1mxaHxysVucLHuWryAxLWg6a5ei+U4TLn/rFg==} + vite@7.1.10: + resolution: {integrity: sha512-CmuvUBzVJ/e3HGxhg6cYk88NGgTnBoOo7ogtfJJ0fefUWAxN/WDSUa50o+oVBxuIhO8FoEZW0j2eW7sfjs5EtA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -3296,85 +3296,85 @@ snapshots: '@emotion/weak-memoize@0.4.0': {} - '@esbuild/aix-ppc64@0.25.10': + '@esbuild/aix-ppc64@0.25.11': optional: true - '@esbuild/android-arm64@0.25.10': + '@esbuild/android-arm64@0.25.11': optional: true - '@esbuild/android-arm@0.25.10': + '@esbuild/android-arm@0.25.11': optional: true - '@esbuild/android-x64@0.25.10': + '@esbuild/android-x64@0.25.11': optional: true - '@esbuild/darwin-arm64@0.25.10': + '@esbuild/darwin-arm64@0.25.11': optional: true - '@esbuild/darwin-x64@0.25.10': + '@esbuild/darwin-x64@0.25.11': optional: true - '@esbuild/freebsd-arm64@0.25.10': + '@esbuild/freebsd-arm64@0.25.11': optional: true - '@esbuild/freebsd-x64@0.25.10': + '@esbuild/freebsd-x64@0.25.11': optional: true - '@esbuild/linux-arm64@0.25.10': + '@esbuild/linux-arm64@0.25.11': optional: true - '@esbuild/linux-arm@0.25.10': + '@esbuild/linux-arm@0.25.11': optional: true - '@esbuild/linux-ia32@0.25.10': + '@esbuild/linux-ia32@0.25.11': optional: true '@esbuild/linux-loong64@0.14.54': optional: true - '@esbuild/linux-loong64@0.25.10': + '@esbuild/linux-loong64@0.25.11': optional: true - '@esbuild/linux-mips64el@0.25.10': + '@esbuild/linux-mips64el@0.25.11': optional: true - '@esbuild/linux-ppc64@0.25.10': + '@esbuild/linux-ppc64@0.25.11': optional: true - '@esbuild/linux-riscv64@0.25.10': + '@esbuild/linux-riscv64@0.25.11': optional: true - '@esbuild/linux-s390x@0.25.10': + '@esbuild/linux-s390x@0.25.11': optional: true - '@esbuild/linux-x64@0.25.10': + '@esbuild/linux-x64@0.25.11': optional: true - '@esbuild/netbsd-arm64@0.25.10': + '@esbuild/netbsd-arm64@0.25.11': optional: true - '@esbuild/netbsd-x64@0.25.10': + '@esbuild/netbsd-x64@0.25.11': optional: true - '@esbuild/openbsd-arm64@0.25.10': + '@esbuild/openbsd-arm64@0.25.11': optional: true - '@esbuild/openbsd-x64@0.25.10': + '@esbuild/openbsd-x64@0.25.11': optional: true - '@esbuild/openharmony-arm64@0.25.10': + '@esbuild/openharmony-arm64@0.25.11': optional: true - '@esbuild/sunos-x64@0.25.10': + '@esbuild/sunos-x64@0.25.11': optional: true - '@esbuild/win32-arm64@0.25.10': + '@esbuild/win32-arm64@0.25.11': optional: true - '@esbuild/win32-ia32@0.25.10': + '@esbuild/win32-ia32@0.25.11': optional: true - '@esbuild/win32-x64@0.25.10': + '@esbuild/win32-x64@0.25.11': optional: true '@eslint-community/eslint-utils@4.9.0(eslint@9.37.0)': @@ -3575,18 +3575,18 @@ snapshots: dependencies: preact: 10.27.2 - '@preact/preset-vite@2.10.2(@babel/core@7.28.4)(preact@10.27.2)(vite@7.1.9(@types/node@24.7.2)(terser@5.44.0))': + '@preact/preset-vite@2.10.2(@babel/core@7.28.4)(preact@10.27.2)(vite@7.1.10(@types/node@24.7.2)(terser@5.44.0))': dependencies: '@babel/core': 7.28.4 '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.4) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.4) - '@prefresh/vite': 2.4.10(preact@10.27.2)(vite@7.1.9(@types/node@24.7.2)(terser@5.44.0)) + '@prefresh/vite': 2.4.10(preact@10.27.2)(vite@7.1.10(@types/node@24.7.2)(terser@5.44.0)) '@rollup/pluginutils': 4.2.1 babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.4) debug: 4.4.3 picocolors: 1.1.1 - vite: 7.1.9(@types/node@24.7.2)(terser@5.44.0) - vite-prerender-plugin: 0.5.12(vite@7.1.9(@types/node@24.7.2)(terser@5.44.0)) + vite: 7.1.10(@types/node@24.7.2)(terser@5.44.0) + vite-prerender-plugin: 0.5.12(vite@7.1.10(@types/node@24.7.2)(terser@5.44.0)) transitivePeerDependencies: - preact - supports-color @@ -3599,7 +3599,7 @@ snapshots: '@prefresh/utils@1.2.1': {} - '@prefresh/vite@2.4.10(preact@10.27.2)(vite@7.1.9(@types/node@24.7.2)(terser@5.44.0))': + '@prefresh/vite@2.4.10(preact@10.27.2)(vite@7.1.10(@types/node@24.7.2)(terser@5.44.0))': dependencies: '@babel/core': 7.28.4 '@prefresh/babel-plugin': 0.5.2 @@ -3607,7 +3607,7 @@ snapshots: '@prefresh/utils': 1.2.1 '@rollup/pluginutils': 4.2.1 preact: 10.27.2 - vite: 7.1.9(@types/node@24.7.2)(terser@5.44.0) + vite: 7.1.10(@types/node@24.7.2)(terser@5.44.0) transitivePeerDependencies: - supports-color @@ -3761,7 +3761,7 @@ snapshots: '@types/prop-types@15.7.15': {} - '@types/react-dom@19.2.1(@types/react@19.2.2)': + '@types/react-dom@19.2.2(@types/react@19.2.2)': dependencies: '@types/react': 19.2.2 @@ -3781,14 +3781,14 @@ snapshots: dependencies: '@types/node': 24.7.2 - '@typescript-eslint/eslint-plugin@8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.46.0(eslint@9.37.0)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.0 - '@typescript-eslint/type-utils': 8.46.0(eslint@9.37.0)(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.0(eslint@9.37.0)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.0 + '@typescript-eslint/parser': 8.46.1(eslint@9.37.0)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.1 + '@typescript-eslint/type-utils': 8.46.1(eslint@9.37.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.1(eslint@9.37.0)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.1 eslint: 9.37.0 graphemer: 1.4.0 ignore: 7.0.5 @@ -3798,41 +3798,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.0(eslint@9.37.0)(typescript@5.9.3)': + '@typescript-eslint/parser@8.46.1(eslint@9.37.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.46.0 - '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.0 + '@typescript-eslint/scope-manager': 8.46.1 + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.1 debug: 4.4.3 eslint: 9.37.0 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.46.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.46.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.3) - '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3) + '@typescript-eslint/types': 8.46.1 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.46.0': + '@typescript-eslint/scope-manager@8.46.1': dependencies: - '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/visitor-keys': 8.46.0 + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/visitor-keys': 8.46.1 - '@typescript-eslint/tsconfig-utils@8.46.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.46.1(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.46.0(eslint@9.37.0)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.46.1(eslint@9.37.0)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.0(eslint@9.37.0)(typescript@5.9.3) + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.1(eslint@9.37.0)(typescript@5.9.3) debug: 4.4.3 eslint: 9.37.0 ts-api-utils: 2.1.0(typescript@5.9.3) @@ -3840,14 +3840,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.46.0': {} + '@typescript-eslint/types@8.46.1': {} - '@typescript-eslint/typescript-estree@8.46.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.46.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.46.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.46.0(typescript@5.9.3) - '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/visitor-keys': 8.46.0 + '@typescript-eslint/project-service': 8.46.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3) + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/visitor-keys': 8.46.1 debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -3858,20 +3858,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.0(eslint@9.37.0)(typescript@5.9.3)': + '@typescript-eslint/utils@8.46.1(eslint@9.37.0)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0) - '@typescript-eslint/scope-manager': 8.46.0 - '@typescript-eslint/types': 8.46.0 - '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.1 + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3) eslint: 9.37.0 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.46.0': + '@typescript-eslint/visitor-keys@8.46.1': dependencies: - '@typescript-eslint/types': 8.46.0 + '@typescript-eslint/types': 8.46.1 eslint-visitor-keys: 4.2.1 acorn-jsx@5.3.2(acorn@8.15.0): @@ -3995,7 +3995,7 @@ snapshots: dependencies: baseline-browser-mapping: 2.8.16 caniuse-lite: 1.0.30001750 - electron-to-chromium: 1.5.234 + electron-to-chromium: 1.5.237 node-releases: 2.0.23 update-browserslist-db: 1.1.3(browserslist@4.26.3) @@ -4340,7 +4340,7 @@ snapshots: duplexer3@0.1.5: {} - electron-to-chromium@1.5.234: {} + electron-to-chromium@1.5.237: {} emoji-regex@8.0.0: {} @@ -4448,34 +4448,34 @@ snapshots: esbuild-windows-64: 0.14.54 esbuild-windows-arm64: 0.14.54 - esbuild@0.25.10: + esbuild@0.25.11: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.10 - '@esbuild/android-arm': 0.25.10 - '@esbuild/android-arm64': 0.25.10 - '@esbuild/android-x64': 0.25.10 - '@esbuild/darwin-arm64': 0.25.10 - '@esbuild/darwin-x64': 0.25.10 - '@esbuild/freebsd-arm64': 0.25.10 - '@esbuild/freebsd-x64': 0.25.10 - '@esbuild/linux-arm': 0.25.10 - '@esbuild/linux-arm64': 0.25.10 - '@esbuild/linux-ia32': 0.25.10 - '@esbuild/linux-loong64': 0.25.10 - '@esbuild/linux-mips64el': 0.25.10 - '@esbuild/linux-ppc64': 0.25.10 - '@esbuild/linux-riscv64': 0.25.10 - '@esbuild/linux-s390x': 0.25.10 - '@esbuild/linux-x64': 0.25.10 - '@esbuild/netbsd-arm64': 0.25.10 - '@esbuild/netbsd-x64': 0.25.10 - '@esbuild/openbsd-arm64': 0.25.10 - '@esbuild/openbsd-x64': 0.25.10 - '@esbuild/openharmony-arm64': 0.25.10 - '@esbuild/sunos-x64': 0.25.10 - '@esbuild/win32-arm64': 0.25.10 - '@esbuild/win32-ia32': 0.25.10 - '@esbuild/win32-x64': 0.25.10 + '@esbuild/aix-ppc64': 0.25.11 + '@esbuild/android-arm': 0.25.11 + '@esbuild/android-arm64': 0.25.11 + '@esbuild/android-x64': 0.25.11 + '@esbuild/darwin-arm64': 0.25.11 + '@esbuild/darwin-x64': 0.25.11 + '@esbuild/freebsd-arm64': 0.25.11 + '@esbuild/freebsd-x64': 0.25.11 + '@esbuild/linux-arm': 0.25.11 + '@esbuild/linux-arm64': 0.25.11 + '@esbuild/linux-ia32': 0.25.11 + '@esbuild/linux-loong64': 0.25.11 + '@esbuild/linux-mips64el': 0.25.11 + '@esbuild/linux-ppc64': 0.25.11 + '@esbuild/linux-riscv64': 0.25.11 + '@esbuild/linux-s390x': 0.25.11 + '@esbuild/linux-x64': 0.25.11 + '@esbuild/netbsd-arm64': 0.25.11 + '@esbuild/netbsd-x64': 0.25.11 + '@esbuild/openbsd-arm64': 0.25.11 + '@esbuild/openbsd-x64': 0.25.11 + '@esbuild/openharmony-arm64': 0.25.11 + '@esbuild/sunos-x64': 0.25.11 + '@esbuild/win32-arm64': 0.25.11 + '@esbuild/win32-ia32': 0.25.11 + '@esbuild/win32-x64': 0.25.11 escalade@3.2.0: {} @@ -5885,12 +5885,12 @@ snapshots: dependencies: typescript: 5.9.3 - typescript-eslint@8.46.0(eslint@9.37.0)(typescript@5.9.3): + typescript-eslint@8.46.1(eslint@9.37.0)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.46.0(@typescript-eslint/parser@8.46.0(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(typescript@5.9.3) - '@typescript-eslint/parser': 8.46.0(eslint@9.37.0)(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.46.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.0(eslint@9.37.0)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.46.1(@typescript-eslint/parser@8.46.1(eslint@9.37.0)(typescript@5.9.3))(eslint@9.37.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.1(eslint@9.37.0)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.1(eslint@9.37.0)(typescript@5.9.3) eslint: 9.37.0 typescript: 5.9.3 transitivePeerDependencies: @@ -5936,7 +5936,7 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vite-plugin-imagemin@0.6.1(vite@7.1.9(@types/node@24.7.2)(terser@5.44.0)): + vite-plugin-imagemin@0.6.1(vite@7.1.10(@types/node@24.7.2)(terser@5.44.0)): dependencies: '@types/imagemin': 7.0.1 '@types/imagemin-gifsicle': 7.0.4 @@ -5961,11 +5961,11 @@ snapshots: imagemin-webp: 6.1.0 jpegtran-bin: 6.0.1 pathe: 0.2.0 - vite: 7.1.9(@types/node@24.7.2)(terser@5.44.0) + vite: 7.1.10(@types/node@24.7.2)(terser@5.44.0) transitivePeerDependencies: - supports-color - vite-prerender-plugin@0.5.12(vite@7.1.9(@types/node@24.7.2)(terser@5.44.0)): + vite-prerender-plugin@0.5.12(vite@7.1.10(@types/node@24.7.2)(terser@5.44.0)): dependencies: kolorist: 1.8.0 magic-string: 0.30.19 @@ -5973,22 +5973,22 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.6 stack-trace: 1.0.0-pre2 - vite: 7.1.9(@types/node@24.7.2)(terser@5.44.0) + vite: 7.1.10(@types/node@24.7.2)(terser@5.44.0) - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.9(@types/node@24.7.2)(terser@5.44.0)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.1.10(@types/node@24.7.2)(terser@5.44.0)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 7.1.9(@types/node@24.7.2)(terser@5.44.0) + vite: 7.1.10(@types/node@24.7.2)(terser@5.44.0) transitivePeerDependencies: - supports-color - typescript - vite@7.1.9(@types/node@24.7.2)(terser@5.44.0): + vite@7.1.10(@types/node@24.7.2)(terser@5.44.0): dependencies: - esbuild: 0.25.10 + esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 From bd128072c0a21247acefbcecf20857c8921d0065 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 15 Oct 2025 10:49:46 +0200 Subject: [PATCH 10/13] fix childlock setting --- src/devices/connect.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/devices/connect.cpp b/src/devices/connect.cpp index 0d619ce75..63ed29760 100644 --- a/src/devices/connect.cpp +++ b/src/devices/connect.cpp @@ -246,7 +246,7 @@ bool Connect::set_childlock(const char * value, const int8_t id) { } bool b; if (Helpers::value2bool(value, b)) { - write_command(0xBB5 + rc->room(), b ? 1 : 0, 7, 0xBB5 + rc->room()); + write_command(0xBB5 + rc->room(), 7, b ? 1 : 0, 0xBB5 + rc->room()); return true; } return false; From 766281d8d29fbd8acb3796fe3c5073d5cc9e24af Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 15 Oct 2025 14:32:44 +0200 Subject: [PATCH 11/13] add dhw modetype #2659 --- CHANGELOG_LATEST.md | 1 + src/core/locale_common.h | 1 + src/devices/thermostat.cpp | 4 +++- src/devices/thermostat.h | 1 + 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 6ce0bf3fc..3c9aa8c77 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -27,6 +27,7 @@ For more details go to [docs.emsesp.org](https://docs.emsesp.org/). - Analogsensors frequency input [#2631](https://github.com/emsesp/EMS-ESP32/discussions/2631) - SRC plus thermostats [#2636](https://github.com/emsesp/EMS-ESP32/issues/2636) - Greenstar 2000 [#2645](https://github.com/emsesp/EMS-ESP32/issues/2645) +- RC3xx `dhw modetype` [#2659](https://github.com/emsesp/EMS-ESP32/discussions/2659) ## Fixed diff --git a/src/core/locale_common.h b/src/core/locale_common.h index b7689701a..85536d038 100644 --- a/src/core/locale_common.h +++ b/src/core/locale_common.h @@ -323,6 +323,7 @@ MAKE_ENUM(enum_wwMode3, FL_(on), FL_(off), FL_(auto)) MAKE_ENUM(enum_wwMode4, FL_(off), FL_(ecoplus), FL_(eco), FL_(comfort), FL_(auto)) MAKE_ENUM(enum_wwMode5, FL_(normal), FL_(comfort), FL_(ecoplus)) // Rego3000 MAKE_ENUM(enum_wwMode6, FL_(off), FL_(comfort), FL_(auto)) // CR120 +MAKE_ENUM(enum_wwModeType, FL_(off), FL_(eco), FL_(comfort), FL_(ecoplus)) MAKE_ENUM(enum_heatingtype, FL_(off), FL_(radiator), FL_(convector), FL_(floor)) MAKE_ENUM(enum_heatingtype1, FL_(off), FL_(curve), FL_(radiator), FL_(convector), FL_(floor)) MAKE_ENUM(enum_heatingtype2, FL_(off), FL_(radiator), FL_(convector), FL_(floor), FL_(roomflow), FL_(roomload)) diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index f772110a9..6d9e93591 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -1326,7 +1326,8 @@ void Thermostat::process_RC300WWmode2(std::shared_ptr telegram) // pos 1 = holiday mode // pos 2 = current status of DHW setpoint // pos 3 = current status of DHW circulation pump - has_update(telegram, dhw->wwExtra_, 0); // 0=no, 1=yes + has_update(telegram, dhw->wwExtra_, 0); // 0=no, 1=yes + has_update(telegram, dhw->wwModeType_, 8); // 0-off, 1-eco, 2-comfort, 3-eco+ } // 0x23A damped outdoor temp @@ -5179,6 +5180,7 @@ void Thermostat::register_device_values_dhw(std::shared_ptrwwMode_, DeviceValueType::ENUM, FL_(enum_wwMode), FL_(wwMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwmode)); } + register_device_value(tag, &dhw->wwModeType_, DeviceValueType::ENUM, FL_(enum_wwModeType), FL_(modetype), DeviceValueUOM::NONE); register_device_value(tag, &dhw->wwSetTemp_, DeviceValueType::UINT8, FL_(wwSetTemp), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwtemp)); register_device_value(tag, &dhw->wwSetTempLow_, DeviceValueType::UINT8, FL_(wwSetTempLow), DeviceValueUOM::DEGREES, MAKE_CF_CB(set_wwtemplow)); register_device_value(tag, &dhw->wwCircMode_, DeviceValueType::ENUM, FL_(enum_wwCircMode), FL_(wwCircMode), DeviceValueUOM::NONE, MAKE_CF_CB(set_wwcircmode)); diff --git a/src/devices/thermostat.h b/src/devices/thermostat.h index 62bbe67e9..93c1f9886 100644 --- a/src/devices/thermostat.h +++ b/src/devices/thermostat.h @@ -183,6 +183,7 @@ class Thermostat : public EMSdevice { ~DhwCircuit() = default; uint8_t wwExtra_; uint8_t wwMode_; + uint8_t wwModeType_; uint8_t wwCircPump_; uint8_t wwCircMode_; uint8_t wwSetTemp_; From 9bf57c3e220e98df9d46605f5005c10ed27174c8 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 15 Oct 2025 15:09:22 +0200 Subject: [PATCH 12/13] dev20, remove `obj_id` again --- src/core/analogsensor.cpp | 1 - src/core/mqtt.cpp | 3 --- src/core/shower.cpp | 2 -- src/core/temperaturesensor.cpp | 1 - src/emsesp_version.h | 2 +- src/web/WebCustomEntityService.cpp | 1 - src/web/WebSchedulerService.cpp | 1 - 7 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/core/analogsensor.cpp b/src/core/analogsensor.cpp index 771c876e6..8aa69c0cc 100644 --- a/src/core/analogsensor.cpp +++ b/src/core/analogsensor.cpp @@ -701,7 +701,6 @@ void AnalogSensor::publish_values(const bool force) { } config["uniq_id"] = uniq_s; - config["obj_id"] = uniq_s; char name[50]; snprintf(name, sizeof(name), "%s", sensor.name().c_str()); diff --git a/src/core/mqtt.cpp b/src/core/mqtt.cpp index 5904664fc..769c2672d 100644 --- a/src/core/mqtt.cpp +++ b/src/core/mqtt.cpp @@ -529,7 +529,6 @@ void Mqtt::ha_status() { } doc["uniq_id"] = uniq; - doc["obj_id"] = uniq; doc["def_ent_id"] = (std::string) "binary_sensor." + uniq; doc["stat_t"] = Mqtt::base() + "/status"; doc["name"] = "System status"; @@ -981,7 +980,6 @@ bool Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev // build the full payload JsonDocument doc; doc["uniq_id"] = uniq_id; - doc["obj_id"] = uniq_id; // set the entity_id. This is breaking change in HA 2025.10.0 - see https://github.com/home-assistant/core/pull/151775 // extract the string from topic up to the / using std::string @@ -1320,7 +1318,6 @@ bool Mqtt::publish_ha_climate_config(const int8_t tag, const bool has_roomtemp, doc["~"] = Mqtt::base(); doc["uniq_id"] = uniq_id_s; - doc["obj_id"] = uniq_id_s; doc["def_ent_id"] = (std::string) "climate." + uniq_id_s; doc["name"] = name_s; doc["mode_stat_t"] = topic_t; diff --git a/src/core/shower.cpp b/src/core/shower.cpp index fa3f5d673..372337311 100644 --- a/src/core/shower.cpp +++ b/src/core/shower.cpp @@ -206,7 +206,6 @@ void Shower::create_ha_discovery() { snprintf(str, sizeof(str), "shower_active"); // v3.4 compatible } doc["uniq_id"] = str; - doc["obj_id"] = str; doc["def_ent_id"] = (std::string) "binary_sensor." + str; snprintf(stat_t, sizeof(stat_t), "%s/shower_active", Mqtt::base().c_str()); @@ -225,7 +224,6 @@ void Shower::create_ha_discovery() { snprintf(str, sizeof(str), "%s_shower_duration", Mqtt::basename().c_str()); doc["uniq_id"] = str; - doc["obj_id"] = str; doc["def_ent_id"] = (std::string) "sensor." + str; snprintf(stat_t, sizeof(stat_t), "%s/shower_data", Mqtt::base().c_str()); diff --git a/src/core/temperaturesensor.cpp b/src/core/temperaturesensor.cpp index 039cda598..89878a95f 100644 --- a/src/core/temperaturesensor.cpp +++ b/src/core/temperaturesensor.cpp @@ -532,7 +532,6 @@ void TemperatureSensor::publish_values(const bool force) { } config["uniq_id"] = uniq_s; - config["obj_id"] = uniq_s; config["def_ent_id"] = (std::string) "sensor." + uniq_s; char name[50]; diff --git a/src/emsesp_version.h b/src/emsesp_version.h index 096657251..d234ddd9b 100644 --- a/src/emsesp_version.h +++ b/src/emsesp_version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.7.3-dev.19" +#define EMSESP_APP_VERSION "3.7.3-dev.20" diff --git a/src/web/WebCustomEntityService.cpp b/src/web/WebCustomEntityService.cpp index 61c8e8c77..e81f383c6 100644 --- a/src/web/WebCustomEntityService.cpp +++ b/src/web/WebCustomEntityService.cpp @@ -430,7 +430,6 @@ void WebCustomEntityService::publish(const bool force) { snprintf(uniq_s, sizeof(uniq_s), "%s_%s", F_(custom), entityItem.name.c_str()); config["uniq_id"] = uniq_s; - config["obj_id"] = uniq_s; config["name"] = entityItem.name.c_str(); char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp index e78aac6c6..616ca95a4 100644 --- a/src/web/WebSchedulerService.cpp +++ b/src/web/WebSchedulerService.cpp @@ -283,7 +283,6 @@ void WebSchedulerService::publish(const bool force) { snprintf(uniq_s, sizeof(uniq_s), "%s_%s", F_(scheduler), scheduleItem.name.c_str()); config["uniq_id"] = uniq_s; - config["obj_id"] = uniq_s; config["name"] = scheduleItem.name.c_str(); config["def_ent_id"] = (std::string) "switch." + uniq_s; From 2a565dc677bd0989ce61ba862f24d568ec14fcbc Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Wed, 15 Oct 2025 20:17:44 +0200 Subject: [PATCH 13/13] fix standalone --- src/core/device_library.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/device_library.h b/src/core/device_library.h index aa0177d2c..fa10d6e1d 100644 --- a/src/core/device_library.h +++ b/src/core/device_library.h @@ -202,8 +202,8 @@ {161, DeviceType::WATER, "MM200", DeviceFlags::EMS_DEVICE_FLAG_MMPLUS}, {163, DeviceType::WATER, "SM100, MS100", DeviceFlags::EMS_DEVICE_FLAG_SM100}, {164, DeviceType::WATER, "SM200, MS200", DeviceFlags::EMS_DEVICE_FLAG_SM100}, -{248, DeviceType::MIXER, "HM210", DeviceFlags::EMS_DEVICE_FLAG_MMPLUS} -{17, DeviceType::CONNECT, "MX400", DeviceFlags::EMS_DEVICE_FLAG_NONE}, // 0x50 Wirelss Base +{248, DeviceType::MIXER, "HM210", DeviceFlags::EMS_DEVICE_FLAG_MMPLUS}, +{17, DeviceType::CONNECT, "MX400", DeviceFlags::EMS_DEVICE_FLAG_NONE} // 0x50 Wirelss Base // {157, DeviceType::THERMOSTAT, "RC120", DeviceFlags::EMS_DEVICE_FLAG_CR120} #endif