From 1bb26b29c4600263a7bbd1bb25d8cb796cb76c2a Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 14 Oct 2026 15:08:29 +0200 Subject: [PATCH] Fix Matter MQTT subscription when Matter is disabled (#25140) --- CHANGELOG.md | 1 + lib/libesp32/berry_matter/src/embedded/Matter_UI.be | 9 ++++++--- .../berry_matter/src/embedded/Matter_zz_Device.be | 7 +++++-- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 384c4e9b5..602adbbbd 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ 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 ### Removed diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index 103b2c6d5..750b79d0c 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -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 diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_zz_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_zz_Device.be index 201ccd0ab..533d28409 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_zz_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_zz_Device.be @@ -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//config or tasmota/discovery//sensors var discovery_prefix_len = size("tasmota/discovery/")