Merge pull request #2504 from MichaelDvP/dev

some smaller fixes
This commit is contained in:
Proddy
2025-04-03 09:51:26 +02:00
committed by GitHub
10 changed files with 163 additions and 87 deletions

View File

@@ -9,11 +9,15 @@ For more details go to [docs.emsesp.org](https://docs.emsesp.org/).
- analogsensor types: NTC and RGB-Led
- Flag for HMC310 [#2465](https://github.com/emsesp/EMS-ESP32/issues/2465)
- boiler auxheatersource [#2489](https://github.com/emsesp/EMS-ESP32/discussions/2489)
- thermostat last error for RC100/300 [#2501](https://github.com/emsesp/EMS-ESP32/issues/2501)
## Fixed
- dhw/switchtime [#2490](https://github.com/emsesp/EMS-ESP32/issues/2490)
- switch to secure mqtt [#2492](https://github.com/emsesp/EMS-ESP32/issues/2492)
- update link buttons [#2497](https://github.com/emsesp/EMS-ESP32/issues/2497)
- refresh scheduler states [#2502](https://github.com/emsesp/EMS-ESP32/discussions/2502)
- also rebuild HA config on mqtt connect for scheduler, custom and shower
## Changed

View File

@@ -47,9 +47,9 @@
"@preact/preset-vite": "^2.10.1",
"@trivago/prettier-plugin-sort-imports": "^5.2.2",
"@types/formidable": "^3",
"@types/node": "^22.13.14",
"@types/react": "^19.0.12",
"@types/react-dom": "^19.0.4",
"@types/node": "^22.13.17",
"@types/react": "^19.1.0",
"@types/react-dom": "^19.1.1",
"concurrently": "^9.1.2",
"eslint": "^9.23.0",
"eslint-config-prettier": "^10.1.1",
@@ -57,8 +57,8 @@
"prettier": "^3.5.3",
"rollup-plugin-visualizer": "^5.14.0",
"terser": "^5.39.0",
"typescript-eslint": "8.28.0",
"vite": "^6.2.3",
"typescript-eslint": "8.29.0",
"vite": "^6.2.4",
"vite-plugin-imagemin": "^0.6.1",
"vite-tsconfig-paths": "^5.1.4"
},

View File

@@ -27,6 +27,7 @@ import {
useLayoutTitle
} from 'components';
import { useI18nContext } from 'i18n/i18n-react';
import { useInterval } from 'utils';
import { readSchedule, writeSchedule } from '../../api/app';
import SettingsSchedulerDialog from './SchedulerDialog';
@@ -73,6 +74,12 @@ const Scheduler = () => {
);
}
useInterval(() => {
if (numChanges === 0) {
void fetchSchedule();
}
});
useEffect(() => {
const formatter = new Intl.DateTimeFormat(locale, {
weekday: 'short',

View File

@@ -1415,7 +1415,7 @@ __metadata:
languageName: node
linkType: hard
"@types/node@npm:*, @types/node@npm:^22.13.14":
"@types/node@npm:*":
version: 22.13.14
resolution: "@types/node@npm:22.13.14"
dependencies:
@@ -1424,6 +1424,15 @@ __metadata:
languageName: node
linkType: hard
"@types/node@npm:^22.13.17":
version: 22.13.17
resolution: "@types/node@npm:22.13.17"
dependencies:
undici-types: "npm:~6.20.0"
checksum: 10c0/77a052fec0fe02f60557e1c5f3f28eb09cd9bee426be88328a94689150a3c0df5b4b6b69fad28157fb34521693dad0b311ecd7f613845d681ff973991310c20e
languageName: node
linkType: hard
"@types/parse-json@npm:^4.0.0":
version: 4.0.2
resolution: "@types/parse-json@npm:4.0.2"
@@ -1438,12 +1447,12 @@ __metadata:
languageName: node
linkType: hard
"@types/react-dom@npm:^19.0.4":
version: 19.0.4
resolution: "@types/react-dom@npm:19.0.4"
"@types/react-dom@npm:^19.1.1":
version: 19.1.1
resolution: "@types/react-dom@npm:19.1.1"
peerDependencies:
"@types/react": ^19.0.0
checksum: 10c0/4e71853919b94df9e746a4bd73f8180e9ae13016333ce9c543dcba9f4f4c8fe6e28b038ca6ee61c24e291af8e03ca3bc5ded17c46dee938fcb32d71186fda7a3
checksum: 10c0/83833af502f501a372b370fdeb7cf933dfc8780903fe0e0d6e6a76b4ea3adbe5316159a62a0388d8afdd409afd76a40959e2ce82fbb788f57d32c786a63601ee
languageName: node
linkType: hard
@@ -1456,12 +1465,12 @@ __metadata:
languageName: node
linkType: hard
"@types/react@npm:^19.0.12":
version: 19.0.12
resolution: "@types/react@npm:19.0.12"
"@types/react@npm:^19.1.0":
version: 19.1.0
resolution: "@types/react@npm:19.1.0"
dependencies:
csstype: "npm:^3.0.2"
checksum: 10c0/c814b6af5c0fbcf5c65d031b1c9bf98c5b857e015254d95811f2851b27b869c3d31c6f35dab127dc6921a3dbda0b0622c6323d493a14b31b231a6a58c41c5e84
checksum: 10c0/632fd20ee176e55801a61c5f854141b043571a3e363ef106b047b766a813a12735cbb37abb3d61d126346979f530f2ed269a60c8ef3cdee54e5e9fe4174e5dad
languageName: node
linkType: hard
@@ -1483,15 +1492,15 @@ __metadata:
languageName: node
linkType: hard
"@typescript-eslint/eslint-plugin@npm:8.28.0":
version: 8.28.0
resolution: "@typescript-eslint/eslint-plugin@npm:8.28.0"
"@typescript-eslint/eslint-plugin@npm:8.29.0":
version: 8.29.0
resolution: "@typescript-eslint/eslint-plugin@npm:8.29.0"
dependencies:
"@eslint-community/regexpp": "npm:^4.10.0"
"@typescript-eslint/scope-manager": "npm:8.28.0"
"@typescript-eslint/type-utils": "npm:8.28.0"
"@typescript-eslint/utils": "npm:8.28.0"
"@typescript-eslint/visitor-keys": "npm:8.28.0"
"@typescript-eslint/scope-manager": "npm:8.29.0"
"@typescript-eslint/type-utils": "npm:8.29.0"
"@typescript-eslint/utils": "npm:8.29.0"
"@typescript-eslint/visitor-keys": "npm:8.29.0"
graphemer: "npm:^1.4.0"
ignore: "npm:^5.3.1"
natural-compare: "npm:^1.4.0"
@@ -1500,64 +1509,64 @@ __metadata:
"@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <5.9.0"
checksum: 10c0/f01b7d231b01ec2c1cc7c40599ddceb329532f2876664a39dec9d25c0aed4cfdbef3ec07f26bac357df000d798f652af6fdb6a2481b6120e43bfa38f7c7a7c48
checksum: 10c0/3b05a7376a0752484229369af6eb60d13cf06d2331e79c2d471cb0b963dcf5b25a31617cafdc71d74e98921091f479f3da10725b761878a89421191d23866b54
languageName: node
linkType: hard
"@typescript-eslint/parser@npm:8.28.0":
version: 8.28.0
resolution: "@typescript-eslint/parser@npm:8.28.0"
"@typescript-eslint/parser@npm:8.29.0":
version: 8.29.0
resolution: "@typescript-eslint/parser@npm:8.29.0"
dependencies:
"@typescript-eslint/scope-manager": "npm:8.28.0"
"@typescript-eslint/types": "npm:8.28.0"
"@typescript-eslint/typescript-estree": "npm:8.28.0"
"@typescript-eslint/visitor-keys": "npm:8.28.0"
"@typescript-eslint/scope-manager": "npm:8.29.0"
"@typescript-eslint/types": "npm:8.29.0"
"@typescript-eslint/typescript-estree": "npm:8.29.0"
"@typescript-eslint/visitor-keys": "npm:8.29.0"
debug: "npm:^4.3.4"
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <5.9.0"
checksum: 10c0/4bde6887bbf3fe031c01e46db90f9f384a8cac2e67c2972b113a62d607db75e01db943601279aac847b9187960a038981814042cb02fd5aa27ea4613028f9313
checksum: 10c0/270b9b27e3edb54b2f98a97b7f026f95580214002a04167809b1b71233c36d1585041cdcf26f9e08f48b9eb92652f4f9c756a83dc230f48fd204a4e5e054831c
languageName: node
linkType: hard
"@typescript-eslint/scope-manager@npm:8.28.0":
version: 8.28.0
resolution: "@typescript-eslint/scope-manager@npm:8.28.0"
"@typescript-eslint/scope-manager@npm:8.29.0":
version: 8.29.0
resolution: "@typescript-eslint/scope-manager@npm:8.29.0"
dependencies:
"@typescript-eslint/types": "npm:8.28.0"
"@typescript-eslint/visitor-keys": "npm:8.28.0"
checksum: 10c0/f3bd76b3f54e60f1efe108b233b2d818e44ecf0dc6422cc296542f784826caf3c66d51b8acc83d8c354980bd201e1d9aa1ea01011de96e0613d320c00e40ccfd
"@typescript-eslint/types": "npm:8.29.0"
"@typescript-eslint/visitor-keys": "npm:8.29.0"
checksum: 10c0/330d777043a99485b51197ad24927f1276d61e61adaf710f012b3fe7db2ab67c8925c0526f801715b498e7d8fa7cef390006b6f7ae40cee89abe22e8e438de9a
languageName: node
linkType: hard
"@typescript-eslint/type-utils@npm:8.28.0":
version: 8.28.0
resolution: "@typescript-eslint/type-utils@npm:8.28.0"
"@typescript-eslint/type-utils@npm:8.29.0":
version: 8.29.0
resolution: "@typescript-eslint/type-utils@npm:8.29.0"
dependencies:
"@typescript-eslint/typescript-estree": "npm:8.28.0"
"@typescript-eslint/utils": "npm:8.28.0"
"@typescript-eslint/typescript-estree": "npm:8.29.0"
"@typescript-eslint/utils": "npm:8.29.0"
debug: "npm:^4.3.4"
ts-api-utils: "npm:^2.0.1"
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <5.9.0"
checksum: 10c0/b8936edc2153bf794efba39bfb06393a228217830051767360f4b691fed7c82f3831c4fc6deac6d78b90a58596e61f866c17eaee9dd793c3efda3ebdcf5a71d8
checksum: 10c0/f254c8d22fc29ea088d16b06e4be1756cb5ad05ccf5989e163637b9c582e5fc8c27aa7003aad6e6a8158d56d7711ea1e4e9d361702c1a18945e0e6aaff1267c5
languageName: node
linkType: hard
"@typescript-eslint/types@npm:8.28.0":
version: 8.28.0
resolution: "@typescript-eslint/types@npm:8.28.0"
checksum: 10c0/1f95895e20dac1cf063dc93c99142fd1871e53be816bcbbee93f22a05e6b2a82ca83c20ce3a551f65555910aa0956443a23268edbb004369d0d5cb282d13c377
"@typescript-eslint/types@npm:8.29.0":
version: 8.29.0
resolution: "@typescript-eslint/types@npm:8.29.0"
checksum: 10c0/fc1e3f3071102973a9cfb8ae843c51398bd74b5583b7b0edad182ea605ef85e72ceac7987513581869958b3a65303af6b3471bfba5b7be1338e8add62019c858
languageName: node
linkType: hard
"@typescript-eslint/typescript-estree@npm:8.28.0":
version: 8.28.0
resolution: "@typescript-eslint/typescript-estree@npm:8.28.0"
"@typescript-eslint/typescript-estree@npm:8.29.0":
version: 8.29.0
resolution: "@typescript-eslint/typescript-estree@npm:8.29.0"
dependencies:
"@typescript-eslint/types": "npm:8.28.0"
"@typescript-eslint/visitor-keys": "npm:8.28.0"
"@typescript-eslint/types": "npm:8.29.0"
"@typescript-eslint/visitor-keys": "npm:8.29.0"
debug: "npm:^4.3.4"
fast-glob: "npm:^3.3.2"
is-glob: "npm:^4.0.3"
@@ -1566,32 +1575,32 @@ __metadata:
ts-api-utils: "npm:^2.0.1"
peerDependencies:
typescript: ">=4.8.4 <5.9.0"
checksum: 10c0/97a91c95b1295926098c12e2d2c2abaa68994dc879da132dcce1e75ec9d7dee8187695eaa5241d09cbc42b5e633917b6d35c624e78e3d3ee9bda42d1318080b6
checksum: 10c0/61dd52229a0758e0bd29f732115c16e640a2418fb25488877c74ef03cdbeb43ddc592a37094abd794ef49812f33d6f814c5b662b95ea796ed0a6c6bfc849299b
languageName: node
linkType: hard
"@typescript-eslint/utils@npm:8.28.0":
version: 8.28.0
resolution: "@typescript-eslint/utils@npm:8.28.0"
"@typescript-eslint/utils@npm:8.29.0":
version: 8.29.0
resolution: "@typescript-eslint/utils@npm:8.29.0"
dependencies:
"@eslint-community/eslint-utils": "npm:^4.4.0"
"@typescript-eslint/scope-manager": "npm:8.28.0"
"@typescript-eslint/types": "npm:8.28.0"
"@typescript-eslint/typescript-estree": "npm:8.28.0"
"@typescript-eslint/scope-manager": "npm:8.29.0"
"@typescript-eslint/types": "npm:8.29.0"
"@typescript-eslint/typescript-estree": "npm:8.29.0"
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <5.9.0"
checksum: 10c0/d3425be7f86c1245a11f0ea39136af681027797417348d8e666d38c76646945eaed7b35eb8db66372b067dee8b02a855caf2c24c040ec9c31e59681ab223b59d
checksum: 10c0/e259d7edd12946b2dc8e1aa3bbea10f66c5277f27dda71368aa2b2923487f28cd1c123681aaae22518a31c8aeabd60a5365f8a832d0f6e6efadb03745a2d8a31
languageName: node
linkType: hard
"@typescript-eslint/visitor-keys@npm:8.28.0":
version: 8.28.0
resolution: "@typescript-eslint/visitor-keys@npm:8.28.0"
"@typescript-eslint/visitor-keys@npm:8.29.0":
version: 8.29.0
resolution: "@typescript-eslint/visitor-keys@npm:8.29.0"
dependencies:
"@typescript-eslint/types": "npm:8.28.0"
"@typescript-eslint/types": "npm:8.29.0"
eslint-visitor-keys: "npm:^4.2.0"
checksum: 10c0/245a78ed983fe95fbd1b0f2d4cb9e9d1d964bddc0aa3e3d6ab10c19c4273855bfb27d840bb1fd55deb7ae3078b52f26592472baf6fd2c7019a5aa3b1da974f35
checksum: 10c0/7f5452b137c4edd258b2289cddf5d92687780375db33421bc4f5e2e9b0c94064c7c5ed3a7b5d96dc9c2d09ca7842b4415b3f3ed3e3f1ae3ac2e625ecb5e87efc
languageName: node
linkType: hard
@@ -1611,9 +1620,9 @@ __metadata:
"@table-library/react-table-library": "npm:4.1.12"
"@trivago/prettier-plugin-sort-imports": "npm:^5.2.2"
"@types/formidable": "npm:^3"
"@types/node": "npm:^22.13.14"
"@types/react": "npm:^19.0.12"
"@types/react-dom": "npm:^19.0.4"
"@types/node": "npm:^22.13.17"
"@types/react": "npm:^19.1.0"
"@types/react-dom": "npm:^19.1.1"
alova: "npm:3.2.10"
async-validator: "npm:^4.2.5"
concurrently: "npm:^9.1.2"
@@ -1633,8 +1642,8 @@ __metadata:
terser: "npm:^5.39.0"
typesafe-i18n: "npm:^5.26.2"
typescript: "npm:^5.8.2"
typescript-eslint: "npm:8.28.0"
vite: "npm:^6.2.3"
typescript-eslint: "npm:8.29.0"
vite: "npm:^6.2.4"
vite-plugin-imagemin: "npm:^0.6.1"
vite-tsconfig-paths: "npm:^5.1.4"
languageName: unknown
@@ -6659,17 +6668,17 @@ __metadata:
languageName: node
linkType: hard
"typescript-eslint@npm:8.28.0":
version: 8.28.0
resolution: "typescript-eslint@npm:8.28.0"
"typescript-eslint@npm:8.29.0":
version: 8.29.0
resolution: "typescript-eslint@npm:8.29.0"
dependencies:
"@typescript-eslint/eslint-plugin": "npm:8.28.0"
"@typescript-eslint/parser": "npm:8.28.0"
"@typescript-eslint/utils": "npm:8.28.0"
"@typescript-eslint/eslint-plugin": "npm:8.29.0"
"@typescript-eslint/parser": "npm:8.29.0"
"@typescript-eslint/utils": "npm:8.29.0"
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: ">=4.8.4 <5.9.0"
checksum: 10c0/bf1c1e4b2f21a95930758d5b285c39a394a50e3b6983f373413b93b80a6cb5aabc1d741780e60c63cb42ad5d645ea9c1e6d441d98174c5a2884ab88f4ac46df6
checksum: 10c0/1438b80fc875acc65acc842dc870070be31d6a30f756a6d9985fadd063f4f568e74a83bac7aaf94d2320e434df3c033a6e2ab7258b1429cae2aa7c4b16fb5088
languageName: node
linkType: hard
@@ -6872,9 +6881,9 @@ __metadata:
languageName: node
linkType: hard
"vite@npm:^6.2.3":
version: 6.2.3
resolution: "vite@npm:6.2.3"
"vite@npm:^6.2.4":
version: 6.2.4
resolution: "vite@npm:6.2.4"
dependencies:
esbuild: "npm:^0.25.0"
fsevents: "npm:~2.3.3"
@@ -6920,7 +6929,7 @@ __metadata:
optional: true
bin:
vite: bin/vite.js
checksum: 10c0/ba6ad7e83e5a63fb0b6f62d3a3963624b8784bdc1bfa2a83e16cf268fb58c76bd9f8e69f39ed34bf8711cdb8fd7702916f878781da53c232c34ef7a85e0600cf
checksum: 10c0/5a011ee5cce91de023a22564a314f04bf64d0d02b420d92c3d539d10257448d60e98e52b491404656426fba4a50dc25f107282540d7388fc5303dc441280155e
languageName: node
linkType: hard

View File

@@ -37,9 +37,11 @@ void NetworkSettingsService::begin() {
WiFi.mode(WIFI_MODE_MAX);
WiFi.mode(WIFI_MODE_NULL);
// WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN); // default is FAST_SCAN, connect issues in 2.0.14
// scan settings give connect issues with arduino 2.0.14 and arduino 3.x.x
#if ESP_ARDUINO_VERSION_MAJOR < 3
WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN); // default is FAST_SCAN
// WiFi.setSortMethod(WIFI_CONNECT_AP_BY_SIGNAL); // is default, no need to set
#endif
_fsPersistence.readFromFS();
}

View File

@@ -634,6 +634,9 @@ void EMSESP::reset_mqtt_ha() {
// force the re-creating of the temperature and analog sensor topics (for HA)
temperaturesensor_.reload();
analogsensor_.reload();
shower_.ha_reset();
webSchedulerService.ha_reset();
webCustomEntityService.ha_reset();
}
// create json doc for the devices values and add to MQTT publish queue
@@ -975,7 +978,9 @@ void EMSESP::process_deviceName(std::shared_ptr<const Telegram> telegram) {
return;
}
char name[16];
uint8_t len = telegram->offset + telegram->message_length - 27;
// len including zero terminator, if there is one, otherwise copy to end of telegram
// https://github.com/emsesp/EMS-ESP32/discussions/2482#discussioncomment-12649817
uint8_t len = telegram->offset + telegram->message_length - 26;
strlcpy(name, (const char *)&telegram->message_data[27 - telegram->offset], len < 16 ? len : 16);
char * c = name;
while (isprint(*c)) {

View File

@@ -40,6 +40,9 @@ class Shower {
void shower_alert(bool enable) {
shower_alert_ = enable;
}
void ha_reset() {
ha_configdone_ = false;
}
private:
static uuid::log::Logger logger_;

View File

@@ -194,6 +194,8 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i
register_telegram_type(0x269, "RC300Holiday", true, MAKE_PF_CB(process_RC300Holiday));
}
register_telegram_type(0x16E, "Absent", true, MAKE_PF_CB(process_Absent));
register_telegram_type(0xC0, "RCErrorMessage", false, MAKE_PF_CB(process_RCErrorMessage2));
EMSESP::send_read_request(0xC0, device_id); // read last errorcode on start (only published on errors)
// JUNKERS/HT3
} else if (model == EMSdevice::EMS_DEVICE_FLAG_JUNKERS) {
@@ -1751,6 +1753,49 @@ void Thermostat::process_RCErrorMessage(std::shared_ptr<const Telegram> telegram
}
}
}
// 0xC0 error log for RC300
void Thermostat::process_RCErrorMessage2(std::shared_ptr<const Telegram> telegram) {
if (telegram->offset > 0 || telegram->message_length < 20) {
return;
}
uint8_t code[4] = {telegram->message_data[5], telegram->message_data[6], telegram->message_data[7], 0};
uint16_t codeNo = telegram->message_data[8] * 256 + telegram->message_data[9];
uint16_t year = (telegram->message_data[10] & 0x7F) + 2000;
uint8_t month = telegram->message_data[11];
uint8_t day = telegram->message_data[13];
uint8_t hour = telegram->message_data[12];
uint8_t min = telegram->message_data[14];
uint16_t year1 = (telegram->message_data[15] & 0x7F) + 2000;
uint8_t month1 = telegram->message_data[16];
uint8_t day1 = telegram->message_data[18];
uint8_t hour1 = telegram->message_data[17];
uint8_t min1 = telegram->message_data[19];
if (isprint(code[0]) && isprint(code[1]) && isprint(code[2])) {
if (year == 2000) { // no clock
uint32_t min2 = 65536 * telegram->message_data[11] + 256 * telegram->message_data[12] + telegram->message_data[13];
snprintf(lastCode_, sizeof(lastCode_), "%s(%d) %d min", code, codeNo, min2);
} else if (year1 == 2000) {
snprintf(lastCode_, sizeof(lastCode_), "%s(%d) %02d.%02d.%d %02d:%02d", code, codeNo, day, month, year, hour, min);
} else {
snprintf(lastCode_,
sizeof(lastCode_),
"%s(%d) %02d.%02d.%d %02d:%02d-%02d.%02d.%d %02d:%02d",
code,
codeNo,
day,
month,
year,
hour,
min,
day1,
month1,
year1,
hour1,
min1);
}
has_update(lastCode_);
}
}
/*
*

View File

@@ -411,6 +411,7 @@ class Thermostat : public EMSdevice {
void process_RCTime(std::shared_ptr<const Telegram> telegram);
void process_RCError(std::shared_ptr<const Telegram> telegram);
void process_RCErrorMessage(std::shared_ptr<const Telegram> telegram);
void process_RCErrorMessage2(std::shared_ptr<const Telegram> telegram);
void process_RC35wwSettings(std::shared_ptr<const Telegram> telegram);
void process_RC35wwTimer(std::shared_ptr<const Telegram> telegram);
void process_RC35Monitor(std::shared_ptr<const Telegram> telegram);

View File

@@ -1 +1 @@
#define EMSESP_APP_VERSION "3.7.3-dev.4"
#define EMSESP_APP_VERSION "3.7.3-dev.5"