🚀 Matter & Gladys Assistant: Here we go!

Hi everyone :blush:

I kept making progress on Matter today.

I’m still feeling my way around since we’re at the start of development. Don’t pay attention to translations that haven’t been done yet.

Matter Integration: manual activation

From now on, the Matter integration is disabled by default and only starts if it’s enabled manually:

Improved « Matter Nodes Â» view

Little by little, we’ll need to add all Matter devices on the market. For that, everyone will need to share their device information.

Two new things:

  • A richer « Matter Node Â» view, showing:
    • The NodeId, the device brand and model
    • The associated devices
    • The available clusters, commands and attributes
    • The available child_endpoints

  • A « Download Nodes JSON Â» button, allowing you to retrieve a JSON file containing the entire Matter network structure. This file makes it easy for us to integrate an unknown Matter device.

The goal is to offer a smooth user experience, without having to dig through logs or use an inspector.

:movie_camera: Short demo video:

Support for a motion/light sensor

I bought an Eve Motion to test a battery-powered Matter device. The integration is similar to other devices, which allowed me to validate the process.

@Terdious Normally, your nodes with child_endpoints should appear in the « Settings Â» tab. I’d be curious to see that view and to get the JSON of your Matter network :wink:

@mutmut it might still be a bit early, but I’m totally up for integrating your Tahoma devices as soon as we’ve deployed a first version of the Matter integration :slight_smile:

Everything is pushed to GitHub :rocket:

3 Likes

haha, me too, it’ll save me from having to use Node-RED to control my shutters!!

2 Likes

Hi @pierre-gilles !!

Looks really neat. And a good point to display additional info much easier to read / find / share.

As a reminder, if possible allow entering the pairing code without dashes:

But sorry, for now the bridge pairing doesn’t go through, whether in Bridge mode or in Childbridge mode - 500 Error after 10s with:

Well, I was talking nonsense — I had installed a new Linux VM for dev but on a separate VLAN, except that apparently mDNS doesn’t pass between the two network ranges.
Anyway, it works ^^ Congrats. So if you want the json, I’ll send it to you by email. In the meantime, here are the screenshots / explanations. Endpoint 1 is the matter-shelly plugin that groups the devices in the Matterbridge. Knowing that I’m configured in « Bridge Â», the Endpoints become different if I switch to « Childbridge Â» mode.


  • 5, 9 and 17 are PRO3s (module of 3 single/three switchs)
    • Child Endpoint 5: 1 feature PowerSource (Same as Endpoint 2 of the P3EM),
    • Child Endpoint 6: 1 feature OnOff,
    • Child Endpoint 7: 1 feature OnOff,
    • Child Endpoint 8: 1 feature OnOff,
Example PRO3 - Child Endpoint: 5 (+6+7+8)




  • 2 and 13 are PRO3EMs (three-phase energy meters) composed of
    • Child Endpoint 2: 1 feature PowerSource (there must be an extra subtlety here because I don’t see the 3 phases 
 or the functionality isn’t finished 
),
    • Child Endpoint 3: 1 feature OnOff,
    • Child Endpoint 4: 1 feature TemperatureSensor (internal temperature of the module)
    • 1 (or 3) feature missing in MatterBridge: Energy
Example PRO3EM - Child Endpoint: 2 (+3+4)



  • 15 is a 3EM (energy meter for solar or for 3 devices)
    • Child Endpoint 15: 1 feature PowerSource (Same as Endpoint 2 of the P3EM),
    • Child Endpoint 16: 1 feature OnOff (Same as Endpoint 3 of the P3EM),
    • 1 (or 3) feature missing in MatterBridge: Energy
Example 3EM - Child Endpoint: 15 (+16)


For information as well, on every re-pairing of the different devices, the Endpoint can be different (pairing response order), so if you take that into account for correlating the external_id, it will be broken. UniqueId, serialNumber, VendorId, ProductId, no matter, but in the case of bridges, it is clearly not the Endpoint and the NodeId that will allow re-associating a previously associated device.

Many thanks for sharing the specification. I looked but never found it :upside_down_face:

1 Like

I’d like the JSON by email, I’ll look at it on Monday :slight_smile:

1 Like

@Terdious I pushed a new version that should handle your nested child_endpoints :slight_smile: I couldn’t test it live, I’d appreciate your feedback!

1 Like

Voici la sortie des devices / features :

