diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index b9f0e741d..a94fb6913 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -55,7 +55,7 @@ This release is based on the latest Espressif/Arduino core version 3. It brings - show temperature value for sensor 0x40 [#3272](https://github.com/emsesp/EMS-ESP32/issues/3272) - no EMS bus on custom boards whose interface relies on a pull-up on the Rx line. The newer ESP-IDF no longer enables the internal pull-up on the UART Rx pin, so it is now set explicitly as it was in 3.8 [#3258](https://github.com/emsesp/EMS-ESP32/discussions/3258) - no EMS bus after restart when Rx uses a pin that boots with another IO_MUX function (e.g. GPIO43/44 = UART0 on ESP32-S3). IDF 5 `uart_set_pin()` no longer selects the GPIO function on the Rx pad when routing via the matrix, so the pin is reset before UART setup [#3258](https://github.com/emsesp/EMS-ESP32/discussions/3258) -- Tx mode Auto preferred HT3 pacing over EMS+ when the bus used the HT3 address mask. Some Bosch heat pumps (e.g. Compress 7000i AW, CS5800i) need EMS+ timing; Auto now prefers EMS+ when EMS 2.0 telegrams are seen [#3283](https://github.com/emsesp/EMS-ESP32/issues/3283), [#3245](https://github.com/emsesp/EMS-ESP32/issues/3245) +- Tx mode Auto preferred HT3 pacing over EMS+ when the bus used the HT3 address mask. Some Bosch heat pumps (e.g. Compress 7000i AW, CS5800i) need EMS+ timing; Auto now selects EMS+ when boiler monitor 0xE4 is seen (not merely any extended telegram, which Junkers HT3 also uses) [#3283](https://github.com/emsesp/EMS-ESP32/issues/3283), [#3245](https://github.com/emsesp/EMS-ESP32/issues/3245) - Guru Meditation (cache error) on HybridCompile builds when the EMS or console UART ISR ran from flash during a SPI flash read (WiFi power-down, mDNS, NVS). The UART ISR and ringbuf ISR helpers are now in IRAM - compile errors against Arduino 3.3.12 from Tasmota/Arduino headers named `console.h`, `network.h` and `httpClient.h`. Those EMS-ESP headers are now `emsesp_console.h`, `emsesp_network.h` and `emsesp_http_client.h` - HTTP OTA from WSL/mDNS stalled on IPv6 and used tiny write chunks. Uploads now resolve IPv4 and stream in 64 KB blocks (`scripts/upload.py`, `scripts/upload_cli.py`) diff --git a/src/core/telegram.cpp b/src/core/telegram.cpp index 3abdd41f1..9d5af1638 100644 --- a/src/core/telegram.cpp +++ b/src/core/telegram.cpp @@ -207,7 +207,9 @@ void RxService::add(uint8_t * data, uint8_t length) { message_data = data + 6; message_length = length - 7; } - if (type_id > 0x0FF && message_length > 1) { // used for auto tx_mode + // EMS+ boilers broadcast UBAMonitorFastPlus (0xE4); EMS/HT3 use 0x18. + // Extended telegrams alone are not enough: Junkers HT3 also uses them (e.g. 0x16F). + if (type_id == 0xE4) { set_ems2(); } // if we're watching and "raw" print out actual telegram as bytes to the console diff --git a/src/core/telegram.h b/src/core/telegram.h index a5472d945..21da888bd 100644 --- a/src/core/telegram.h +++ b/src/core/telegram.h @@ -169,6 +169,7 @@ class EMSbus { return (ems_mask_ == EMS_MASK_HT3); } + // True once UBAMonitorFastPlus (0xE4) was received — used by Tx mode Auto for EMS+ pacing static bool is_ems2() { return isEMS2_; } diff --git a/src/uart/emsuart_esp32.cpp b/src/uart/emsuart_esp32.cpp index 014f71b87..d1337d44b 100644 --- a/src/uart/emsuart_esp32.cpp +++ b/src/uart/emsuart_esp32.cpp @@ -171,8 +171,8 @@ uint8_t EMSuart::transmit(const uint8_t * buf, const uint8_t len) { return EMS_TX_STATUS_OK; } - // Auto: prefer EMS+ over HT3. Some Bosch heat pumps set the HT3 address mask (source MSB) - // but need EMS+ pacing; HT3-first caused FF→E3 echo corruption (#3283, #3245). + // Auto: EMS+ if boiler monitor 0xE4 seen (is_ems2), else HT3 address mask, else EMS. + // Do not key off extended telegrams alone — Junkers HT3 uses those too (#3283, #3245). auto tx_mode = tx_mode_ != EMS_TXMODE_AUTO ? tx_mode_ : EMSbus::is_ems2() ? EMS_TXMODE_EMSPLUS : EMSbus::is_ht3() ? EMS_TXMODE_HT3 : EMS_TXMODE_EMS; // TXMODE is EMS+ with long delay