Merge branch 'development' into prerelease-16.0.0

This commit is contained in:
Theo Arends committed 2026-10-14 15:53:15 +02:00
commit 5f34a0f1eb
5 files changed
+27 -5

No files matched your search

+2
View File
@@ -18,6 +18,8 @@ All notable changes to this project will be documented in this file.
### Fixed
- Unauthenticated UFS writes on web password enabled systems
- Display dsi dma2d psram buffers (#24949)
- Matter MQTT subscription when Matter is disabled (#25140)
- HttpClientLight time out reading a body when the server goes silent (#25139)
## [15.6.0.2] 20261008
### Added
+4
View File
@@ -166,9 +166,13 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm
- MiELHVAC Modbus length-based framing, queue writes, FC03 sensor mirror [#24993](https://github.com/arendst/Tasmota/issues/24993)
- WT32_ETH01 ethernet initialization [#25051](https://github.com/arendst/Tasmota/issues/25051)
- ESP32 release UART0 console when the template uses its pins [#25047](https://github.com/arendst/Tasmota/issues/25047)
- HttpClientLight time out reading a body when the server goes silent [#25139](https://github.com/arendst/Tasmota/issues/25139)
- PWM on CDC GPIO [#25106](https://github.com/arendst/Tasmota/issues/25106)
- Zigbee deferred timer use after free, and the truncated backtrace that hid it [#24979](https://github.com/arendst/Tasmota/issues/24979)
- Berry rare register allocation bug [#25010](https://github.com/arendst/Tasmota/issues/25010)
- Matter autoconfiguration after configuration reset [#24997](https://github.com/arendst/Tasmota/issues/24997)
- Matter commissioning mDNS announcements [#25069](https://github.com/arendst/Tasmota/issues/25069)
- Matter non-bridge endpoint topology [#25099](https://github.com/arendst/Tasmota/issues/25099)
- Matter MQTT subscription when Matter is disabled [#25140](https://github.com/arendst/Tasmota/issues/25140)
### Removed
@@ -1370,6 +1370,10 @@ int HTTPClientLight::writeToStreamDataBlock(Stream * stream, int size)
uint8_t * buff = (uint8_t *) malloc(buff_size);
if(buff) {
// a server gone silent without closing stays connected(): give up
// after _tcpTimeout without data, as handleHeaderResponse() does
unsigned long lastDataTime = millis();
// read all data from server
while(connected() && (len > 0 || len == -1)) {
@@ -1442,8 +1446,14 @@ int HTTPClientLight::writeToStreamDataBlock(Stream * stream, int size)
len -= readBytes;
}
lastDataTime = millis();
delay(0);
} else {
if((millis() - lastDataTime) > _tcpTimeout) {
log_w("read timeout after %d bytes", bytesWritten);
free(buff);
return HTTPC_ERROR_READ_TIMEOUT;
}
delay(1);
}
}
@@ -1069,7 +1069,9 @@ class Matter_UI
if !webserver.check_privileged_access() return nil end
self.device.ensure_discovery() # lazy subscribe to tasmota/discovery/# on first visit
if self.matter_enabled
self.device.ensure_discovery() # lazy subscribe to tasmota/discovery/# on first visit
end
webserver.content_start("Matter") #- title of the web page -#
webserver.content_send_style() #- send standard Tasmota styles -#
@@ -1523,7 +1525,8 @@ class Matter_UI
var matter_commissioning_requested = webserver.has_arg("comm")
var matter_disable_bridge_mode_requested = (webserver.arg("nobridge") == 'on')
var matter_disable_bridge_mode_current = self.device.disable_bridge_mode
var matter_bridge_mode_changed = matter_disable_bridge_mode_current != matter_disable_bridge_mode_requested
# when Matter is disabled, `device.disable_bridge_mode` is `nil` and the checkbox is not displayed
var matter_bridge_mode_changed = self.matter_enabled && (matter_disable_bridge_mode_current != matter_disable_bridge_mode_requested)
if matter_bridge_mode_changed
# Persist the next-boot topology while keeping the live topology coherent
# until the restart below rebuilds all fixed Descriptor metadata.
@@ -1544,7 +1547,7 @@ class Matter_UI
#- and force restart -#
webserver.redirect("/?rst=")
else
if matter_commissioning_requested != (self.device.commissioning.commissioning_open != nil)
if self.matter_enabled && matter_commissioning_requested != (self.device.commissioning.commissioning_open != nil)
if matter_commissioning_requested
self.device.commissioning.start_root_basic_commissioning()
else
@@ -927,7 +927,8 @@ class Matter_Device
# Lazy subscription to tasmota/discovery/# — only on first config page visit
#####################################################################
def ensure_discovery()
if !self.discovery_subscribed
# when Matter is disabled, init() returns early and `discovery_subscribed` is `nil`
if self.discovery_subscribed == false
self.subscribe_discovery()
self.discovery_subscribed = true
end
@@ -942,10 +943,12 @@ class Matter_Device
# Parse discovery messages, store by topic
def handle_global_discovery(mqtt_topic, data)
if data == nil return end
# discovery tables are not initialized when Matter is disabled
if self.discovered_devices == nil || self.discovered_sensors == nil return end
import json
import string
var j = type(data) == 'string' ? json.load(data) : data
if j == nil return end
if !isinstance(j, map) return end # also rejects `nil` and non-object JSON
# tasmota/discovery/<MAC>/config or tasmota/discovery/<MAC>/sensors
var discovery_prefix_len = size("tasmota/discovery/")