🚀 Matter & Gladys Assistant: ¡Comenzamos!

¡Hola a todos! :blush:

Hoy he seguido avanzando con Matter.

Aún estoy tanteando, ya que estamos al principio del desarrollo. No hagan caso a las traducciones que aún no están hechas.

Integración Matter: activación manual

A partir de ahora, la integración Matter está desactivada por defecto y solo se lanza si se activa manualmente:

Vista « Nodos Matter » mejorada

Poco a poco, habrá que añadir todos los dispositivos Matter del mercado. Para ello, cada uno deberá compartir las informaciones de sus dispositivos.

Dos novedades:

  • Una vista « Nodo Matter » más rica, mostrando:
    • El NodeId, la marca y el modelo del dispositivo
    • Los devices asociados
    • Los clusters, comandos y atributos disponibles
    • Los child_endpoints disponibles

  • Un botón « Download Nodes JSON », que permite recuperar un archivo JSON que contiene toda la estructura de la red Matter. Este archivo nos permite integrar fácilmente un dispositivo Matter desconocido.

El objetivo es ofrecer una experiencia de usuario fluida, sin tener que hurgar en los logs o usar un inspector.

:movie_camera: Pequeña demo en vídeo:

Gestión de un sensor de movimiento/luminosidad

He comprado un Eve Motion para probar un dispositivo Matter con batería. La integración es similar a la de otros dispositivos, lo que me ha permitido validar el proceso.

@Terdious Normalmente, tus nodos con child_endpoints deberían aparecer en la pestaña « Configuración ». Me encantaría ver esta vista y tener el JSON de tu red Matter :wink:

@mutmut quizá sea un poco pronto, pero estoy totalmente entusiasmado para integrar tus dispositivos Tahoma en cuanto despleguemos una primera versión de la integración Matter :slight_smile:

Todo está subido a GitHub :rocket:

haha, yo también, ¡así no tendré que usar node-red para controlar mis persianas!!

¡Hola @pierre-gilles!
¡Muy limpio todo eso. Y un buen punto mostrar información adicional mucho más fácil de leer/encuentra/compartir.

Por cierto, si es posible, poder ingresar el código de emparejamiento sin guiones:

Bueno, pero lamentablemente, por el momento el emparejamiento del puente no funciona, ya sea en modo Bridge o en modo Childbridge - Error 500 después de 10s con:

Bueno, he estado diciendo tonterías, había instalado una nueva VM de Linux para el desarrollo, pero en un VLAN independiente. Sin embargo, aparentemente el mDns no pasa entre las dos redes.
En fin, funciona ^^ ¡Bravo! Así que si quieres el json, te lo envío por correo. Mientras tanto, aquí tienes las capturas de pantalla / explicaciones. El Endpoint 1 es el plugin matter-shelly que agrupa los dispositivos en Matterbridge. Teniendo en cuenta que estoy configurado en « Bridge », los Endpoints son diferentes si cambio al modo « Childbridge ».


  • 5, 9 y 17 son PRO3 (módulo de 3 interruptores mono/tri)
    • Child Endpoint 5 : 1 característica PowerSource (igual que Endpoint 2 del P3EM),
    • Child Endpoint 6 : 1 característica OnOff,
    • Child Endpoint 7 : 1 característica OnOff,
    • Child Endpoint 8 : 1 característica OnOff,
Ejemplo PRO3 - Child Endpoint: 5 (+6+7+8)




  • 2 y 13 son PRO3EM (contador de energía trifásico) compuesto de
    • Child Endpoint 2 : 1 característica PowerSource (debe haber un detalle adicional aquí, ya que no veo las 3 fases… o tal vez la funcionalidad no está terminada…),
    • Child Endpoint 3 : 1 característica OnOff,
    • Child Endpoint 4 : 1 característica TemperatureSensor (Temperatura interna del módulo)
    • 1 (o 3) característica faltante en MatterBridge : Energy
Ejemplo PRO3EM - Child Endpoint: 2 (+3+4)



  • 15 es un 3EM (contador de energía para solar o para 3 dispositivos)
    • Child Endpoint 15 : 1 característica PowerSource (igual que Endpoint 2 del P3EM),
    • Child Endpoint 16 : 1 característica OnOff (igual que Endpoint 3 del P3EM),
    • 1 (o 3) característica faltante en MatterBridge : Energy
Ejemplo 3EM - Child Endpoint: 15 (+16)


