Skip to content

Commit

Permalink
testing & added simples
Browse files Browse the repository at this point in the history
  • Loading branch information
sammachin committed Jan 1, 2025
1 parent b7196fb commit ca448af
Show file tree
Hide file tree
Showing 11 changed files with 1,113 additions and 53 deletions.
6 changes: 3 additions & 3 deletions command.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ module.exports = function(RED) {
var node = this;
node.controller = RED.nodes.getNode(config.controller);
node._id = BigInt(config.device.split('-')[0])
node._ep = config.device.split('-')[1] || 1
node._ep = config.device.split('-')[1]
node.cluster = Number(config.cluster)
node.command = config.command
this.on('input', function(msg) {
_data = RED.util.evaluateNodeProperty(config.data, config.dataType, node, msg);
node.controller.commissioningController.connectNode(node._id)
.then((device) => {
const ep = device.getDeviceById(node._ep)
.then((conn) => {
const ep = conn.getDeviceById(Number(node._ep))
const clc = ep.getClusterClientById(Number(node.cluster))
let command = eval(`clc.commands.${node.command}`)
if (Object.keys(_data).length == 0){
Expand Down
59 changes: 35 additions & 24 deletions editor_apis.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
const {commandOptions, attributeOptions} = require('./utils')
const { BasicInformationCluster } = require( "@matter/main/clusters");
const os = require('os');

let listComplete = false
let deviceList = {}

module.exports = function(RED) {

Expand All @@ -21,8 +22,9 @@ RED.httpAdmin.get('/_mattercontroller/interfaces', RED.auth.needsPermission('adm
// List Devices
RED.httpAdmin.get('/_mattercontroller/:id/devices/', RED.auth.needsPermission('admin.write'), function(req,res){
let ctrl_node = RED.nodes.getNode(req.params.id)
listComplete = false
deviceList = {}
if (ctrl_node){
deviceList = {}
const nodes = ctrl_node.commissioningController.getCommissionedNodes();
nodes.forEach(nodeId => {
ctrl_node.commissioningController.connectNode(nodeId)
Expand All @@ -37,16 +39,15 @@ RED.httpAdmin.get('/_mattercontroller/:id/devices/', RED.auth.needsPermission('a
deviceList[`${nodeId}-${ep.number}`] = nodeLabel
})
})
listComplete = true

} else { //Simple Device
info = conn.getRootClusterClient(BasicInformationCluster)
info.getNodeLabelAttribute()
ep = endpoints[0]
info.getNodeLabelAttribute()
.then((nodeLabel) => {
deviceList[`${nodeId}-${ep.number}`] = nodeLabel
if (Object.keys(deviceList).length == nodes.length){
res.send(deviceList)
}
listComplete = true
})
}
} else { //Composed Device
Expand All @@ -57,29 +58,37 @@ RED.httpAdmin.get('/_mattercontroller/:id/devices/', RED.auth.needsPermission('a
let name = ep.name.split('-')[1]
deviceList[`${nodeId}-${ep.number}`] = `${nodeLabel}-${name}`
})
if (Object.keys(deviceList).length == nodes.length){
res.send(deviceList)
}
listComplete = true
})
}
})
})
listReadytoSend(res)

}
else {
res.sendStatus(404);
}

})
function listReadytoSend(res) {
if (!listComplete) {
setTimeout(listReadytoSend, 100, res)
} else {
res.send(deviceList)
}
}

// List Clusters
RED.httpAdmin.get('/_mattercontroller/:cid/device/:did/clusters', RED.auth.needsPermission('admin.write'), function(req,res){
let ctrl_node = RED.nodes.getNode(req.params.cid)
let nodeID = BigInt(req.params.did.split('-')[0])
let ep = Number(req.params.did.split('-')[1]) || 0
let epID = Number(req.params.did.split('-')[1])
if (ctrl_node){
ctrl_node.commissioningController.connectNode(nodeID)
.then((conn) => {
let d = conn.getDevices()
let cl = d[ep].getAllClusterClients()
let ep = conn.getDeviceById(epID)
let cl = ep.getAllClusterClients()
clusterList = {}
cl.forEach((c) => {
clusterList[c.id] = c.name
Expand All @@ -95,12 +104,12 @@ RED.httpAdmin.get('/_mattercontroller/:cid/device/:did/clusters', RED.auth.needs
RED.httpAdmin.get('/_mattercontroller/:cid/device/:did/cluster/:clid/commands', RED.auth.needsPermission('admin.write'), function(req,res){
let ctrl_node = RED.nodes.getNode(req.params.cid)
let nodeID = BigInt(req.params.did.split('-')[0])
let ep = Number(req.params.did.split('-')[1]) || 0
let epID = Number(req.params.did.split('-')[1])
if (ctrl_node){
ctrl_node.commissioningController.connectNode(nodeID)
.then((conn) => {
let d = conn.getDevices()
cmds = d[ep].getClusterClientById(Number(req.params.clid)).commands
let ep = conn.getDeviceById(epID)
cmds = ep.getClusterClientById(Number(req.params.clid)).commands
res.send(Object.keys(cmds))
})
}
Expand All @@ -119,12 +128,12 @@ RED.httpAdmin.get('/_mattermodel/cluster/:clid/command/:cmd/options', RED.auth.n
RED.httpAdmin.get('/_mattercontroller/:cid/device/:did/cluster/:clid/attributes', RED.auth.needsPermission('admin.write'), function(req,res){
let ctrl_node = RED.nodes.getNode(req.params.cid)
let nodeID = BigInt(req.params.did.split('-')[0])
let ep = Number(req.params.did.split('-')[1]) || 0
let epID = Number(req.params.did.split('-')[1])
if (ctrl_node){
ctrl_node.commissioningController.connectNode(nodeID)
.then((conn) => {
let d = conn.getDevices()
atrs = d[ep].getClusterClientById(Number(req.params.clid)).attributes
let ep = conn.getDeviceById(epID)
atrs = ep.getClusterClientById(Number(req.params.clid)).attributes
res.send(Object.keys(atrs))
})
}
Expand All @@ -135,13 +144,14 @@ RED.httpAdmin.get('/_mattercontroller/:cid/device/:did/cluster/:clid/attributes'

// List Writable Attributes
RED.httpAdmin.get('/_mattercontroller/:cid/device/:did/cluster/:clid/attributes_writable', RED.auth.needsPermission('admin.write'), function(req,res){
let ctrl_node = RED.nodes.getNode(req.params.cid)
let nodeID = BigInt(req.params.did.split('-')[0])
let ep = Number(req.params.did.split('-')[1]) || 0
let epID = Number(req.params.did.split('-')[1])
if (ctrl_node){
ctrl_node.commissioningController.connectNode(nodeID)
.then((conn) => {
let d = conn.getDevices()
atrs = d[ep].getClusterClientById(Number(req.params.clid)).attributes
let ep = conn.getDeviceById(epID)
atrs = ep.getClusterClientById(Number(req.params.clid)).attributes
let response = []
Object.keys(atrs).forEach((k) => {
if (atrs[k].attribute.writable) {
Expand All @@ -158,13 +168,14 @@ RED.httpAdmin.get('/_mattercontroller/:cid/device/:did/cluster/:clid/attributes_

// List Events
RED.httpAdmin.get('/_mattercontroller/:cid/device/:did/cluster/:clid/events', RED.auth.needsPermission('admin.write'), function(req,res){
let ctrl_node = RED.nodes.getNode(req.params.cid)
let nodeID = BigInt(req.params.did.split('-')[0])
let ep = Number(req.params.did.split('-')[1]) || 0
let epID = Number(req.params.did.split('-')[1]) || 0
if (ctrl_node){
ctrl_node.commissioningController.connectNode(nodeID)
.then((conn) => {
let d = conn.getDevices()
events = d[ep].getClusterClientById(Number(req.params.clid)).events
let ep = conn.getDeviceById(epID)
events = ep.getClusterClientById(Number(req.params.clid)).events
res.send(Object.keys(events))
})
}
Expand Down
4 changes: 2 additions & 2 deletions event.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ module.exports = function(RED) {

function subscribe(node){
node.controller.commissioningController.connectNode(node._id)
.then((device) => {
const ep = device.getDeviceById(node._ep)
.then((conn) => {
const ep = conn.getDeviceById(Number(node._ep))
const clc = ep.getClusterClientById(Number(node.cluster))
let command = eval(`clc.add${node.event}EventListener`)
command(value => {
Expand Down
2 changes: 1 addition & 1 deletion manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ module.exports = function(RED) {
.then((conn) => {
let endpoints = conn.getDevices()
if (endpoints[0].deviceType == 14) { //Bridge
ep = conn.getDeviceByID(_ep)
ep = conn.getDeviceById(Number(_ep))
bridgedinfo = ep.getClusterClientById(57)
bridgedinfo.setNodeLabelAttribute(_label).then(() => {
node.log(`Renamed ${msg.payload.id} as ${_label}`)
Expand Down
4 changes: 2 additions & 2 deletions read_attribute.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ module.exports = function(RED) {
node.cluster = Number(config.cluster)
node.attr = cap(config.attr)
this.on('input', function(msg) {
node.controller.commissioningController.connectNode(node._id).then((device) => {
const ep = device.getDeviceById(node._ep)
node.controller.commissioningController.connectNode(node._id).then((conn) => {
const ep = conn.getDeviceById(Number(node._ep))
const clc = ep.getClusterClientById(Number(node.cluster))
try {
let command = eval(`clc.get${node.attr}Attribute`)
Expand Down
6 changes: 2 additions & 4 deletions repl.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Logger.defaultLogLevel = 4;
const commissioningController = new CommissioningController({
environment: {
environment,
id: "controller-9999",
id: "24cb35c0870756c1",
},
autoConnect: true,
});
Expand Down Expand Up @@ -51,13 +51,11 @@ async function commissionDevice(pc){


var nodes = commissioningController.getCommissionedNodes();
var conn = await commissioningController.connectNode(nodes[0])
var conn = await commissioningController.connectNode(nodes[2])
var devices = conn.getDevices()

var info = conn.getRootClusterClient(BasicInformationCluster)
var descriptor = conn.getRootClusterClient(DescriptorCluster);
var parts = await descriptor.attributes.partsList.get()
var agg = devices[0]



Expand Down
Loading

0 comments on commit ca448af

Please sign in to comment.