Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Matter consolidate attributes per cluster #19493

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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