Skip to content

Conversation

@BurchuMikhail
Copy link
Contributor

An issue has arisen (commit: 50ea9ba) where when extending a standard cluster with custom attributes, the standard genBasic attributes become unavailable from the zigbee2mqtt web interface.
The mechanism for expanding a standard cluster via a converter file turned out to be unclear.
Expansion is only possible through cluster.ts?

@Koenkk
Copy link
Owner

Koenkk commented Nov 26, 2025

Can you try with m.deviceAddCustomCluster("genBasic", {? It happens because you are using the same id as the genBasic cluster.

@BurchuMikhail
Copy link
Contributor Author

  1. I tried this:

     extend: [
         m.deviceAddCustomCluster("genBasic", {
             ID: 0,
             manufacturerCode: 26214,
             attributes: {
                 deviceVersion: {ID: 26113, type: Zcl.DataType.CHAR_STR},
                 deviceSignature: {ID: 26114, type: Zcl.DataType.CHAR_STR},
                 deviceBootVersion: {ID: 26115, type: Zcl.DataType.CHAR_STR},
                 componentVersion: {ID: 26117, type: Zcl.DataType.CHAR_STR},
                 componentSignature: {ID: 26118, type: Zcl.DataType.CHAR_STR},
             },
             commands: {},
             commandsResponse: {},
         }),
    

But in this case, the web interface has cluster genBasic, and when I request, for example, attribute powerSource, I get this error.

[27.11.2025, 13:41:15] z2m: Publish 'set' 'read' to '0xbc026efffe372e6b' failed: 'Error: ZCL command 0xbc026efffe372e6b/1 genBasic.read(["powerSource"], {"timeout":10000,"disableResponse":false,"disableRecovery":false,"disableDefaultResponse":true,"direction":0,"reservedBits":0,"manufacturerCode":26214,"writeUndiv":false}) failed (Status 'UNSUPPORTED_ATTRIBUTE')'

Custom attributes are not displayed in this cluster.

  1. If I don't make any changes to the standard cluster genBasic, then I get a response without an error when I request attribute powerSource:

[27.11.2025, 13:47:29] zhc:tz: Read result of 'genBasic': {"powerSource":4}

  1. If I use this code:

     extend: [
         m.deviceAddCustomCluster("genBasic", {
             ID: 0,
             attributes: {
                 deviceVersion: {ID: 26113, type: Zcl.DataType.CHAR_STR, manufacturerCode: sprutCode},
                 deviceSignature: {ID: 26114, type: Zcl.DataType.CHAR_STR, manufacturerCode: sprutCode},
                 deviceBootVersion: {ID: 26115, type: Zcl.DataType.CHAR_STR, manufacturerCode: sprutCode},
                 componentVersion: {ID: 26117, type: Zcl.DataType.CHAR_STR, manufacturerCode: sprutCode},
                 componentSignature: {ID: 26118, type: Zcl.DataType.CHAR_STR, manufacturerCode: sprutCode},
             },
             commands: {},
             commandsResponse: {},
         }),
    

, then cluster genBasic is available in the web interface with standard attributes (but no custom ones). However, the response to the request for attribute powerSource is:

[27.11.2025, 15:02:19] zhc:tz: Read result of 'genBasic': {"powerSource":4}

  1. Unfortunately, I don't yet know how to add custom attributes to the standard cluster.
    Thanks!

@BurchuMikhail
Copy link
Contributor Author

If I add attributes to a standard cluster after cluster.ts like this:

        schneiderMeterRadioPower: {ID: 0xe200, type: DataType.INT8, manufacturerCode: ManufacturerCode.SCHNEIDER_ELECTRIC},
        deviceVersion: {ID: 26113, type: DataType.CHAR_STR, manufacturerCode: ManufacturerCode.CUSTOM_SPRUT_DEVICE },
        deviceSignature: {ID: 26114, type: DataType.CHAR_STR, manufacturerCode: ManufacturerCode.CUSTOM_SPRUT_DEVICE },
        deviceBootVersion: {ID: 26115, type: DataType.CHAR_STR, manufacturerCode: ManufacturerCode.CUSTOM_SPRUT_DEVICE },
        componentVersion: {ID: 26117, type: DataType.CHAR_STR, manufacturerCode: ManufacturerCode.CUSTOM_SPRUT_DEVICE },
        componentSignature: {ID: 26118, type: DataType.CHAR_STR, manufacturerCode: ManufacturerCode.CUSTOM_SPRUT_DEVICE },
    },

, the result is as expected – custom attributes are available in cluster genBasic in the web interface:
zigbee2mqtt

and are readable normally:

[27.11.2025, 15:53:42] zhc:tz: Read result of 'genBasic': {"deviceVersion":"4.34.1"}

@Koenkk
Copy link
Owner

Koenkk commented Nov 27, 2025

Would it be possible to use a non conflicting cluster ID for the device? If not, maybe you can help debugging https://github.com/Koenkk/zigbee-herdsman/blob/fe0d4a428a05002e248a52af0ed87cfde3828e36/src/controller/model/device.ts#L1268 ?

@BurchuMikhail
Copy link
Contributor Author

Unfortunately, it's currently not possible to use another cluster for these attributes. Only in the near future.
I think so. I could help with debugging. I just don't have any ideas yet on how to fix it. I need help.

@Koenkk
Copy link
Owner

Koenkk commented Nov 29, 2025

To start, I would add some console.log statements there to see what's happening.

@BurchuMikhail
Copy link
Contributor Author

After commit 7ef4099, adding custom attributes to the standard cluster works.
I'm publishing the following in mqtt:
root@wirenboard-AW3A6BUN:~# mosquitto_pub -t "zigbee2mqtt/0x94b216fffef21e48/set" -m '{"read": {"cluster": "genBasic", "attributes": ["deviceVersion"]}}'
And in the log, I see the response:
[30.11.2025, 21:03:16] zhc:tz: Read result of 'genBasic': {"deviceVersion":"4.34.1"}
Everything is as expected.
Custom attributes aren't displayed in the web interface itself. I've attached the screenshot above.
Unfortunately, I don't know how to make these attributes available through the web interface.

@BurchuMikhail
Copy link
Contributor Author

Added logging to /zigbee-herdsman/blob/master/src/controller/model/device.ts for addCustomCluster
Here's the log:

Nov 30 14:24:13 wirenboard-AW3A6BUN zigbee2mqtt[45609]: > [email protected] start
Nov 30 14:24:13 wirenboard-AW3A6BUN zigbee2mqtt[45609]: > node index.js
Nov 30 14:24:14 wirenboard-AW3A6BUN zigbee2mqtt[45621]: Starting Zigbee2MQTT without watchdog.
Nov 30 14:24:17 wirenboard-AW3A6BUN zigbee2mqtt[45621]: [2025-11-30 14:24:17] info:         z2m: Logging to console, file (filename: log.log)
Nov 30 14:24:17 wirenboard-AW3A6BUN zigbee2mqtt[45621]: [2025-11-30 14:24:17] info:         z2m: Starting Zigbee2MQTT version 2.6.2 (commit #unknown)
Nov 30 14:24:17 wirenboard-AW3A6BUN zigbee2mqtt[45621]: [2025-11-30 14:24:17] info:         z2m: Starting zigbee-herdsman (6.1.5)
Nov 30 14:24:18 wirenboard-AW3A6BUN zigbee2mqtt[45621]: [2025-11-30 14:24:18] info:         zh:zstack:znp: Opening SerialPort with {"path":"/dev/ttyMOD1","baudRate":115200,"rtscts":false,"autoOpen":false}
Nov 30 14:24:18 wirenboard-AW3A6BUN zigbee2mqtt[45621]: [2025-11-30 14:24:18] info:         zh:zstack:znp: Serialport opened
Nov 30 14:24:18 wirenboard-AW3A6BUN zigbee2mqtt[45621]: [2025-11-30 14:24:18] info:         z2m: zigbee-herdsman started (resumed)
Nov 30 14:24:18 wirenboard-AW3A6BUN zigbee2mqtt[45621]: [2025-11-30 14:24:18] info:         z2m: Coordinator firmware version: '{"meta":{"maintrel":1,"majorrel":2,"minorrel":7,"product":1,"revision":20240710,"transportrev":2},"type":"ZStack3x0"}'
Nov 30 14:24:18 wirenboard-AW3A6BUN zigbee2mqtt[45621]: [2025-11-30 14:24:18] info:         z2m: 0xbc026efffe372e6b (0xbc026efffe372e6b): WB-MSW-ZIGBEE v.4 - Wirenboard Wall-mounted multi sensor (Router)
Nov 30 14:24:18 wirenboard-AW3A6BUN zigbee2mqtt[45621]: [2025-11-30 14:24:18] info:         z2m: Currently 1 devices are joined.
Nov 30 14:24:18 wirenboard-AW3A6BUN zigbee2mqtt[45621]: [2025-11-30 14:24:18] info:         z2m: Connecting to MQTT server at mqtt://localhost
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: [2025-11-30 14:24:19] info:         z2m: Connected to MQTT server
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: [2025-11-30 14:24:19] info:         z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/bridge/state', payload '{"state":"online"}'
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: === ADD CUSTOM CLUSTER DEBUG ===
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: Input name: genBasic
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: Input cluster ID: 0
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: Input manufacturerCode: undefined
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: Is cluster name: true
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: Existing cluster: {
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:   ID: 0,
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:   attributes: {
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     zclVersion: { ID: 0, type: 32 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     appVersion: { ID: 1, type: 32 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     stackVersion: { ID: 2, type: 32 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     hwVersion: { ID: 3, type: 32 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     manufacturerName: { ID: 4, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     modelId: { ID: 5, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     dateCode: { ID: 6, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     powerSource: { ID: 7, type: 48 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     appProfileVersion: { ID: 8, type: 48 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     genericDeviceType: { ID: 9, type: 48 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     productCode: { ID: 10, type: 65 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     productUrl: { ID: 11, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     manufacturerVersionDetails: { ID: 12, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     serialNumber: { ID: 13, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     productLabel: { ID: 14, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     locationDesc: { ID: 16, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     physicalEnv: { ID: 17, type: 48 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     deviceEnabled: { ID: 18, type: 16 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     alarmMask: { ID: 19, type: 24 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     disableLocalConfig: { ID: 20, type: 24 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     swBuildId: { ID: 16384, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     schneiderMeterRadioPower: { ID: 57856, type: 40, manufacturerCode: 4190 }
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:   },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:   commands: {
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     resetFactDefault: { ID: 0, parameters: [] },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     tuyaSetup: { ID: 240, parameters: [] }
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:   },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:   commandsResponse: {}
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: }
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: Existing cluster ID: 0
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: Final cluster: {
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:   ID: 0,
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:   manufacturerCode: undefined,
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:   attributes: {
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     zclVersion: { ID: 0, type: 32 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     appVersion: { ID: 1, type: 32 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     stackVersion: { ID: 2, type: 32 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     hwVersion: { ID: 3, type: 32 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     manufacturerName: { ID: 4, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     modelId: { ID: 5, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     dateCode: { ID: 6, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     powerSource: { ID: 7, type: 48 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     appProfileVersion: { ID: 8, type: 48 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     genericDeviceType: { ID: 9, type: 48 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     productCode: { ID: 10, type: 65 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     productUrl: { ID: 11, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     manufacturerVersionDetails: { ID: 12, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     serialNumber: { ID: 13, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     productLabel: { ID: 14, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     locationDesc: { ID: 16, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     physicalEnv: { ID: 17, type: 48 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     deviceEnabled: { ID: 18, type: 16 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     alarmMask: { ID: 19, type: 24 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     disableLocalConfig: { ID: 20, type: 24 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     swBuildId: { ID: 16384, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     schneiderMeterRadioPower: { ID: 57856, type: 40, manufacturerCode: 4190 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     deviceVersion: { ID: 26113, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     deviceSignature: { ID: 26114, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     deviceBootVersion: { ID: 26115, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     componentVersion: { ID: 26117, type: 66 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     componentSignature: { ID: 26118, type: 66 }
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:   },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:   commands: {
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     resetFactDefault: { ID: 0, parameters: [] },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     tuyaSetup: { ID: 240, parameters: [] }
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:   },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:   commandsResponse: {}
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: }
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: ==============================
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: === ADD CUSTOM CLUSTER DEBUG ===
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: Input name: sprutDevice
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: Input cluster ID: 26112
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: Input manufacturerCode: 26214
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: Is cluster name: false
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: Final cluster: {
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:   ID: 26112,
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:   manufacturerCode: 26214,
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:   attributes: {
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     isConnected: { ID: 26116, type: 16 },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:     UartBaudRate: { ID: 26113, type: 35 }
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:   },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:   commands: { debug: { ID: 103, parameters: [Array] } },
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]:   commandsResponse: {}
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: }
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: ==============================
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: [2025-11-30 14:24:19] info:         z2m: Started frontend on port 0.0.0.0:8081
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: [2025-11-30 14:24:19] info:         z2m:mqtt: MQTT publish: topic 'zigbee2mqtt/0xbc026efffe372e6b', payload '{"activity_led_indicator":false,"co2":752,"humidity":50.98,"illuminance":80,"last_seen":1764512637472,"linkquality":193,"noise":53.91,"noise_detect_level":50,"noise_detected":true,"noise_timeout":60,"occupancy":true,"occupancy_level":19,"occupancy_sensitivity":50,"occupancy_timeout":60,"state_l1":"OFF","state_l2":"OFF","state_l3":"OFF","temperature":24.75,"temperature_offset":0,"th_heater":false,"uart_baud_rate":"9600","uart_connection":true,"update":{"installed_version":72,"latest_version":71,"state":"idle"},"voc":55}'
Nov 30 14:24:19 wirenboard-AW3A6BUN zigbee2mqtt[45621]: [2025-11-30 14:24:19] info:         z2m: Zigbee2MQTT started!

And I saw that the cluster was expanding with new custom attributes.
Now I need to understand how to display these attributes in the web interface when working in Dev console.

@Koenkk
Copy link
Owner

Koenkk commented Dec 1, 2025

The custom cluster are published as part of the zigbee2mqtt/bridge/definitions topic (code), if they are published there it's probably a frontend bug.

@BurchuMikhail
Copy link
Contributor Author

I subscribed to the topic zigbee2mqtt/bridge/definitions. As a result, genBasic of them doesn't have the attributes I added:

    "genBasic": {
      "ID": 0,
      "attributes": {
        "alarmMask": {
          "ID": 19,
          "type": 24
        },
        "appProfileVersion": {
          "ID": 8,
          "type": 48
        },
        "appVersion": {
          "ID": 1,
          "type": 32
        },
        "dateCode": {
          "ID": 6,
          "type": 66
        },
        "deviceEnabled": {
          "ID": 18,
          "type": 16
        },
        "disableLocalConfig": {
          "ID": 20,
          "type": 24
        },
        "genericDeviceType": {
          "ID": 9,
          "type": 48
        },
        "hwVersion": {
          "ID": 3,
          "type": 32
        },
        "locationDesc": {
          "ID": 16,
          "type": 66
        },
        "manufacturerName": {
          "ID": 4,
          "type": 66
        },
        "manufacturerVersionDetails": {
          "ID": 12,
          "type": 66
        },
        "modelId": {
          "ID": 5,
          "type": 66
        },
        "physicalEnv": {
          "ID": 17,
          "type": 48
        },
        "powerSource": {
          "ID": 7,
          "type": 48
        },
        "productCode": {
          "ID": 10,
          "type": 65
        },
        "productLabel": {
          "ID": 14,
          "type": 66
        },
        "productUrl": {
          "ID": 11,
          "type": 66
        },
        "schneiderMeterRadioPower": {
          "ID": 57856,
          "manufacturerCode": 4190,
          "type": 40
        },
        "serialNumber": {
          "ID": 13,
          "type": 66
        },
        "stackVersion": {
          "ID": 2,
          "type": 32
        },
        "swBuildId": {
          "ID": 16384,
          "type": 66
        },
        "zclVersion": {
          "ID": 0,
          "type": 32
        }
      },
      "commands": {
        "resetFactDefault": {
          "ID": 0,
          "parameters": []
        },
        "tuyaSetup": {
          "ID": 240,
          "parameters": []
        }
      },
      "commandsResponse": {}
    },

@BurchuMikhail
Copy link
Contributor Author

At the very end of the response I see custom cluster sprutDevice (i.e. it shouldn't be here?):

      "sprutDevice": {
        "ID": 26112,
        "attributes": {
          "UartBaudRate": {
            "ID": 26113,
            "type": 35
          },
          "isConnected": {
            "ID": 26116,
            "type": 16
          }
        },
        "commands": {
          "debug": {
            "ID": 103,
            "parameters": [
              {
                "name": "data",
                "type": 32
              }
            ]
          }
        },
        "commandsResponse": {},
        "manufacturerCode": 26214
      }

@BurchuMikhail
Copy link
Contributor Author

Will it be possible to backport these changes to 2.7.0? Because the changes in #10856 resulted in the standard cluster genBasic becoming unreadable? Or will that only happen in the next version?

@Koenkk
Copy link
Owner

Koenkk commented Dec 2, 2025

I subscribed to the topic zigbee2mqtt/bridge/definitions. As a result, genBasic of them doesn't have the attributes I added:

Can you add some debug logging to z2m to log the custom clusters when published? Seems they are missing there?

Will it be possible to backport these changes to 2.7.0? Because the changes in #10856 resulted in the standard cluster genBasic becoming unreadable? Or will that only happen in the next version?

Fix will be included in the next version and dev branch once this is merged.

@BurchuMikhail
Copy link
Contributor Author

I must have missed it last time.
I entered the command:
mosquitto_sub -t "zigbee2mqtt/bridge/definitions"
This is what the custom cluster field looks like:

  "custom_clusters": {
    "0x2c1165fffeabe0ad": {
      "genBasic": {
        "ID": 0,
        "attributes": {
          "alarmMask": {
            "ID": 19,
            "type": 24
          },
          "appProfileVersion": {
            "ID": 8,
            "type": 48
          },
          "appVersion": {
            "ID": 1,
            "type": 32
          },
          "componentSignature": {
            "ID": 26118,
            "manufacturerCode": 26214,
            "type": 66
          },
          "componentVersion": {
            "ID": 26117,
            "manufacturerCode": 26214,
            "type": 66
          },
          "dateCode": {
            "ID": 6,
            "type": 66
          },
          "deviceBootVersion": {
            "ID": 26115,
            "manufacturerCode": 26214,
            "type": 66
          },
          "deviceEnabled": {
            "ID": 18,
            "type": 16
          },
          "deviceSignature": {
            "ID": 26114,
            "manufacturerCode": 26214,
            "type": 66
          },
          "deviceVersion": {
            "ID": 26113,
            "manufacturerCode": 26214,
            "type": 66
          },
          "disableLocalConfig": {
            "ID": 20,
            "type": 24
          },
          "genericDeviceType": {
            "ID": 9,
            "type": 48
          },
          "hwVersion": {
            "ID": 3,
            "type": 32
          },
          "locationDesc": {
            "ID": 16,
            "type": 66
          },
          "manufacturerName": {
            "ID": 4,
            "type": 66
          },
          "manufacturerVersionDetails": {
            "ID": 12,
            "type": 66
          },
          "modelId": {
            "ID": 5,
            "type": 66
          },
          "physicalEnv": {
            "ID": 17,
            "type": 48
          },
          "powerSource": {
            "ID": 7,
            "type": 48
          },
          "productCode": {
            "ID": 10,
            "type": 65
          },
          "productLabel": {
            "ID": 14,
            "type": 66
          },
          "productUrl": {
            "ID": 11,
            "type": 66
          },
          "schneiderMeterRadioPower": {
            "ID": 57856,
            "manufacturerCode": 4190,
            "type": 40
          },
          "serialNumber": {
            "ID": 13,
            "type": 66
          },
          "stackVersion": {
            "ID": 2,
            "type": 32
          },
          "swBuildId": {
            "ID": 16384,
            "type": 66
          },
          "zclVersion": {
            "ID": 0,
            "type": 32
          }
        },
        "commands": {
          "resetFactDefault": {
            "ID": 0,
            "parameters": []
          },
          "tuyaSetup": {
            "ID": 240,
            "parameters": []
          }
        },
        "commandsResponse": {}
      },
      "sprutDevice": {
        "ID": 26112,
        "attributes": {
          "UartBaudRate": {
            "ID": 26113,
            "type": 35
          },
          "isConnected": {
            "ID": 26116,
            "type": 16
          }
        },
        "commands": {
          "debug": {
            "ID": 103,
            "parameters": [
              {
                "name": "data",
                "type": 32
              }
            ]
          }
        },
        "commandsResponse": {},
        "manufacturerCode": 26214
      }
    }
  }

So, all 5 custom attributes (componentSignature, componentVersion, deviceBootVersion, deviceSignature, deviceVersion) have been retrieved.
Was this result necessary to check?

@Koenkk
Copy link
Owner

Koenkk commented Dec 3, 2025

@Nerivec could it be that windfront ignores the custom cluster because it conflicts with genBasic?

@Nerivec
Copy link
Collaborator

Nerivec commented Dec 3, 2025

No WindFront picks custom cluster first, then standard if not available (2.7.0 includes a fix on this, previously was ZH first - old frontend has the bug also I believe).
https://github.com/Nerivec/zigbee2mqtt-windfront/blob/ef2c5b37be299ee8045cdbc8eb246313c4e391f6/src/components/reporting/index.ts#L29-L51
I added a sample device (taken from a real device) Bosch thermostat that overrides the hvacThermostat in the dev interface of WindFront to test this.

@BurchuMikhail can you check the state.json from Settings>Tools>Download state to see if the custom cluster attributes are present in the frontend's store?

I did not read everything related to this, but I see some renaming, could it be it's trying to use an improper (outdated) key somewhere?

@BurchuMikhail
Copy link
Contributor Author

@Nerivec I checked. I see that the custom attributes are in this file.
state.json

@Nerivec
Copy link
Collaborator

Nerivec commented Dec 7, 2025

This is what I get when adding one of the devices in that state.json as mock:
10862

Did you test this with latest Z2M version (as mentioned there was a related fix)?

@BurchuMikhail
Copy link
Contributor Author

@Nerivec
Unfortunately, I didn't read your message carefully and tested it on z2m version 2.7.0.
Now I've tested it on version 2.7.1, and my changes worked as expected.
Снимок экрана от 2025-12-09 09-01-36
This is what it looks like in the latest version.
Снимок экрана от 2025-12-09 09-09-15

Thank you.

@Nerivec
Copy link
Collaborator

Nerivec commented Dec 9, 2025

I've added a mock device to the demo so we can have an example of this: https://nerivec.github.io/zigbee2mqtt-windfront/

@BurchuMikhail
Copy link
Contributor Author

@Koenkk, It's working as expected now. Would you like to accept the changes to the converter?
Thank you.

@Koenkk Koenkk merged commit d5906d1 into Koenkk:master Dec 10, 2025
3 checks passed
@Koenkk
Copy link
Owner

Koenkk commented Dec 10, 2025

Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants