From 09255d6373805ddebe5b4d6c5c81eb366ba2455a Mon Sep 17 00:00:00 2001
From: s-hadinger <49731213+s-hadinger@users.noreply.github.com>
Date: Thu, 16 Mar 2023 08:51:07 +0100
Subject: [PATCH] Matter fix Network Featuremap (#18202)
---
.../src/embedded/Matter_Device.be | 3 +-
.../src/embedded/Matter_Expirable.be | 12 +
.../src/embedded/Matter_Plugin_Root.be | 2 +-
.../src/embedded/Matter_Session.be | 9 +
.../berry_matter/src/embedded/Matter_UI.be | 10 +-
.../src/solidify/solidified_Matter_Device.h | 30 +-
.../solidify/solidified_Matter_Expirable.h | 230 ++--
.../solidify/solidified_Matter_Plugin_Root.h | 2 +-
.../src/solidify/solidified_Matter_Session.h | 1220 +++++++++--------
.../src/solidify/solidified_Matter_UI.h | 121 +-
10 files changed, 891 insertions(+), 748 deletions(-)
diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be
index a909a7ccc..edc6e6320 100644
--- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be
+++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be
@@ -110,7 +110,7 @@ class Matter_Device
self.compute_pbkdf(self.passcode)
# if no fabric is configured, automatically open commissioning at restart
- if size(self.sessions.fabrics) == 0
+ if self.sessions.count_active_fabrics() == 0
self.start_basic_commissioning()
end
end
@@ -274,6 +274,7 @@ class Matter_Device
#
def start_commissioning_complete(session)
tasmota.log("MTR: *** Commissioning complete ***", 2)
+ self.stop_basic_commissioning() # by default close commissioning when it's complete
end
diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Expirable.be b/lib/libesp32/berry_matter/src/embedded/Matter_Expirable.be
index 6ced61193..9320f1949 100644
--- a/lib/libesp32/berry_matter/src/embedded/Matter_Expirable.be
+++ b/lib/libesp32/berry_matter/src/embedded/Matter_Expirable.be
@@ -168,6 +168,18 @@ class Matter_Expirable_list : list
return f
end
+ #############################################################
+ # Count the number of persistable objects
+ def count_persistables()
+ var ret = 0
+ var idx = 0
+ while idx < size(self)
+ if self[idx]._persist ret += 1 end
+ idx += 1
+ end
+ return ret
+ end
+
#############################################################
# every_second
def every_second()
diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be
index 994343ffa..da143d52c 100644
--- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be
+++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be
@@ -269,7 +269,7 @@ class Matter_Plugin_Root : Matter_Plugin
if attribute == 0x0003 # ---------- ConnectMaxTimeSeconds / uint8 ----------
return TLV.create_TLV(TLV.U1, 30) # 30 - value taking from example in esp-matter
elif attribute == 0xFFFC # ---------- FeatureMap / map32 ----------
- return TLV.create_TLV(TLV.U4, 0) # 15s ??? TOOD what should we put here?
+ return TLV.create_TLV(TLV.U4, 0x04) # Put Eth for now which should work for any on-network
end
# ====================================================================================================
diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Session.be b/lib/libesp32/berry_matter/src/embedded/Matter_Session.be
index 77fed188a..1e67a192f 100644
--- a/lib/libesp32/berry_matter/src/embedded/Matter_Session.be
+++ b/lib/libesp32/berry_matter/src/embedded/Matter_Session.be
@@ -601,6 +601,15 @@ class Matter_Session_Store
end
end
+ #############################################################
+ # Count active fabrics
+ #
+ # Count the number of commissionned fabrics, i.e. persisted
+ def count_active_fabrics(f)
+ self.remove_expired() # clean before saving
+ return self.fabrics.count_persistables()
+ end
+
#############################################################
# add session
def create_session(local_session_id, initiator_session_id)
diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be
index 7fc9329a0..e421cb7df 100644
--- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be
+++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be
@@ -160,7 +160,7 @@ class Matter_UI
webserver.content_send("
Passcode:
")
webserver.content_send(string.format("", self.device.passcode))
webserver.content_send("Distinguish id:
")
- webserver.content_send(string.format("", self.device.discriminator))
+ webserver.content_send(string.format("", self.device.discriminator))
webserver.content_send(string.format("IPv4 only
", self.device.ipv4only ? " checked" : ""))
webserver.content_send("")
webserver.content_send("")
@@ -314,6 +314,14 @@ class Matter_UI
end
# mtc0 = close, mtc1 = open commissioning
+ var fabrics_count = self.device.sessions.count_active_fabrics()
+ if fabrics_count == 0
+ webserver.content_send(string.format("%s
", "No active associaition"))
+ else
+ var plural = fabrics_count > 1
+ webserver.content_send(string.format("%s
", str(fabrics_count) + " active association" + (plural ? "s" : "")))
+ end
+
webserver.content_send(string.format("