Skip to content

Commit 059d119

Browse files
authored
Matter consolidate attributes per cluster (#19493)
1 parent ad00d9e commit 059d119

File tree

82 files changed

+7510
-5261
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+7510
-5261
lines changed

Diff for: lib/libesp32/berry_matter/solidify_all.be

+15
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,20 @@ end
2525
var prefix_dir = "src/embedded/"
2626
var prefix_out = "src/solidify/"
2727

28+
def sort(l)
29+
# insertion sort
30+
for i:1..size(l)-1
31+
var k = l[i]
32+
var j = i
33+
while (j > 0) && (l[j-1] > k)
34+
l[j] = l[j-1]
35+
j -= 1
36+
end
37+
l[j] = k
38+
end
39+
return l
40+
end
41+
2842
def clean_directory(dir)
2943
var file_list = os.listdir(dir)
3044
for f : file_list
@@ -78,6 +92,7 @@ end
7892
clean_directory(prefix_out)
7993

8094
var src_file_list = os.listdir(prefix_dir)
95+
src_file_list = sort(src_file_list)
8196
for src_file : src_file_list
8297
if src_file[0] == '.' continue end
8398
parse_file(src_file, prefix_out)

Diff for: lib/libesp32/berry_matter/src/be_matter_module.c

+44-33
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ BE_FUNC_CTYPE_DECLARE(matter_get_ip_bytes, "&", "s")
179179

180180
extern int matter_publish_command(bvm *vm);
181181

182-
#include "solidify/solidified_Matter_inspect.h"
182+
#include "solidify/solidified_Matter_0_Inspect.h"
183183

184184
extern const bclass be_class_Matter_TLV; // need to declare it upfront because of circular reference
185185
#include "solidify/solidified_Matter_Path.h"
@@ -201,45 +201,50 @@ extern const bclass be_class_Matter_TLV; // need to declare it upfront because
201201
#include "solidify/solidified_Matter_IM_Subscription.h"
202202
#include "solidify/solidified_Matter_IM.h"
203203
#include "solidify/solidified_Matter_Control_Message.h"
204-
#include "solidify/solidified_Matter_Plugin.h"
204+
#include "solidify/solidified_Matter_Plugin_0.h"
205205
#include "solidify/solidified_Matter_Base38.h"
206206
#include "solidify/solidified_Matter_UI.h"
207207
#include "solidify/solidified_Matter_Device.h"
208208
#include "solidify/solidified_Matter_Profiler.h"
209209

210210
#include "../generate/be_matter_certs.h"
211211

212-
#include "solidify/solidified_Matter_Plugin_Root.h"
213-
#include "solidify/solidified_Matter_Plugin_Aggregator.h"
214-
#include "solidify/solidified_Matter_Plugin_Device.h"
215-
#include "solidify/solidified_Matter_Plugin_OnOff.h"
216-
#include "solidify/solidified_Matter_Plugin_Light0.h"
217-
#include "solidify/solidified_Matter_Plugin_Light1.h"
218-
#include "solidify/solidified_Matter_Plugin_Light2.h"
219-
#include "solidify/solidified_Matter_Plugin_Light3.h"
220-
#include "solidify/solidified_Matter_Plugin_Shutter.h"
221-
#include "solidify/solidified_Matter_Plugin_ShutterTilt.h"
222-
#include "solidify/solidified_Matter_Plugin_Sensor.h"
223-
#include "solidify/solidified_Matter_Plugin_Sensor_Pressure.h"
224-
#include "solidify/solidified_Matter_Plugin_Sensor_Temp.h"
225-
#include "solidify/solidified_Matter_Plugin_Sensor_Illuminance.h"
226-
#include "solidify/solidified_Matter_Plugin_Sensor_Humidity.h"
227-
#include "solidify/solidified_Matter_Plugin_Sensor_Occupancy.h"
228-
#include "solidify/solidified_Matter_Plugin_Sensor_OnOff.h"
229-
#include "solidify/solidified_Matter_Plugin_Sensor_Contact.h"
230-
#include "solidify/solidified_Matter_Plugin_Bridge_HTTP.h"
231-
#include "solidify/solidified_Matter_Plugin_Bridge_OnOff.h"
232-
#include "solidify/solidified_Matter_Plugin_Bridge_Light0.h"
233-
#include "solidify/solidified_Matter_Plugin_Bridge_Light1.h"
234-
#include "solidify/solidified_Matter_Plugin_Bridge_Light2.h"
235-
#include "solidify/solidified_Matter_Plugin_Bridge_Light3.h"
236-
#include "solidify/solidified_Matter_Plugin_Bridge_Sensor.h"
237-
#include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h"
238-
#include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h"
239-
#include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h"
240-
#include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h"
241-
#include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h"
242-
#include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Contact.h"
212+
#include "solidify/solidified_Matter_Plugin_1_Root.h"
213+
#include "solidify/solidified_Matter_Plugin_2_Aggregator.h"
214+
#include "solidify/solidified_Matter_Plugin_1_Device.h"
215+
#include "solidify/solidified_Matter_Plugin_2_OnOff.h"
216+
#include "solidify/solidified_Matter_Plugin_9_Virt_OnOff.h"
217+
#include "solidify/solidified_Matter_Plugin_2_Light0.h"
218+
#include "solidify/solidified_Matter_Plugin_9_Virt_Light0.h"
219+
#include "solidify/solidified_Matter_Plugin_3_Light1.h"
220+
#include "solidify/solidified_Matter_Plugin_9_Virt_Light1.h"
221+
#include "solidify/solidified_Matter_Plugin_4_Light2.h"
222+
#include "solidify/solidified_Matter_Plugin_9_Virt_Light2.h"
223+
#include "solidify/solidified_Matter_Plugin_3_Light3.h"
224+
#include "solidify/solidified_Matter_Plugin_9_Virt_Light3.h"
225+
#include "solidify/solidified_Matter_Plugin_2_Shutter.h"
226+
#include "solidify/solidified_Matter_Plugin_3_ShutterTilt.h"
227+
#include "solidify/solidified_Matter_Plugin_2_Sensor.h"
228+
#include "solidify/solidified_Matter_Plugin_3_Sensor_Pressure.h"
229+
#include "solidify/solidified_Matter_Plugin_3_Sensor_Temp.h"
230+
#include "solidify/solidified_Matter_Plugin_3_Sensor_Illuminance.h"
231+
#include "solidify/solidified_Matter_Plugin_3_Sensor_Humidity.h"
232+
#include "solidify/solidified_Matter_Plugin_3_Sensor_Occupancy.h"
233+
#include "solidify/solidified_Matter_Plugin_3_Sensor_OnOff.h"
234+
#include "solidify/solidified_Matter_Plugin_3_Sensor_Contact.h"
235+
#include "solidify/solidified_Matter_Plugin_2_Bridge_HTTP.h"
236+
#include "solidify/solidified_Matter_Plugin_4_Bridge_OnOff.h"
237+
#include "solidify/solidified_Matter_Plugin_3_Bridge_Light0.h"
238+
#include "solidify/solidified_Matter_Plugin_4_Bridge_Light1.h"
239+
#include "solidify/solidified_Matter_Plugin_5_Bridge_Light2.h"
240+
#include "solidify/solidified_Matter_Plugin_5_Bridge_Light3.h"
241+
#include "solidify/solidified_Matter_Plugin_3_Bridge_Sensor.h"
242+
#include "solidify/solidified_Matter_Plugin_4_Bridge_Sensor_Pressure.h"
243+
#include "solidify/solidified_Matter_Plugin_4_Bridge_Sensor_Temp.h"
244+
#include "solidify/solidified_Matter_Plugin_4_Bridge_Sensor_Illuminance.h"
245+
#include "solidify/solidified_Matter_Plugin_4_Bridge_Sensor_Humidity.h"
246+
#include "solidify/solidified_Matter_Plugin_4_Bridge_Sensor_Occupancy.h"
247+
#include "solidify/solidified_Matter_Plugin_4_Bridge_Sensor_Contact.h"
243248

244249
/*********************************************************************************************\
245250
* Get a bytes() object of the certificate DAC/PAI_Cert
@@ -290,6 +295,7 @@ module matter (scope: global, strings: weak) {
290295
sort, closure(matter_sort_closure)
291296
jitter, closure(matter_jitter_closure)
292297
inspect, closure(matter_inspect_closure)
298+
consolidate_clusters, closure(matter_consolidate_clusters_closure)
293299
Profiler, class(be_class_Matter_Profiler)
294300
295301
// Status codes
@@ -422,10 +428,15 @@ module matter (scope: global, strings: weak) {
422428
Plugin_Aggregator, class(be_class_Matter_Plugin_Aggregator) // Aggregator
423429
Plugin_Device, class(be_class_Matter_Plugin_Device) // Generic device (abstract)
424430
Plugin_OnOff, class(be_class_Matter_Plugin_OnOff) // Relay/Light behavior (OnOff)
431+
Plugin_Virt_OnOff, class(be_class_Matter_Plugin_Virt_OnOff) // Relay/Light virtual (OnOff)
425432
Plugin_Light0, class(be_class_Matter_Plugin_Light0) // OnOff Light
433+
Plugin_Virt_Light0, class(be_class_Matter_Plugin_Virt_Light0) // OnOff Light Virtual
426434
Plugin_Light1, class(be_class_Matter_Plugin_Light1) // Dimmable Light
435+
Plugin_Virt_Light1, class(be_class_Matter_Plugin_Virt_Light1) // Dimmable Light Virtual
427436
Plugin_Light2, class(be_class_Matter_Plugin_Light2) // Color Temperature Light
437+
Plugin_Virt_Light2, class(be_class_Matter_Plugin_Virt_Light2) // Color Temperature Light Virtual
428438
Plugin_Light3, class(be_class_Matter_Plugin_Light3) // Extended Color Light
439+
Plugin_Virt_Light3, class(be_class_Matter_Plugin_Virt_Light3) // Extended Color Light Virtual
429440
Plugin_Shutter, class(be_class_Matter_Plugin_Shutter) // Shutter
430441
Plugin_ShutterTilt, class(be_class_Matter_Plugin_ShutterTilt) // Shutter + Tilt
431442
Plugin_Sensor, class(be_class_Matter_Plugin_Sensor) // Generic Sensor

Diff for: lib/libesp32/berry_matter/src/embedded/Matter_inspect.be renamed to lib/libesp32/berry_matter/src/embedded/Matter_0_Inspect.be

+28
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,31 @@ def inspect(p)
7474
end
7575
end
7676
matter.inspect = inspect
77+
78+
79+
#############################################################
80+
# consolidate_clusters
81+
#
82+
# Build a consolidated map of all the `CLUSTERS` static vars
83+
# from the inheritance hierarchy
84+
#@ solidify:matter.consolidate_clusters,weak
85+
def consolidate_clusters(cl, m)
86+
var cl_parent = super(cl).CLUSTERS
87+
var ret = {}
88+
# clone cl_parent
89+
for k: cl_parent.keys()
90+
# print(f"{k=} {cl_parent[k]=}")
91+
ret[k] = cl_parent[k].copy()
92+
end
93+
# add all keys from m
94+
# print("--- step 2")
95+
for k: m.keys()
96+
# print(f"{k=} {ret.find(k)=} {m[k]=}")
97+
var l = ret.find(k)
98+
if l == nil l = [] end
99+
ret[k] = l + m[k]
100+
end
101+
# print(ret)
102+
return ret
103+
end
104+
matter.consolidate_clusters = consolidate_clusters

Diff for: lib/libesp32/berry_matter/src/embedded/Matter_Device.be

+62
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,23 @@ class Matter_Device
664664
return nil
665665
end
666666

667+
#############################################################
668+
# Find plugin by endpoint
669+
def find_plugin_by_friendly_name(name)
670+
if (name == nil) || (size(name) == 0) return nil end # invalid name
671+
672+
var idx = 0
673+
while idx < size(self.plugins)
674+
var pl = self.plugins[idx]
675+
var pl_name = pl.get_name()
676+
if (pl_name != nil) && (size(pl_name) > 0) && (pl_name == name)
677+
return pl
678+
end
679+
idx += 1
680+
end
681+
return nil
682+
end
683+
667684
#############################################################
668685
# Persistance of Matter Device parameters
669686
#
@@ -1514,6 +1531,7 @@ class Matter_Device
15141531
#
15151532
def register_commands()
15161533
tasmota.add_cmd("MtrJoin", /cmd_found, idx, payload, payload_json -> self.MtrJoin(cmd_found, idx, payload, payload_json))
1534+
tasmota.add_cmd("MtrUpdate", /cmd_found, idx, payload, payload_json -> self.MtrUpdate(cmd_found, idx, payload, payload_json))
15171535
end
15181536

15191537
#####################################################################
@@ -1531,7 +1549,51 @@ class Matter_Device
15311549
tasmota.resp_cmnd_done()
15321550
end
15331551

1552+
#####################################################################
1553+
# `MtrUpdate`
1554+
#
1555+
# MtrUpdate {"ep":1, "Power":1}
1556+
# MtrUpdate {"Name":"ep1", "Power":1}
1557+
# MtrUpdate {"Name":"My_virtual_light", "Power":1}
1558+
#
1559+
def MtrUpdate(cmd_found, idx, payload, payload_json)
1560+
if payload_json == nil return tasmota.resp_cmnd("Invalid JSON") end
1561+
1562+
var key_i
1563+
if (key_i := tasmota.find_key_i(payload_json, 'Device')) != nil
1564+
var pl = self.find_plugin_by_name_or_ep(payload[key_i])
1565+
if (pl == nil) return tasmota.resp_cmnd("Invalid Device") end
1566+
if (!pl.virtual) return tasmota.resp_cmnd("Device is not virtual") end
1567+
# find endpoint (plugin) by name
1568+
# can be:
1569+
# - integer: endpoint number
1570+
# - "ep<n>": endpoint number
1571+
# - "<name>": friendly name for endpoint
1572+
end
1573+
1574+
tasmota.resp_cmnd_done()
1575+
end
15341576

1577+
#####################################################################
1578+
# find_plugin_by_name_or_ep
1579+
#
1580+
# `name`can be:
1581+
# - integer: endpoint number
1582+
# - "ep<n>": endpoint number
1583+
# - "<name>": friendly name for endpoint
1584+
def find_plugin_by_name_or_ep(name)
1585+
if type(name) == 'int'
1586+
if (name > 0) return self.find_plugin_by_endpoint(name) end
1587+
elif type(name) == 'string'
1588+
if name[0..1] == "ep"
1589+
var ep_num = int(name[2..])
1590+
if ep_num > 0 return self.find_plugin_by_endpoint(ep_num) end
1591+
else
1592+
return self.find_plugin_by_friendly_name(name)
1593+
end
1594+
end
1595+
return nil # invalid type
1596+
end
15351597
end
15361598
matter.Device = Matter_Device
15371599

Diff for: lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be renamed to lib/libesp32/berry_matter/src/embedded/Matter_Plugin_0.be

+19-18
Original file line numberDiff line numberDiff line change
@@ -128,24 +128,25 @@ class Matter_Plugin
128128
# Build a consolidated map of all the `CLUSTERS` static vars
129129
# from the inheritance hierarchy
130130
def consolidate_clusters()
131-
def real_super(o) return super(o) end # enclose `super()` in a static function to disable special behavior for super in instances
132-
var ret = {}
133-
var o = self # start with self
134-
while o != nil # when we rich highest class, `super()` returns `nil`
135-
var CL = o.CLUSTERS
136-
for k: CL.keys()
137-
# check if key already exists
138-
if !ret.contains(k) ret[k] = [] end
139-
for attr: CL[k] # iterate on values
140-
if ret[k].find(attr) == nil
141-
ret[k].push(attr)
142-
end
143-
end
144-
end
145-
146-
o = real_super(o)
147-
end
148-
return ret
131+
return self.CLUSTERS
132+
# def real_super(o) return super(o) end # enclose `super()` in a static function to disable special behavior for super in instances
133+
# var ret = {}
134+
# var o = self # start with self
135+
# while o != nil # when we rich highest class, `super()` returns `nil`
136+
# var CL = o.CLUSTERS
137+
# for k: CL.keys()
138+
# # check if key already exists
139+
# if !ret.contains(k) ret[k] = [] end
140+
# for attr: CL[k] # iterate on values
141+
# if ret[k].find(attr) == nil
142+
# ret[k].push(attr)
143+
# end
144+
# end
145+
# end
146+
147+
# o = real_super(o)
148+
# end
149+
# return ret
149150
end
150151

151152
#############################################################

Diff for: lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be renamed to lib/libesp32/berry_matter/src/embedded/Matter_Plugin_1_Device.be

+10-5
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,16 @@
1919

2020
import matter
2121

22-
# dummy declaration for solidification
23-
class Matter_Plugin end
24-
2522
#@ solidify:Matter_Plugin_Device,weak
2623

2724
class Matter_Plugin_Device : Matter_Plugin
28-
static var CLUSTERS = {
25+
static var CLUSTERS = matter.consolidate_clusters(_class, {
2926
# 0x001D: inherited # Descriptor Cluster 9.5 p.453
3027
0x0039: [3,5,0x0A,0x0F,0x11,0x12], # Bridged Device Basic Information 9.13 p.485
3128
0x0003: [0,1,0xFFFC,0xFFFD], # Identify 1.2 p.16
3229
0x0004: [0,0xFFFC,0xFFFD], # Groups 1.3 p.21
3330
0x0005: [0,1,2,3,4,5,0xFFFC,0xFFFD], # Scenes 1.4 p.30 - no writable
34-
}
31+
})
3532
static var TYPES = { 0x0013: 1 } # fake type
3633
static var NON_BRIDGE_VENDOR = [ 0x1217, 0x1381 ] # Fabric VendorID not supporting Bridge mode
3734
# Inherited
@@ -182,5 +179,13 @@ class Matter_Plugin_Device : Matter_Plugin
182179
end
183180
end
184181

182+
#############################################################
183+
# update_virtual
184+
#
185+
# Update internal state for virtual devices
186+
def update_virtual(payload_json)
187+
# pass
188+
end
189+
185190
end
186191
matter.Plugin_Device = Matter_Plugin_Device

Diff for: lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be renamed to lib/libesp32/berry_matter/src/embedded/Matter_Plugin_1_Root.be

+2-5
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,12 @@ import matter
2121

2222
# Matter plug-in for root behavior
2323

24-
# dummy declaration for solidification
25-
class Matter_Plugin end
26-
2724
#@ solidify:Matter_Plugin_Root,weak
2825

2926
class Matter_Plugin_Root : Matter_Plugin
3027
static var TYPE = "root" # name of the plug-in in json
3128
static var NAME = "Root node" # display name of the plug-in
32-
static var CLUSTERS = {
29+
static var CLUSTERS = matter.consolidate_clusters(_class, {
3330
# 0x001D: inherited # Descriptor Cluster 9.5 p.453
3431
0x001F: [0,2,3,4], # Access Control Cluster, p.461
3532
0x0028: [0,1,2,3,4,5,6,7,8,9,0x0A,0x0F,0x11,0x12,0x13],# Basic Information Cluster cluster 11.1 p.565
@@ -45,7 +42,7 @@ class Matter_Plugin_Root : Matter_Plugin
4542
0x003C: [0,1,2], # Administrator Commissioning Cluster 11.18 p.725
4643
0x003E: [0,1,2,3,4,5], # Node Operational Credentials Cluster 11.17 p.704
4744
0x003F: [] # Group Key Management Cluster 11.2 p.572
48-
}
45+
})
4946
static var TYPES = { 0x0016: 1 } # Root node
5047

5148
#############################################################

Diff for: lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Aggregator.be renamed to lib/libesp32/berry_matter/src/embedded/Matter_Plugin_2_Aggregator.be

-3
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@ import matter
2121

2222
# Matter plug-in for root behavior
2323

24-
# dummy declaration for solidification
25-
class Matter_Plugin end
26-
2724
#@ solidify:Matter_Plugin_Aggregator,weak
2825

2926
class Matter_Plugin_Aggregator : Matter_Plugin

0 commit comments

Comments
 (0)