[
    {
        "name": "Matterbridge (Matterbridge aggregator)",
        "external_id": "matter:5048395297330787217:1:child_endpoint:2:child_endpoint:3",
        "selector": "matter:5048395297330787217:1:child_endpoint:2:child_endpoint:3",
        "service_id": "1404ff11-4863-47e4-8060-dd25844b67e4",
        "should_poll": false,
        "features": [
            {
                "name": "on_off",
                "category": "switch",
                "type": "binary",
                "read_only": false,
                "has_feedback": true,
                "external_id": "matter:5048395297330787217:1:child_endpoint:2:child_endpoint:3:6",
                "selector": "matter:5048395297330787217:1:child_endpoint:2:child_endpoint:3:6",
                "min": 0,
                "max": 1
            }
        ],
        "params": []
    },
    {
        "name": "Matterbridge (Matterbridge aggregator)",
        "external_id": "matter:5048395297330787217:1:child_endpoint:5:child_endpoint:6",
        "selector": "matter:5048395297330787217:1:child_endpoint:5:child_endpoint:6",
        "service_id": "1404ff11-4863-47e4-8060-dd25844b67e4",
        "should_poll": false,
        "features": [
            {
                "name": "on_off",
                "category": "switch",
                "type": "binary",
                "read_only": false,
                "has_feedback": true,
                "external_id": "matter:5048395297330787217:1:child_endpoint:5:child_endpoint:6:6",
                "selector": "matter:5048395297330787217:1:child_endpoint:5:child_endpoint:6:6",
                "min": 0,
                "max": 1
            }
        ],
        "params": []
    },
    {
        "name": "Matterbridge (Matterbridge aggregator)",
        "external_id": "matter:5048395297330787217:1:child_endpoint:5:child_endpoint:7",
        "selector": "matter:5048395297330787217:1:child_endpoint:5:child_endpoint:7",
        "service_id": "1404ff11-4863-47e4-8060-dd25844b67e4",
        "should_poll": false,
        "features": [
            {
                "name": "on_off",
                "category": "switch",
                "type": "binary",
                "read_only": false,
                "has_feedback": true,
                "external_id": "matter:5048395297330787217:1:child_endpoint:5:child_endpoint:7:6",
                "selector": "matter:5048395297330787217:1:child_endpoint:5:child_endpoint:7:6",
                "min": 0,
                "max": 1
            }
        ],
        "params": []
    },
    {
        "name": "Matterbridge (Matterbridge aggregator)",
        "external_id": "matter:5048395297330787217:1:child_endpoint:5:child_endpoint:8",
        "selector": "matter:5048395297330787217:1:child_endpoint:5:child_endpoint:8",
        "service_id": "1404ff11-4863-47e4-8060-dd25844b67e4",
        "should_poll": false,
        "features": [
            {
                "name": "on_off",
                "category": "switch",
                "type": "binary",
                "read_only": false,
                "has_feedback": true,
                "external_id": "matter:5048395297330787217:1:child_endpoint:5:child_endpoint:8:6",
                "selector": "matter:5048395297330787217:1:child_endpoint:5:child_endpoint:8:6",
                "min": 0,
                "max": 1
            }
        ],
        "params": []
    },
    {
        "name": "Matterbridge (Matterbridge aggregator)",
        "external_id": "matter:5048395297330787217:1:child_endpoint:9:child_endpoint:10",
        "selector": "matter:5048395297330787217:1:child_endpoint:9:child_endpoint:10",
        "service_id": "1404ff11-4863-47e4-8060-dd25844b67e4",
        "should_poll": false,
        "features": [
            {
                "name": "on_off",
                "category": "switch",
                "type": "binary",
                "read_only": false,
                "has_feedback": true,
                "external_id": "matter:5048395297330787217:1:child_endpoint:9:child_endpoint:10:6",
                "selector": "matter:5048395297330787217:1:child_endpoint:9:child_endpoint:10:6",
                "min": 0,
                "max": 1
            }
        ],
        "params": []
    },
    {
        "name": "Matterbridge (Matterbridge aggregator)",
        "external_id": "matter:5048395297330787217:1:child_endpoint:9:child_endpoint:11",
        "selector": "matter:5048395297330787217:1:child_endpoint:9:child_endpoint:11",
        "service_id": "1404ff11-4863-47e4-8060-dd25844b67e4",
        "should_poll": false,
        "features": [
            {
                "name": "on_off",
                "category": "switch",
                "type": "binary",
                "read_only": false,
                "has_feedback": true,
                "external_id": "matter:5048395297330787217:1:child_endpoint:9:child_endpoint:11:6",
                "selector": "matter:5048395297330787217:1:child_endpoint:9:child_endpoint:11:6",
                "min": 0,
                "max": 1
            }
        ],
        "params": []
    },
    {
        "name": "Matterbridge (Matterbridge aggregator)",
        "external_id": "matter:5048395297330787217:1:child_endpoint:9:child_endpoint:12",
        "selector": "matter:5048395297330787217:1:child_endpoint:9:child_endpoint:12",
        "service_id": "1404ff11-4863-47e4-8060-dd25844b67e4",
        "should_poll": false,
        "features": [
            {
                "name": "on_off",
                "category": "switch",
                "type": "binary",
                "read_only": false,
                "has_feedback": true,
                "external_id": "matter:5048395297330787217:1:child_endpoint:9:child_endpoint:12:6",
                "selector": "matter:5048395297330787217:1:child_endpoint:9:child_endpoint:12:6",
                "min": 0,
                "max": 1
            }
        ],
        "params": []
    },
    {
        "name": "Matterbridge (Matterbridge aggregator)",
        "external_id": "matter:5048395297330787217:1:child_endpoint:15:child_endpoint:16",
        "selector": "matter:5048395297330787217:1:child_endpoint:15:child_endpoint:16",
        "service_id": "1404ff11-4863-47e4-8060-dd25844b67e4",
        "should_poll": false,
        "features": [
            {
                "name": "on_off",
                "category": "switch",
                "type": "binary",
                "read_only": false,
                "has_feedback": true,
                "external_id": "matter:5048395297330787217:1:child_endpoint:15:child_endpoint:16:6",
                "selector": "matter:5048395297330787217:1:child_endpoint:15:child_endpoint:16:6",
                "min": 0,
                "max": 1
            }
        ],
        "params": []
    },
    {
        "name": "Matterbridge (Matterbridge aggregator)",
        "external_id": "matter:5048395297330787217:1:child_endpoint:17:child_endpoint:18",
        "selector": "matter:5048395297330787217:1:child_endpoint:17:child_endpoint:18",
        "service_id": "1404ff11-4863-47e4-8060-dd25844b67e4",
        "should_poll": false,
        "features": [
            {
                "name": "on_off",
                "category": "switch",
                "type": "binary",
                "read_only": false,
                "has_feedback": true,
                "external_id": "matter:5048395297330787217:1:child_endpoint:17:child_endpoint:18:6",
                "selector": "matter:5048395297330787217:1:child_endpoint:17:child_endpoint:18:6",
                "min": 0,
                "max": 1
            }
        ],
        "params": []
    },
    {
        "name": "Matterbridge (Matterbridge aggregator)",
        "external_id": "matter:5048395297330787217:1:child_endpoint:17:child_endpoint:19",
        "selector": "matter:5048395297330787217:1:child_endpoint:17:child_endpoint:19",
        "service_id": "1404ff11-4863-47e4-8060-dd25844b67e4",
        "should_poll": false,
        "features": [
            {
                "name": "on_off",
                "category": "switch",
                "type": "binary",
                "read_only": false,
                "has_feedback": true,
                "external_id": "matter:5048395297330787217:1:child_endpoint:17:child_endpoint:19:6",
                "selector": "matter:5048395297330787217:1:child_endpoint:17:child_endpoint:19:6",
                "min": 0,
                "max": 1
            }
        ],
        "params": []
    },
    {
        "name": "Matterbridge (Matterbridge aggregator)",
        "external_id": "matter:5048395297330787217:1:child_endpoint:17:child_endpoint:20",
        "selector": "matter:5048395297330787217:1:child_endpoint:17:child_endpoint:20",
        "service_id": "1404ff11-4863-47e4-8060-dd25844b67e4",
        "should_poll": false,
        "features": [
            {
                "name": "on_off",
                "category": "switch",
                "type": "binary",
                "read_only": false,
                "has_feedback": true,
                "external_id": "matter:5048395297330787217:1:child_endpoint:17:child_endpoint:20:6",
                "selector": "matter:5048395297330787217:1:child_endpoint:17:child_endpoint:20:6",
                "min": 0,
                "max": 1
            }
        ],
        "params": []
    }
]


