🚀 Matter & Gladys Assistant: Here we go!

Hello everyone! :smiley:

The Matter protocol is becoming more and more interesting: we’re finally starting to see stable and compelling devices on the market.

As I explained in my live “Projets pour 2025” (at 23:57), I have high hopes for Matter and I think Gladys Assistant could benefit greatly.

:backhand_index_pointing_right: In the long run, a single home automation protocol could dominate, and if it’s Matter, that would greatly reduce the differences between Gladys and other solutions in terms of integrations. The main challenge would then become the user experience, which is precisely Gladys’s greatest strength! :fire:

:bullseye: First test: a Matter / Thread smart plug

To move forward on this topic, I ordered a Eve Energy plug compatible with Matter on the Thread network.

It’s one of the highest-rated Matter devices right now! The Eve brand puts a strong focus on UX and privacy, which aligns perfectly with Gladys’s philosophy.

:clapper_board: Matter live coding in Gladys – Friday, March 28 at 10:00

I’ll be live on YouTube for a live coding session where I’ll code the Matter integration into Gladys live!

As usual, we’ll start small (one device) and expand progressively.

:red_circle: Live link : https://youtube.com/live/gBxSVSGUjJ0

:loudspeaker: Remember to turn on the bell :bell: to be notified!

Looking forward to sharing this with you and getting your feedback! :rocket:

hello @pierre-gilles ,
stable and convincing, certainly, and I’m convinced.
but 2 other elements are also important to me:
- that it be an open protocol and accessible to devs (not a proprietary protocol that a lobby of brands would appropriate, as too often happens with certain types of devices and standards)
- that the offered products remain affordable in the same way as with Zigbee, because other products/protocols often weigh on the wallet
- but also that Matter does not come to kill Zigbee for all that!

2 Likes

That’s the case! I’ve already done tests, and it’s very open. I only created this post after my investigations :wink:

Since the protocol is open, anyone can create a Matter device, including DIY! :rocket: This should have the same impact as Zigbee: unlimited competition, pushing prices down. :chart_decreasing:

Matter is not a competitor of Zigbee; however, Thread is a competitor of Zigbee.

Matter is not a radio protocol :warning:

You can have a Zigbee device compatible with Matter :slight_smile:

4 Likes

All set for tomorrow ^^ Unbelievably simple to install ^^ Once the plugin is installed, it finds everything by itself 
 I was surprised there wasn’t even any need to configure the Shelly ^^

2 Likes

Amazing! I can’t wait to see all of this working with Gladys :star_struck:

2 Likes

Thanks everyone for coming to this live!

The replay is available here:

https://www.youtube.com/live/gBxSVSGUjJ0

I’ve pushed this morning’s development here:

It’s still WIP, but it’s already a very good base, I think we’re not far from having something to publish to production :slight_smile:

@Terdious as we said on the live, I’d appreciate a test from you with MatterBridge to make sure the choices I made about the identification of devices/features are correct :slight_smile:

3 Likes

Just launched:

Shouldn’t Matter be disabled by default? And take advantage of your activation button in the settings? And on the devices page, redirect to the settings page if not activated?

So
 It’s not working (the pairing code) but I suppose the reason is:

