Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Device Support Request] Matrix Intercom Automator DIY_Zintercom #3763

Open
dimensi opened this issue Jan 23, 2025 · 1 comment
Open

[Device Support Request] Matrix Intercom Automator DIY_Zintercom #3763

dimensi opened this issue Jan 23, 2025 · 1 comment

Comments

@dimensi
Copy link

dimensi commented Jan 23, 2025

Problem description

I tried to write a quirk for this device with and without chatgpt, but I still can't start the device. There are no errors in the log, there is only information that my quirk is loaded, but it's not used for my device. The device still doesn't have the necessary sensors and settings in homeassistant. I took a converter for z2m as a basis https://github.com/xyzroe/Zintercom/blob/master/converters/DIYRuZ_Zintercom.js

I tried to remove the device and reconnect it, including constantly overloading the Home Assistant, but nothing helps.

Image

Solution description

I don't know. Use the converter from https://github.com/xyzroe/Zintercom/blob/master/converters/DIYRuZ_Zintercom.js as a basis, write a quirk for ZHA?

Screenshots/Video

Screenshots/Video

[Paste/upload your media here]

Device signature

Device signature
{
  "node_descriptor": {
    "logical_type": 2,
    "complex_descriptor_available": 0,
    "user_descriptor_available": 0,
    "reserved": 0,
    "aps_flags": 0,
    "frequency_band": 8,
    "mac_capability_flags": 128,
    "manufacturer_code": 0,
    "maximum_buffer_size": 80,
    "maximum_incoming_transfer_size": 160,
    "server_mask": 0,
    "maximum_outgoing_transfer_size": 160,
    "descriptor_capability_field": 0
  },
  "endpoints": {
    "1": {
      "profile_id": "0x0104",
      "device_type": "0x000c",
      "input_clusters": [
        "0x0000"
      ],
      "output_clusters": [
        "0x0006",
        "0x0101"
      ]
    }
  },
  "manufacturer": "xyzroe",
  "model": "DIY_Zintercom",
  "class": "zigpy.device.Device"
}

Diagnostic information