Para información adicional, cada vez que se vuelven a emparejar los diferentes dispositivos, el Endpoint puede ser diferente (orden de respuesta de emparejamiento), por lo que si tenemos en cuenta esto para la correlación del external_id, se romperá. UniqueId, serieNumber, VendorId, ProductId, no importa, pero en el caso de los bridges, claramente no son el Endpoint y el NodeId los que permitirán volver a asociar un dispositivo previamente asociado.

¡Muchas gracias por compartir la especificación! La busqué pero nunca la encontré :upside_down_face:

Puedo recibir el JSON por correo electrónico, lo miraré el lunes :slight_smile:

@Terdious He subido una nueva versión que debería gestionar tus child_endpoints anidados :slight_smile: No he podido probarlo en la práctica, ¡me encantaría recibir tu feedback!

Aquí está la salida de los dispositivos/funciones:

[
    {
        "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": []
    }
]


Sin embargo, para el nombre, hay que buscarlo en el primer nivel de child_endpoints si el dispositivo es un agregador. Se trata del nodeLabel. Aquí está la salida de los clústeres en MatterBridge (aunque los ves en el JSON que permite exportar):

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

Endpoint	Id	Tipos de Dispositivo	Nombre del Clúster	ID del Clúster	Nombre del Atributo	ID del Atributo	Valor del Atributo
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

Para recordatorio, aquí:

  • child_endpoint:2 y 13 son Shelly Pro3EM, hay un solo On_Off activado en el 2 (no en el 13)
  • child_endpoint:15 es un Shelly EM3, hay un solo On_Off
  • child_endpoint:5, 9 y 17 son Shelly Pro3, hay 3 interruptores On_Off.

¿Ya puedes controlar los Shelly?

¡Sí, está bien para el pedido!

Pero no hay devolución de estado, sin embargo

¿Ah? Se supone que debería funcionar. ¿MatterBridge soporta la retroalimentación de estado?

¿Dónde está exactamente el nodeLabel?

Registros de Gladys cuando lo activo manualmente o a través de la interfaz de Shelly:

2025-04-07T15:39:40+0200 <debug> lan-manager.scanPresence.js:25 (LANManager.scanPresence) LANManager: 0 características de sensor de presencia
2025-04-07 15:39:48.414 DEBUG  MessageExchange      Nuevo canal de intercambio: udp://[fe80::1f9b:dcb9:d14b:707a%enp2s0]:5540 en sesión secure/42171 protocolo: 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      Mensaje « para: I/ReportData msgId: 42171/62022/235444815 tipo: 0x1/0x5 reqAck tamaño: 41 carga útil: 152600c590d63d3601153501260069ab88083701240206240306240400182902181818280424ff0c18
2025-04-07 15:39:48.415 DEBUG  ExchangeManager      Mensaje » para: I/StatusResponse estado: Success(0x0) subId: 1037471941 attr: 1 msgId: 42171/62022/133132491 tipo: 0x1/0x1 acked: 235444815 reqAck tamaño: 8 carga útil: 1524000024ff0c18
2025-04-07 15:39:48.419 DEBUG  MessageExchange      Mensaje « para: SC/StandaloneAck msgId: 42171/62022/235444816 tipo: 0x0/0x10 acked: 133132491
2025-04-07 15:39:48.423 DEBUG  InteractionClient    Recibida actualización de atributo: 0x6/OnOff(0x6)/onOff(0x0) = true (versión=143174505)

Registros cuando lo activo por Gladys (apagado en este caso):