Par contre pour le nom il faut aller le chercher dans le 1er niveau de child_endpoints si le device est un aggregator. Et il s’agit du nodeLabel. Voici la sorties des clusters dans MatterBridge (mĂȘme si tu les vois dans le JSON que tu permets d’exporter) :

Clusters for device "Pro3 L1 BĂątiment Perso" on endpoint 5

Endpoint	Id	Device Types	Cluster Name	Cluster ID	Attribute Name	Attribute ID	Attribute Value
5	main	0x0013, 0x0011	Descriptor	0x1d	deviceTypeList	0x00	
[ { deviceType: 19, revision: 2 }, { deviceType: 17, revision: 1 } ]
5	main	0x0013, 0x0011	Descriptor	0x1d	serverList	0x01	
[ 29, 57, 47, 64 ]
5	main	0x0013, 0x0011	Descriptor	0x1d	clientList	0x02	
[ ]
5	main	0x0013, 0x0011	Descriptor	0x1d	partsList	0x03	
[ 6, 7, 8 ]
5	main	0x0013, 0x0011	Descriptor	0x1d	clusterRevision	0xfffd	
2
5	main	0x0013, 0x0011	Descriptor	0x1d	featureMap	0xfffc	
{ tagList: false }
5	main	0x0013, 0x0011	Descriptor	0x1d	attributeList	0xfffb	
[ 0, 1, 2, 3, 65533, 65532, 65531, 65529, 65528 ]
5	main	0x0013, 0x0011	Descriptor	0x1d	acceptedCommandList	0xfff9	
[ ]
5	main	0x0013, 0x0011	Descriptor	0x1d	generatedCommandList	0xfff8	
[ ]
5	main	0x0013, 0x0011	BridgedDeviceBasicInformation	0x39	vendorName	0x01	
Shelly
5	main	0x0013, 0x0011	BridgedDeviceBasicInformation	0x39	vendorId	0x02	
65521
5	main	0x0013, 0x0011	BridgedDeviceBasicInformation	0x39	productName	0x03	
SPSW-003XE16EU
5	main	0x0013, 0x0011	BridgedDeviceBasicInformation	0x39	nodeLabel	0x05	
Pro3 L1 BĂątiment Perso
5	main	0x0013, 0x0011	BridgedDeviceBasicInformation	0x39	hardwareVersion	0x07	
1
5	main	0x0013, 0x0011	BridgedDeviceBasicInformation	0x39	hardwareVersionString	0x08	
1.0.0
5	main	0x0013, 0x0011	BridgedDeviceBasicInformation	0x39	softwareVersion	0x09	
1
5	main	0x0013, 0x0011	BridgedDeviceBasicInformation	0x39	softwareVersionString	0x0a	
1.4.4-g6d2a586
5	main	0x0013, 0x0011	BridgedDeviceBasicInformation	0x39	productUrl	0x0d	
https://www.npmjs.com/package/matterbridge
5	main	0x0013, 0x0011	BridgedDeviceBasicInformation	0x39	productLabel	0x0e	
Pro3 L1 BĂątiment Perso
5	main	0x0013, 0x0011	BridgedDeviceBasicInformation	0x39	serialNumber	0x0f	
shellypro3-2CBCBBA5E414
5	main	0x0013, 0x0011	BridgedDeviceBasicInformation	0x39	reachable	0x11	
true
5	main	0x0013, 0x0011	BridgedDeviceBasicInformation	0x39	uniqueId	0x12	
9234c6c5e1cba064abc04f37f6707ac0
5	main	0x0013, 0x0011	BridgedDeviceBasicInformation	0x39	clusterRevision	0xfffd	
3
5	main	0x0013, 0x0011	BridgedDeviceBasicInformation	0x39	featureMap	0xfffc	
{ }
5	main	0x0013, 0x0011	BridgedDeviceBasicInformation	0x39	attributeList	0xfffb	
[ 1, 2, 3, 5, 7, 8, 9, 10, 13, 14, 15, 17, 18, 65533, 65532, 65531, 65529, 65528 ]
5	main	0x0013, 0x0011	BridgedDeviceBasicInformation	0x39	acceptedCommandList	0xfff9	
[ ]
5	main	0x0013, 0x0011	BridgedDeviceBasicInformation	0x39	generatedCommandList	0xfff8	
[ ]
5	main	0x0013, 0x0011	PowerSource	0x2f	status	0x00	
1
5	main	0x0013, 0x0011	PowerSource	0x2f	order	0x01	
0
5	main	0x0013, 0x0011	PowerSource	0x2f	description	0x02	
AC Power
5	main	0x0013, 0x0011	PowerSource	0x2f	endpointList	0x1f	
[ ]
5	main	0x0013, 0x0011	PowerSource	0x2f	clusterRevision	0xfffd	
2
5	main	0x0013, 0x0011	PowerSource	0x2f	featureMap	0xfffc	
{ wired: true, battery: false, rechargeable: false, replaceable: false }
5	main	0x0013, 0x0011	PowerSource	0x2f	attributeList	0xfffb	
[ 0, 1, 2, 31, 65533, 65532, 65531, 65529, 65528, 5 ]
5	main	0x0013, 0x0011	PowerSource	0x2f	acceptedCommandList	0xfff9	
[ ]
5	main	0x0013, 0x0011	PowerSource	0x2f	generatedCommandList	0xfff8	
[ ]
5	main	0x0013, 0x0011	PowerSource	0x2f	wiredCurrentType	0x05	
0
5	main	0x0013, 0x0011	FixedLabel	0x40	labelList	0x00	
[ { label: 'composed', value: 'Switch' } ]
5	main	0x0013, 0x0011	FixedLabel	0x40	clusterRevision	0xfffd	
1
5	main	0x0013, 0x0011	FixedLabel	0x40	featureMap	0xfffc	
{ }
5	main	0x0013, 0x0011	FixedLabel	0x40	attributeList	0xfffb	
[ 0, 65533, 65532, 65531, 65529, 65528 ]
5	main	0x0013, 0x0011	FixedLabel	0x40	acceptedCommandList	0xfff9	
[ ]
5	main	0x0013, 0x0011	FixedLabel	0x40	generatedCommandList	0xfff8	
[ ]
6	switch:0	0x010a	Descriptor	0x1d	deviceTypeList	0x00	
[ { deviceType: 266, revision: 3 } ]
6	switch:0	0x010a	Descriptor	0x1d	serverList	0x01	
[ 29, 3, 4, 6 ]
6	switch:0	0x010a	Descriptor	0x1d	clientList	0x02	
[ ]
6	switch:0	0x010a	Descriptor	0x1d	partsList	0x03	
[ ]
6	switch:0	0x010a	Descriptor	0x1d	clusterRevision	0xfffd	
2
6	switch:0	0x010a	Descriptor	0x1d	featureMap	0xfffc	
{ tagList: false }
6	switch:0	0x010a	Descriptor	0x1d	attributeList	0xfffb	
[ 0, 1, 2, 3, 65533, 65532, 65531, 65529, 65528 ]
6	switch:0	0x010a	Descriptor	0x1d	acceptedCommandList	0xfff9	
[ ]
6	switch:0	0x010a	Descriptor	0x1d	generatedCommandList	0xfff8	
[ ]
6	switch:0	0x010a	Identify	0x03	identifyTime	0x00	
0
6	switch:0	0x010a	Identify	0x03	identifyType	0x01	
0
6	switch:0	0x010a	Identify	0x03	clusterRevision	0xfffd	
4
6	switch:0	0x010a	Identify	0x03	featureMap	0xfffc	
{ }
6	switch:0	0x010a	Identify	0x03	attributeList	0xfffb	
[ 0, 1, 65533, 65532, 65531, 65529, 65528 ]
6	switch:0	0x010a	Identify	0x03	acceptedCommandList	0xfff9	
[ 0, 64 ]
6	switch:0	0x010a	Identify	0x03	generatedCommandList	0xfff8	
[ ]
6	switch:0	0x010a	Groups	0x04	nameSupport	0x00	
{ nameSupport: false, groupNames: false }
6	switch:0	0x010a	Groups	0x04	clusterRevision	0xfffd	
4
6	switch:0	0x010a	Groups	0x04	featureMap	0xfffc	
{ groupNames: true }
6	switch:0	0x010a	Groups	0x04	attributeList	0xfffb	
[ 0, 65533, 65532, 65531, 65529, 65528 ]
6	switch:0	0x010a	Groups	0x04	acceptedCommandList	0xfff9	
[ ]
6	switch:0	0x010a	Groups	0x04	generatedCommandList	0xfff8	
[ ]
6	switch:0	0x010a	OnOff	0x06	onOff	0x00	
true
6	switch:0	0x010a	OnOff	0x06	clusterRevision	0xfffd	
6
6	switch:0	0x010a	OnOff	0x06	featureMap	0xfffc	
{ lighting: true, deadFrontBehavior: false, offOnly: false }
6	switch:0	0x010a	OnOff	0x06	attributeList	0xfffb	
[ 0, 65533, 65532, 65531, 65529, 65528, 16384, 16385, 16386, 16387 ]
6	switch:0	0x010a	OnOff	0x06	acceptedCommandList	0xfff9	
[ 0, 64, 65, 66, 1, 2 ]
6	switch:0	0x010a	OnOff	0x06	generatedCommandList	0xfff8	
[ ]
6	switch:0	0x010a	OnOff	0x06	globalSceneControl	0x4000	
false
6	switch:0	0x010a	OnOff	0x06	onTime	0x4001	
0
6	switch:0	0x010a	OnOff	0x06	offWaitTime	0x4002	
0
6	switch:0	0x010a	OnOff	0x06	startUpOnOff	0x4003	
null
7	switch:1	0x010a	Descriptor	0x1d	deviceTypeList	0x00	
[ { deviceType: 266, revision: 3 } ]
7	switch:1	0x010a	Descriptor	0x1d	serverList	0x01	
[ 29, 3, 4, 6 ]
7	switch:1	0x010a	Descriptor	0x1d	clientList	0x02	
[ ]
7	switch:1	0x010a	Descriptor	0x1d	partsList	0x03	
[ ]
7	switch:1	0x010a	Descriptor	0x1d	clusterRevision	0xfffd	
2
7	switch:1	0x010a	Descriptor	0x1d	featureMap	0xfffc	
{ tagList: false }
7	switch:1	0x010a	Descriptor	0x1d	attributeList	0xfffb	
[ 0, 1, 2, 3, 65533, 65532, 65531, 65529, 65528 ]
7	switch:1	0x010a	Descriptor	0x1d	acceptedCommandList	0xfff9	
[ ]
7	switch:1	0x010a	Descriptor	0x1d	generatedCommandList	0xfff8	
[ ]
7	switch:1	0x010a	Identify	0x03	identifyTime	0x00	
0
7	switch:1	0x010a	Identify	0x03	identifyType	0x01	
0
7	switch:1	0x010a	Identify	0x03	clusterRevision	0xfffd	
4
7	switch:1	0x010a	Identify	0x03	featureMap	0xfffc	
{ }
7	switch:1	0x010a	Identify	0x03	attributeList	0xfffb	
[ 0, 1, 65533, 65532, 65531, 65529, 65528 ]
7	switch:1	0x010a	Identify	0x03	acceptedCommandList	0xfff9	
[ 0, 64 ]
7	switch:1	0x010a	Identify	0x03	generatedCommandList	0xfff8	
[ ]
7	switch:1	0x010a	Groups	0x04	nameSupport	0x00	
{ nameSupport: false, groupNames: false }
7	switch:1	0x010a	Groups	0x04	clusterRevision	0xfffd	
4
7	switch:1	0x010a	Groups	0x04	featureMap	0xfffc	
{ groupNames: true }
7	switch:1	0x010a	Groups	0x04	attributeList	0xfffb	
[ 0, 65533, 65532, 65531, 65529, 65528 ]
7	switch:1	0x010a	Groups	0x04	acceptedCommandList	0xfff9	
[ ]
7	switch:1	0x010a	Groups	0x04	generatedCommandList	0xfff8	
[ ]
7	switch:1	0x010a	OnOff	0x06	onOff	0x00	
false
7	switch:1	0x010a	OnOff	0x06	clusterRevision	0xfffd	
6
7	switch:1	0x010a	OnOff	0x06	featureMap	0xfffc	
{ lighting: true, deadFrontBehavior: false, offOnly: false }
7	switch:1	0x010a	OnOff	0x06	attributeList	0xfffb	
[ 0, 65533, 65532, 65531, 65529, 65528, 16384, 16385, 16386, 16387 ]
7	switch:1	0x010a	OnOff	0x06	acceptedCommandList	0xfff9	
[ 0, 64, 65, 66, 1, 2 ]
7	switch:1	0x010a	OnOff	0x06	generatedCommandList	0xfff8	
[ ]
7	switch:1	0x010a	OnOff	0x06	globalSceneControl	0x4000	
false
7	switch:1	0x010a	OnOff	0x06	onTime	0x4001	
0
7	switch:1	0x010a	OnOff	0x06	offWaitTime	0x4002	
0
7	switch:1	0x010a	OnOff	0x06	startUpOnOff	0x4003	
null
8	switch:2	0x010a	Descriptor	0x1d	deviceTypeList	0x00	
[ { deviceType: 266, revision: 3 } ]
8	switch:2	0x010a	Descriptor	0x1d	serverList	0x01	
[ 29, 3, 4, 6 ]
8	switch:2	0x010a	Descriptor	0x1d	clientList	0x02	
[ ]
8	switch:2	0x010a	Descriptor	0x1d	partsList	0x03	
[ ]
8	switch:2	0x010a	Descriptor	0x1d	clusterRevision	0xfffd	
2
8	switch:2	0x010a	Descriptor	0x1d	featureMap	0xfffc	
{ tagList: false }
8	switch:2	0x010a	Descriptor	0x1d	attributeList	0xfffb	
[ 0, 1, 2, 3, 65533, 65532, 65531, 65529, 65528 ]
8	switch:2	0x010a	Descriptor	0x1d	acceptedCommandList	0xfff9	
[ ]
8	switch:2	0x010a	Descriptor	0x1d	generatedCommandList	0xfff8	
[ ]
8	switch:2	0x010a	Identify	0x03	identifyTime	0x00	
0
8	switch:2	0x010a	Identify	0x03	identifyType	0x01	
0
8	switch:2	0x010a	Identify	0x03	clusterRevision	0xfffd	
4
8	switch:2	0x010a	Identify	0x03	featureMap	0xfffc	
{ }
8	switch:2	0x010a	Identify	0x03	attributeList	0xfffb	
[ 0, 1, 65533, 65532, 65531, 65529, 65528 ]
8	switch:2	0x010a	Identify	0x03	acceptedCommandList	0xfff9	
[ 0, 64 ]
8	switch:2	0x010a	Identify	0x03	generatedCommandList	0xfff8	
[ ]
8	switch:2	0x010a	Groups	0x04	nameSupport	0x00	
{ nameSupport: false, groupNames: false }
8	switch:2	0x010a	Groups	0x04	clusterRevision	0xfffd	
4
8	switch:2	0x010a	Groups	0x04	featureMap	0xfffc	
{ groupNames: true }
8	switch:2	0x010a	Groups	0x04	attributeList	0xfffb	
[ 0, 65533, 65532, 65531, 65529, 65528 ]
8	switch:2	0x010a	Groups	0x04	acceptedCommandList	0xfff9	
[ ]
8	switch:2	0x010a	Groups	0x04	generatedCommandList	0xfff8	
[ ]
8	switch:2	0x010a	OnOff	0x06	onOff	0x00	
false
8	switch:2	0x010a	OnOff	0x06	clusterRevision	0xfffd	
6
8	switch:2	0x010a	OnOff	0x06	featureMap	0xfffc	
{ lighting: true, deadFrontBehavior: false, offOnly: false }
8	switch:2	0x010a	OnOff	0x06	attributeList	0xfffb	
[ 0, 65533, 65532, 65531, 65529, 65528, 16384, 16385, 16386, 16387 ]
8	switch:2	0x010a	OnOff	0x06	acceptedCommandList	0xfff9	
[ 0, 64, 65, 66, 1, 2 ]
8	switch:2	0x010a	OnOff	0x06	generatedCommandList	0xfff8	
[ ]
8	switch:2	0x010a	OnOff	0x06	globalSceneControl	0x4000	
false
8	switch:2	0x010a	OnOff	0x06	onTime	0x4001	
0
8	switch:2	0x010a	OnOff	0x06	offWaitTime	0x4002	
0
8	switch:2	0x010a	OnOff	0x06	startUpOnOff	0x4003	
null
Total child endpoints: 3

