Skip to content

Commit

Permalink
Matter consolidate attributes per cluster (#19493)
Browse files Browse the repository at this point in the history
  • Loading branch information
s-hadinger authored Sep 10, 2023
1 parent ad00d9e commit 059d119
Show file tree
Hide file tree
Showing 82 changed files with 7,510 additions and 5,261 deletions.
15 changes: 15 additions & 0 deletions lib/libesp32/berry_matter/solidify_all.be
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,20 @@ end
var prefix_dir = "src/embedded/"
var prefix_out = "src/solidify/"

def sort(l)
# insertion sort
for i:1..size(l)-1
var k = l[i]
var j = i
while (j > 0) && (l[j-1] > k)
l[j] = l[j-1]
j -= 1
end
l[j] = k
end
return l
end

def clean_directory(dir)
var file_list = os.listdir(dir)
for f : file_list
Expand Down Expand Up @@ -78,6 +92,7 @@ end
clean_directory(prefix_out)

var src_file_list = os.listdir(prefix_dir)
src_file_list = sort(src_file_list)
for src_file : src_file_list
if src_file[0] == '.' continue end
parse_file(src_file, prefix_out)
Expand Down
77 changes: 44 additions & 33 deletions lib/libesp32/berry_matter/src/be_matter_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ BE_FUNC_CTYPE_DECLARE(matter_get_ip_bytes, "&", "s")

extern int matter_publish_command(bvm *vm);

#include "solidify/solidified_Matter_inspect.h"
#include "solidify/solidified_Matter_0_Inspect.h"

extern const bclass be_class_Matter_TLV; // need to declare it upfront because of circular reference
#include "solidify/solidified_Matter_Path.h"
Expand All @@ -201,45 +201,50 @@ extern const bclass be_class_Matter_TLV; // need to declare it upfront because
#include "solidify/solidified_Matter_IM_Subscription.h"
#include "solidify/solidified_Matter_IM.h"
#include "solidify/solidified_Matter_Control_Message.h"
#include "solidify/solidified_Matter_Plugin.h"
#include "solidify/solidified_Matter_Plugin_0.h"
#include "solidify/solidified_Matter_Base38.h"
#include "solidify/solidified_Matter_UI.h"
#include "solidify/solidified_Matter_Device.h"
#include "solidify/solidified_Matter_Profiler.h"

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

#include "solidify/solidified_Matter_Plugin_Root.h"
#include "solidify/solidified_Matter_Plugin_Aggregator.h"
#include "solidify/solidified_Matter_Plugin_Device.h"
#include "solidify/solidified_Matter_Plugin_OnOff.h"
#include "solidify/solidified_Matter_Plugin_Light0.h"
#include "solidify/solidified_Matter_Plugin_Light1.h"
#include "solidify/solidified_Matter_Plugin_Light2.h"
#include "solidify/solidified_Matter_Plugin_Light3.h"
#include "solidify/solidified_Matter_Plugin_Shutter.h"
#include "solidify/solidified_Matter_Plugin_ShutterTilt.h"
#include "solidify/solidified_Matter_Plugin_Sensor.h"
#include "solidify/solidified_Matter_Plugin_Sensor_Pressure.h"
#include "solidify/solidified_Matter_Plugin_Sensor_Temp.h"
#include "solidify/solidified_Matter_Plugin_Sensor_Illuminance.h"
#include "solidify/solidified_Matter_Plugin_Sensor_Humidity.h"
#include "solidify/solidified_Matter_Plugin_Sensor_Occupancy.h"
#include "solidify/solidified_Matter_Plugin_Sensor_OnOff.h"
#include "solidify/solidified_Matter_Plugin_Sensor_Contact.h"
#include "solidify/solidified_Matter_Plugin_Bridge_HTTP.h"
#include "solidify/solidified_Matter_Plugin_Bridge_OnOff.h"
#include "solidify/solidified_Matter_Plugin_Bridge_Light0.h"
#include "solidify/solidified_Matter_Plugin_Bridge_Light1.h"
#include "solidify/solidified_Matter_Plugin_Bridge_Light2.h"
#include "solidify/solidified_Matter_Plugin_Bridge_Light3.h"
#include "solidify/solidified_Matter_Plugin_Bridge_Sensor.h"
#include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h"
#include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h"
#include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h"
#include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h"
#include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h"
#include "solidify/solidified_Matter_Plugin_Bridge_Sensor_Contact.h"
#include "solidify/solidified_Matter_Plugin_1_Root.h"
#include "solidify/solidified_Matter_Plugin_2_Aggregator.h"
#include "solidify/solidified_Matter_Plugin_1_Device.h"
#include "solidify/solidified_Matter_Plugin_2_OnOff.h"
#include "solidify/solidified_Matter_Plugin_9_Virt_OnOff.h"
#include "solidify/solidified_Matter_Plugin_2_Light0.h"
#include "solidify/solidified_Matter_Plugin_9_Virt_Light0.h"
#include "solidify/solidified_Matter_Plugin_3_Light1.h"
#include "solidify/solidified_Matter_Plugin_9_Virt_Light1.h"
#include "solidify/solidified_Matter_Plugin_4_Light2.h"
#include "solidify/solidified_Matter_Plugin_9_Virt_Light2.h"
#include "solidify/solidified_Matter_Plugin_3_Light3.h"
#include "solidify/solidified_Matter_Plugin_9_Virt_Light3.h"
#include "solidify/solidified_Matter_Plugin_2_Shutter.h"
#include "solidify/solidified_Matter_Plugin_3_ShutterTilt.h"
#include "solidify/solidified_Matter_Plugin_2_Sensor.h"
#include "solidify/solidified_Matter_Plugin_3_Sensor_Pressure.h"
#include "solidify/solidified_Matter_Plugin_3_Sensor_Temp.h"
#include "solidify/solidified_Matter_Plugin_3_Sensor_Illuminance.h"
#include "solidify/solidified_Matter_Plugin_3_Sensor_Humidity.h"
#include "solidify/solidified_Matter_Plugin_3_Sensor_Occupancy.h"
#include "solidify/solidified_Matter_Plugin_3_Sensor_OnOff.h"
#include "solidify/solidified_Matter_Plugin_3_Sensor_Contact.h"
#include "solidify/solidified_Matter_Plugin_2_Bridge_HTTP.h"
#include "solidify/solidified_Matter_Plugin_4_Bridge_OnOff.h"
#include "solidify/solidified_Matter_Plugin_3_Bridge_Light0.h"
#include "solidify/solidified_Matter_Plugin_4_Bridge_Light1.h"
#include "solidify/solidified_Matter_Plugin_5_Bridge_Light2.h"
#include "solidify/solidified_Matter_Plugin_5_Bridge_Light3.h"
#include "solidify/solidified_Matter_Plugin_3_Bridge_Sensor.h"
#include "solidify/solidified_Matter_Plugin_4_Bridge_Sensor_Pressure.h"
#include "solidify/solidified_Matter_Plugin_4_Bridge_Sensor_Temp.h"
#include "solidify/solidified_Matter_Plugin_4_Bridge_Sensor_Illuminance.h"
#include "solidify/solidified_Matter_Plugin_4_Bridge_Sensor_Humidity.h"
#include "solidify/solidified_Matter_Plugin_4_Bridge_Sensor_Occupancy.h"
#include "solidify/solidified_Matter_Plugin_4_Bridge_Sensor_Contact.h"

/*********************************************************************************************\
* Get a bytes() object of the certificate DAC/PAI_Cert
Expand Down Expand Up @@ -290,6 +295,7 @@ module matter (scope: global, strings: weak) {
sort, closure(matter_sort_closure)
jitter, closure(matter_jitter_closure)
inspect, closure(matter_inspect_closure)
consolidate_clusters, closure(matter_consolidate_clusters_closure)
Profiler, class(be_class_Matter_Profiler)
// Status codes
Expand Down Expand Up @@ -422,10 +428,15 @@ module matter (scope: global, strings: weak) {
Plugin_Aggregator, class(be_class_Matter_Plugin_Aggregator) // Aggregator
Plugin_Device, class(be_class_Matter_Plugin_Device) // Generic device (abstract)
Plugin_OnOff, class(be_class_Matter_Plugin_OnOff) // Relay/Light behavior (OnOff)
Plugin_Virt_OnOff, class(be_class_Matter_Plugin_Virt_OnOff) // Relay/Light virtual (OnOff)
Plugin_Light0, class(be_class_Matter_Plugin_Light0) // OnOff Light
Plugin_Virt_Light0, class(be_class_Matter_Plugin_Virt_Light0) // OnOff Light Virtual
Plugin_Light1, class(be_class_Matter_Plugin_Light1) // Dimmable Light
Plugin_Virt_Light1, class(be_class_Matter_Plugin_Virt_Light1) // Dimmable Light Virtual
Plugin_Light2, class(be_class_Matter_Plugin_Light2) // Color Temperature Light
Plugin_Virt_Light2, class(be_class_Matter_Plugin_Virt_Light2) // Color Temperature Light Virtual
Plugin_Light3, class(be_class_Matter_Plugin_Light3) // Extended Color Light
Plugin_Virt_Light3, class(be_class_Matter_Plugin_Virt_Light3) // Extended Color Light Virtual
Plugin_Shutter, class(be_class_Matter_Plugin_Shutter) // Shutter
Plugin_ShutterTilt, class(be_class_Matter_Plugin_ShutterTilt) // Shutter + Tilt
Plugin_Sensor, class(be_class_Matter_Plugin_Sensor) // Generic Sensor
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,3 +74,31 @@ def inspect(p)
end
end
matter.inspect = inspect


#############################################################
# consolidate_clusters
#
# Build a consolidated map of all the `CLUSTERS` static vars
# from the inheritance hierarchy
#@ solidify:matter.consolidate_clusters,weak
def consolidate_clusters(cl, m)
var cl_parent = super(cl).CLUSTERS
var ret = {}
# clone cl_parent
for k: cl_parent.keys()
# print(f"{k=} {cl_parent[k]=}")
ret[k] = cl_parent[k].copy()
end
# add all keys from m
# print("--- step 2")
for k: m.keys()
# print(f"{k=} {ret.find(k)=} {m[k]=}")
var l = ret.find(k)
if l == nil l = [] end
ret[k] = l + m[k]
end
# print(ret)
return ret
end
matter.consolidate_clusters = consolidate_clusters
62 changes: 62 additions & 0 deletions lib/libesp32/berry_matter/src/embedded/Matter_Device.be
Original file line number Diff line number Diff line change
Expand Up @@ -664,6 +664,23 @@ class Matter_Device
return nil
end

#############################################################
# Find plugin by endpoint
def find_plugin_by_friendly_name(name)
if (name == nil) || (size(name) == 0) return nil end # invalid name

var idx = 0
while idx < size(self.plugins)
var pl = self.plugins[idx]
var pl_name = pl.get_name()
if (pl_name != nil) && (size(pl_name) > 0) && (pl_name == name)
return pl
end
idx += 1
end
return nil
end

#############################################################
# Persistance of Matter Device parameters
#
Expand Down Expand Up @@ -1514,6 +1531,7 @@ class Matter_Device
#
def register_commands()
tasmota.add_cmd("MtrJoin", /cmd_found, idx, payload, payload_json -> self.MtrJoin(cmd_found, idx, payload, payload_json))
tasmota.add_cmd("MtrUpdate", /cmd_found, idx, payload, payload_json -> self.MtrUpdate(cmd_found, idx, payload, payload_json))
end

#####################################################################
Expand All @@ -1531,7 +1549,51 @@ class Matter_Device
tasmota.resp_cmnd_done()
end

#####################################################################
# `MtrUpdate`
#
# MtrUpdate {"ep":1, "Power":1}
# MtrUpdate {"Name":"ep1", "Power":1}
# MtrUpdate {"Name":"My_virtual_light", "Power":1}
#
def MtrUpdate(cmd_found, idx, payload, payload_json)
if payload_json == nil return tasmota.resp_cmnd("Invalid JSON") end

var key_i
if (key_i := tasmota.find_key_i(payload_json, 'Device')) != nil
var pl = self.find_plugin_by_name_or_ep(payload[key_i])
if (pl == nil) return tasmota.resp_cmnd("Invalid Device") end
if (!pl.virtual) return tasmota.resp_cmnd("Device is not virtual") end
# find endpoint (plugin) by name
# can be:
# - integer: endpoint number
# - "ep<n>": endpoint number
# - "<name>": friendly name for endpoint
end

tasmota.resp_cmnd_done()
end

#####################################################################
# find_plugin_by_name_or_ep
#
# `name`can be:
# - integer: endpoint number
# - "ep<n>": endpoint number
# - "<name>": friendly name for endpoint
def find_plugin_by_name_or_ep(name)
if type(name) == 'int'
if (name > 0) return self.find_plugin_by_endpoint(name) end
elif type(name) == 'string'
if name[0..1] == "ep"
var ep_num = int(name[2..])
if ep_num > 0 return self.find_plugin_by_endpoint(ep_num) end
else
return self.find_plugin_by_friendly_name(name)
end
end
return nil # invalid type
end
end
matter.Device = Matter_Device

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,24 +128,25 @@ class Matter_Plugin
# Build a consolidated map of all the `CLUSTERS` static vars
# from the inheritance hierarchy
def consolidate_clusters()
def real_super(o) return super(o) end # enclose `super()` in a static function to disable special behavior for super in instances
var ret = {}
var o = self # start with self
while o != nil # when we rich highest class, `super()` returns `nil`
var CL = o.CLUSTERS
for k: CL.keys()
# check if key already exists
if !ret.contains(k) ret[k] = [] end
for attr: CL[k] # iterate on values
if ret[k].find(attr) == nil
ret[k].push(attr)
end
end
end

o = real_super(o)
end
return ret
return self.CLUSTERS
# def real_super(o) return super(o) end # enclose `super()` in a static function to disable special behavior for super in instances
# var ret = {}
# var o = self # start with self
# while o != nil # when we rich highest class, `super()` returns `nil`
# var CL = o.CLUSTERS
# for k: CL.keys()
# # check if key already exists
# if !ret.contains(k) ret[k] = [] end
# for attr: CL[k] # iterate on values
# if ret[k].find(attr) == nil
# ret[k].push(attr)
# end
# end
# end

# o = real_super(o)
# end
# return ret
end

#############################################################
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,16 @@

import matter

# dummy declaration for solidification
class Matter_Plugin end

#@ solidify:Matter_Plugin_Device,weak

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

#############################################################
# update_virtual
#
# Update internal state for virtual devices
def update_virtual(payload_json)
# pass
end

end
matter.Plugin_Device = Matter_Plugin_Device
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,12 @@ import matter

# Matter plug-in for root behavior

# dummy declaration for solidification
class Matter_Plugin end

#@ solidify:Matter_Plugin_Root,weak

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

#############################################################
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,6 @@ import matter

# Matter plug-in for root behavior

# dummy declaration for solidification
class Matter_Plugin end

#@ solidify:Matter_Plugin_Aggregator,weak

class Matter_Plugin_Aggregator : Matter_Plugin
Expand Down
Loading

0 comments on commit 059d119

Please sign in to comment.