Diagnostic information
{
  "home_assistant": {
    "installation_type": "Home Assistant OS",
    "version": "2025.1.2",
    "dev": false,
    "hassio": true,
    "virtualenv": false,
    "python_version": "3.13.1",
    "docker": true,
    "arch": "x86_64",
    "timezone": "Europe/Moscow",
    "os_name": "Linux",
    "os_version": "6.6.66-haos",
    "supervisor": "2024.12.3",
    "host_os": "Home Assistant OS 14.1",
    "docker_version": "27.2.0",
    "chassis": "embedded",
    "run_as_root": true
  },
  "custom_components": {
    "yandex_smart_home": {
      "documentation": "https://docs.yaha-cloud.ru/v1.0.x/",
      "version": "1.0.2",
      "requirements": []
    },
    "elkbledom": {
      "documentation": "https://github.com/dave-code-ruiz/elkbledom",
      "version": "1.2.2",
      "requirements": [
        "bleak-retry-connector>=3.5.0",
        "bleak>=0.22.2"
      ]
    },
    "hacs": {
      "documentation": "https://hacs.xyz/docs/use/",
      "version": "2.0.3",
      "requirements": [
        "aiogithubapi>=22.10.1"
      ]
    }
  },
  "integration_manifest": {
    "domain": "zha",
    "name": "Zigbee Home Automation",
    "after_dependencies": [
      "hassio",
      "onboarding",
      "usb"
    ],
    "codeowners": [
      "dmulcahey",
      "adminiuga",
      "puddly",
      "TheJulianJES"
    ],
    "config_flow": true,
    "dependencies": [
      "file_upload"
    ],
    "documentation": "https://www.home-assistant.io/integrations/zha",
    "iot_class": "local_polling",
    "loggers": [
      "aiosqlite",
      "bellows",
      "crccheck",
      "pure_pcapy3",
      "zhaquirks",
      "zigpy",
      "zigpy_deconz",
      "zigpy_xbee",
      "zigpy_zigate",
      "zigpy_znp",
      "zha",
      "universal_silabs_flasher"
    ],
    "requirements": [
      "universal-silabs-flasher==0.0.25",
      "zha==0.0.45"
    ],
    "usb": [
      {
        "vid": "10C4",
        "pid": "EA60",
        "description": "*2652*",
        "known_devices": [
          "slae.sh cc2652rb stick"
        ]
      },
      {
        "vid": "10C4",
        "pid": "EA60",
        "description": "*slzb-07*",
        "known_devices": [
          "smlight slzb-07"
        ]
      },
      {
        "vid": "1A86",
        "pid": "55D4",
        "description": "*sonoff*plus*",
        "known_devices": [
          "sonoff zigbee dongle plus v2"
        ]
      },
      {
        "vid": "10C4",
        "pid": "EA60",
        "description": "*sonoff*plus*",
        "known_devices": [
          "sonoff zigbee dongle plus"
        ]
      },
      {
        "vid": "10C4",
        "pid": "EA60",
        "description": "*tubeszb*",
        "known_devices": [
          "TubesZB Coordinator"
        ]
      },
      {
        "vid": "1A86",
        "pid": "7523",
        "description": "*tubeszb*",
        "known_devices": [
          "TubesZB Coordinator"
        ]
      },
      {
        "vid": "1A86",
        "pid": "7523",
        "description": "*zigstar*",
        "known_devices": [
          "ZigStar Coordinators"
        ]
      },
      {
        "vid": "1CF1",
        "pid": "0030",
        "description": "*conbee*",
        "known_devices": [
          "Conbee II"
        ]
      },
      {
        "vid": "0403",
        "pid": "6015",
        "description": "*conbee*",
        "known_devices": [
          "Conbee III"
        ]
      },
      {
        "vid": "10C4",
        "pid": "8A2A",
        "description": "*zigbee*",
        "known_devices": [
          "Nortek HUSBZB-1"
        ]
      },
      {
        "vid": "0403",
        "pid": "6015",
        "description": "*zigate*",
        "known_devices": [
          "ZiGate+"
        ]
      },
      {
        "vid": "10C4",
        "pid": "EA60",
        "description": "*zigate*",
        "known_devices": [
          "ZiGate"
        ]
      },
      {
        "vid": "10C4",
        "pid": "8B34",
        "description": "*bv 2010/10*",
        "known_devices": [
          "Bitron Video AV2010/10"
        ]
      }
    ],
    "zeroconf": [
      {
        "type": "_esphomelib._tcp.local.",
        "name": "tube*"
      },
      {
        "type": "_zigate-zigbee-gateway._tcp.local.",
        "name": "*zigate*"
      },
      {
        "type": "_zigstar_gw._tcp.local.",
        "name": "*zigstar*"
      },
      {
        "type": "_uzg-01._tcp.local.",
        "name": "uzg-01*"
      },
      {
        "type": "_slzb-06._tcp.local.",
        "name": "slzb-06*"
      },
      {
        "type": "_xzg._tcp.local.",
        "name": "xzg*"
      },
      {
        "type": "_czc._tcp.local.",
        "name": "czc*"
      },
      {
        "type": "_zigbee-coordinator._tcp.local.",
        "name": "*"
      }
    ],
    "is_built_in": true,
    "overwrites_built_in": false
  },
  "setup_times": {
    "null": {
      "setup": 9.991088882088661e-05
    },
    "01JEPBC8HMYFGRB8CSF1Y5RV5A": {
      "wait_import_platforms": -0.01690014498308301,
      "wait_base_component": -0.0009163238573819399,
      "config_entry_setup": 5.907047356944531
    }
  },
  "data": {
    "ieee": "**REDACTED**",
    "nwk": 6439,
    "manufacturer": "xyzroe",
    "model": "DIY_Zintercom",
    "name": "xyzroe DIY_Zintercom",
    "quirk_applied": false,
    "quirk_class": "zigpy.device.Device",
    "quirk_id": null,
    "manufacturer_code": 0,
    "power_source": "Battery or Unknown",
    "lqi": null,
    "rssi": null,
    "last_seen": "2025-01-23T02:14:53",
    "available": false,
    "device_type": "EndDevice",
    "signature": {
      "node_descriptor": {
        "logical_type": 2,
        "complex_descriptor_available": 0,
        "user_descriptor_available": 0,
        "reserved": 0,
        "aps_flags": 0,
        "frequency_band": 8,
        "mac_capability_flags": 128,
        "manufacturer_code": 0,
        "maximum_buffer_size": 80,
        "maximum_incoming_transfer_size": 160,
        "server_mask": 0,
        "maximum_outgoing_transfer_size": 160,
        "descriptor_capability_field": 0
      },
      "endpoints": {
        "1": {
          "profile_id": "0x0104",
          "device_type": "0x000c",
          "input_clusters": [
            "0x0000"
          ],
          "output_clusters": [
            "0x0006",
            "0x0101"
          ]
        }
      },
      "manufacturer": "xyzroe",
      "model": "DIY_Zintercom"
    },
    "active_coordinator": false,
    "entities": [
      {
        "entity_id": "binary_sensor.xyzroe_diy_zintercom_otkryvaetsia",
        "name": "xyzroe DIY_Zintercom"
      }
    ],
    "neighbors": [],
    "routes": [],
    "endpoint_names": [
      {
        "name": "SIMPLE_SENSOR"
      }
    ],
    "user_given_name": null,
    "device_reg_id": "f98620a0c3247a53c1b8a5164018e304",
    "area_id": "koridor",
    "cluster_details": {
      "1": {
        "device_type": {
          "name": "SIMPLE_SENSOR",
          "id": 12
        },
        "profile_id": 260,
        "in_clusters": {
          "0x0000": {
            "endpoint_attribute": "basic",
            "attributes": {
              "0x0013": {
                "attribute": "ZCLAttributeDef(id=0x0013, name='alarm_mask', type=<flag 'AlarmMask'>, zcl_type=<DataTypeId.map8: 24>, access=<ZCLAttributeAccess.Read|Write: 3>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0001": {
                "attribute": "ZCLAttributeDef(id=0x0001, name='app_version', type=<class 'zigpy.types.basic.uint8_t'>, zcl_type=<DataTypeId.uint8: 32>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0xfffd": {
                "attribute": "ZCLAttributeDef(id=0xFFFD, name='cluster_revision', type=<class 'zigpy.types.basic.uint16_t'>, zcl_type=<DataTypeId.uint16: 33>, access=<ZCLAttributeAccess.Read: 1>, mandatory=True, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0006": {
                "attribute": "ZCLAttributeDef(id=0x0006, name='date_code', type=<class 'zigpy.types.basic.LimitedCharString.<locals>.LimitedCharString'>, zcl_type=<DataTypeId.string: 66>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0012": {
                "attribute": "ZCLAttributeDef(id=0x0012, name='device_enabled', type=<enum 'Bool'>, zcl_type=<DataTypeId.bool_: 16>, access=<ZCLAttributeAccess.Read|Write: 3>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0014": {
                "attribute": "ZCLAttributeDef(id=0x0014, name='disable_local_config', type=<flag 'DisableLocalConfig'>, zcl_type=<DataTypeId.map8: 24>, access=<ZCLAttributeAccess.Read|Write: 3>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0008": {
                "attribute": "ZCLAttributeDef(id=0x0008, name='generic_device_class', type=<enum 'GenericDeviceClass'>, zcl_type=<DataTypeId.enum8: 48>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0009": {
                "attribute": "ZCLAttributeDef(id=0x0009, name='generic_device_type', type=<enum 'GenericLightingDeviceType'>, zcl_type=<DataTypeId.enum8: 48>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0003": {
                "attribute": "ZCLAttributeDef(id=0x0003, name='hw_version', type=<class 'zigpy.types.basic.uint8_t'>, zcl_type=<DataTypeId.uint8: 32>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0010": {
                "attribute": "ZCLAttributeDef(id=0x0010, name='location_desc', type=<class 'zigpy.types.basic.LimitedCharString.<locals>.LimitedCharString'>, zcl_type=<DataTypeId.string: 66>, access=<ZCLAttributeAccess.Read|Write: 3>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0004": {
                "attribute": "ZCLAttributeDef(id=0x0004, name='manufacturer', type=<class 'zigpy.types.basic.LimitedCharString.<locals>.LimitedCharString'>, zcl_type=<DataTypeId.string: 66>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": "xyzroe"
              },
              "0x000c": {
                "attribute": "ZCLAttributeDef(id=0x000C, name='manufacturer_version_details', type=<class 'zigpy.types.basic.CharacterString'>, zcl_type=<DataTypeId.string: 66>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0005": {
                "attribute": "ZCLAttributeDef(id=0x0005, name='model', type=<class 'zigpy.types.basic.LimitedCharString.<locals>.LimitedCharString'>, zcl_type=<DataTypeId.string: 66>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": "DIY_Zintercom"
              },
              "0x0011": {
                "attribute": "ZCLAttributeDef(id=0x0011, name='physical_env', type=<enum 'PhysicalEnvironment'>, zcl_type=<DataTypeId.enum8: 48>, access=<ZCLAttributeAccess.Read|Write: 3>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0007": {
                "attribute": "ZCLAttributeDef(id=0x0007, name='power_source', type=<enum 'PowerSource'>, zcl_type=<DataTypeId.enum8: 48>, access=<ZCLAttributeAccess.Read: 1>, mandatory=True, is_manufacturer_specific=False)",
                "value": null
              },
              "0x000a": {
                "attribute": "ZCLAttributeDef(id=0x000A, name='product_code', type=<class 'zigpy.types.basic.LVBytes'>, zcl_type=<DataTypeId.octstr: 65>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x000e": {
                "attribute": "ZCLAttributeDef(id=0x000E, name='product_label', type=<class 'zigpy.types.basic.CharacterString'>, zcl_type=<DataTypeId.string: 66>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x000b": {
                "attribute": "ZCLAttributeDef(id=0x000B, name='product_url', type=<class 'zigpy.types.basic.CharacterString'>, zcl_type=<DataTypeId.string: 66>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0xfffe": {
                "attribute": "ZCLAttributeDef(id=0xFFFE, name='reporting_status', type=<enum 'AttributeReportingStatus'>, zcl_type=<DataTypeId.enum8: 48>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x000d": {
                "attribute": "ZCLAttributeDef(id=0x000D, name='serial_number', type=<class 'zigpy.types.basic.CharacterString'>, zcl_type=<DataTypeId.string: 66>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0002": {
                "attribute": "ZCLAttributeDef(id=0x0002, name='stack_version', type=<class 'zigpy.types.basic.uint8_t'>, zcl_type=<DataTypeId.uint8: 32>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x4000": {
                "attribute": "ZCLAttributeDef(id=0x4000, name='sw_build_id', type=<class 'zigpy.types.basic.CharacterString'>, zcl_type=<DataTypeId.string: 66>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0000": {
                "attribute": "ZCLAttributeDef(id=0x0000, name='zcl_version', type=<class 'zigpy.types.basic.uint8_t'>, zcl_type=<DataTypeId.uint8: 32>, access=<ZCLAttributeAccess.Read: 1>, mandatory=True, is_manufacturer_specific=False)",
                "value": null
              }
            },
            "unsupported_attributes": []
          }
        },
        "out_clusters": {
          "0x0101": {
            "endpoint_attribute": "door_lock",
            "attributes": {
              "0x0002": {
                "attribute": "ZCLAttributeDef(id=0x0002, name='actuator_enabled', type=<enum 'Bool'>, zcl_type=<DataTypeId.bool_: 16>, access=<ZCLAttributeAccess.Read: 1>, mandatory=True, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0040": {
                "attribute": "ZCLAttributeDef(id=0x0040, name='alarm_mask', type=<flag 'AlarmMask'>, zcl_type=<DataTypeId.map16: 25>, access=<ZCLAttributeAccess.Read|Write|Report: 11>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0023": {
                "attribute": "ZCLAttributeDef(id=0x0023, name='auto_relock_time', type=<class 'zigpy.types.basic.uint32_t'>, zcl_type=<DataTypeId.uint32: 35>, access=<ZCLAttributeAccess.Read|Write_Optional|Report: 13>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0027": {
                "attribute": "ZCLAttributeDef(id=0x0027, name='default_configuration_register', type=<flag 'DefaultConfigurationRegister'>, zcl_type=<DataTypeId.map16: 25>, access=<ZCLAttributeAccess.Read|Report: 9>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0005": {
                "attribute": "ZCLAttributeDef(id=0x0005, name='door_closed_events', type=<class 'zigpy.types.basic.uint32_t'>, zcl_type=<DataTypeId.uint32: 35>, access=<ZCLAttributeAccess.Read|Write: 3>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0004": {
                "attribute": "ZCLAttributeDef(id=0x0004, name='door_open_events', type=<class 'zigpy.types.basic.uint32_t'>, zcl_type=<DataTypeId.uint32: 35>, access=<ZCLAttributeAccess.Read|Write: 3>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0003": {
                "attribute": "ZCLAttributeDef(id=0x0003, name='door_state', type=<enum 'DoorState'>, zcl_type=<DataTypeId.enum8: 48>, access=<ZCLAttributeAccess.Read|Report: 9>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x002a": {
                "attribute": "ZCLAttributeDef(id=0x002A, name='enable_inside_status_led', type=<enum 'Bool'>, zcl_type=<DataTypeId.bool_: 16>, access=<ZCLAttributeAccess.Read|Write|Report: 11>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0028": {
                "attribute": "ZCLAttributeDef(id=0x0028, name='enable_local_programming', type=<enum 'Bool'>, zcl_type=<DataTypeId.bool_: 16>, access=<ZCLAttributeAccess.Read|Write_Optional|Report: 13>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0020": {
                "attribute": "ZCLAttributeDef(id=0x0020, name='enable_logging', type=<enum 'Bool'>, zcl_type=<DataTypeId.bool_: 16>, access=<ZCLAttributeAccess.Read|Write_Optional|Report: 13>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0029": {
                "attribute": "ZCLAttributeDef(id=0x0029, name='enable_one_touch_locking', type=<enum 'Bool'>, zcl_type=<DataTypeId.bool_: 16>, access=<ZCLAttributeAccess.Read|Write|Report: 11>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x002b": {
                "attribute": "ZCLAttributeDef(id=0x002B, name='enable_privacy_mode_button', type=<enum 'Bool'>, zcl_type=<DataTypeId.bool_: 16>, access=<ZCLAttributeAccess.Read|Write|Report: 11>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0041": {
                "attribute": "ZCLAttributeDef(id=0x0041, name='keypad_operation_event_mask', type=<flag 'KeypadOperationEventMask'>, zcl_type=<DataTypeId.map16: 25>, access=<ZCLAttributeAccess.Read|Write|Report: 11>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0045": {
                "attribute": "ZCLAttributeDef(id=0x0045, name='keypad_programming_event_mask', type=<flag 'KeypadProgrammingEventMask'>, zcl_type=<DataTypeId.map16: 25>, access=<ZCLAttributeAccess.Read|Write|Report: 11>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0021": {
                "attribute": "ZCLAttributeDef(id=0x0021, name='language', type=<class 'zigpy.types.basic.LimitedCharString.<locals>.LimitedCharString'>, zcl_type=<DataTypeId.string: 66>, access=<ZCLAttributeAccess.Read|Write_Optional|Report: 13>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0022": {
                "attribute": "ZCLAttributeDef(id=0x0022, name='led_settings', type=<class 'zigpy.types.basic.uint8_t'>, zcl_type=<DataTypeId.uint8: 32>, access=<ZCLAttributeAccess.Read|Write_Optional|Report: 13>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0000": {
                "attribute": "ZCLAttributeDef(id=0x0000, name='lock_state', type=<enum 'LockState'>, zcl_type=<DataTypeId.enum8: 48>, access=<ZCLAttributeAccess.Read|Report: 9>, mandatory=True, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0001": {
                "attribute": "ZCLAttributeDef(id=0x0001, name='lock_type', type=<enum 'LockType'>, zcl_type=<DataTypeId.enum8: 48>, access=<ZCLAttributeAccess.Read: 1>, mandatory=True, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0043": {
                "attribute": "ZCLAttributeDef(id=0x0043, name='manual_operation_event_mask', type=<flag 'ManualOperatitonEventMask'>, zcl_type=<DataTypeId.map16: 25>, access=<ZCLAttributeAccess.Read|Write|Report: 11>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0017": {
                "attribute": "ZCLAttributeDef(id=0x0017, name='max_pin_len', type=<class 'zigpy.types.basic.uint8_t'>, zcl_type=<DataTypeId.uint8: 32>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0019": {
                "attribute": "ZCLAttributeDef(id=0x0019, name='max_rfid_len', type=<class 'zigpy.types.basic.uint8_t'>, zcl_type=<DataTypeId.uint8: 32>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0018": {
                "attribute": "ZCLAttributeDef(id=0x0018, name='min_pin_len', type=<class 'zigpy.types.basic.uint8_t'>, zcl_type=<DataTypeId.uint8: 32>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x001a": {
                "attribute": "ZCLAttributeDef(id=0x001A, name='min_rfid_len', type=<class 'zigpy.types.basic.uint8_t'>, zcl_type=<DataTypeId.uint8: 32>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0016": {
                "attribute": "ZCLAttributeDef(id=0x0016, name='num_of_holiday_scheduleds_supported', type=<class 'zigpy.types.basic.uint8_t'>, zcl_type=<DataTypeId.uint8: 32>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0010": {
                "attribute": "ZCLAttributeDef(id=0x0010, name='num_of_lock_records_supported', type=<class 'zigpy.types.basic.uint16_t'>, zcl_type=<DataTypeId.uint16: 33>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0012": {
                "attribute": "ZCLAttributeDef(id=0x0012, name='num_of_pin_users_supported', type=<class 'zigpy.types.basic.uint16_t'>, zcl_type=<DataTypeId.uint16: 33>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0013": {
                "attribute": "ZCLAttributeDef(id=0x0013, name='num_of_rfid_users_supported', type=<class 'zigpy.types.basic.uint16_t'>, zcl_type=<DataTypeId.uint16: 33>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0011": {
                "attribute": "ZCLAttributeDef(id=0x0011, name='num_of_total_users_supported', type=<class 'zigpy.types.basic.uint16_t'>, zcl_type=<DataTypeId.uint16: 33>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0014": {
                "attribute": "ZCLAttributeDef(id=0x0014, name='num_of_week_day_schedules_supported_per_user', type=<class 'zigpy.types.basic.uint8_t'>, zcl_type=<DataTypeId.uint8: 32>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0015": {
                "attribute": "ZCLAttributeDef(id=0x0015, name='num_of_year_day_schedules_supported_per_user', type=<class 'zigpy.types.basic.uint8_t'>, zcl_type=<DataTypeId.uint8: 32>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0006": {
                "attribute": "ZCLAttributeDef(id=0x0006, name='open_period', type=<class 'zigpy.types.basic.uint16_t'>, zcl_type=<DataTypeId.uint16: 33>, access=<ZCLAttributeAccess.Read|Write: 3>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0025": {
                "attribute": "ZCLAttributeDef(id=0x0025, name='operating_mode', type=<enum 'OperatingMode'>, zcl_type=<DataTypeId.enum8: 48>, access=<ZCLAttributeAccess.Read|Write_Optional|Report: 13>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0033": {
                "attribute": "ZCLAttributeDef(id=0x0033, name='require_pin_for_rf_operation', type=<enum 'Bool'>, zcl_type=<DataTypeId.bool_: 16>, access=<ZCLAttributeAccess.Read|Write_Optional|Report: 13>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0042": {
                "attribute": "ZCLAttributeDef(id=0x0042, name='rf_operation_event_mask', type=<flag 'RFOperationEventMask'>, zcl_type=<DataTypeId.map16: 25>, access=<ZCLAttributeAccess.Read|Write|Report: 11>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0046": {
                "attribute": "ZCLAttributeDef(id=0x0046, name='rf_programming_event_mask', type=<flag 'RFProgrammingEventMask'>, zcl_type=<DataTypeId.map16: 25>, access=<ZCLAttributeAccess.Read|Write|Report: 11>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0044": {
                "attribute": "ZCLAttributeDef(id=0x0044, name='rfid_operation_event_mask', type=<flag 'RFIDOperationEventMask'>, zcl_type=<DataTypeId.map16: 25>, access=<ZCLAttributeAccess.Read|Write|Report: 11>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0047": {
                "attribute": "ZCLAttributeDef(id=0x0047, name='rfid_programming_event_mask', type=<flag 'RFIDProgrammingEventMask'>, zcl_type=<DataTypeId.map16: 25>, access=<ZCLAttributeAccess.Read|Write|Report: 11>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0032": {
                "attribute": "ZCLAttributeDef(id=0x0032, name='send_pin_ota', type=<enum 'Bool'>, zcl_type=<DataTypeId.bool_: 16>, access=<ZCLAttributeAccess.Read|Write_Optional|Report: 13>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0024": {
                "attribute": "ZCLAttributeDef(id=0x0024, name='sound_volume', type=<class 'zigpy.types.basic.uint8_t'>, zcl_type=<DataTypeId.uint8: 32>, access=<ZCLAttributeAccess.Read|Write_Optional|Report: 13>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0026": {
                "attribute": "ZCLAttributeDef(id=0x0026, name='supported_operating_modes', type=<flag 'SupportedOperatingModes'>, zcl_type=<DataTypeId.map16: 25>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0031": {
                "attribute": "ZCLAttributeDef(id=0x0031, name='user_code_temporary_disable_time', type=<class 'zigpy.types.basic.uint8_t'>, zcl_type=<DataTypeId.uint8: 32>, access=<ZCLAttributeAccess.Read|Write_Optional|Report: 13>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0030": {
                "attribute": "ZCLAttributeDef(id=0x0030, name='wrong_code_entry_limit', type=<class 'zigpy.types.basic.uint8_t'>, zcl_type=<DataTypeId.uint8: 32>, access=<ZCLAttributeAccess.Read|Write_Optional|Report: 13>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0034": {
                "attribute": "ZCLAttributeDef(id=0x0034, name='zigbee_security_level', type=<enum 'ZigbeeSecurityLevel'>, zcl_type=<DataTypeId.enum8: 48>, access=<ZCLAttributeAccess.Read|Report: 9>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              }
            },
            "unsupported_attributes": []
          },
          "0x0006": {
            "endpoint_attribute": "on_off",
            "attributes": {
              "0xfffd": {
                "attribute": "ZCLAttributeDef(id=0xFFFD, name='cluster_revision', type=<class 'zigpy.types.basic.uint16_t'>, zcl_type=<DataTypeId.uint16: 33>, access=<ZCLAttributeAccess.Read: 1>, mandatory=True, is_manufacturer_specific=False)",
                "value": null
              },
              "0x4000": {
                "attribute": "ZCLAttributeDef(id=0x4000, name='global_scene_control', type=<enum 'Bool'>, zcl_type=<DataTypeId.bool_: 16>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x4002": {
                "attribute": "ZCLAttributeDef(id=0x4002, name='off_wait_time', type=<class 'zigpy.types.basic.uint16_t'>, zcl_type=<DataTypeId.uint16: 33>, access=<ZCLAttributeAccess.Read|Write: 3>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x0000": {
                "attribute": "ZCLAttributeDef(id=0x0000, name='on_off', type=<enum 'Bool'>, zcl_type=<DataTypeId.bool_: 16>, access=<ZCLAttributeAccess.Read|Report|Scene: 25>, mandatory=True, is_manufacturer_specific=False)",
                "value": 0
              },
              "0x4001": {
                "attribute": "ZCLAttributeDef(id=0x4001, name='on_time', type=<class 'zigpy.types.basic.uint16_t'>, zcl_type=<DataTypeId.uint16: 33>, access=<ZCLAttributeAccess.Read|Write: 3>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0xfffe": {
                "attribute": "ZCLAttributeDef(id=0xFFFE, name='reporting_status', type=<enum 'AttributeReportingStatus'>, zcl_type=<DataTypeId.enum8: 48>, access=<ZCLAttributeAccess.Read: 1>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              },
              "0x4003": {
                "attribute": "ZCLAttributeDef(id=0x4003, name='start_up_on_off', type=<enum 'StartUpOnOff'>, zcl_type=<DataTypeId.enum8: 48>, access=<ZCLAttributeAccess.Read|Write: 3>, mandatory=False, is_manufacturer_specific=False)",
                "value": null
              }
            },
            "unsupported_attributes": [
              0,
              16387,
              "on_off",
              "start_up_on_off"
            ]
          }
        }
      }
    }
  }
}

Logs

Logs
...
2025-01-23 01:53:58.630 DEBUG (SyncWorker_6) [zhaquirks] Loading custom quirks from PosixPath('custom_zha_quirks')
2025-01-23 01:53:58.632 DEBUG (SyncWorker_6) [zhaquirks] Loading custom quirk module 'diyruz_zintercom'
2025-01-23 01:53:58.640 WARNING (SyncWorker_6) [zhaquirks] Loaded custom quirks. Please contribute them to https://github.com/zigpy/zha-device-handlers
...
2025-01-23 01:53:58.669 DEBUG (MainThread) [zigpy.appdb] Current database version is v13 (table version v13)
2025-01-23 01:53:58.675 DEBUG (MainThread) [zigpy.appdb] Loading application state
2025-01-23 01:53:58.769 DEBUG (MainThread) [zigpy.appdb] [0x1927:1:0x0000] Attribute id: 4 value: xyzroe
2025-01-23 01:53:58.769 DEBUG (MainThread) [zigpy.appdb] [0x1927:1:0x0000] Attribute id: 5 value: DIY_Zintercom
...
2025-01-23 01:53:58.780 DEBUG (MainThread) [zigpy.quirks.registry] Checking quirks for xyzroe DIY_Zintercom (00:12:4b:00:2f:c2:f1:f8)
2025-01-23 01:53:58.780 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'diyruz_zintercom.DIYZintercom'>
2025-01-23 01:53:58.780 DEBUG (MainThread) [zigpy.quirks] Fail because device_type mismatch on at least one endpoint
2025-01-23 01:53:58.780 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.xbee.xbee_io.XBeeSensor'>
2025-01-23 01:53:58.780 DEBUG (MainThread) [zigpy.quirks] Fail because endpoint list mismatch: {232, 230} {1}
2025-01-23 01:53:58.780 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.xbee.xbee3_io.XBee3Sensor'>
2025-01-23 01:53:58.780 DEBUG (MainThread) [zigpy.quirks] Fail because endpoint list mismatch: {232, 230} {1}
2025-01-23 01:53:58.780 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.tuya.ts0201.MoesTemperatureHumidtySensorWithScreen'>
2025-01-23 01:53:58.780 DEBUG (MainThread) [zigpy.quirks] Fail because device_type mismatch on at least one endpoint
2025-01-23 01:53:58.780 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.smartthings.tag_v4.SmartThingsTagV4'>
2025-01-23 01:53:58.780 DEBUG (MainThread) [zigpy.quirks] Fail because input cluster mismatch on at least one endpoint
2025-01-23 01:53:58.780 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.smartthings.multi.SmartthingsMultiPurposeSensor'>
2025-01-23 01:53:58.780 DEBUG (MainThread) [zigpy.quirks] Fail because device_type mismatch on at least one endpoint
2025-01-23 01:53:58.780 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.netvox.z308e3ed.Z308E3ED'>
2025-01-23 01:53:58.780 DEBUG (MainThread) [zigpy.quirks] Fail because device_type mismatch on at least one endpoint
2025-01-23 01:53:58.781 DEBUG (MainThread) [zigpy.quirks.registry] Considering <class 'zhaquirks.gledopto.soposhgu10.SoposhGU10'>
2025-01-23 01:53:58.781 DEBUG (MainThread) [zigpy.quirks] Fail because endpoint list mismatch: {11, 13} {1}
...
2025-01-23 01:57:05.182 DEBUG (MainThread) [zha] Emitting event device_fully_initialized with data DeviceFullInitEvent(device_info=ExtendedDeviceInfoWithPairingStatus(ieee=00:12:4b:00:2f:c2:f1:f8, nwk=0x1927, manufacturer='xyzroe', model='DIY_Zintercom', name='xyzroe DIY_Zintercom', quirk_applied=False, quirk_class='zigpy.device.Device', quirk_id=None, manufacturer_code=0, power_source='Battery or Unknown', lqi=168, rssi=-58, last_seen='2025-01-23T01:57:04', available=True, device_type='EndDevice', signature={'node_descriptor': NodeDescriptor(logical_type=<LogicalType.EndDevice: 2>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress: 128>, manufacturer_code=0, maximum_buffer_size=80, maximum_incoming_transfer_size=160, server_mask=0, maximum_outgoing_transfer_size=160, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False), 'endpoints': {1: {'profile_id': '0x0104', 'device_type': '0x000c', 'input_clusters': ['0x0000'], 'output_clusters': ['0x0006', '0x0101']}}, 'manufacturer': 'xyzroe', 'model': 'DIY_Zintercom'}, active_coordinator=False, entities={}, neighbors=[], routes=[], endpoint_names=[EndpointNameInfo(name='SIMPLE_SENSOR')], pairing_status=<DevicePairingStatus.CONFIGURED: 3>), new_join=True, event_type='zha_gateway_message', event='device_fully_initialized') (1 listeners)
2025-01-23 01:57:05.184 DEBUG (MainThread) [zha] (ZHAGatewayProxy) handling event protocol for event: DeviceFullInitEvent(device_info=ExtendedDeviceInfoWithPairingStatus(ieee=00:12:4b:00:2f:c2:f1:f8, nwk=0x1927, manufacturer='xyzroe', model='DIY_Zintercom', name='xyzroe DIY_Zintercom', quirk_applied=False, quirk_class='zigpy.device.Device', quirk_id=None, manufacturer_code=0, power_source='Battery or Unknown', lqi=168, rssi=-58, last_seen='2025-01-23T01:57:04', available=True, device_type='EndDevice', signature={'node_descriptor': NodeDescriptor(logical_type=<LogicalType.EndDevice: 2>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress: 128>, manufacturer_code=0, maximum_buffer_size=80, maximum_incoming_transfer_size=160, server_mask=0, maximum_outgoing_transfer_size=160, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False), 'endpoints': {1: {'profile_id': '0x0104', 'device_type': '0x000c', 'input_clusters': ['0x0000'], 'output_clusters': ['0x0006', '0x0101']}}, 'manufacturer': 'xyzroe', 'model': 'DIY_Zintercom'}, active_coordinator=False, entities={}, neighbors=[], routes=[], endpoint_names=[EndpointNameInfo(name='SIMPLE_SENSOR')], pairing_status=<DevicePairingStatus.CONFIGURED: 3>), new_join=True, event_type='zha_gateway_message', event='device_fully_initialized')
2025-01-23 01:57:05.186 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event device_registry_updated[L]: action=create, device_id=f98620a0c3247a53c1b8a5164018e304>
2025-01-23 01:57:05.189 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event device_registry_updated[L]: action=update, device_id=f98620a0c3247a53c1b8a5164018e304, changes=via_device_id=None>
2025-01-23 01:57:05.190 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new binary_sensor.zha entity: binary_sensor.xyzroe_diy_zintercom_otkryvaetsia
2025-01-23 01:57:05.191 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event entity_registry_updated[L]: action=create, entity_id=binary_sensor.xyzroe_diy_zintercom_otkryvaetsia>
2025-01-23 01:57:05.192 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: entity_id=binary_sensor.xyzroe_diy_zintercom_otkryvaetsia, old_state=None, new_state=<state binary_sensor.xyzroe_diy_zintercom_otkryvaetsia=off; device_class=opening, friendly_name=xyzroe DIY_Zintercom Открывается @ 2025-01-23T01:57:05.192344+03:00>>
2025-01-23 01:57:05.193 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event entity_registry_updated[L]: action=update, entity_id=binary_sensor.xyzroe_diy_zintercom_otkryvaetsia, changes=options=>
2025-01-23 01:57:05.193 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event state_reported[L]: entity_id=binary_sensor.xyzroe_diy_zintercom_otkryvaetsia, old_last_reported=2025-01-23T01:57:05.192344+03:00, new_state=<state binary_sensor.xyzroe_diy_zintercom_otkryvaetsia=off; device_class=opening, friendly_name=xyzroe DIY_Zintercom Открывается @ 2025-01-23T01:57:05.192344+03:00>>
2025-01-23 01:57:05.198 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.zha entity: sensor.xyzroe_diy_zintercom_rssi
2025-01-23 01:57:05.198 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event entity_registry_updated[L]: action=create, entity_id=sensor.xyzroe_diy_zintercom_rssi>
2025-01-23 01:57:05.200 INFO (MainThread) [homeassistant.helpers.entity_registry] Registered new sensor.zha entity: sensor.xyzroe_diy_zintercom_lqi
2025-01-23 01:57:05.200 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event entity_registry_updated[L]: action=create, entity_id=sensor.xyzroe_diy_zintercom_lqi>
2025-01-23 01:57:05.200 DEBUG (MainThread) [zha.application.helpers] listener not registered with global updater - nothing to remove: <bound method RSSISensor.update of <zha.application.platforms.sensor.RSSISensor object at 0x7f0d7eaa6470>>
2025-01-23 01:57:05.201 DEBUG (MainThread) [zha.application.helpers] listener not registered with global updater - nothing to remove: <bound method RSSISensor.update of <zha.application.platforms.sensor.LQISensor object at 0x7f0d7eaa7bd0>>
2025-01-23 01:57:05.202 DEBUG (MainThread) [zha] Emitting event device_fully_initialized with data DeviceFullInitEvent(device_info=ExtendedDeviceInfoWithPairingStatus(ieee=00:12:4b:00:2f:c2:f1:f8, nwk=0x1927, manufacturer='xyzroe', model='DIY_Zintercom', name='xyzroe DIY_Zintercom', quirk_applied=False, quirk_class='zigpy.device.Device', quirk_id=None, manufacturer_code=0, power_source='Battery or Unknown', lqi=164, rssi=-59, last_seen='2025-01-23T01:57:05', available=True, device_type='EndDevice', signature={'node_descriptor': NodeDescriptor(logical_type=<LogicalType.EndDevice: 2>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress: 128>, manufacturer_code=0, maximum_buffer_size=80, maximum_incoming_transfer_size=160, server_mask=0, maximum_outgoing_transfer_size=160, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False), 'endpoints': {1: {'profile_id': '0x0104', 'device_type': '0x000c', 'input_clusters': ['0x0000'], 'output_clusters': ['0x0006', '0x0101']}}, 'manufacturer': 'xyzroe', 'model': 'DIY_Zintercom'}, active_coordinator=False, entities={'00:12:4b:00:2f:c2:f1:f8-1-6': BinarySensorEntityInfo(fallback_name=None, unique_id='00:12:4b:00:2f:c2:f1:f8-1-6', platform=<Platform.BINARY_SENSOR: 'binary_sensor'>, class_name='Opening', translation_key=None, device_class=<BinarySensorDeviceClass.OPENING: 'opening'>, state_class=None, entity_category=None, entity_registry_enabled_default=True, enabled=True, cluster_handlers=[ClusterHandlerInfo(class_name='OnOffClusterHandler', generic_id='cluster_handler_0x0006', endpoint_id=1, cluster=ClusterInfo(id=6, name='On/Off', type='client', commands=[ZCLCommandDef(id=0x00, name='off', direction=<Direction.Client_to_Server: 0>, schema=<class 'zigpy.zcl.foundation.off'>, is_manufacturer_specific=None), ZCLCommandDef(id=0x40, name='off_with_effect', direction=<Direction.Client_to_Server: 0>, schema=<class 'zigpy.zcl.foundation.off_with_effect'>, is_manufacturer_specific=None), ZCLCommandDef(id=0x01, name='on', direction=<Direction.Client_to_Server: 0>, schema=<class 'zigpy.zcl.foundation.on'>, is_manufacturer_specific=None), ZCLCommandDef(id=0x41, name='on_with_recall_global_scene', direction=<Direction.Client_to_Server: 0>, schema=<class 'zigpy.zcl.foundation.on_with_recall_global_scene'>, is_manufacturer_specific=None), ZCLCommandDef(id=0x42, name='on_with_timed_off', direction=<Direction.Client_to_Server: 0>, schema=<class 'zigpy.zcl.foundation.on_with_timed_off'>, is_manufacturer_specific=None), ZCLCommandDef(id=0x02, name='toggle', direction=<Direction.Client_to_Server: 0>, schema=<class 'zigpy.zcl.foundation.toggle'>, is_manufacturer_specific=None)]), id='1:0x0006', unique_id='00:12:4b:00:2f:c2:f1:f8:1:0x0006', status='INITIALIZED', value_attribute='on_off')], device_ieee=00:12:4b:00:2f:c2:f1:f8, endpoint_id=1, available=True, group_id=None, attribute_name='on_off'), '00:12:4b:00:2f:c2:f1:f8-1-0-rssi': SensorEntityInfo(fallback_name=None, unique_id='00:12:4b:00:2f:c2:f1:f8-1-0-rssi', platform=<Platform.SENSOR: 'sensor'>, class_name='RSSISensor', translation_key='rssi', device_class=<SensorDeviceClass.SIGNAL_STRENGTH: 'signal_strength'>, state_class=<SensorStateClass.MEASUREMENT: 'measurement'>, entity_category=<EntityCategory.DIAGNOSTIC: 'diagnostic'>, entity_registry_enabled_default=False, enabled=True, cluster_handlers=[ClusterHandlerInfo(class_name='BasicClusterHandler', generic_id='cluster_handler_0x0000', endpoint_id=1, cluster=ClusterInfo(id=0, name='Basic', type='server', commands=[ZCLCommandDef(id=0x00, name='reset_fact_default', direction=<Direction.Client_to_Server: 0>, schema=<class 'zigpy.zcl.foundation.reset_fact_default'>, is_manufacturer_specific=None)]), id='1:0x0000', unique_id='00:12:4b:00:2f:c2:f1:f8:1:0x0000', status='INITIALIZED', value_attribute=None)], device_ieee=00:12:4b:00:2f:c2:f1:f8, endpoint_id=1, available=True, group_id=None, attribute=None, decimals=1, divisor=1, multiplier=1, unit='dBm'), '00:12:4b:00:2f:c2:f1:f8-1-0-lqi': SensorEntityInfo(fallback_name=None, unique_id='00:12:4b:00:2f:c2:f1:f8-1-0-lqi', platform=<Platform.SENSOR: 'sensor'>, class_name='LQISensor', translation_key='lqi', device_class=None, state_class=<SensorStateClass.MEASUREMENT: 'measurement'>, entity_category=<EntityCategory.DIAGNOSTIC: 'diagnostic'>, entity_registry_enabled_default=False, enabled=True, cluster_handlers=[ClusterHandlerInfo(class_name='BasicClusterHandler', generic_id='cluster_handler_0x0000', endpoint_id=1, cluster=ClusterInfo(id=0, name='Basic', type='server', commands=[ZCLCommandDef(id=0x00, name='reset_fact_default', direction=<Direction.Client_to_Server: 0>, schema=<class 'zigpy.zcl.foundation.reset_fact_default'>, is_manufacturer_specific=None)]), id='1:0x0000', unique_id='00:12:4b:00:2f:c2:f1:f8:1:0x0000', status='INITIALIZED', value_attribute=None)], device_ieee=00:12:4b:00:2f:c2:f1:f8, endpoint_id=1, available=True, group_id=None, attribute=None, decimals=1, divisor=1, multiplier=1, unit=None)}, neighbors=[], routes=[], endpoint_names=[EndpointNameInfo(name='SIMPLE_SENSOR')], pairing_status=<DevicePairingStatus.INITIALIZED: 4>), new_join=False, event_type='zha_gateway_message', event='device_fully_initialized') (1 listeners)  
2025-01-23 01:57:05.205 DEBUG (MainThread) [zha] (ZHAGatewayProxy) handling event protocol for event: DeviceFullInitEvent(device_info=ExtendedDeviceInfoWithPairingStatus(ieee=00:12:4b:00:2f:c2:f1:f8, nwk=0x1927, manufacturer='xyzroe', model='DIY_Zintercom', name='xyzroe DIY_Zintercom', quirk_applied=False, quirk_class='zigpy.device.Device', quirk_id=None, manufacturer_code=0, power_source='Battery or Unknown', lqi=164, rssi=-59, last_seen='2025-01-23T01:57:05', available=True, device_type='EndDevice', signature={'node_descriptor': NodeDescriptor(logical_type=<LogicalType.EndDevice: 2>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress: 128>, manufacturer_code=0, maximum_buffer_size=80, maximum_incoming_transfer_size=160, server_mask=0, maximum_outgoing_transfer_size=160, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=True, *is_full_function_device=False, *is_mains_powered=False, *is_receiver_on_when_idle=False, *is_router=False, *is_security_capable=False), 'endpoints': {1: {'profile_id': '0x0104', 'device_type': '0x000c', 'input_clusters': ['0x0000'], 'output_clusters': ['0x0006', '0x0101']}}, 'manufacturer': 'xyzroe', 'model': 'DIY_Zintercom'}, active_coordinator=False, entities={'00:12:4b:00:2f:c2:f1:f8-1-6': BinarySensorEntityInfo(fallback_name=None, unique_id='00:12:4b:00:2f:c2:f1:f8-1-6', platform=<Platform.BINARY_SENSOR: 'binary_sensor'>, class_name='Opening', translation_key=None, device_class=<BinarySensorDeviceClass.OPENING: 'opening'>, state_class=None, entity_category=None, entity_registry_enabled_default=True, enabled=True, cluster_handlers=[ClusterHandlerInfo(class_name='OnOffClusterHandler', generic_id='cluster_handler_0x0006', endpoint_id=1, cluster=ClusterInfo(id=6, name='On/Off', type='client', commands=[ZCLCommandDef(id=0x00, name='off', direction=<Direction.Client_to_Server: 0>, schema=<class 'zigpy.zcl.foundation.off'>, is_manufacturer_specific=None), ZCLCommandDef(id=0x40, name='off_with_effect', direction=<Direction.Client_to_Server: 0>, schema=<class 'zigpy.zcl.foundation.off_with_effect'>, is_manufacturer_specific=None), ZCLCommandDef(id=0x01, name='on', direction=<Direction.Client_to_Server: 0>, schema=<class 'zigpy.zcl.foundation.on'>, is_manufacturer_specific=None), ZCLCommandDef(id=0x41, name='on_with_recall_global_scene', direction=<Direction.Client_to_Server: 0>, schema=<class 'zigpy.zcl.foundation.on_with_recall_global_scene'>, is_manufacturer_specific=None), ZCLCommandDef(id=0x42, name='on_with_timed_off', direction=<Direction.Client_to_Server: 0>, schema=<class 'zigpy.zcl.foundation.on_with_timed_off'>, is_manufacturer_specific=None), ZCLCommandDef(id=0x02, name='toggle', direction=<Direction.Client_to_Server: 0>, schema=<class 'zigpy.zcl.foundation.toggle'>, is_manufacturer_specific=None)]), id='1:0x0006', unique_id='00:12:4b:00:2f:c2:f1:f8:1:0x0006', status='INITIALIZED', value_attribute='on_off')], device_ieee=00:12:4b:00:2f:c2:f1:f8, endpoint_id=1, available=True, group_id=None, attribute_name='on_off'), '00:12:4b:00:2f:c2:f1:f8-1-0-rssi': SensorEntityInfo(fallback_name=None, unique_id='00:12:4b:00:2f:c2:f1:f8-1-0-rssi', platform=<Platform.SENSOR: 'sensor'>, class_name='RSSISensor', translation_key='rssi', device_class=<SensorDeviceClass.SIGNAL_STRENGTH: 'signal_strength'>, state_class=<SensorStateClass.MEASUREMENT: 'measurement'>, entity_category=<EntityCategory.DIAGNOSTIC: 'diagnostic'>, entity_registry_enabled_default=False, enabled=True, cluster_handlers=[ClusterHandlerInfo(class_name='BasicClusterHandler', generic_id='cluster_handler_0x0000', endpoint_id=1, cluster=ClusterInfo(id=0, name='Basic', type='server', commands=[ZCLCommandDef(id=0x00, name='reset_fact_default', direction=<Direction.Client_to_Server: 0>, schema=<class 'zigpy.zcl.foundation.reset_fact_default'>, is_manufacturer_specific=None)]), id='1:0x0000', unique_id='00:12:4b:00:2f:c2:f1:f8:1:0x0000', status='INITIALIZED', value_attribute=None)], device_ieee=00:12:4b:00:2f:c2:f1:f8, endpoint_id=1, available=True, group_id=None, attribute=None, decimals=1, divisor=1, multiplier=1, unit='dBm'), '00:12:4b:00:2f:c2:f1:f8-1-0-lqi': SensorEntityInfo(fallback_name=None, unique_id='00:12:4b:00:2f:c2:f1:f8-1-0-lqi', platform=<Platform.SENSOR: 'sensor'>, class_name='LQISensor', translation_key='lqi', device_class=None, state_class=<SensorStateClass.MEASUREMENT: 'measurement'>, entity_category=<EntityCategory.DIAGNOSTIC: 'diagnostic'>, entity_registry_enabled_default=False, enabled=True, cluster_handlers=[ClusterHandlerInfo(class_name='BasicClusterHandler', generic_id='cluster_handler_0x0000', endpoint_id=1, cluster=ClusterInfo(id=0, name='Basic', type='server', commands=[ZCLCommandDef(id=0x00, name='reset_fact_default', direction=<Direction.Client_to_Server: 0>, schema=<class 'zigpy.zcl.foundation.reset_fact_default'>, is_manufacturer_specific=None)]), id='1:0x0000', unique_id='00:12:4b:00:2f:c2:f1:f8:1:0x0000', status='INITIALIZED', value_attribute=None)], device_ieee=00:12:4b:00:2f:c2:f1:f8, endpoint_id=1, available=True, group_id=None, attribute=None, decimals=1, divisor=1, multiplier=1, unit=None)}, neighbors=[], routes=[], endpoint_names=[EndpointNameInfo(name='SIMPLE_SENSOR')], pairing_status=<DevicePairingStatus.INITIALIZED: 4>), new_join=False, event_type='zha_gateway_message', event='device_fully_initialized')

Custom quirk

Custom quirk
from zigpy.profiles import zha
from zigpy.quirks import CustomDevice
from zigpy.zcl.clusters.general import PowerConfiguration, Basic
from zigpy.zcl.clusters.closures import DoorLock
from zhaquirks import CustomCluster
import zigpy.types as t


class CustomDoorLockCluster(CustomCluster, DoorLock):
    """Custom Door Lock Cluster with extended attributes."""

    cluster_id = DoorLock.cluster_id
    attributes = DoorLock.attributes.copy()
    attributes.update({
        0x0050: ("state", t.enum8),  # Current state (Idle, Ring, Talk, Open, Drop)
        0x0051: ("mode", t.enum8),  # Open mode (Never, Once, Always, Drop)
        0x0052: ("sound", t.Bool),  # Sound on/off
        0x0053: ("time_ring", t.uint16_t),  # Time to ring before answer (0-600 sec)
        0x0054: ("time_talk", t.uint16_t),  # Time to hold before open (0-600 sec)
        0x0055: ("time_open", t.uint16_t),  # Time to open before end (0-600 sec)
        0x0057: ("time_bell", t.uint16_t),  # Time after last bell to finish ring (0-600 sec)
        0x0056: ("time_report", t.uint16_t),  # Reporting interval (0-1440 min)
    })

    async def write_attributes(self, attributes, *args, **kwargs):
        """Write attributes to the cluster."""
        return await super().write_attributes(attributes, *args, **kwargs)

    async def read_attributes(self, attributes, *args, **kwargs):
        """Read attributes from the cluster."""
        return await super().read_attributes(attributes, *args, **kwargs)


class DIYZintercom(CustomDevice):
    """Custom device handler for DIY Zintercom."""

    signature = {
        "models_info": [("DIYRuZ", "DIY_Zintercom")], // also try [("xyzroe", "DIY_Zintercom")]
        "endpoints": {
            1: {
                "profile_id": zha.PROFILE_ID,
                "device_type": zha.DeviceType.DOOR_LOCK,
                "input_clusters": [
                    Basic.cluster_id,
                    PowerConfiguration.cluster_id,
                    DoorLock.cluster_id,
                ],
                "output_clusters": [
                    Basic.cluster_id,
                    PowerConfiguration.cluster_id,
                ],
            },
        },
    }

    replacement = {
        "endpoints": {
            1: {
                "profile_id": zha.PROFILE_ID,
                "device_type": zha.DeviceType.DOOR_LOCK,
                "input_clusters": [
                    Basic,
                    PowerConfiguration,
                    CustomDoorLockCluster,
                ],
                "output_clusters": [
                    Basic,
                    PowerConfiguration,
                ],
            },
        },
    }

    REPORT_CONFIG_DEFAULT = (
        0,  # Minimum interval (in seconds)
        300,  # Maximum interval (in seconds)
        1,  # Change in which the report will be sent
    )

    REPORT_CONFIG = [
        {
            "cluster": PowerConfiguration.cluster_id,
            "attributes": [
                {"attr": "battery_percentage_remaining", "config": REPORT_CONFIG_DEFAULT},
                {"attr": "battery_voltage", "config": REPORT_CONFIG_DEFAULT},
            ],
        },
        {
            "cluster": DoorLock.cluster_id,
            "attributes": [
                {"attr": 0x0050, "config": REPORT_CONFIG_DEFAULT},  # State
                {"attr": 0x0051, "config": REPORT_CONFIG_DEFAULT},  # Mode
                {"attr": 0x0052, "config": REPORT_CONFIG_DEFAULT},  # Sound
                {"attr": 0x0053, "config": REPORT_CONFIG_DEFAULT},  # Time ring
                {"attr": 0x0054, "config": REPORT_CONFIG_DEFAULT},  # Time talk
                {"attr": 0x0055, "config": REPORT_CONFIG_DEFAULT},  # Time open
                {"attr": 0x0056, "config": REPORT_CONFIG_DEFAULT},  # Time report
                {"attr": 0x0057, "config": REPORT_CONFIG_DEFAULT},  # Time bell
            ],
        },
    ]

Additional information

No response

@dimensi
Copy link
Author

dimensi commented Jan 23, 2025

So... After looking at the Sonoff examples, at least I got my quirk up and running. The settings appear in the dashboard, but the values are not pulling up. I also don't understand how to get more value from the battery.

Quirk

"""Quirk for xyzroe DIY_Zintercom."""

from zigpy.quirks import CustomCluster
from zigpy.quirks.v2 import QuirkBuilder
from zigpy.quirks.v2.homeassistant import UnitOfTime, EntityType
import zigpy.types as t
from zigpy.zcl import ClusterType
from zigpy.zcl.foundation import BaseAttributeDefs, ZCLAttributeDef
from zigpy.zcl.clusters.general import PowerConfiguration

class ZintercomState(t.enum8):
    """Zintercom state enum."""
    Idle = 0
    Ring = 1
    Talk = 2
    Open = 3
    Drop = 4

class ZintercomMode(t.enum8):
    """Zintercom mode enum."""
    Never = 0
    Once = 1
    Always = 2
    Drop = 3

class DIYZintercomDoorLockCluster(CustomCluster):
    """Custom Zintercom cluster."""

    cluster_id = 0x0101  # DoorLock cluster ID

    class AttributeDefs(BaseAttributeDefs):
        """Attribute definitions."""

        state = ZCLAttributeDef(
            id=0x0050,
            type=ZintercomState,
        )

        mode = ZCLAttributeDef(
            id=0x0051,
            type=ZintercomMode,
        )

        sound = ZCLAttributeDef(
            id=0x0052,
            type=t.Bool,
        )

        time_ring = ZCLAttributeDef(
            id=0x0053,
            type=t.uint16_t,
        )

        time_talk = ZCLAttributeDef(
            id=0x0054,
            type=t.uint16_t,
        )

        time_open = ZCLAttributeDef(
            id=0x0055,
            type=t.uint16_t,
        )

        time_report = ZCLAttributeDef(
            id=0x0056,
            type=t.uint16_t,
        )

        time_bell = ZCLAttributeDef(
            id=0x0057,
            type=t.uint16_t,
        )

class DIYZintercomPowerConfigurationCluster(PowerConfiguration):
    """Power configuration cluster for DIY Zintercom."""
    cluster_id = PowerConfiguration.cluster_id
    
    class AttributeDefs(PowerConfiguration.AttributeDefs):
        """Attribute definitions."""
        battery_voltage = PowerConfiguration.AttributeDefs.battery_voltage
        battery_percentage_remaining = PowerConfiguration.AttributeDefs.battery_percentage_remaining

(
    QuirkBuilder("xyzroe", "DIY_Zintercom")
    .replaces(DIYZintercomDoorLockCluster)
    .replaces(
        DIYZintercomDoorLockCluster,
        cluster_type=ClusterType.Client
    )
    .replaces(DIYZintercomPowerConfigurationCluster)
    .enum(
        DIYZintercomDoorLockCluster.AttributeDefs.state.name,
        ZintercomState,
        DIYZintercomDoorLockCluster.cluster_id,
        translation_key="state",
        fallback_name="Current state",
    )
    .enum(
        DIYZintercomDoorLockCluster.AttributeDefs.mode.name,
        ZintercomMode,
        DIYZintercomDoorLockCluster.cluster_id,
        translation_key="mode",
        fallback_name="Mode",
    )
    .switch(
        DIYZintercomDoorLockCluster.AttributeDefs.sound.name,
        DIYZintercomDoorLockCluster.cluster_id,
        translation_key="sound",
        fallback_name="Sound",
    )
    .number(
        DIYZintercomDoorLockCluster.AttributeDefs.time_ring.name,
        DIYZintercomDoorLockCluster.cluster_id,
        min_value=0,
        max_value=65535,
        step=1,
        unit=UnitOfTime.SECONDS,
        multiplier=1,
        translation_key="time_ring",
        fallback_name="Time to ring",
    )
    .number(
        DIYZintercomDoorLockCluster.AttributeDefs.time_talk.name,
        DIYZintercomDoorLockCluster.cluster_id,
        min_value=0,
        max_value=65535,
        step=1,
        unit=UnitOfTime.SECONDS,
        multiplier=1,
        translation_key="time_talk",
        fallback_name="Time to talk",
    )
    .number(
        DIYZintercomDoorLockCluster.AttributeDefs.time_open.name,
        DIYZintercomDoorLockCluster.cluster_id,
        min_value=0,
        max_value=65535,
        step=1,
        unit=UnitOfTime.SECONDS,
        multiplier=1,
        translation_key="time_open",
        fallback_name="Time to open",
    )
    .number(
        DIYZintercomDoorLockCluster.AttributeDefs.time_bell.name,
        DIYZintercomDoorLockCluster.cluster_id,
        min_value=0,
        max_value=65535,
        step=1,
        unit=UnitOfTime.SECONDS,
        multiplier=1,
        translation_key="time_bell",
        fallback_name="Time bell",
    )
    .number(
        DIYZintercomDoorLockCluster.AttributeDefs.time_report.name,
        DIYZintercomDoorLockCluster.cluster_id,
        min_value=0,
        max_value=65535,
        step=1,
        unit=UnitOfTime.MINUTES,
        multiplier=1,
        translation_key="time_report",
        fallback_name="Time report",
    )
    .sensor(
        DIYZintercomPowerConfigurationCluster.AttributeDefs.battery_percentage_remaining.name,
        DIYZintercomPowerConfigurationCluster.cluster_id,
        entity_type=EntityType.DIAGNOSTIC,
        multiplier=0.5,
        translation_key="battery",
        fallback_name="Battery",
    )
    .sensor(
        DIYZintercomPowerConfigurationCluster.AttributeDefs.battery_voltage.name,
        DIYZintercomPowerConfigurationCluster.cluster_id,
        entity_type=EntityType.DIAGNOSTIC,
        multiplier=0.1,
        unit="V",
        translation_key="battery_voltage",
        fallback_name="Battery Voltage",
    )
    .add_to_registry()
) 

Signature

{
  "node_descriptor": {
    "logical_type": 2,
    "complex_descriptor_available": 0,
    "user_descriptor_available": 0,
    "reserved": 0,
    "aps_flags": 0,
    "frequency_band": 8,
    "mac_capability_flags": 128,
    "manufacturer_code": 0,
    "maximum_buffer_size": 80,
    "maximum_incoming_transfer_size": 160,
    "server_mask": 0,
    "maximum_outgoing_transfer_size": 160,
    "descriptor_capability_field": 0
  },
  "endpoints": {
    "1": {
      "profile_id": "0x0104",
      "device_type": "0x000c",
      "input_clusters": [
        "0x0000",
        "0x0001",
        "0x0101"
      ],
      "output_clusters": [
        "0x0006",
        "0x0101"
      ]
    }
  },
  "manufacturer": "xyzroe",
  "model": "DIY_Zintercom",
  "class": "zigpy.quirks.v2.CustomDeviceV2"
}

Update:

If you request the value directly, it seems to come. But still it is not clear why not all values are not received at once? After some time even manually requesting values is impossible, the device simply does not respond. It is necessary to remove and insert the battery.
In general the following problems:

  • Values are not automatically pulled up and updated
  • I don't know how to get the charge value correctly
  • How to make the state field readable only

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

No branches or pull requests

1 participant