2025-04-07T15:40:59+0200 <debug> scene.executeActions.js:20 (executeAction) Ejecutando acción device.set-value
2025-04-07T15:40:59+0200 <info> matter.setValue.js:52 (MatterHandler.setValue) Estableciendo valor para el nodo 5048395297330787217
2025-04-07 15:40:59.750 DEBUG  InteractionClient    Invocando comando: 0x6/OnOff(0x6)/off(0x0) con "undefined"
2025-04-07 15:40:59.750 DEBUG  MessageExchange      Nuevo canal de intercambio: udp://[fe80::1f9b:dcb9:d14b:707a%enp2s0]:5540 en sesión secure/42171 protocolo: 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      Mensaje » para: I/InvokeRequest msgId: 35175/35120/133132493 tipo: 0x1/0x8 reqAck tamaño: 29 carga útil: 1528002801360215370024000624010624020018350118181824ff0c18
2025-04-07T15:40:59+0200 <debug> gateway.forwardWebsockets.js:14 (Gateway.forwardWebsockets) Gateway: no conectado. Evitar reenvío de evento.
2025-04-07 15:40:59.772 DEBUG  MessageExchange      Mensaje « para: I/InvokeResponse msgId: 42171/35120/235444818 tipo: 0x1/0x9 acked: 133132493 reqAck tamaño: 33 carga útil: 152800360115350137002400062401062402001835012400001818181824ff0c18
2025-04-07 15:40:59.775 DEBUG  ExchangeManager      Mensaje » para: SC/StandaloneAck msgId: 35175/35120/133132494 tipo: 0x0/0x10 acked: 235444818
2025-04-07T15:40:59+0200 <debug> gateway.forwardWebsockets.js:14 (Gateway.forwardWebsockets) Gateway: no conectado. Evitar reenvío de evento.
2025-04-07 15:40:59.821 DEBUG  MessageExchange      Nuevo canal de intercambio: udp://[fe80::1f9b:dcb9:d14b:707a%enp2s0]:5540 en sesión secure/42171 protocolo: 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      Mensaje « para: I/ReportData msgId: 42171/62024/235444819 tipo: 0x1/0x5 reqAck tamaño: 41 carga útil: 152600c590d63d360115350126006aab88083701240206240306240400182902181818280424ff0c18
2025-04-07 15:40:59.822 DEBUG  ExchangeManager      Mensaje » para: I/StatusResponse estado: Success(0x0) subId: 1037471941 attr: 1 msgId: 42171/62024/133132495 tipo: 0x1/0x1 acked: 235444819 reqAck tamaño: 8 carga útil: 1524000024ff0c18
2025-04-07 15:40:59.825 DEBUG  InteractionClient    Recibida actualización de atributo: 0x6/OnOff(0x6)/onOff(0x0) = true (versión=143174506)
2025-04-07 15:40:59.826 DEBUG  MessageExchange      Mensaje « para: SC/StandaloneAck msgId: 42171/62024/235444820 tipo: 0x0/0x10 acked: 133132495

Por lo tanto, aparentemente sí, ¡captura el evento!

Lo capturé haciendo algo como esto:

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

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

Ok, lo he entendido, hay un pequeño problema en el código :smiley: ¡Lo corrijo!

Ok, pero el clusterClient BridgedDeviceBasicInformation está a un nivel superior a la funcionalidad, a nivel del bridgednode :thinking:

Tengo que ver cómo puedo identificar esto, espero que sea estándar lo que hizo Matterbrige :stuck_out_tongue:

@Terdious He arreglado el estado de retorno normalmente :slight_smile:

Bah entonces


En sí no me sorprende, espero que sigan el estándar, pero si seguimos la escalera, es coherente,
Un agregador que contiene varios dispositivos que contienen varias características. El nombre del dispositivo aquí es « Pro3 L1 Bâtiment Perso » y las características no tienen nombre, tienen ids « switch:0 », « switch:1 », « switch:2 »

Debe haber un tipo, supongo, para cada piso… voy a mirar.

5	main	0x0013, 0x0011	FixedLabel	0x40	labelList	0x00	
[ { label: 'composed', value: 'Switch' } ]
13	main	0x0013, 0x0011	FixedLabel	0x40	labelList	0x00	
[ { label: 'composed', value: 'PowerMeter' } ]

?

Mmmmh aparentemente no funciona… Aquí hice un apagado manual y luego un encendido manual

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

Mira si se parece a tus registros, pero si es la parte InteractionClient Received attribute update: 0x6/OnOff(0x6)/onOff(0x0) = true (version=634393535) envía true 2 veces. No sé si es la razón ^^

Creo que no es el estado de la lámpara lo que vemos, sino la entrada:


¡Es un pulsador!

Voy a probar con un interruptor

Acabo de subir la gestión de BridgedDeviceBasicInformation :slight_smile:

Normalmente, deberías tener los nombres correctos de los dispositivos. ¿Puedes confirmarlo? (Solo hay que eliminar los dispositivos Gladys, no es necesario reaparearlos)

¡Ah! :smiley: ¡Sí! Por ahora solo manejo el encendido/apagado

Está indefinido :grimacing: :sweat_smile:

Lo mismo para el interruptor, así que no hay de qué ^^

He elegido vendorName ( nodeLabel || productLabel ), por lo que el vendorName debe estar vacío en tu caso. ¡Estoy haciendo pruebas :p! Tiene que funcionar tanto para MatterBridge como para los dispositivos « reales » de Matter.

Sí, por supuesto, pero te confirmo que vendorName está relleno:


Y además nodeLabel = productLabel ^^