Pour rappel, ici :

  • child_endpoint:2 et 13 sont des Shelly Pro3EM, il y a bien 1 seul On_Off activĂ© sur le 2 (pas sur le 13)
  • child_endpoint:15 est un Shelly EM3, il y a bien 1 seul On_Off
  • child_endpoint:5, 9 et 17 sont des Shelly Pro3, il y a 3 commutateurs On_Off.

Can you control the Shelly devices?

Yes ok for the order!

But no status update, though

[quote="T

Gladys logs when I trigger manually or via the Shelly interface:

2025-04-07T15:39:40+0200 \u003cdebug\u003e lan-manager.scanPresence.js:25 (LANManager.scanPresence) LANManager: 0 presence sensor features
2025-04-07 15:39:48.414 DEBUG  MessageExchange      New exchange channel: udp://[fe80::1f9b:dcb9:d14b:707a%enp2s0]:5540 on session secure/42171 protocol: 1 exId: 62022 sess: secure/42171 peerSess: 42171 SAT: 4000 SAI: 300 SII: 500 maxTrans: 5 MRP
2025-04-07 15:39:48.414 DEBUG  MessageExchange      Message « for: I/ReportData msgId: 42171/62022/235444815 type: 0x1/0x5 reqAck size: 41 payload: 152600c590d63d3601153501260069ab88083701240206240306240400182902181818280424ff0c18
2025-04-07 15:39:48.415 DEBUG  ExchangeManager      Message » for: I/StatusResponse status: Success(0x0) subId: 1037471941 attr: 1 msgId: 42171/62022/133132491 type: 0x1/0x1 acked: 235444815 reqAck size: 8 payload: 1524000024ff0c18
2025-04-07 15:39:48.419 DEBUG  MessageExchange      Message « for: SC/StandaloneAck msgId: 42171/62022/235444816 type: 0x0/0x10 acked: 133132491
2025-04-07 15:39:48.423 DEBUG  InteractionClient    Received attribute update: 0x6/OnOff(0x6)/onOff(0x0) = true (version=143174505)

Logs when I trigger via Gladys (turning off in this case):

2025-04-07T15:40:59+0200 \u003cdebug\u003e scene.executeActions.js:20 (executeAction) Executing action device.set-value
2025-04-07T15:40:59+0200 \u003cinfo\u003e matter.setValue.js:52 (MatterHandler.setValue) Setting value for node 5048395297330787217
2025-04-07 15:40:59.750 DEBUG  InteractionClient    Invoking command: 0x6/OnOff(0x6)/off(0x0) with "undefined"
2025-04-07 15:40:59.750 DEBUG  MessageExchange      New exchange channel: udp://[fe80::1f9b:dcb9:d14b:707a%enp2s0]:5540 on session secure/42171 protocol: 1 exId: 35120 sess: secure/42171 peerSess: 35175 SAT: 4000 SAI: 300 SII: 500 maxTrans: 5 MRP I
2025-04-07 15:40:59.752 DEBUG  ExchangeManager      Message » for: I/InvokeRequest msgId: 35175/35120/133132493 type: 0x1/0x8 reqAck size: 29 payload: 1528002801360215370024000624010624020018350118181824ff0c18
2025-04-07T15:40:59+0200 \u003cdebug\u003e gateway.forwardWebsockets.js:14 (Gateway.forwardWebsockets) Gateway: not connected. Prevent forwarding event.
2025-04-07 15:40:59.772 DEBUG  MessageExchange      Message « for: I/InvokeResponse msgId: 42171/35120/235444818 type: 0x1/0x9 acked: 133132493 reqAck size: 33 payload: 152800360115350137002400062401062402001835012400001818181824ff0c18
2025-04-07 15:40:59.775 DEBUG  ExchangeManager      Message » for: SC/StandaloneAck msgId: 35175/35120/133132494 type: 0x0/0x10 acked: 235444818
2025-04-07T15:40:59+0200 \u003cdebug\u003e gateway.forwardWebsockets.js:14 (Gateway.forwardWebsockets) Gateway: not connected. Prevent forwarding event.
2025-04-07 15:40:59.821 DEBUG  MessageExchange      New exchange channel: udp://[fe80::1f9b:dcb9:d14b:707a%enp2s0]:5540 on session secure/42171 protocol: 1 exId: 62024 sess: secure/42171 peerSess: 42171 SAT: 4000 SAI: 300 SII: 500 maxTrans: 5 MRP
2025-04-07 15:40:59.822 DEBUG  MessageExchange      Message « for: I/ReportData msgId: 42171/62024/235444819 type: 0x1/0x5 reqAck size: 41 payload: 152600c590d63d360115350126006aab88083701240206240306240400182902181818280424ff0c18
2025-04-07 15:40:59.822 DEBUG  ExchangeManager      Message » for: I/StatusResponse status: Success(0x0) subId: 1037471941 attr: 1 msgId: 42171/62024/133132495 type: 0x1/0x1 acked: 235444819 reqAck size: 8 payload: 1524000024ff0c18
2025-04-07 15:40:59.825 DEBUG  InteractionClient    Received attribute update: 0x6/OnOff(0x6)/onOff(0x0) = true (version=143174506)
2025-04-07 15:40:59.826 DEBUG  MessageExchange      Message « for: SC/StandaloneAck msgId: 42171/62024/235444820 type: 0x0/0x10 acked: 133132495

So apparently yes, it does catch the event!!

I got it by doing something like this:

  const bridgedCluster = Array.from(device.clusterClients.values()).find(
    (c) =\u003e c.name === 'BridgedDeviceBasicInformation'
  );
let detailedName = device.name;

  if (bridgedCluster) {
    if (bridgedCluster.attributes.hasOwnProperty('nodeLabel')) {
      detailedName = await bridgedCluster.attributes.nodeLabel.get().catch(() =\u003e device.name);
    }
    if (bridgedCluster.attributes.hasOwnProperty('productName')) {
      productName = await bridgedCluster.attributes.productName.get().catch(() =\u003e null);
    }
    if (bridgedCluster.attributes.hasOwnProperty('serialNumber')) {
      serialNumber = await bridgedCluster.attributes.serialNumber.get().catch(() =\u003e null);
    }
    if (bridgedCluster.attributes.hasOwnProperty('uniqueId')) {
      uniqueId = await bridgedCluster.attributes.uniqueId.get().catch(() =\u003e null);
    }
    if (bridgedCluster.attributes.hasOwnProperty('vendorId')) {
      vendorId = await bridgedCluster.attributes.vendorId.get().catch(() =\u003e null);
    }
    if (bridgedCluster.attributes.hasOwnProperty('productId')) {
      productId = await bridgedCluster.attributes.productId.get().catch(() =\u003e null);
    }
  }

[quote="Terdious, post:31, topic

1 Like

@Terdious I fixed the status response, should be fine now :slight_smile:

1 Like

Well then


In itself that doesn’t shock me, I do indeed hope they follow the standard but if we follow the staircase, it’s coherent,
An aggregator that contains multiple devices that contain multiple features. The name of the device here is indeed « Pro3 L1 BĂątiment Perso Â» and the features don’t have names, they have ids « switch:0 Â», « switch:1 Â», « switch:2 Â»

There must be a type I suppose for each level 
 I’ll take a look.

5\tmain\t0x0013, 0x0011\tFixedLabel\t0x40\tlabelList\t0x00\t
[ { label: 'composed', value: 'Switch' } ]
13\tmain\t0x0013, 0x0011\tFixedLabel\t0x40\tlabelList\t0x00\t
[ { label: 'composed', value: 'PowerMeter' } ]

?

Mmmmh apparently it’s not working
 Here I did a manual turn-off then a manual turn-on

2025-04-07 16:19:33.184 DEBUG  MessageExchange      New exchange channel: udp://[fe80::1f9b:dcb9:d14b:707a%enp2s0]:5540 on session secure/2537 protocol: 1 exId: 5518 sess: secure/2537 peerSess: 2537 SAT: 4000 SAI: 300 SII: 500 maxTrans: 5 MRP
2025-04-07 16:19:33.184 DEBUG  MessageExchange      Message « for: I/ReportData msgId: 2537/5518/45251895 type: 0x1/0x5 reqAck size: 41 payload: 152600d7c86c7b36011535012600be13d0253701240206240306240400182902181818280424ff0c18
2025-04-07 16:19:33.185 DEBUG  ExchangeManager      Message » for: I/StatusResponse status: Success(0x0) subId: 2070726871 attr: 1 msgId: 2537/5518/193656250 type: 0x1/0x1 acked: 45251895 reqAck size: 8 payload: 1524000024ff0c18
2025-04-07 16:19:33.187 DEBUG  MessageExchange      Message « for: SC/StandaloneAck msgId: 2537/5518/45251896 type: 0x0/0x10 acked: 193656250
2025-04-07 16:19:33.188 DEBUG  InteractionClient    Received attribute update: 0x6/OnOff(0x6)/onOff(0x0) = true (version=634393534)
2025-04-07 16:19:34.697 DEBUG  MessageExchange      New exchange channel: udp://[fe80::1f9b:dcb9:d14b:707a%enp2s0]:5540 on session secure/2537 protocol: 1 exId: 5519 sess: secure/2537 peerSess: 2537 SAT: 4000 SAI: 300 SII: 500 maxTrans: 5 MRP
2025-04-07 16:19:34.697 DEBUG  MessageExchange      Message « for: I/ReportData msgId: 2537/5519/45251897 type: 0x1/0x5 reqAck size: 41 payload: 152600d7c86c7b36011535012600bf13d0253701240206240306240400182902181818280424ff0c18
2025-04-07 16:19:34.698 DEBUG  ExchangeManager      Message » for: I/StatusResponse status: Success(0x0) subId: 2070726871 attr: 1 msgId: 2537/5519/193656251 type: 0x1/0x1 acked: 45251897 reqAck size: 8 payload: 1524000024ff0c18
2025-04-07 16:19:34.699 DEBUG  InteractionClient    Received attribute update: 0x6/OnOff(0x6)/onOff(0x0) = true (version=634393535)
2025-04-07 16:19:34.700 DEBUG  MessageExchange      Message « for: SC/StandaloneAck msgId: 2537/5519/45251898 type: 0x0/0x10 acked: 193656251

Check if this looks like your logs but if it’s the part InteractionClient Received attribute update: 0x6/OnOff(0x6)/onOff(0x0) = true (version=634393535) it sends true 2 times. I don’t know if that’s the reason ^^

I think what we’re seeing is not the lamp’s state feedback but the input’s:


It’s a pushbutton!!
I’m testing with a switch

I just pushed support for BridgedDeviceBasicInformation :slight_smile:

Normally, you should have the correct device names! Can you confirm? (You just need to delete the Gladys devices, no need to pair again)

1 Like

Ah!! :smiley: Yes! For now I only handle the OnOff

It’s undefined :grimacing: :sweat_smile:
![image

[quote="Terd

Yes, of course, but I can confirm that vendorName is populated:


And by the way nodeLabel = productLabel ^^