2025-03-28T17:19:53+0100 \u003cinfo\u003e matter.pairDevice.js:38 (MatterHandler.pairDevice) Commissioning device with options: {\"commissioning\":{\"regulatoryLocation\":0,\"regulatoryCountryCode\":\"XX\",\"regulatoryLocationType\":0},\"discovery\":{\"identifierData\":{\"shortDiscriminator\":15},\"discoveryCapabilities\":{\"ble\":false}},\"passcode\":63702205,\"commissioningTimeoutSeconds\":60,\"commissioningAttempts\":3,\"commissioningRetryDelayMs\":1000}
2025-03-28 17:19:53.938 INFO   PeerCommissioner     Commissioning device with identifier {\"shortDiscriminator\":15} and 1 scanners and knownAddress \"undefined\"
2025-03-28 17:19:53.938 INFO   ControllerDiscovery  Start Discovering devices using identifier {\"shortDiscriminator\":15} ...
2025-03-28 17:19:53.939 DEBUG  MdnsScanner          Registered waiter for query _S15._sub._matterc._udp.local with timeout 30 seconds
2025-03-28 17:19:53.939 DEBUG  MdnsScanner          Set 2 query records for query _S15._sub._matterc._udp.local: [{\"name\":\"_matterc._udp.local\",\"recordClass\":1,\"recordType\":12},{\"name\":\"_S15._sub._matterc._udp.local\",\"recordClass\":1,\"recordType\":12}]
2025-03-28 17:19:53.940 DEBUG  MdnsScanner          Sending 2 query records for 1 queries with 0 known answers. Re-Announce in 1.5 seconds
2025-03-28 17:19:53.942 DEBUG  NodejsChannel        Socket created and bound remoteAddress: undefined:5353 localAddress: 0.0.0.0:5353
2025-03-28 17:19:53.942 DEBUG  NodejsChannel        Socket created and bound remoteAddress: undefined:5353 localAddress: :::5353
2025-03-28 17:19:53.942 DEBUG  NodejsChannel        Initialize multicast address: 172.26.50.62:5353 interface: eth0 type: udp4
2025-03-28 17:19:53.943 DEBUG  NodejsChannel        Initialize multicast address: ::%eth0:5353 interface: eth0 type: udp6
2025-03-28 17:19:55.441 DEBUG  MdnsScanner          Sending 2 query records for 1 queries with 0 known answers. Re-Announce in 3 seconds
2025-03-28 17:19:58.441 DEBUG  MdnsScanner          Sending 2 query records for 1 queries with 0 known answers. Re-Announce in 6 seconds
2025-03-28 17:20:04.442 DEBUG  MdnsScanner          Sending 2 query records for 1 queries with 0 known answers. Re-Announce in 12 seconds
2025-03-28 17:20:16.443 DEBUG  MdnsScanner          Sending 2 query records for 1 queries with 0 known answers. Re-Announce in 24 seconds
2025-03-28 17:20:23.940 DEBUG  MdnsScanner          Finishing waiter for query _S15._sub._matterc._udp.local, resolving: true
2025-03-28 17:20:23.940 DEBUG  MdnsScanner          Removing last query _S15._sub._matterc._udp.local and stopping announce timer
2025-03-28 17:20:23.940 INFO   ControllerDiscovery  Found 0 devices using identifier {\"shortDiscriminator\":15}

I’m stuck on my Linux (dev on Windows).

I’m looking


Tout repris, j’ai installĂ© un env de dev sur mon linux avec 
 vscode ! Je verrais plus tard si Cursor dispo.
Donc Ă  la connexion

  • CĂŽtĂ© logs MatterBridge :
info [18:05:06.148] [Frontend] WebSocketServer client "::ffff:10.1.0.62" connected to Matterbridge
info [18:05:18.685] [PaseServer] Received pairing request from udp://[fe80::1f9b:dcb9:d14b:707a%enp2s0]:39400.
info [18:05:18.957] [PaseServer] Session 2371 created with udp://[fe80::1f9b:dcb9:d14b:707a%enp2s0]:39400.
info [18:05:18.968] [InsecureSession] End insecure session insecure/7632973793930278144
info [18:05:19.103] [BehaviorServer] Invoke Matterbridge.armFailSafe online#846f4e6@0 expiryLengthSeconds: 60 breadcrumb: 1
info [18:05:19.120] [BehaviorServer] Invoke Matterbridge.certificateChainRequest online#846f4e8@0 certificateType: 1
info [18:05:19.145] [BehaviorServer] Invoke Matterbridge.certificateChainRequest online#846f4ea@0 certificateType: 2
info [18:05:19.156] [BehaviorServer] Invoke Matterbridge.attestationRequest online#846f4ec@0 attestationNonce: 4715872ecb087233d5d062588e348c5d8327780d7e571a1972df59b9cc5ebeaa
info [18:05:19.167] [BehaviorServer] Invoke Matterbridge.csrRequest online#846f4ee@0 csrNonce: 7a47ebec9f78619baa1423d1cf550ffbc610c9b5b6d5528a56e69821cd2d92cb
info [18:05:19.184] [BehaviorServer] Invoke Matterbridge.addTrustedRootCertificate online#846f4f0@0 rootCaCertificate: 15300101002402013703 ... 65a682b8ff2be688ea18
info [18:05:19.203] [BehaviorServer] Invoke Matterbridge.addNoc online#846f4f2@0 nocValue: 15300101022402013703 ... a05d01243f6df9f3f918 icacValue: ipkValue: 249f416140414c8a8509587f128476f4 caseAdminSubject: 13660266413132073995 adminVendorId: 65521
info [18:05:19.212] [DeviceCommissioner] Announce done fabric: 1 fabricIndex: 1
info [18:05:19.216] [Transaction] Tx reactor#224 waiting on online#846f4f2@0
info [18:05:19.218] [Operationa~edentials] addNoc success, adminVendorId 65521, caseAdminSubject 13660266413132073995
info [18:05:19.257] [AccessControlServer] ACL updated, updating ACL manager { fabricIndex: 1, privilege: 5, authMode: 2, subjects: [ 13660266413132073995 ], targets: null }
info [18:05:19.274] [BehaviorServer] Invoke Matterbridge.armFailSafe online#846f4f4@0 expiryLengthSeconds: 60 breadcrumb: 1
info [18:05:19.387] [CaseServer] Received pairing request from udp://[fe80::1f9b:dcb9:d14b:707a%enp2s0]:39400
notice [18:05:19.418] [Matterbridge] Session opened on server node for Matterbridge: { name: 'secure/2372', nodeId: 18303769249106620906, peerNodeId: 13660266413132073995, fabric: { fabricIndex: 1, fabricId: 1, nodeId: 18303769249106620906, rootNodeId: 13660266413132073995, rootVendorId: 65521, label: '' }, isPeerActive: true, lastInteractionTimestamp: 1743185119417, lastActiveTimestamp: 1743185119417, numberOfActiveSubscriptions: 0 }
info [18:05:19.421] [CaseServer] Session 2372 created with udp://[fe80::1f9b:dcb9:d14b:707a%enp2s0]:39400 for Fabric FE040D278FB7F1EA (index 1) and PeerNode BD9303ED73EFCC0B with CATs undefined
info [18:05:19.451] [InsecureSession] End insecure session insecure/1863744617825343146
info [18:05:19.468] [BehaviorServer] Invoke Matterbridge.commissioningComplete online#912e3da@bd9303ed73efcc0b (no payload)
info [18:05:19.472] [DeviceCommissioner] All announcements stopped
info [18:05:19.474] [SecureSession] Register Session secure/2371 to close when exchange is ended.
notice [18:05:19.477] [Matterbridge] Server node for Matterbridge was initially commissioned successfully!
notice [18:05:19.479] [Matterbridge] Commissioned fabric index 1 added on server node for Matterbridge: { fabricIndex: 1, fabricId: 1, nodeId: 18303769249106620906, rootNodeId: 13660266413132073995, rootVendorId: 65521, label: '' }
info [18:05:19.480] [Matterbridge] Fabrics: [ { fabricIndex: 1, fabricId: '1', nodeId: '18303769249106620906', rootNodeId: '13660266413132073995', rootVendorId: 65521, rootVendorName: '(MatterServer)', label: '' } ]
info [18:05:19.481] [GeneralCom~erHandler] Commissioning completed on fabric #1 as node #18303769249106620906.
info [18:05:19.517] [BehaviorServer] Invoke Matterbridge.updateFabricLabel online#912e3dc@bd9303ed73efcc0b label: Gladys Assistant fabricIndex: 1
info [18:05:19.526] [Transaction] Tx reactor#230 waiting on online#912e3dc@bd9303ed73efcc0b
notice [18:05:19.531] [Matterbridge] Commissioned fabric index 1 updated on server node for Matterbridge: { fabricIndex: 1, fabricId: 1, nodeId: 18303769249106620906, rootNodeId: 13660266413132073995, rootVendorId: 65521, label: 'Gladys Assistant' }
info [18:05:19.531] [Matterbridge] Fabrics: [ { fabricIndex: 1, fabricId: '1', nodeId: '18303769249106620906', rootNodeId: '13660266413132073995', rootVendorId: 65521, rootVendorName: '(MatterServer)', label: 'Gladys Assistant' } ]
info [18:05:19.963] [InteractionServer] Successfully created subscription 1167932576 for Session 2372 to peer@1:0xbd9303ed73efcc0b. Updates: 1 - 60 => 62 seconds (sendInterval = 49 seconds)
notice [18:05:19.984] [Matterbridge] Session subscriptions changed on server node for Matterbridge: { name: 'secure/2372', nodeId: 18303769249106620906, peerNodeId: 13660266413132073995, fabric: { fabricIndex: 1, fabricId: 1, nodeId: 18303769249106620906, rootNodeId: 13660266413132073995, rootVendorId: 65521, label: '' }, isPeerActive: true, lastInteractionTimestamp: 1743185119417, lastActiveTimestamp: 1743185119417, numberOfActiveSubscriptions: 1 }

L’image de pairing code flashable s’est transformĂ©e en :

  • CĂŽtĂ© Gladys :
[...]
2025-03-28 19:05:23.461 DEBUG  PairedNode           Node 18303769249106620906: Creating device 0 {"29":{"deviceTypeList":[{"deviceType":22,"revision":2}],"serverList":[40,31,63,48,60,62,51,29],"clientList":[],"partsList":[1,10,11,12,13,14,15,16,17,18,19,2,20,3,4,5,6,7,8,9],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"31":{"acl":[{"privilege":5,"authMode":2,"subjects":["13660266413132073995"],"targets":null,"fabricIndex":1}],"subjectsPerAccessControlEntry":4,"targetsPerAccessControlEntry":3,"accessControlEntriesPerFabric":4,"clusterRevision":1,"featureMap":{},"attributeList":[0,2,3,4,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"40":{"dataModelRevision":17,"vendorName":"Matterbridge","vendorId":65521,"productName":"Matterbridge aggregator","productId":32768,"nodeLabel":"Matterbridge aggregator","location":"XX","hardwareVersion":6,"hardwareVersionString":"6.8.0-52-generic","softwareVersion":2,"softwareVersionString":"2.2.5","productLabel":"Matterbridge aggregator","serialNumber":"SN77b87cfd460bbd72","uniqueId":"UI77b87cfd460bbd72","capabilityMinima":{"caseSessionsPerFabric":3,"subscriptionsPerFabric":3},"specificationVersion":16973824,"maxPathsPerInvoke":10,"clusterRevision":3,"featureMap":{},"attributeList":[0,1,2,3,4,5,6,7,8,9,10,14,15,18,19,21,22,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"48":{"breadcrumb":0,"basicCommissioningInfo":{"failSafeExpiryLengthSeconds":60,"maxCumulativeFailsafeSeconds":900},"regulatoryConfig":2,"locationCapability":2,"supportsConcurrentConnection":true,"clusterRevision":1,"featureMap":{},"attributeList":[0,1,2,3,4,65533,65532,65531,65529,65528],"acceptedCommandList":[0,2,4],"generatedCommandList":[1,3,5]},"51":{"networkInterfaces":[{"name":"enp2s0","isOperational":true,"offPremiseServicesReachableIPv4":null,"offPremiseServicesReachableIPv6":null,"hardwareAddress":"7c8334b9fca5","iPv4Addresses":["0a0500e3"],"iPv6Addresses":["00000000"],"type":2},{"name":"docker0","isOperational":true,"offPremiseServicesReachableIPv4":null,"offPremiseServicesReachableIPv6":null,"hardwareAddress":"0242d0a03741","iPv4Addresses":["ac110001"],"iPv6Addresses":["00000000"],"type":2},{"name":"br-2eecc872cee4","isOperational":true,"offPremiseServicesReachableIPv4":null,"offPremiseServicesReachableIPv6":null,"hardwareAddress":"02ab40d33c39","iPv4Addresses":["ac120001"],"iPv6Addresses":["00000000"],"type":2},{"name":"veth2417577","isOperational":true,"offPremiseServicesReachableIPv4":null,"offPremiseServicesReachableIPv6":null,"hardwareAddress":"5e9da348f214","iPv4Addresses":[],"iPv6Addresses":["00000000"],"type":2},{"name":"vethb8de1cb","isOperational":true,"offPremiseServicesReachableIPv4":null,"offPremiseServicesReachableIPv6":null,"hardwareAddress":"d2e0b4de5248","iPv4Addresses":[],"iPv6Addresses":["00000000"],"type":2},{"name":"vethb8c8d92","isOperational":true,"offPremiseServicesReachableIPv4":null,"offPremiseServicesReachableIPv6":null,"hardwareAddress":"4ec6e7ff65e7","iPv4Addresses":[],"iPv6Addresses":["00000000"],"type":2},{"name":"veth220f71b","isOperational":true,"offPremiseServicesReachableIPv4":null,"offPremiseServicesReachableIPv6":null,"hardwareAddress":"36183ec2d11c","iPv4Addresses":[],"iPv6Addresses":["00000000"],"type":2},{"name":"veth2686606","isOperational":true,"offPremiseServicesReachableIPv4":null,"offPremiseServicesReachableIPv6":null,"hardwareAddress":"d2add5942f62","iPv4Addresses":[],"iPv6Addresses":["00000000"],"type":2}],"rebootCount":3,"upTime":3472,"totalOperationalHours":21,"testEventTriggersEnabled":false,"clusterRevision":2,"featureMap":{"dataModelTest":true},"attributeList":[0,1,2,3,8,65533,65532,65531,65529,65528],"acceptedCommandList":[0,1,3],"generatedCommandList":[2,4]},"60":{"windowStatus":0,"adminFabricIndex":null,"adminVendorId":null,"clusterRevision":1,"featureMap":{"basic":false},"attributeList":[0,1,2,65533,65532,65531,65529,65528],"acceptedCommandList":[0,2],"generatedCommandList":[]},"62":{"nocs":[{"noc":"15300101022402013703241400182604df6d982d26055fa4454237062415012711eaf1b78f270d04fe1824070124080130094104fb834dd94b3f3147570912e12a52f3b43fc459aa33a8185528bcc8da544c5db74da780efe6c6b20fdcffe775040115f90ff9c502a0aba2cc1bc508b67e511b58370a3501280118240201360304020401183004144d6effa5be27c3ba2313b159f4ad233911c0fed4300514ea64585f9d84965b500818dd44a8385db5bc618418300b40a6771706dafea93da1bfad7c458943dfe6b96c836f5dbbc203d1c90af69bb9bcdb563cdeef1d96a9f286686f9763cde97a4c8c301f443ba05d01243f6df9f3f918","icac":null,"fabricIndex":1}],"fabrics":[{"rootPublicKey":"046c5b1b64fcf104c1e3200dedbaa2ca73368e43e75fc0e32386390c5c51bb343180137d6c38c51199f8cb5484b794eda0dbc571bc8c21bb8c4536ed56fb24ef4f","vendorId":65521,"fabricId":"1","nodeId":"18303769249106620906","label":"Gladys Assistant","fabricIndex":1}],"supportedFabrics":254,"commissionedFabrics":1,"trustedRootCertificates":["153001010024020137032414001826047c6c982d2605fca24542370624140018240701240801300941046c5b1b64fcf104c1e3200dedbaa2ca73368e43e75fc0e32386390c5c51bb343180137d6c38c51199f8cb5484b794eda0dbc571bc8c21bb8c4536ed56fb24ef4f370a3501290118240260300414ea64585f9d84965b500818dd44a8385db5bc6184300514ea64585f9d84965b500818dd44a8385db5bc618418300b40e925c4db5cb042668c7b59253d13353f2fb8303f453d20407875fe75bdedf1be6cd5ae3641710b7174f7e6bcd55aec0a07c183fd68947765a682b8ff2be688ea18"],"currentFabricIndex":1,"clusterRevision":1,"featureMap":{},"attributeList":[0,1,2,3,4,5,65533,65532,65531,65529,65528],"acceptedCommandList":[0,2,4,6,7,9,10,11],"generatedCommandList":[1,3,5,8]},"63":{"groupKeyMap":[],"groupTable":[],"maxGroupsPerFabric":0,"maxGroupKeysPerFabric":1,"clusterRevision":2,"featureMap":{"cacheAndSync":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[0,1,3,4],"generatedCommandList":[2,5]}}
2025-03-28 19:05:23.492 DEBUG  PairedNode           Node 18303769249106620906: Creating device 1 {"29":{"deviceTypeList":[{"deviceType":14,"revision":1}],"serverList":[29],"clientList":[],"partsList":[10,11,12,13,14,15,16,17,18,19,2,20,3,4,5,6,7,8,9],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]}}
2025-03-28 19:05:23.495 DEBUG  PairedNode           Node 18303769249106620906: Creating device 2 {"29":{"deviceTypeList":[{"deviceType":19,"revision":2},{"deviceType":17,"revision":1}],"serverList":[29,57,47,64],"clientList":[],"partsList":[3,4],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"47":{"status":1,"order":0,"description":"AC Power","endpointList":[],"clusterRevision":2,"featureMap":{"wired":true,"battery":false,"rechargeable":false,"replaceable":false},"attributeList":[0,1,2,31,65533,65532,65531,65529,65528,5],"acceptedCommandList":[],"generatedCommandList":[],"wiredCurrentType":0},"57":{"vendorName":"Shelly","vendorId":65521,"productName":"SPEM-003CEBEU","nodeLabel":"Pro3EM Locaux Pro","hardwareVersion":1,"hardwareVersionString":"1.0.0","softwareVersion":1,"softwareVersionString":"1.4.4-g6d2a586","productUrl":"https://www.npmjs.com/package/matterbridge","productLabel":"Pro3EM Locaux Pro","serialNumber":"shellypro3em-2CBCBBB2DB18","reachable":true,"uniqueId":"e059a4bdf914374eee37f4fce8d8c1bb","clusterRevision":3,"featureMap":{},"attributeList":[1,2,3,5,7,8,9,10,13,14,15,17,18,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"64":{"labelList":[{"label":"composed","value":"Switch"}],"clusterRevision":1,"featureMap":{},"attributeList":[0,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]}}
2025-03-28 19:05:23.500 DEBUG  PairedNode           Node 18303769249106620906: Creating device 3 {"3":{"identifyTime":0,"identifyType":0,"clusterRevision":4,"featureMap":{},"attributeList":[0,1,65533,65532,65531,65529,65528],"acceptedCommandList":[0,64],"generatedCommandList":[]},"4":{"nameSupport":{"nameSupport":false,"groupNames":false},"clusterRevision":4,"featureMap":{"groupNames":true},"attributeList":[0,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"6":{"onOff":false,"clusterRevision":6,"featureMap":{"lighting":true,"deadFrontBehavior":false,"offOnly":false},"attributeList":[0,65533,65532,65531,65529,65528,16384,16385,16386,16387],"acceptedCommandList":[0,64,65,66,1,2],"generatedCommandList":[],"globalSceneControl":false,"onTime":0,"offWaitTime":0,"startUpOnOff":null},"29":{"deviceTypeList":[{"deviceType":266,"revision":3}],"serverList":[29,3,4,6],"clientList":[],"partsList":[],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]}}
2025-03-28 19:05:23.503 DEBUG  PairedNode           Node 18303769249106620906: Creating device 4 {"3":{"identifyTime":0,"identifyType":0,"clusterRevision":4,"featureMap":{},"attributeList":[0,1,65533,65532,65531,65529,65528],"acceptedCommandList":[0,64],"generatedCommandList":[]},"29":{"deviceTypeList":[{"deviceType":770,"revision":2}],"serverList":[29,3,1026],"clientList":[],"partsList":[],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"1026":{"measuredValue":4720,"minMeasuredValue":null,"maxMeasuredValue":null,"tolerance":0,"clusterRevision":4,"featureMap":{},"acceptedCommandList":[],"generatedCommandList":[],"attributeList":[0,1,2,3,65533,65532,65531,65529,65528]}}
2025-03-28 19:05:23.504 DEBUG  PairedNode           Node 18303769249106620906: Creating device 5 {"29":{"deviceTypeList":[{"deviceType":19,"revision":2},{"deviceType":17,"revision":1}],"serverList":[29,57,47,64],"clientList":[],"partsList":[6,7,8],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"47":{"status":1,"order":0,"description":"AC Power","endpointList":[],"clusterRevision":2,"featureMap":{"wired":true,"battery":false,"rechargeable":false,"replaceable":false},"attributeList":[0,1,2,31,65533,65532,65531,65529,65528,5],"acceptedCommandList":[],"generatedCommandList":[],"wiredCurrentType":0},"57":{"vendorName":"Shelly","vendorId":65521,"productName":"SPSW-003XE16EU","nodeLabel":"Pro3 L1 BĂątiment Perso","hardwareVersion":1,"hardwareVersionString":"1.0.0","softwareVersion":1,"softwareVersionString":"1.4.4-g6d2a586","productUrl":"https://www.npmjs.com/package/matterbridge","productLabel":"Pro3 L1 BĂątiment Perso","serialNumber":"shellypro3-2CBCBBA5E414","reachable":true,"uniqueId":"9234c6c5e1cba064abc04f37f6707ac0","clusterRevision":3,"featureMap":{},"attributeList":[1,2,3,5,7,8,9,10,13,14,15,17,18,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"64":{"labelList":[{"label":"composed","value":"Switch"}],"clusterRevision":1,"featureMap":{},"attributeList":[0,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]}}
2025-03-28 19:05:23.507 DEBUG  PairedNode           Node 18303769249106620906: Creating device 6 {"3":{"identifyTime":0,"identifyType":0,"clusterRevision":4,"featureMap":{},"attributeList":[0,1,65533,65532,65531,65529,65528],"acceptedCommandList":[0,64],"generatedCommandList":[]},"4":{"nameSupport":{"nameSupport":false,"groupNames":false},"clusterRevision":4,"featureMap":{"groupNames":true},"attributeList":[0,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"6":{"onOff":true,"clusterRevision":6,"featureMap":{"lighting":true,"deadFrontBehavior":false,"offOnly":false},"attributeList":[0,65533,65532,65531,65529,65528,16384,16385,16386,16387],"acceptedCommandList":[0,64,65,66,1,2],"generatedCommandList":[],"globalSceneControl":false,"onTime":0,"offWaitTime":0,"startUpOnOff":null},"29":{"deviceTypeList":[{"deviceType":266,"revision":3}],"serverList":[29,3,4,6],"clientList":[],"partsList":[],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]}}
2025-03-28 19:05:23.510 DEBUG  PairedNode           Node 18303769249106620906: Creating device 7 {"3":{"identifyTime":0,"identifyType":0,"clusterRevision":4,"featureMap":{},"attributeList":[0,1,65533,65532,65531,65529,65528],"acceptedCommandList":[0,64],"generatedCommandList":[]},"4":{"nameSupport":{"nameSupport":false,"groupNames":false},"clusterRevision":4,"featureMap":{"groupNames":true},"attributeList":[0,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"6":{"onOff":false,"clusterRevision":6,"featureMap":{"lighting":true,"deadFrontBehavior":false,"offOnly":false},"attributeList":[0,65533,65532,65531,65529,65528,16384,16385,16386,16387],"acceptedCommandList":[0,64,65,66,1,2],"generatedCommandList":[],"globalSceneControl":false,"onTime":0,"offWaitTime":0,"startUpOnOff":null},"29":{"deviceTypeList":[{"deviceType":266,"revision":3}],"serverList":[29,3,4,6],"clientList":[],"partsList":[],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]}}
2025-03-28 19:05:23.512 DEBUG  PairedNode           Node 18303769249106620906: Creating device 8 {"3":{"identifyTime":0,"identifyType":0,"clusterRevision":4,"featureMap":{},"attributeList":[0,1,65533,65532,65531,65529,65528],"acceptedCommandList":[0,64],"generatedCommandList":[]},"4":{"nameSupport":{"nameSupport":false,"groupNames":false},"clusterRevision":4,"featureMap":{"groupNames":true},"attributeList":[0,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"6":{"onOff":false,"clusterRevision":6,"featureMap":{"lighting":true,"deadFrontBehavior":false,"offOnly":false},"attributeList":[0,65533,65532,65531,65529,65528,16384,16385,16386,16387],"acceptedCommandList":[0,64,65,66,1,2],"generatedCommandList":[],"globalSceneControl":false,"onTime":0,"offWaitTime":0,"startUpOnOff":null},"29":{"deviceTypeList":[{"deviceType":266,"revision":3}],"serverList":[29,3,4,6],"clientList":[],"partsList":[],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]}}
2025-03-28 19:05:23.515 DEBUG  PairedNode           Node 18303769249106620906: Creating device 9 {"29":{"deviceTypeList":[{"deviceType":19,"revision":2},{"deviceType":17,"revision":1}],"serverList":[29,57,47,64],"clientList":[],"partsList":[10,11,12],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"47":{"status":1,"order":0,"description":"AC Power","endpointList":[],"clusterRevision":2,"featureMap":{"wired":true,"battery":false,"rechargeable":false,"replaceable":false},"attributeList":[0,1,2,31,65533,65532,65531,65529,65528,5],"acceptedCommandList":[],"generatedCommandList":[],"wiredCurrentType":0},"57":{"vendorName":"Shelly","vendorId":65521,"productName":"SPSW-003XE16EU","nodeLabel":"Pro3 L2 BĂątiment Perso","hardwareVersion":1,"hardwareVersionString":"1.0.0","softwareVersion":1,"softwareVersionString":"1.4.4-g6d2a586","productUrl":"https://www.npmjs.com/package/matterbridge","productLabel":"Pro3 L2 BĂątiment Perso","serialNumber":"shellypro3-2CBCBBA747C0","reachable":true,"uniqueId":"0ef1e597ee48f5f5b2e511a2ced51a5c","clusterRevision":3,"featureMap":{},"attributeList":[1,2,3,5,7,8,9,10,13,14,15,17,18,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"64":{"labelList":[{"label":"composed","value":"Switch"}],"clusterRevision":1,"featureMap":{},"attributeList":[0,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]}}
2025-03-28 19:05:23.526 DEBUG  PairedNode           Node 18303769249106620906: Creating device 10 {"3":{"identifyTime":0,"identifyType":0,"clusterRevision":4,"featureMap":{},"attributeList":[0,1,65533,65532,65531,65529,65528],"acceptedCommandList":[0,64],"generatedCommandList":[]},"4":{"nameSupport":{"nameSupport":false,"groupNames":false},"clusterRevision":4,"featureMap":{"groupNames":true},"attributeList":[0,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"6":{"onOff":false,"clusterRevision":6,"featureMap":{"lighting":true,"deadFrontBehavior":false,"offOnly":false},"attributeList":[0,65533,65532,65531,65529,65528,16384,16385,16386,16387],"acceptedCommandList":[0,64,65,66,1,2],"generatedCommandList":[],"globalSceneControl":false,"onTime":0,"offWaitTime":0,"startUpOnOff":null},"29":{"deviceTypeList":[{"deviceType":266,"revision":3}],"serverList":[29,3,4,6],"clientList":[],"partsList":[],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]}}
2025-03-28 19:05:23.532 DEBUG  PairedNode           Node 18303769249106620906: Creating device 11 {"3":{"identifyTime":0,"identifyType":0,"clusterRevision":4,"featureMap":{},"attributeList":[0,1,65533,65532,65531,65529,65528],"acceptedCommandList":[0,64],"generatedCommandList":[]},"4":{"nameSupport":{"nameSupport":false,"groupNames":false},"clusterRevision":4,"featureMap":{"groupNames":true},"attributeList":[0,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"6":{"onOff":false,"clusterRevision":6,"featureMap":{"lighting":true,"deadFrontBehavior":false,"offOnly":false},"attributeList":[0,65533,65532,65531,65529,65528,16384,16385,16386,16387],"acceptedCommandList":[0,64,65,66,1,2],"generatedCommandList":[],"globalSceneControl":false,"onTime":0,"offWaitTime":0,"startUpOnOff":null},"29":{"deviceTypeList":[{"deviceType":266,"revision":3}],"serverList":[29,3,4,6],"clientList":[],"partsList":[],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]}}
2025-03-28 19:05:23.535 DEBUG  PairedNode           Node 18303769249106620906: Creating device 12 {"3":{"identifyTime":0,"identifyType":0,"clusterRevision":4,"featureMap":{},"attributeList":[0,1,65533,65532,65531,65529,65528],"acceptedCommandList":[0,64],"generatedCommandList":[]},"4":{"nameSupport":{"nameSupport":false,"groupNames":false},"clusterRevision":4,"featureMap":{"groupNames":true},"attributeList":[0,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"6":{"onOff":false,"clusterRevision":6,"featureMap":{"lighting":true,"deadFrontBehavior":false,"offOnly":false},"attributeList":[0,65533,65532,65531,65529,65528,16384,16385,16386,16387],"acceptedCommandList":[0,64,65,66,1,2],"generatedCommandList":[],"globalSceneControl":false,"onTime":0,"offWaitTime":0,"startUpOnOff":null},"29":{"deviceTypeList":[{"deviceType":266,"revision":3}],"serverList":[29,3,4,6],"clientList":[],"partsList":[],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]}}
2025-03-28 19:05:23.537 DEBUG  PairedNode           Node 18303769249106620906: Creating device 13 {"29":{"deviceTypeList":[{"deviceType":19,"revision":2},{"deviceType":17,"revision":1}],"serverList":[29,57,47,64],"clientList":[],"partsList":[14],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"47":{"status":1,"order":0,"description":"AC Power","endpointList":[],"clusterRevision":2,"featureMap":{"wired":true,"battery":false,"rechargeable":false,"replaceable":false},"attributeList":[0,1,2,31,65533,65532,65531,65529,65528,5],"acceptedCommandList":[],"generatedCommandList":[],"wiredCurrentType":0},"57":{"vendorName":"Shelly","vendorId":65521,"productName":"SPEM-003CEBEU","nodeLabel":"Pro3EM BĂątiment Perso","hardwareVersion":1,"hardwareVersionString":"1.0.0","softwareVersion":1,"softwareVersionString":"1.4.4-g6d2a586","productUrl":"https://www.npmjs.com/package/matterbridge","productLabel":"Pro3EM BĂątiment Perso","serialNumber":"shellypro3em-9454C5B99110","reachable":true,"uniqueId":"c4d1fe0bdf8549110f7afc1617b5b3af","clusterRevision":3,"featureMap":{},"attributeList":[1,2,3,5,7,8,9,10,13,14,15,17,18,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"64":{"labelList":[{"label":"composed","value":"PowerMeter"}],"clusterRevision":1,"featureMap":{},"attributeList":[0,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]}}
2025-03-28 19:05:23.545 DEBUG  PairedNode           Node 18303769249106620906: Creating device 14 {"3":{"identifyTime":0,"identifyType":0,"clusterRevision":4,"featureMap":{},"attributeList":[0,1,65533,65532,65531,65529,65528],"acceptedCommandList":[0,64],"generatedCommandList":[]},"29":{"deviceTypeList":[{"deviceType":770,"revision":2}],"serverList":[29,3,1026],"clientList":[],"partsList":[],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"1026":{"measuredValue":4490,"minMeasuredValue":null,"maxMeasuredValue":null,"tolerance":0,"clusterRevision":4,"featureMap":{},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]}}
2025-03-28 19:05:23.553 DEBUG  PairedNode           Node 18303769249106620906: Creating device 15 {"29":{"deviceTypeList":[{"deviceType":19,"revision":2},{"deviceType":17,"revision":1}],"serverList":[29,57,47,64],"clientList":[],"partsList":[16],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"47":{"status":1,"order":0,"description":"AC Power","endpointList":[],"clusterRevision":2,"featureMap":{"wired":true,"battery":false,"rechargeable":false,"replaceable":false},"attributeList":[0,1,2,31,65533,65532,65531,65529,65528,5],"acceptedCommandList":[],"generatedCommandList":[],"wiredCurrentType":0},"57":{"vendorName":"Shelly","vendorId":65521,"productName":"SHEM-3","nodeLabel":"Puissance L3 Perso","hardwareVersion":1,"hardwareVersionString":"1.0.0","softwareVersion":1,"softwareVersionString":"v1.14.0-gcb84623","productUrl":"https://www.npmjs.com/package/matterbridge","productLabel":"Puissance L3 Perso","serialNumber":"shellyem3-C8C9A33E667D","reachable":true,"uniqueId":"04e585554a9b108a0de43ef4d45fa738","clusterRevision":3,"featureMap":{},"attributeList":[1,2,3,5,7,8,9,10,13,14,15,17,18,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"64":{"labelList":[{"label":"composed","value":"Switch"}],"clusterRevision":1,"featureMap":{},"attributeList":[0,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]}}
2025-03-28 19:05:23.555 DEBUG  PairedNode           Node 18303769249106620906: Creating device 16 {"3":{"identifyTime":0,"identifyType":0,"clusterRevision":4,"featureMap":{},"attributeList":[0,1,65533,65532,65531,65529,65528],"acceptedCommandList":[0,64],"generatedCommandList":[]},"4":{"nameSupport":{"nameSupport":false,"groupNames":false},"clusterRevision":4,"featureMap":{"groupNames":true},"attributeList":[0,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"6":{"onOff":false,"clusterRevision":6,"featureMap":{"lighting":true,"deadFrontBehavior":false,"offOnly":false},"acceptedCommandList":[0,64,65,66,1,2],"generatedCommandList":[],"attributeList":[0,65533,65532,65531,65529,65528,16384,16385,16386,16387],"globalSceneControl":false,"onTime":0,"offWaitTime":0,"startUpOnOff":null},"29":{"deviceTypeList":[{"deviceType":266,"revision":3}],"serverList":[29,3,4,6],"clientList":[],"partsList":[],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]}}
2025-03-28 19:05:23.557 DEBUG  PairedNode           Node 18303769249106620906: Creating device 17 {"29":{"deviceTypeList":[{"deviceType":19,"revision":2},{"deviceType":17,"revision":1}],"serverList":[29,57,47,64],"clientList":[],"partsList":[18,19,20],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"47":{"status":1,"order":0,"description":"AC Power","endpointList":[],"clusterRevision":2,"featureMap":{"wired":true,"battery":false,"rechargeable":false,"replaceable":false},"attributeList":[0,1,2,31,65533,65532,65531,65529,65528,5],"acceptedCommandList":[],"generatedCommandList":[],"wiredCurrentType":0},"57":{"vendorName":"Shelly","vendorId":65521,"productName":"SPSW-003XE16EU","nodeLabel":"Pro3 L3 BĂątiment Perso","hardwareVersion":1,"hardwareVersionString":"1.0.0","softwareVersion":1,"softwareVersionString":"1.4.4-g6d2a586","productUrl":"https://www.npmjs.com/package/matterbridge","productLabel":"Pro3 L3 BĂątiment Perso","serialNumber":"shellypro3-FCE8C0DBF970","reachable":true,"uniqueId":"d4d0174a4ba0c81571d931868b458dec","clusterRevision":3,"featureMap":{},"attributeList":[1,2,3,5,7,8,9,10,13,14,15,17,18,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"64":{"labelList":[{"label":"composed","value":"Switch"}],"clusterRevision":1,"featureMap":{},"attributeList":[0,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]}}
2025-03-28 19:05:23.563 DEBUG  PairedNode           Node 18303769249106620906: Creating device 18 {"3":{"identifyTime":0,"identifyType":0,"clusterRevision":4,"featureMap":{},"attributeList":[0,1,65533,65532,65531,65529,65528],"acceptedCommandList":[0,64],"generatedCommandList":[]},"4":{"nameSupport":{"nameSupport":false,"groupNames":false},"clusterRevision":4,"featureMap":{"groupNames":true},"attributeList":[0,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"6":{"onOff":false,"clusterRevision":6,"featureMap":{"lighting":true,"deadFrontBehavior":false,"offOnly":false},"attributeList":[0,65533,65532,65531,65529,65528,16384,16385,16386,16387],"acceptedCommandList":[0,64,65,66,1,2],"generatedCommandList":[],"globalSceneControl":false,"onTime":0,"offWaitTime":0,"startUpOnOff":null},"29":{"deviceTypeList":[{"deviceType":266,"revision":3}],"serverList":[29,3,4,6],"clientList":[],"partsList":[],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]}}
2025-03-28 19:05:23.565 DEBUG  PairedNode           Node 18303769249106620906: Creating device 19 {"3":{"identifyTime":0,"identifyType":0,"clusterRevision":4,"featureMap":{},"attributeList":[0,1,65533,65532,65531,65529,65528],"acceptedCommandList":[0,64],"generatedCommandList":[]},"4":{"nameSupport":{"nameSupport":false,"groupNames":false},"clusterRevision":4,"featureMap":{"groupNames":true},"attributeList":[0,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"6":{"onOff":false,"clusterRevision":6,"featureMap":{"lighting":true,"deadFrontBehavior":false,"offOnly":false},"acceptedCommandList":[0,64,65,66,1,2],"generatedCommandList":[],"attributeList":[0,65533,65532,65531,65529,65528,16384,16385,16386,16387],"globalSceneControl":false,"onTime":0,"offWaitTime":0,"startUpOnOff":null},"29":{"deviceTypeList":[{"deviceType":266,"revision":3}],"serverList":[29,3,4,6],"clientList":[],"partsList":[],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]}}
2025-03-28 19:05:23.569 DEBUG  PairedNode           Node 18303769249106620906: Creating device 20 {"3":{"identifyTime":0,"identifyType":0,"clusterRevision":4,"featureMap":{},"attributeList":[0,1,65533,65532,65531,65529,65528],"acceptedCommandList":[0,64],"generatedCommandList":[]},"4":{"nameSupport":{"nameSupport":false,"groupNames":false},"clusterRevision":4,"featureMap":{"groupNames":true},"attributeList":[0,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]},"6":{"onOff":false,"clusterRevision":6,"featureMap":{"lighting":true,"deadFrontBehavior":false,"offOnly":false},"attributeList":[0,65533,65532,65531,65529,65528,16384,16385,16386,16387],"acceptedCommandList":[0,64,65,66,1,2],"generatedCommandList":[],"globalSceneControl":false,"onTime":0,"offWaitTime":0,"startUpOnOff":null},"29":{"deviceTypeList":[{"deviceType":266,"revision":3}],"serverList":[29,3,4,6],"clientList":[],"partsList":[],"clusterRevision":2,"featureMap":{"tagList":false},"attributeList":[0,1,2,3,65533,65532,65531,65529,65528],"acceptedCommandList":[],"generatedCommandList":[]}}
2025-03-28 19:05:23.572 DEBUG  PairedNode           Node 18303769249106620906: Endpoints from PartsLists [[0,[1,10,11,12,13,14,15,16,17,18,19,2,20,3,4,5,6,7,8,9]],[1,[10,11,12,13,14,15,16,17,18,19,2,20,3,4,5,6,7,8,9]],[2,[3,4]],[3,[]],[4,[]],[5,[6,7,8]],[6,[]],[7,[]],[8,[]],[9,[10,11,12]],[10,[]],[11,[]],[12,[]],[13,[14]],[14,[]],[15,[16]],[16,[]],[17,[18,19,20]],[18,[]],[19,[]],[20,[]]]
2025-03-28 19:05:23.573 DEBUG  PairedNode           Node 18303769249106620906: Endpoint usages {"1":[0],"2":[0,1],"3":[0,1,2],"4":[0,1,2],"5":[0,1],"6":[0,1,5],"7":[0,1,5],"8":[0,1,5],"9":[0,1],"10":[0,1,9],"11":[0,1,9],"12":[0,1,9],"13":[0,1],"14":[0,1,13],"15":[0,1],"16":[0,1,15],"17":[0,1],"18":[0,1,17],"19":[0,1,17],"20":[0,1,17]}
2025-03-28 19:05:23.573 DEBUG  PairedNode           Node 18303769249106620906: Processing Endpoint [["1",[0]]]
2025-03-28 19:05:23.574 DEBUG  PairedNode           Node 18303769249106620906: Endpoint structure: Child: 1 -> Parent: 0
2025-03-28 19:05:23.576 DEBUG  PairedNode           Node 18303769249106620906: Endpoint data Cleanup {"0":true}
2025-03-28 19:05:23.576 DEBUG  PairedNode           Node 18303769249106620906: Processing Endpoint [["2",[1]],["5",[1]],["9",[1]],["13",[1]],["15",[1]],["17",[1]]]
2025-03-28 19:05:23.576 DEBUG  PairedNode           Node 18303769249106620906: Endpoint structure: Child: 2 -> Parent: 1
2025-03-28 19:05:23.577 DEBUG  PairedNode           Node 18303769249106620906: Endpoint structure: Child: 5 -> Parent: 1
2025-03-28 19:05:23.577 DEBUG  PairedNode           Node 18303769249106620906: Endpoint structure: Child: 9 -> Parent: 1
2025-03-28 19:05:23.580 DEBUG  PairedNode           Node 18303769249106620906: Endpoint structure: Child: 13 -> Parent: 1
2025-03-28 19:05:23.581 DEBUG  PairedNode           Node 18303769249106620906: Endpoint structure: Child: 15 -> Parent: 1
2025-03-28 19:05:23.581 DEBUG  PairedNode           Node 18303769249106620906: Endpoint structure: Child: 17 -> Parent: 1
2025-03-28 19:05:23.582 DEBUG  PairedNode           Node 18303769249106620906: Endpoint data Cleanup {"1":true}
2025-03-28 19:05:23.582 DEBUG  PairedNode           Node 18303769249106620906: Processing Endpoint [["3",[2]],["4",[2]],["6",[5]],["7",[5]],["8",[5]],["10",[9]],["11",[9]],["12",[9]],["14",[13]],["16",[15]],["18",[17]],["19",[17]],["20",[17]]]
2025-03-28 19:05:23.583 DEBUG  PairedNode           Node 18303769249106620906: Endpoint structure: Child: 3 -> Parent: 2
2025-03-28 19:05:23.584 DEBUG  PairedNode           Node 18303769249106620906: Endpoint structure: Child: 4 -> Parent: 2
2025-03-28 19:05:23.584 DEBUG  PairedNode           Node 18303769249106620906: Endpoint structure: Child: 6 -> Parent: 5
2025-03-28 19:05:23.585 DEBUG  PairedNode           Node 18303769249106620906: Endpoint structure: Child: 7 -> Parent: 5
2025-03-28 19:05:23.585 DEBUG  PairedNode           Node 18303769249106620906: Endpoint structure: Child: 8 -> Parent: 5
2025-03-28 19:05:23.585 DEBUG  PairedNode           Node 18303769249106620906: Endpoint structure: Child: 10 -> Parent: 9
2025-03-28 19:05:23.586 DEBUG  PairedNode           Node 18303769249106620906: Endpoint structure: Child: 11 -> Parent: 9
2025-03-28 19:05:23.586 DEBUG  PairedNode           Node 18303769249106620906: Endpoint structure: Child: 12 -> Parent: 9
2025-03-28 19:05:23.586 DEBUG  PairedNode           Node 18303769249106620906: Endpoint structure: Child: 14 -> Parent: 13
2025-03-28 19:05:23.587 DEBUG  PairedNode           Node 18303769249106620906: Endpoint structure: Child: 16 -> Parent: 15
2025-03-28 19:05:23.587 DEBUG  PairedNode           Node 18303769249106620906: Endpoint structure: Child: 18 -> Parent: 17
2025-03-28 19:05:23.587 DEBUG  PairedNode           Node 18303769249106620906: Endpoint structure: Child: 19 -> Parent: 17
2025-03-28 19:05:23.587 DEBUG  PairedNode           Node 18303769249106620906: Endpoint structure: Child: 20 -> Parent: 17
2025-03-28 19:05:23.588 DEBUG  PairedNode           Node 18303769249106620906: Endpoint data Cleanup {"2":true,"5":true,"9":true,"13":true,"15":true,"17":true}
2025-03-28 19:05:23.588 DEBUG  InteractionClient    Sending read request: attributes: 0x0/OperationalCredentials(0x3e)/fabrics(0x1) and events: undefined
2025-03-28 19:05:23.589 DEBUG  MessageExchange      New exchange channel: udp://[fe80::1f9b:dcb9:d14b:707a%enp2s0]:5540 on session secure/34538 protocol: 1 exId: 1268 sess: secure/34538 peerSess: 2372 SAT: 4000 SAI: 300 SII: 500 maxTrans: 5 MRP I
2025-03-28 19:05:23.590 DEBUG  InteractionClient    Sending read request to udp://[fe80::1f9b:dcb9:d14b:707a%enp2s0]:5540 on session secure/34538 for attributes 0x0/OperationalCredentials(0x3e)/fabrics(0x1) and events undefined
2025-03-28 19:05:23.591 DEBUG  ExchangeManager      Message » for: I/ReadRequest msgId: 2372/1268/152232953 type: 0x1/0x2 reqAck size: 21 payload: 1536001724020024033e2404011818290324ff0c18
2025-03-28 19:05:23.595 DEBUG  MessageExchange      Message « for: I/ReportData msgId: 34538/1268/240120675 type: 0x1/0x5 acked: 152232953 reqAck size: 145 payload: 1536011535012600309fdc68370124020024033e24040118360215300141046c5b1b64fcf104c1e3200dedbaa2ca73368e43e75fc0e32386390c5c51bb343180137d6c38c51199f8cb5484b794eda0dbc571bc8c21bb8c4536ed56fb24ef4f2502f1ff2403012704eaf1b78f270d04fe2c0510476c6164797320417373697374616e7424fe011818181818290424ff0c18
2025-03-28 19:05:23.598 DEBUG  InteractionClient    Received read response with attributes 0x0/OperationalCredentials(0x3e)/fabrics(0x1) = [{"rootPublicKey":"046c5b1b64fcf104c1e3200dedbaa2ca73368e43e75fc0e32386390c5c51bb343180137d6c38c51199f8cb5484b794eda0dbc571bc8c21bb8c4536ed56fb24ef4f","vendorId":65521,"fabricId":"1","nodeId":"18303769249106620906","label":"Gladys Assistant","fabricIndex":1}] and events
2025-03-28 19:05:23.598 DEBUG  ExchangeManager      Message » for: SC/StandaloneAck msgId: 2372/1268/152232954 type: 0x0/0x10 acked: 240120675
2025-03-28T19:05:23+0100 <info> matter.pairDevice.js:42 (MatterHandler.pairDevice) Successfully commissioned device with nodeId 18303769249106620906
2025-03-28T19:05:23+0100 <info> convertToGladysDevice.js:57 () Matter pairing - Cluster client 29
2025-03-28 19:07:46.758 DEBUG  MessageExchange      New exchange channel: udp://[fe80::1f9b:dcb9:d14b:707a%enp2s0]:5540 on session secure/34538 protocol: 1 exId: 62691 sess: secure/34538 peerSess: 34538 SAT: 4000 SAI: 300 SII: 500 maxTrans: 5 MRP
2025-03-28 19:07:46.758 DEBUG  MessageExchange      Message « for: I/ReportData msgId: 34538/62691/240120678 type: 0x1/0x5 reqAck size: 13 payload: 152600a03c9d45290424ff0c18
2025-03-28 19:07:46.759 DEBUG  ExchangeManager      Message » for: SC/StandaloneAck msgId: 34538/62691/152232957 type: 0x0/0x10 acked: 240120678
2025-03-28T19:08:00+0100 <debug> scene.checkCalendarTriggers.js:25 (SceneManager.checkCalendarTriggers) Checking calendar triggers at Fri, 28 Mar 2025 18:08:00 GMT
2025-03-28 19:08:35.667 DEBUG  MessageExchange      New exchange channel: udp://[fe80::1f9b:dcb9:d14b:707a%enp2s0]:5540 on session secure/34538 protocol: 1 exId: 62692 sess: secure/34538 peerSess: 34538 SAT: 4000 SAI: 300 SII: 500 maxTrans: 5 MRP
2025-03-28 19:08:35.669 DEBUG  MessageExchange      Message « for: I/ReportData msgId: 34538/62692/240120679 type: 0x1/0x5 reqAck size: 13 payload: 152600a03c9d45290424ff0c18
2025-03-28 19:08:35.670 DEBUG  ExchangeManager      Message » for: SC/StandaloneAck msgId: 34538/62692/152232958 type: 0x0/0x10 acked: 240120679
2025-03-28 19:07:46.758 DEBUG  MessageExchange      New exchange channel: udp://[fe80::1f9b:dcb9:d14b:707a%enp2s0]:5540 on session secure/34538 protocol: 1 exId: 62691 sess: secure/34538 peerSess: 34538 SAT: 4000 SAI: 300 SII: 500 maxTrans: 5 MRP
2025-03-28 19:07:46.758 DEBUG  MessageExchange      Message « for: I/ReportData msgId: 34538/62691/240120678 type: 0x1/0x5 reqAck size: 13 payload: 152600a03c9d45290424ff0c18
2025-03-28 19:07:46.759 DEBUG  ExchangeManager      Message » for: SC/StandaloneAck msgId: 34538/62691/152232957 type: 0x0/0x10 acked: 240120678
2025-03-28T19:08:00+0100 <debug> scene.checkCalendarTriggers.js:25 (SceneManager.checkCalendarTriggers) Checking calendar triggers at Fri, 28 Mar 2025 18:08:00 GMT
2025-03-28 19:08:35.667 DEBUG  MessageExchange      New exchange channel: udp://[fe80::1f9b:dcb9:d14b:707a%enp2s0]:5540 on session secure/34538 protocol: 1 exId: 62692 sess: secure/34538 peerSess: 34538 SAT: 4000 SAI: 300 SII: 500 maxTrans: 5 MRP
2025-03-28 19:08:35.669 DEBUG  MessageExchange      Message « for: I/ReportData msgId: 34538/62692/240120679 type: 0x1/0x5 reqAck size: 13 payload: 152600a03c9d45290424ff0c18
2025-03-28 19:08:35.670 DEBUG  ExchangeManager      Message » for: SC/StandaloneAck msgId: 34538/62692/152232958 type: 0x0/0x10 acked: 240120679


Logs réseau :

[
    {
        "name": "Matterbridge (Matterbridge aggregator)",
        "external_id": "matter:18303769249106620906:1",
        "selector": "matter:18303769249106620906:1",
        "service_id": "1404ff11-4863-47e4-8060-dd25844b67e4",
        "should_poll": false,
        "features": [],
        "params": []
    }
]

Plein d’autres choses dans les [
] mais trop lourd pour envoyer ici

Maybe autoriser l’appairage via le code sans tirer :

Thanks for investigating!! I see that

1 Like

Great!

I added a bit of logging to see more.
I put the logs for you after stripping the Function entries from the objects:

2025-03-28T19:59:41+0100 \u003cinfo\u003e matter.init.js:36 (MatterHandler.init) Matter controller started
convertToGladysDevice gladysDevice
Aggregator {
  clusterServers: Map(1) {
    29 =\u003e {
      id: 29,
      name: 'Descriptor',
      _type: 'ClusterServer',
      attributes: [Object],
      commands: {},
      events: {},
      datasource: [Getter/Setter],
      _assignToEndpoint: [Function: _assignToEndpoint],
      [...]
    }
  },
  clusterClients: Map(1) {
    29 =\u003e {
      id: 29,
      name: 'Descriptor',
      revision: 2,
      _type: 'ClusterClient',
      supportedFeatures: [Object],
      isUnknown: false,
      endpointId: 1,
      attributes: [Object],
      events: {},
      commands: {},
      subscribeAllAttributes: [AsyncFunction: subscribeAllAttributes],
      [...]
    }
  },
  childEndpoints: [
    ComposedDevice {
      clusterServers: [Map],
      clusterClients: [Map],
      childEndpoints: [Array],
      number: 2,
      uniqueStorageKey: undefined,
      name: 'MA-bridgednode',
      structureChangedCallback: [Function: structureChangedCallback],
      descriptorCluster: [Object],
      deviceTypes: [Array]
    },
    ComposedDevice {
      clusterServers: [Map],
      clusterClients: [Map],
      childEndpoints: [Array],
      number: 5,
      uniqueStorageKey: undefined,
      name: 'MA-bridgednode',
      structureChangedCallback: [Function: structureChangedCallback],
      descriptorCluster: [Object],
      deviceTypes: [Array]
    },
    ComposedDevice {
      clusterServers: [Map],
      clusterClients: [Map],
      childEndpoints: [Array],
      number: 9,
      uniqueStorageKey: undefined,
      name: 'MA-bridgednode',
      structureChangedCallback: [Function: structureChangedCallback],
      descriptorCluster: [Object],
      deviceTypes: [Array]
    },
    ComposedDevice {
      clusterServers: [Map],
      clusterClients: [Map],
      childEndpoints: [Array],
      number: 13,
      uniqueStorageKey: undefined,
      name: 'MA-bridgednode',
      structureChangedCallback: [Function: structureChangedCallback],
      descriptorCluster: [Object],
      deviceTypes: [Array]
    },
    ComposedDevice {
      clusterServers: [Map],
      clusterClients: [Map],
      childEndpoints: [Array],
      number: 15,
      uniqueStorageKey: undefined,
      name: 'MA-bridgednode',
      structureChangedCallback: [Function: structureChangedCallback],
      descriptorCluster: [Object],
      deviceTypes: [Array]
    },
    ComposedDevice {
      clusterServers: [Map],
      clusterClients: [Map],
      childEndpoints: [Array],
      number: 17,
      uniqueStorageKey: undefined,
      name: 'MA-bridgednode',
      structureChangedCallback: [Function: structureChangedCallback],
      descriptorCluster: [Object],
      deviceTypes: [Array]
    }
  ],
  number: 1,
  uniqueStorageKey: undefined,
  name: 'MA-aggregator',
  structureChangedCallback: [Function: structureChangedCallback],
  descriptorCluster: {
    id: 29,
    name: 'Descriptor',
    _type: 'ClusterServer',
    attributes: {
      deviceTypeList: [FixedAttributeServer],
      serverList: [FixedAttributeServer],
      clientList: [FixedAttributeServer],
      partsList: [AttributeServer],
      clusterRevision: [AttributeServer],
      featureMap: [AttributeServer],
      attributeList: [AttributeServer],
      acceptedCommandList: [AttributeServer],
      generatedCommandList: [AttributeServer]
    },
    commands: {},
    events: {},
    datasource: [Getter/Setter],
    _assignToEndpoint: [Function: _assignToEndpoint],
    [...]
  },
  deviceTypes: [
    {
      name: 'MA-aggregator',
      code: 14,
      deviceClass: 'Simple',
      superSet: undefined,
      revision: 1,
      requiredServerClusters: [],
      optionalServerClusters: [Array],
      requiredClientClusters: [],
      optionalClientClusters: [],
      unknown: false
    }
  ]
}
{
  basicInformation: {
    dataModelRevision: 17,
    vendorName: 'Matterbridge',
    vendorId: 65521,
    productName: 'Matterbridge aggregator',
    productId: 32768,
    nodeLabel: 'Matterbridge aggregator',
    location: 'XX',
    hardwareVersion: 6,
    hardwareVersionString: '6.8.0-52-generic',
    softwareVersion: 2,
    softwareVersionString: '2.2.5',
    productLabel: 'Matterbridge aggregator',
    serialNumber: 'SN77b87cfd460bbd72',
    uniqueId: 'UI77b87cfd460bbd72',
    capabilityMinima: { caseSessionsPerFabric: 3, subscriptionsPerFabric: 3 },
    specificationVersion: 16973824,
    maxPathsPerInvoke: 10
  },
  deviceMeta: {
    ethernetConnected: false,
    wifiConnected: false,
    threadConnected: false,
    rootEndpointServerList: [
      40, 31, 63, 48,
      60, 62, 51, 29
    ],
    isBatteryPowered: false,
    isIntermittentlyConnected: false,
    isThreadSleepyEndDevice: false,
    dataRevision: 1
  }
}
PairedNode {
  events: {
    initialized: BasicObservable {},
    initializedFromRemote: BasicObservable {},
    stateChanged: BasicObservable {},
    attributeChanged: BasicObservable {},
    eventTriggered: BasicObservable {},
    structureChanged: BasicObservable {},
    decommissioned: BasicObservable {}
  },
  nodeId: 9432374632414880343n
}
2025-03-28T19:59:41+0100 \u003cinfo\u003e convertToGladysDevice.js:62 () Matter pairing - Cluster client 29
{
  id: 29,
  name: 'Descriptor',
  revision: 2,
  _type: 'ClusterClient',
  supportedFeatures: { tagList: false },
  isUnknown: false,
  endpointId: 1,
  attributes: {
    deviceTypeList: SupportedAttributeClient {
      schema: [ArraySchema],
      id: 0,
      attribute: [Object],
      name: 'deviceTypeList',
      endpointId: 1,
      clusterId: 29
    },
    serverList: SupportedAttributeClient {
      schema: [ArraySchema],
      id: 1,
      attribute: [Object],
      name: 'serverList',
      endpointId: 1,
      clusterId: 29
    },
    clientList: SupportedAttributeClient {
      schema: [ArraySchema],
      id: 2,
      attribute: [Object],
      name: 'clientList',
      endpointId: 1,
      clusterId: 29
    },
    partsList: SupportedAttributeClient {
      schema: [ArraySchema],
      id: 3,
      attribute: [Object],
      name: 'partsList',
      endpointId: 1,
      clusterId: 29
    },
    clusterRevision: SupportedAttributeClient {
      schema: [TlvNumberSchema],
      id: 65533,
      attribute: [Object],
      name: 'clusterRevision',
      endpointId: 1,
      clusterId: 29
    },
    featureMap: SupportedAttributeClient {
      schema: [TlvWrapper],
      id: 65532,
      attribute: [Object],
      name: 'featureMap',
      endpointId: 1,
      clusterId: 29
    },
    attributeList: SupportedAttributeClient {
      schema: [ArraySchema],
      id: 65531,
      attribute: [Object],
      name: 'attributeList',
      endpointId: 1,
      clusterId: 29
    },
    acceptedCommandList: SupportedAttributeClient {
      schema: [ArraySchema],
      id: 65529,
      attribute: [Object],
      name: 'acceptedCommandList',
      endpointId: 1,
      clusterId: 29
    },
    generatedCommandList: SupportedAttributeClient {
      schema: [ArraySchema],
      id: 65528,
      attribute: [Object],
      name: 'generatedCommandList',
      endpointId: 1,
      clusterId: 29
    },
    tagList: AttributeClient {
      schema: [ArraySchema],
      id: 4,
      attribute: [Object],
      name: 'tagList',
      endpointId: 1,
      clusterId: 29
    }
  },
  events: {},
  commands: {},
  subscribeAllAttributes: [AsyncFunction: subscribeAllAttributes],
  [...]
}

I think that because it’s a gateway, it’s constructed differently. Maybe focus on your modules for the moment and revisit bridges in a future PR?
In any case, in the file convertToGladysDevice under device we do receive the devices registered in the bridge via: device.childEndpoints[] because the properties of the objects in the array include in device.childEndpoints[].ComposedDevice.number the endpoint numbers of the Shelly


To investigate further in the next episode or whenever you want.

I still think it would be good to understand how it’s architected, just to be sure we don’t go down the wrong path regarding the format of the external_id :slight_smile:

Can you try to have the « simplified Â» format of your single Node?

We should think about what the external_id of such a device looks like

1 Like

Hello everyone,

A bit of reading regarding the development of IoT Matter gadgets here: ESP LowCode Matter splits system and application firmware for simpler ESP32 device development - CNX Software :slightly_smiling_face: We’ll therefore be able to even more easily « create Â» physical interfaces via Matter with these types of products whose SDK is open :heart_eyes:

1 Like

Hi @pierre-gilles,

I’ve looked but
 ^^ I still don’t know how to access the devices behind a bridge.
By adding the following function in server/services/matter/lib/matter.pairDevice.js after the this.devices.push(gladysDevice);:

        const childEndpointsCount = device.childEndpoints?.length || 0;
        if (childEndpointsCount > 0) {
          logger.debug(`Processing ${childEndpointsCount} child endpoints for device ${device.number}`);

          await Promise.each(device.childEndpoints, async (childEndpoint) => {

            console.log('pairDevice childEndpoints');
            console.log(childEndpoint);
            const childDevice = await convertToGladysDevice(
              this.serviceId,
              nodeDetail.nodeId, // Unique ID for the child device
              node,
              childEndpoint, // The child endpoint is treated as a device
              nodeDetail.deviceData,
              nodeDetail.unique_id
            );
            this.listenToStateChange(nodeDetail.nodeId, childEndpoint);
            this.devices.push(childDevice);
          });
        }

Here’s an example of a device « childEndpoints Â»:

childEndpoints: [
    PairedDevice {
      clusterServers: [Map],
      clusterClients: [Map],
      childEndpoints: [],
      number: 3,
      uniqueStorageKey: undefined,
      name: 'MA-onoffpluginunit',
      structureChangedCallback: [Function: structureChangedCallback],
      descriptorCluster: [Object],
      deviceTypes: [Array],
      declineAddingMoreClusters: true
    },
    PairedDevice {
      clusterServers: [Map],
      clusterClients: [Map],
      childEndpoints: [],
      number: 4,
      uniqueStorageKey: undefined,
      name: 'MA-temperaturesensor',
      structureChangedCallback: [Function: structureChangedCallback],
      descriptorCluster: [Object],
      deviceTypes: [Array],
      declineAddingMoreClusters: true
    }
  ],
  number: 2,
  uniqueStorageKey: undefined,
  name: 'MA-bridgednode',
  structureChangedCallback: [Function: structureChangedCallback],
  descriptorCluster: {
    id: 29,
    name: 'Descriptor',
    _type: 'ClusterServer',
    attributes: {
      deviceTypeList: [FixedAttributeServer],
      serverList: [FixedAttributeServer],
      clientList: [FixedAttributeServer],
      partsList: [AttributeServer],
      clusterRevision: [AttributeServer],
      featureMap: [AttributeServer],
      attributeList: [AttributeServer],
      acceptedCommandList: [AttributeServer],
      generatedCommandList: [AttributeServer]
    },
    commands: {},
    events: {},
    datasource: [Getter/Setter],
    _assignToEndpoint: [Function: _assignToEndpoint],
    _close: [Function: _close],
    isAttributeSupported: [Function: isAttributeSupported],
    isAttributeSupportedByName: [Function: isAttributeSupportedByName],
    isEventSupported: [Function: isEventSupported],
    isEventSupportedByName: [Function: isEventSupportedByName],
    isCommandSupported: [Function: isCommandSupported],
    isCommandSupportedByName: [Function: isCommandSupportedByName],
    getDeviceTypeListAttribute: [Function (anonymous)],
    getServerListAttribute: [Function (anonymous)],
    getClientListAttribute: [Function (anonymous)],
    getPartsListAttribute: [Function (anonymous)],
    setPartsListAttribute: [Function (anonymous)],
    subscribePartsListAttribute: [Function (anonymous)],
    getClusterRevisionAttribute: [Function (anonymous)],
    setClusterRevisionAttribute: [Function (anonymous)],
    subscribeClusterRevisionAttribute: [Function (anonymous)],
    getFeatureMapAttribute: [Function (anonymous)],
    setFeatureMapAttribute: [Function (anonymous)],
    subscribeFeatureMapAttribute: [Function (anonymous)],
    getAttributeListAttribute: [Function (anonymous)],
    setAttributeListAttribute: [Function (anonymous)],
    subscribeAttributeListAttribute: [Function (anonymous)],
    getAcceptedCommandListAttribute: [Function (anonymous)],
    setAcceptedCommandListAttribute: [Function (anonymous)],
    subscribeAcceptedCommandListAttribute: [Function (anonymous)],
    getGeneratedCommandListAttribute: [Function (anonymous)],
    setGeneratedCommandListAttribute: [Function (anonymous)],
    subscribeGeneratedCommandListAttribute: [Function (anonymous)]
  },
  deviceTypes: [
    {
      name: 'MA-bridgednode',
      code: 19,
      deviceClass: 'Utility',
      superSet: undefined,
      revision: 2,
      requiredServerClusters: [Array],
      optionalServerClusters: [Array],
      requiredClientClusters: [],
      optionalClientClusters: [],
      unknown: false
    },
    {
      name: 'MA-powersource',
      code: 17,
      deviceClass: 'Utility',
      superSet: undefined,
      revision: 1,
      requiredServerClusters: [Array],
      optionalServerClusters: [],
      requiredClientClusters: [],
      optionalClientClusters: [],
      unknown: false
    }
  ]

And I have

But well, I don’t know if that helps
 ^^

However, I was looking into the issue of keeping a device’s states even after decommissioning (but you may have solved that in the meantime ^^), shouldn’t we use the uniqueId for the external_id:
matter:${nodeDetail.deviceData.basicInformation.uniqueId}:${device.number} and only keep the nodeId in a param?

EDIT: Don’t hesitate to tell me if you want us to do a screen-sharing call.

That helps a lot! :slight_smile:

I think we’ll be able to identify these devices using the format:

node:{node_id}:{device.number}:child_endpoint:${child_endpoint.number}

From what I read on the internet, the uniqueId is not a standard ID and you can’t really rely on it.

The combo we used is a good solution :slight_smile:

I’ll continue reading the documentation on the subject!

2 Likes

Hello @pierre-gilles,

I don’t necessarily agree — if we look at the device level, the nodeId is not fixed. It is even considered a « temporary Â» bridge. Any cause that leads to a re-pairing results in a change of nodeId.
The uniqueId itself remains fixed as far as I can read/observe.
Proof of this: below I installed 2 matterbridge on 2 distinct networks, and I was able to pair my Shelly on the 2nd platform. For info, there was also a power cut in the meantime, so I’m certain those devices restarted.
The UniqueID are exactly the same, the serialNumber as well. And on each re-pairing with MatterBridge (uninstalling the matter-shelly plugin or restarting) they « re-pair Â» identically.


And finally, you can always use the serial number instead. The serieNumber is accessible in the same place, it seems to me. Because the nodeId is not a device ID.
Concrete example: your device is paired according to your method. You have another thread next to it that also references it — when you connect it you will have a second identical referenced device because it will depend on the nodeId of that other channel

For me, the nodeID is a parameter that will need to be updated when it changes.

I might be wrong — you’d need several platforms to test the unique ID.

But for the serial number
 there’s no reason it would be different from one platform to another, is there?

I think we should check the official recommendation and see how the other platforms handle it :slightly_smiling_face:

Matter is a standard, it’s not up to us to make those decisions!

I’m currently reading the Matter 1.4 specification.

There are over 1000 pages, but at least everything is described, it’s very clear.

Already, the field uniqueId was not mandatory before Matter 1.4, it’s a recent addition. There are therefore devices in the wild without uniqueId.

In the case of the « Bridge Â» device as in your case @Terdious, the uniqueId is not stable over time according to what the spec says:

In general, I have the impression that a device identifier is the combination of 3 attributes:

  • FabricIndex
  • NodeId
  • Endpoint

We weren’t far off but it was missing the FabricIndex because a NodeId can exist in another Fabric, I think.

My opinion

The uniqueId field is not a stable basis for identification from what I read in the specification.

However, nothing prevents us from saving this uniqueId if it exists (in a param for example), and then doing the matching in case of commissioning a device that has apparently already been commissioned in Gladys!

I’ll continue reading the spec


1 Like

Hello,
if you need additional info about other products, I set up a matterbridge with the Tahoma gateway to retrieve all my roller shutters and blinds.
I won’t be able to help on the dev side but if you need details about a device, I can provide them :slight_smile:
PS: I also imported my Zigbee devices so we have a few more features for other devices for later.

2 Likes