zha-device-handlers: [BUG] E1812 Ikea shortcut button does not fire zha_event

Describe the bug Similar to #1516 but different context.

I’m using supervised HA where I confugured ZHA to access a ZigStar LAN Gateway. I can succesfully bind a Sonoff SNZB-04 (door/window sensor) and a RSH-ZigBee-SC04 4-button scene switch. Both devices report events to HA. But both the Ikea E1812 I tested seems to have troubles both during discovery and after binding. I once saw events while testing a CC2531-based bridge, but only for a short time. (Actually, while collecting debug info, one of the buttons started generating events… hope it continues)

To Reproduce Steps to reproduce the behavior:

  1. Go to ZHA integration
  2. Put E1812 in pairing mode (4 clicks on bind button, red LED starts blinking)
  3. Click on add device
  4. The logs report:
[0x0000:zdo] ZDO request ZDOCmd.Mgmt_Permit_Joining_rsp: [<Status.SUCCESS: 0>]
[0x0000:zdo] No handler for ZDO request:ZDOCmd.Mgmt_Permit_Joining_rsp([<Status.SUCCESS: 0>])
New device 0xd62c (8c:f6:81:ff:fe:2b:c6:6f) joined the network
[0xd62c] Scheduling initialization
Received frame on uninitialized device <Device model=None manuf=None nwk=0xD62C ieee=8c:f6:81:ff:fe:2b:c6:6f is_initialized=False> from ep 0 to ep 0, cluster 19: b'\x81,\xd6o\xc6+\xfe\xff\x81\xf6\x8c\x80'
[0xd62c:zdo] ZDO request ZDOCmd.Device_annce: [0xD62C, 8c:f6:81:ff:fe:2b:c6:6f, 128]
Tries remaining: 3
[0xd62c] Requesting 'Node Descriptor'
Tries remaining: 2
[0xd62c] Extending timeout for 0x8d request
Received frame on uninitialized device <Device model=None manuf=None nwk=0xD62C ieee=8c:f6:81:ff:fe:2b:c6:6f is_initialized=False> from ep 0 to ep 0, cluster 32770: b'\x8d\x00,\xd6\x02@\x80|\x11RR\x00\x00,R\x00\x00'
[0xd62c] Got 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=4476, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, 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)
[0xd62c] Discovering endpoints
Tries remaining: 3
[0xd62c] Extending timeout for 0x8e request
Received frame on uninitialized device <Device model=None manuf=None nwk=0xD62C ieee=8c:f6:81:ff:fe:2b:c6:6f is_initialized=False> from ep 0 to ep 0, cluster 32773: b'\x8e\x00,\xd6\x01\x01'
[0xd62c] Discovered endpoints: [1]
[0xd62c] Initializing endpoints [<Endpoint id=1 in=[] out=[] status=<Status.NEW: 0>>]
[0xd62c:1] Discovering endpoint information
Tries remaining: 3
[0xd62c] Extending timeout for 0x8f request
Received frame on uninitialized device <Device model=None manuf=None nwk=0xD62C ieee=8c:f6:81:ff:fe:2b:c6:6f is_initialized=False> from ep 0 to ep 0, cluster 32772: b'\x8f\x00,\xd6"\x01\x04\x01 \x08\x01\x06\x00\x00\x01\x00\x03\x00\t\x00 \x00\x00\x10\x07\x03\x00\x04\x00\x06\x00\x08\x00\x19\x00\x02\x01\x00\x10'
[0xd62c:1] Discovered endpoint information: SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=2080, device_version=1, input_clusters=[0, 1, 3, 9, 32, 4096], output_clusters=[3, 4, 6, 8, 25, 258, 4096])
[0xD62C:1:0x0000] Sending request header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=False, direction=<Direction.Server_to_Client: 0>, disable_default_response=0, reserved=0, *is_cluster=False, *is_general=True, *is_reply=False), tsn=144, command_id=<GeneralCommand.Read_Attributes: 0>, *direction=<Direction.Server_to_Client: 0>, *is_reply=False)
[0xD62C:1:0x0000] Sending request: Read_Attributes(attribute_ids=[4, 5])
[0xd62c] Extending timeout for 0x90 request
[0xD62C:1:0x0000] Received ZCL frame: b'\x18\x90\x01\x04\x00\x00\x42\x0E\x49\x4B\x45\x41\x20\x6F\x66\x20\x53\x77\x65\x64\x65\x6E\x05\x00\x00\x42\x17\x54\x52\x41\x44\x46\x52\x49\x20\x53\x48\x4F\x52\x54\x43\x55\x54\x20\x42\x75\x74\x74\x6F\x6E'
[0xD62C:1:0x0000] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 1>, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True, *is_reply=True), tsn=144, command_id=1, *direction=<Direction.Client_to_Server: 1>, *is_reply=True)
[0xD62C:1:0x0000] Decoded ZCL frame: Basic:Read_Attributes_rsp(status_records=[ReadAttributeRecord(attrid=0x0004, status=<Status.SUCCESS: 0>, value=TypeValue(type=CharacterString, value='IKEA of Sweden')), ReadAttributeRecord(attrid=0x0005, status=<Status.SUCCESS: 0>, value=TypeValue(type=CharacterString, value='TRADFRI SHORTCUT Button'))])
[0xd62c] Read model 'TRADFRI SHORTCUT Button' and manufacturer 'IKEA of Sweden' from <Endpoint id=1 in=[basic:0x0000, power:0x0001, identify:0x0003, alarms:0x0009, poll_control:0x0020, lightlink:0x1000] out=[identify:0x0003, groups:0x0004, on_off:0x0006, level:0x0008, ota:0x0019, window_covering:0x0102, lightlink:0x1000] status=<Status.ZDO_INIT: 1>>
[0xd62c] Discovered basic device information for <Device model='TRADFRI SHORTCUT Button' manuf='IKEA of Sweden' nwk=0xD62C ieee=8c:f6:81:ff:fe:2b:c6:6f is_initialized=True>
Device is initialized <Device model='TRADFRI SHORTCUT Button' manuf='IKEA of Sweden' nwk=0xD62C ieee=8c:f6:81:ff:fe:2b:c6:6f is_initialized=True>
Checking quirks for IKEA of Sweden TRADFRI SHORTCUT Button (8c:f6:81:ff:fe:2b:c6:6f)
Considering <class 'zhaquirks.ikea.shortcutbtn.IkeaTradfriShortcutBtn2'>
Fail because input cluster mismatch on at least one endpoint
Considering <class 'zhaquirks.ikea.shortcutbtn.IkeaTradfriShortcutBtn'>
Found custom device replacement for 8c:f6:81:ff:fe:2b:c6:6f: <class 'zhaquirks.ikea.shortcutbtn.IkeaTradfriShortcutBtn'>
'button' component -> 'ZHAIdentifyButton' using ['identify']
'sensor' component -> 'Battery' using ['power']
'sensor' component -> 'RSSISensor' using ['basic']
'sensor' component -> 'LQISensor' using ['basic']
device - 0xD62C:8c:f6:81:ff:fe:2b:c6:6f entering async_device_initialized - is_new_join: True
device - 0xD62C:8c:f6:81:ff:fe:2b:c6:6f has joined the ZHA zigbee network
[0xD62C](TRADFRI SHORTCUT Button): started configuration
[0xD62C:ZDO](TRADFRI SHORTCUT Button): 'async_configure' stage succeeded
[0xD62C:1:0x0000]: Configuring cluster attribute reporting
Error handling '_save_attribute' event with (8c:f6:81:ff:fe:2b:c6:6f, 1, 0, 5, 'TRADFRI SHORTCUT Button') params: FOREIGN KEY constraint failed
[0xD62C:1:0x1000] Received ZCL frame: b'\x19\x93\x41\x01\x00\x00'
[0xD62C:1:0x1000] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False, *is_reply=True), tsn=147, command_id=65, *direction=<Direction.Client_to_Server: 1>, *is_reply=True)
[0xD62C:1:0x1000] Decoded ZCL frame: LightLinkCluster:get_group_identifiers_rsp(total=1, start_index=0, group_info_records=[])
[0x0000:2] Cannot add 0x0000 group, no groups cluster
[0x0000:1] Cannot add 0x0000 group, no groups cluster
[0xD62C:1:0x0001]: bound 'power' cluster: Status.SUCCESS
[0xD62C:1:0x0001] Received ZCL frame: b'\x08\x97\x07\x00'
[0xD62C:1:0x0001] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 1>, disable_default_response=0, reserved=0, *is_cluster=False, *is_general=True, *is_reply=True), tsn=151, command_id=7, *direction=<Direction.Client_to_Server: 1>, *is_reply=True)
[0xD62C:1:0x0001] Decoded ZCL frame: PowerConfiguration1CRCluster:Configure_Reporting_rsp(status_records=[ConfigureReportingResponseRecord(status=<Status.SUCCESS: 0>)])
[0xD62C:1:0x0001]: Successfully configured reporting for '{'battery_voltage': (3600, 10800, 1), 'battery_percentage_remaining': (3600, 10800, 1)}' on 'power' cluster: [ConfigureReportingResponseRecord(status=<Status.SUCCESS: 0>)]
[0xD62C:1:0x1000] Received ZCL frame: b'\x19\x93\x41\x01\x00\x00'
[0xD62C:1:0x1000] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False, *is_reply=True), tsn=147, command_id=65, *direction=<Direction.Client_to_Server: 1>, *is_reply=True)
[0xD62C:1:0x1000] Decoded ZCL frame: LightLinkCluster:get_group_identifiers_rsp(total=1, start_index=0, group_info_records=[])
[0xD62C:1:0x1000] Received command 0x41 (TSN 147): get_group_identifiers_rsp(total=1, start_index=0, group_info_records=[])
[0xD62C:1:0x1000] No explicit handler for cluster command 0x41: get_group_identifiers_rsp(total=1, start_index=0, group_info_records=[])
[0xBF0E](TS0044): Device seen - marking the device available and resetting counter
[0xBF0E](TS0044): Update device availability -  device available: True - new availability: True - changed: False
[0xD62C:1:0x0020]: Failed to bind 'poll_control' cluster: 
[0xD62C:1:0x0102]: Failed to bind 'window_covering' cluster: 
[0xD62C:1:0x0008]: Failed to bind 'level' cluster: 
[0xD62C:1:0x0006]: Failed to bind 'on_off' cluster: 
[0x7F6A](DS01): Device seen - marking the device available and resetting counter
[0x7F6A](DS01): Update device availability -  device available: True - new availability: True - changed: False
[0x20D3](TRADFRI SHORTCUT Button): Device seen - marking the device available and resetting counter
[0x20D3](TRADFRI SHORTCUT Button): Update device availability -  device available: True - new availability: True - changed: False
[0xD62C:1:0x0020]: Couldn't set check-in interval: Request failed after 5 attempts: <Status.NWK_NO_ROUTE: 205>
[0xD62C:1:0x0020]: finished channel configuration
[0xD62C:1:0x0000]: 'async_configure' stage succeeded
[0xD62C:1:0x0001]: 'async_configure' stage succeeded
[0xD62C:1:0x0003]: 'async_configure' stage succeeded
[0xD62C:1:0x0020]: 'async_configure' stage succeeded
[0xD62C:1:0x1000]: 'async_configure' stage succeeded
[0xD62C:1:0x0102]: 'async_configure' stage succeeded
[0xD62C:1:0x0008]: 'async_configure' stage succeeded
[0xD62C:1:0x0006]: 'async_configure' stage succeeded
[0xD62C:1:0x0019]: 'async_configure' stage succeeded
[0xD62C](TRADFRI SHORTCUT Button): completed configuration
[0xD62C:1:0x0003] Sending request header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=False, direction=<Direction.Server_to_Client: 0>, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False, *is_reply=False), tsn=153, command_id=64, *direction=<Direction.Server_to_Client: 0>, *is_reply=False)
[0xD62C:1:0x0003] Sending request: trigger_effect(effect_id=<EffectIdentifier.Okay: 2>, effect_variant=<EffectVariant.Default: 0>)
[0xd62c] Extending timeout for 0x99 request
[0xD62C:1:0x0003]: command failed: 'trigger_effect' args: '(2, 0)' kwargs '{}' exception: 'Request failed after 5 attempts: <Status.NWK_NO_ROUTE: 205>'
[0xD62C](TRADFRI SHORTCUT Button): started initialization
[0xD62C:ZDO](TRADFRI SHORTCUT Button): 'async_initialize' stage succeeded
[0xD62C:1:0x0000]: initializing channel: from_cache: False
[0xD62C:1:0x0000]: finished channel initialization
[0xD62C:1:0x0001]: initializing channel: from_cache: False
[0xD62C:1:0x0001]: initializing uncached channel attributes: ['battery_voltage', 'battery_percentage_remaining'] - from cache[False]
[0xD62C:1:0x0001]: Reading attributes in chunks: ['battery_voltage', 'battery_percentage_remaining']
[0xD62C:1:0x0001] Sending request header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=False, direction=<Direction.Server_to_Client: 0>, disable_default_response=0, reserved=0, *is_cluster=False, *is_general=True, *is_reply=False), tsn=154, command_id=<GeneralCommand.Read_Attributes: 0>, *direction=<Direction.Server_to_Client: 0>, *is_reply=False)
[0xD62C:1:0x0001] Sending request: Read_Attributes(attribute_ids=[32, 33])
[0xd62c] Extending timeout for 0x9a request
[0xD62C:1:0x0003]: initializing channel: from_cache: False
[0xD62C:1:0x0003]: finished channel initialization
[0xD62C:1:0x0020]: initializing channel: from_cache: False
[0xD62C:1:0x0020]: finished channel initialization
[0xD62C:1:0x1000]: initializing channel: from_cache: False
[0xD62C:1:0x1000]: finished channel initialization
[0xD62C:1:0x0102]: initializing channel: from_cache: False
[0xD62C:1:0x0102]: finished channel initialization
[0xD62C:1:0x0008]: initializing channel: from_cache: False
[0xD62C:1:0x0008]: finished channel initialization
[0xD62C:1:0x0006]: initializing channel: from_cache: False
[0xD62C:1:0x0006]: finished channel initialization
[0xD62C:1:0x0019]: initializing channel: from_cache: False
[0xD62C:1:0x0019]: finished channel initialization
[0xD62C](TRADFRI SHORTCUT Button): Device seen - marking the device available and resetting counter
[0xD62C](TRADFRI SHORTCUT Button): Update device availability -  device available: True - new availability: True - changed: False
[0xD62C:1:0x0001]: failed to get attributes '['battery_voltage', 'battery_percentage_remaining']' on 'power' cluster: Request failed after 5 attempts: <Status.NWK_NO_ROUTE: 205>
[0xD62C:1:0x0001]: async_initialize: retryable request #1 failed: Request failed after 5 attempts: <Status.NWK_NO_ROUTE: 205>. Retrying in 1.2s
[0xD62C:1:0x0001]: initializing channel: from_cache: False
[0xD62C:1:0x0001]: initializing uncached channel attributes: ['battery_voltage', 'battery_percentage_remaining'] - from cache[False]
[0xD62C:1:0x0001]: Reading attributes in chunks: ['battery_voltage', 'battery_percentage_remaining']
[0xD62C:1:0x0001] Sending request header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=False, direction=<Direction.Server_to_Client: 0>, disable_default_response=0, reserved=0, *is_cluster=False, *is_general=True, *is_reply=False), tsn=155, command_id=<GeneralCommand.Read_Attributes: 0>, *direction=<Direction.Server_to_Client: 0>, *is_reply=False)
[0xD62C:1:0x0001] Sending request: Read_Attributes(attribute_ids=[32, 33])
[0xd62c] Extending timeout for 0x9b request
[0xD62C:1:0x0001]: failed to get attributes '['battery_voltage', 'battery_percentage_remaining']' on 'power' cluster: Request failed after 5 attempts: <Status.NWK_NO_ROUTE: 205>
[0xD62C:1:0x0001]: async_initialize: retryable request #2 failed: Request failed after 5 attempts: <Status.NWK_NO_ROUTE: 205>. Retrying in 0.9s
[0xD62C:1:0x0001]: initializing channel: from_cache: False
[0xD62C:1:0x0001]: initializing uncached channel attributes: ['battery_voltage', 'battery_percentage_remaining'] - from cache[False]
[0xD62C:1:0x0001]: Reading attributes in chunks: ['battery_voltage', 'battery_percentage_remaining']
[0xD62C:1:0x0001] Sending request header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=False, direction=<Direction.Server_to_Client: 0>, disable_default_response=0, reserved=0, *is_cluster=False, *is_general=True, *is_reply=False), tsn=156, command_id=<GeneralCommand.Read_Attributes: 0>, *direction=<Direction.Server_to_Client: 0>, *is_reply=False)
[0xD62C:1:0x0001] Sending request: Read_Attributes(attribute_ids=[32, 33])
[0xd62c] Extending timeout for 0x9c request
[0x7F6A](DS01): Device seen - marking the device available and resetting counter
[0x7F6A](DS01): Update device availability -  device available: True - new availability: True - changed: False
[0xD62C:1:0x0001]: failed to get attributes '['battery_voltage', 'battery_percentage_remaining']' on 'power' cluster: Request failed after 5 attempts: <Status.NWK_NO_ROUTE: 205>
[0xD62C:1:0x0001]: async_initialize: retryable request #3 failed: Request failed after 5 attempts: <Status.NWK_NO_ROUTE: 205>. Retrying in 3.6s
[0xD62C:1:0x0001]: initializing channel: from_cache: False
[0xD62C:1:0x0001]: initializing uncached channel attributes: ['battery_voltage', 'battery_percentage_remaining'] - from cache[False]
[0xD62C:1:0x0001]: Reading attributes in chunks: ['battery_voltage', 'battery_percentage_remaining']
[0xD62C:1:0x0001] Sending request header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=False, direction=<Direction.Server_to_Client: 0>, disable_default_response=0, reserved=0, *is_cluster=False, *is_general=True, *is_reply=False), tsn=157, command_id=<GeneralCommand.Read_Attributes: 0>, *direction=<Direction.Server_to_Client: 0>, *is_reply=False)
[0xD62C:1:0x0001] Sending request: Read_Attributes(attribute_ids=[32, 33])
[0xd62c] Extending timeout for 0x9d request
[0xBF0E](TS0044): Device seen - marking the device available and resetting counter
[0xBF0E](TS0044): Update device availability -  device available: True - new availability: True - changed: False

Note that the E1812 gets recognized twice, getting different addresses.

Expected behavior E1812 gets recognized once and generates events when clicked.

Device 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=4476, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, 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": 260,
      "device_type": "0x0820",
      "in_clusters": [
        "0x0000",
        "0x0001",
        "0x0003",
        "0x0009",
        "0x0020",
        "0x1000"
      ],
      "out_clusters": [
        "0x0003",
        "0x0004",
        "0x0006",
        "0x0008",
        "0x0019",
        "0x0102",
        "0x1000"
      ]
    }
  },
  "manufacturer": "IKEA of Sweden",
  "model": "TRADFRI SHORTCUT Button",
  "class": "zhaquirks.ikea.shortcutbtn.IkeaTradfriShortcutBtn"
}
Diagnostic information
{
  "home_assistant": {
    "installation_type": "Home Assistant Supervised",
    "version": "2022.9.2",
    "dev": false,
    "hassio": true,
    "virtualenv": false,
    "python_version": "3.10.5",
    "docker": true,
    "arch": "x86_64",
    "timezone": "Europe/Rome",
    "os_name": "Linux",
    "os_version": "5.10.0-17-amd64",
    "supervisor": "2022.08.6",
    "host_os": "Debian GNU/Linux 11 (bullseye)",
    "docker_version": "20.10.17",
    "chassis": "vm",
    "run_as_root": true
  },
  "custom_components": {
    "tasmota_irhvac": {
      "version": "2021.12.0",
      "requirements": []
    },
    "scheduler": {
      "version": "v0.0.0",
      "requirements": []
    },
    "nodered": {
      "version": "1.0.9",
      "requirements": []
    },
    "remote_homeassistant": {
      "version": "3.6",
      "requirements": []
    },
    "sonoff": {
      "version": "3.2.0",
      "requirements": [
        "pycryptodome>=3.6.6"
      ]
    },
    "shelly": {
      "version": "1.0.2",
      "requirements": [
        "pyShelly==1.0.2",
        "paho-mqtt==1.6.1",
        "websocket-client"
      ]
    },
    "hacs": {
      "version": "1.27.2",
      "requirements": [
        "aiogithubapi>=22.2.4"
      ]
    },
    "hisense_tv": {
      "version": "22.05.09",
      "requirements": [
        "wakeonlan==2.0.1"
      ]
    },
    "localtuya": {
      "version": "4.1.0",
      "requirements": []
    },
    "dual_smart_thermostat": {
      "version": "0.5.5",
      "requirements": []
    },
    "zha_toolkit": {
      "version": "v0.8.16",
      "requirements": []
    },
    "aquaariston": {
      "version": "1.0.50",
      "requirements": []
    }
  },
  "integration_manifest": {
    "domain": "zha",
    "name": "Zigbee Home Automation",
    "config_flow": true,
    "documentation": "https://www.home-assistant.io/integrations/zha",
    "requirements": [
      "bellows==0.33.1",
      "pyserial==3.5",
      "pyserial-asyncio==0.6",
      "zha-quirks==0.0.79",
      "zigpy-deconz==0.18.1",
      "zigpy==0.50.3",
      "zigpy-xbee==0.15.0",
      "zigpy-zigate==0.9.2",
      "zigpy-znp==0.8.2"
    ],
    "usb": [
      {
        "vid": "10C4",
        "pid": "EA60",
        "description": "*2652*",
        "known_devices": [
          "slae.sh cc2652rb stick"
        ]
      },
      {
        "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": "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"
        ]
      }
    ],
    "codeowners": [
      "@dmulcahey",
      "@adminiuga",
      "@puddly"
    ],
    "zeroconf": [
      {
        "type": "_esphomelib._tcp.local.",
        "name": "tube*"
      },
      {
        "type": "_zigate-zigbee-gateway._tcp.local.",
        "name": "*zigate*"
      }
    ],
    "dependencies": [
      "file_upload"
    ],
    "after_dependencies": [
      "onboarding",
      "usb",
      "zeroconf"
    ],
    "iot_class": "local_polling",
    "loggers": [
      "aiosqlite",
      "bellows",
      "crccheck",
      "pure_pcapy3",
      "zhaquirks",
      "zigpy",
      "zigpy_deconz",
      "zigpy_xbee",
      "zigpy_zigate",
      "zigpy_znp"
    ],
    "is_built_in": true
  },
  "data": {
    "ieee": "**REDACTED**",
    "nwk": 54828,
    "manufacturer": "IKEA of Sweden",
    "model": "TRADFRI SHORTCUT Button",
    "name": "IKEA of Sweden TRADFRI SHORTCUT Button",
    "quirk_applied": true,
    "quirk_class": "zhaquirks.ikea.shortcutbtn.IkeaTradfriShortcutBtn",
    "manufacturer_code": 4476,
    "power_source": "Battery or Unknown",
    "lqi": 178,
    "rssi": null,
    "last_seen": "2022-09-13T23:35:18",
    "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=4476, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, 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": 260,
          "device_type": "0x0820",
          "in_clusters": [
            "0x0000",
            "0x0001",
            "0x0003",
            "0x0009",
            "0x0020",
            "0x1000"
          ],
          "out_clusters": [
            "0x0003",
            "0x0004",
            "0x0006",
            "0x0008",
            "0x0019",
            "0x0102",
            "0x1000"
          ]
        }
      }
    },
    "active_coordinator": false,
    "entities": [
      {
        "entity_id": "button.ikea_of_sweden_tradfri_shortcut_button_identifybutton",
        "name": "IKEA of Sweden TRADFRI SHORTCUT Button"
      },
      {
        "entity_id": "sensor.ikea_of_sweden_tradfri_shortcut_button_battery",
        "name": "IKEA of Sweden TRADFRI SHORTCUT Button"
      }
    ],
    "neighbors": [],
    "endpoint_names": [
      {
        "name": "NON_COLOR_CONTROLLER"
      }
    ],
    "user_given_name": null,
    "device_reg_id": "4e502e76718b392a38c901651e439a42",
    "area_id": null,
    "cluster_details": {
      "1": {
        "device_type": {
          "name": "NON_COLOR_CONTROLLER",
          "id": 2080
        },
        "profile_id": 260,
        "in_clusters": {
          "0x0000": {
            "endpoint_attribute": "basic",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x0001": {
            "endpoint_attribute": "power",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x0003": {
            "endpoint_attribute": "identify",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x0009": {
            "endpoint_attribute": "alarms",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x0020": {
            "endpoint_attribute": "poll_control",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x1000": {
            "endpoint_attribute": "lightlink",
            "attributes": {},
            "unsupported_attributes": {}
          }
        },
        "out_clusters": {
          "0x0003": {
            "endpoint_attribute": "identify",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x0004": {
            "endpoint_attribute": "groups",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x0006": {
            "endpoint_attribute": "on_off",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x0008": {
            "endpoint_attribute": "level",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x0019": {
            "endpoint_attribute": "ota",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x0102": {
            "endpoint_attribute": "window_covering",
            "attributes": {},
            "unsupported_attributes": {}
          },
          "0x1000": {
            "endpoint_attribute": "lightlink",
            "attributes": {},
            "unsupported_attributes": {}
          }
        }
      }
    }
  }
}
Additional logs: one of the buttons started working while collecting report info

Bind log:

[0x0000:zdo] ZDO request ZDOCmd.Mgmt_Permit_Joining_rsp: [<Status.SUCCESS: 0>]
[0x0000:zdo] No handler for ZDO request:ZDOCmd.Mgmt_Permit_Joining_rsp([<Status.SUCCESS: 0>])
Sending 'zdo_leave_req' failed: 
[0xD19C](TRADFRI SHORTCUT Button): last_seen is 475186.8700120449 seconds ago and ping attempts have been exhausted, marking the device unavailable
[0xD19C](TRADFRI SHORTCUT Button): Update device availability -  device available: False - new availability: False - changed: False
New device 0xd230 (84:ba:20:ff:fe:d4:0e:1f) joined the network
[0xd230] Scheduling initialization
Received frame on uninitialized device <Device model=None manuf=None nwk=0xD230 ieee=84:ba:20:ff:fe:d4:0e:1f is_initialized=False> from ep 0 to ep 0, cluster 19: b'\x810\xd2\x1f\x0e\xd4\xfe\xff \xba\x84\x80'
[0xd230:zdo] ZDO request ZDOCmd.Device_annce: [0xD230, 84:ba:20:ff:fe:d4:0e:1f, 128]
Tries remaining: 3
[0xd230] Requesting 'Node Descriptor'
Tries remaining: 2
[0xd230] Extending timeout for 0x1d request
Received frame on uninitialized device <Device model=None manuf=None nwk=0xD230 ieee=84:ba:20:ff:fe:d4:0e:1f is_initialized=False> from ep 0 to ep 0, cluster 32770: b'\x1d\x000\xd2\x02@\x80|\x11RR\x00\x00,R\x00\x00'
[0xd230] Got 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=4476, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, 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)
[0xd230] Discovering endpoints
Tries remaining: 3
[0xd230] Extending timeout for 0x1e request
Received frame on uninitialized device <Device model=None manuf=None nwk=0xD230 ieee=84:ba:20:ff:fe:d4:0e:1f is_initialized=False> from ep 0 to ep 0, cluster 32773: b'\x1e\x000\xd2\x01\x01'
[0xd230] Discovered endpoints: [1]
[0xd230] Initializing endpoints [<Endpoint id=1 in=[] out=[] status=<Status.NEW: 0>>]
[0xd230:1] Discovering endpoint information
Tries remaining: 3
[0xd230] Extending timeout for 0x1f request
Received frame on uninitialized device <Device model=None manuf=None nwk=0xD230 ieee=84:ba:20:ff:fe:d4:0e:1f is_initialized=False> from ep 0 to ep 0, cluster 32772: b'\x1f\x000\xd2"\x01\x04\x01 \x08\x01\x06\x00\x00\x01\x00\x03\x00\t\x00 \x00\x00\x10\x07\x03\x00\x04\x00\x06\x00\x08\x00\x19\x00\x02\x01\x00\x10'
[0xd230:1] Discovered endpoint information: SizePrefixedSimpleDescriptor(endpoint=1, profile=260, device_type=2080, device_version=1, input_clusters=[0, 1, 3, 9, 32, 4096], output_clusters=[3, 4, 6, 8, 25, 258, 4096])
[0xD230:1:0x0000] Sending request header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=False, direction=<Direction.Server_to_Client: 0>, disable_default_response=0, reserved=0, *is_cluster=False, *is_general=True, *is_reply=False), tsn=32, command_id=<GeneralCommand.Read_Attributes: 0>, *direction=<Direction.Server_to_Client: 0>, *is_reply=False)
[0xD230:1:0x0000] Sending request: Read_Attributes(attribute_ids=[4, 5])
[0xd230] Extending timeout for 0x20 request
[0xD230:1:0x0000] Received ZCL frame: b'\x18\x20\x01\x04\x00\x00\x42\x0E\x49\x4B\x45\x41\x20\x6F\x66\x20\x53\x77\x65\x64\x65\x6E\x05\x00\x00\x42\x17\x54\x52\x41\x44\x46\x52\x49\x20\x53\x48\x4F\x52\x54\x43\x55\x54\x20\x42\x75\x74\x74\x6F\x6E'
[0xD230:1:0x0000] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 1>, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True, *is_reply=True), tsn=32, command_id=1, *direction=<Direction.Client_to_Server: 1>, *is_reply=True)
[0xD230:1:0x0000] Decoded ZCL frame: Basic:Read_Attributes_rsp(status_records=[ReadAttributeRecord(attrid=0x0004, status=<Status.SUCCESS: 0>, value=TypeValue(type=CharacterString, value='IKEA of Sweden')), ReadAttributeRecord(attrid=0x0005, status=<Status.SUCCESS: 0>, value=TypeValue(type=CharacterString, value='TRADFRI SHORTCUT Button'))])
[0xd230] Read model 'TRADFRI SHORTCUT Button' and manufacturer 'IKEA of Sweden' from <Endpoint id=1 in=[basic:0x0000, power:0x0001, identify:0x0003, alarms:0x0009, poll_control:0x0020, lightlink:0x1000] out=[identify:0x0003, groups:0x0004, on_off:0x0006, level:0x0008, ota:0x0019, window_covering:0x0102, lightlink:0x1000] status=<Status.ZDO_INIT: 1>>
[0xd230] Discovered basic device information for <Device model='TRADFRI SHORTCUT Button' manuf='IKEA of Sweden' nwk=0xD230 ieee=84:ba:20:ff:fe:d4:0e:1f is_initialized=True>
Device is initialized <Device model='TRADFRI SHORTCUT Button' manuf='IKEA of Sweden' nwk=0xD230 ieee=84:ba:20:ff:fe:d4:0e:1f is_initialized=True>
Checking quirks for IKEA of Sweden TRADFRI SHORTCUT Button (84:ba:20:ff:fe:d4:0e:1f)
Considering <class 'zhaquirks.ikea.shortcutbtn.IkeaTradfriShortcutBtn2'>
Fail because input cluster mismatch on at least one endpoint
Considering <class 'zhaquirks.ikea.shortcutbtn.IkeaTradfriShortcutBtn'>
Found custom device replacement for 84:ba:20:ff:fe:d4:0e:1f: <class 'zhaquirks.ikea.shortcutbtn.IkeaTradfriShortcutBtn'>
'button' component -> 'ZHAIdentifyButton' using ['identify']
'sensor' component -> 'Battery' using ['power']
'sensor' component -> 'RSSISensor' using ['basic']
'sensor' component -> 'LQISensor' using ['basic']
device - 0xD230:84:ba:20:ff:fe:d4:0e:1f entering async_device_initialized - is_new_join: True
device - 0xD230:84:ba:20:ff:fe:d4:0e:1f has joined the ZHA zigbee network
[0xD230](TRADFRI SHORTCUT Button): started configuration
[0xD230:ZDO](TRADFRI SHORTCUT Button): 'async_configure' stage succeeded
[0xD230:1:0x0000]: Configuring cluster attribute reporting
Error handling '_save_attribute' event with (84:ba:20:ff:fe:d4:0e:1f, 1, 0, 5, 'TRADFRI SHORTCUT Button') params: FOREIGN KEY constraint failed
[0xD230:1:0x1000] Received ZCL frame: b'\x19\x23\x41\x01\x00\x00'
[0xD230:1:0x1000] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False, *is_reply=True), tsn=35, command_id=65, *direction=<Direction.Client_to_Server: 1>, *is_reply=True)
[0xD230:1:0x1000] Decoded ZCL frame: LightLinkCluster:get_group_identifiers_rsp(total=1, start_index=0, group_info_records=[])
[0x0000:2] Cannot add 0x0000 group, no groups cluster
[0x0000:1] Cannot add 0x0000 group, no groups cluster
[0xD230:1:0x0001]: bound 'power' cluster: Status.SUCCESS
[0xD230:1:0x0001] Received ZCL frame: b'\x08\x27\x07\x00'
[0xD230:1:0x0001] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 1>, disable_default_response=0, reserved=0, *is_cluster=False, *is_general=True, *is_reply=True), tsn=39, command_id=7, *direction=<Direction.Client_to_Server: 1>, *is_reply=True)
[0xD230:1:0x0001] Decoded ZCL frame: PowerConfiguration1CRCluster:Configure_Reporting_rsp(status_records=[ConfigureReportingResponseRecord(status=<Status.SUCCESS: 0>)])
[0xD230:1:0x0001]: Successfully configured reporting for '{'battery_voltage': (3600, 10800, 1), 'battery_percentage_remaining': (3600, 10800, 1)}' on 'power' cluster: [ConfigureReportingResponseRecord(status=<Status.SUCCESS: 0>)]
[0x7F6A](DS01): Device seen - marking the device available and resetting counter
[0x7F6A](DS01): Update device availability -  device available: True - new availability: True - changed: False
Device 0xd230 (84:ba:20:ff:fe:d4:0e:1f) left the network
[0xBF0E](TS0044): Device seen - marking the device available and resetting counter
[0xBF0E](TS0044): Update device availability -  device available: True - new availability: True - changed: False
[0xD230:1:0x0020]: Failed to bind 'poll_control' cluster: 
[0xD230:1:0x0102]: Failed to bind 'window_covering' cluster: 
[0xD230:1:0x0008]: Failed to bind 'level' cluster: 
[0xD230:1:0x0006]: Failed to bind 'on_off' cluster: 
Device 0xc65a (84:ba:20:ff:fe:d4:0e:1f) joined the network
Device 84:ba:20:ff:fe:d4:0e:1f changed id (0xd230 => 0xc65a)
[0xc65a] Skipping initialization, device is fully initialized
Device is initialized <IkeaTradfriShortcutBtn model='TRADFRI SHORTCUT Button' manuf='IKEA of Sweden' nwk=0xC65A ieee=84:ba:20:ff:fe:d4:0e:1f is_initialized=True>
device - 0xC65A:84:ba:20:ff:fe:d4:0e:1f entering async_device_initialized - is_new_join: True
device - 0xC65A:84:ba:20:ff:fe:d4:0e:1f has joined the ZHA zigbee network
[0xC65A](TRADFRI SHORTCUT Button): started configuration
[0xC65A:ZDO](TRADFRI SHORTCUT Button): 'async_configure' stage succeeded
[0xC65A:1:0x0000]: Configuring cluster attribute reporting
[0xC65A:1:0x0020]: Couldn't set check-in interval: Request failed after 5 attempts: <Status.MAC_TRANSACTION_EXPIRED: 240>
[0xC65A:1:0x0020]: finished channel configuration
[0xC65A:1:0x0000]: 'async_configure' stage succeeded
[0xC65A:1:0x0003]: 'async_configure' stage succeeded
[0xC65A:1:0x0001]: 'async_configure' stage succeeded
[0xC65A:1:0x0020]: 'async_configure' stage succeeded
[0xC65A:1:0x1000]: 'async_configure' stage succeeded
[0xC65A:1:0x0102]: 'async_configure' stage succeeded
[0xC65A:1:0x0008]: 'async_configure' stage succeeded
[0xC65A:1:0x0006]: 'async_configure' stage succeeded
[0xC65A:1:0x0019]: 'async_configure' stage succeeded
[0xC65A](TRADFRI SHORTCUT Button): completed configuration
[0xC65A:1:0x0003] Sending request header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=False, direction=<Direction.Server_to_Client: 0>, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False, *is_reply=False), tsn=47, command_id=64, *direction=<Direction.Server_to_Client: 0>, *is_reply=False)
[0xC65A:1:0x0003] Sending request: trigger_effect(effect_id=<EffectIdentifier.Okay: 2>, effect_variant=<EffectVariant.Default: 0>)
[0xc65a] Extending timeout for 0x2f request
Device 0x20d3 (84:ba:20:ff:fe:d4:0e:1f) joined the network
Device 84:ba:20:ff:fe:d4:0e:1f changed id (0xc65a => 0x20d3)
[0x20d3] Skipping initialization, device is fully initialized
Device is initialized <IkeaTradfriShortcutBtn model='TRADFRI SHORTCUT Button' manuf='IKEA of Sweden' nwk=0x20D3 ieee=84:ba:20:ff:fe:d4:0e:1f is_initialized=True>
device - 0x20D3:84:ba:20:ff:fe:d4:0e:1f entering async_device_initialized - is_new_join: True
device - 0x20D3:84:ba:20:ff:fe:d4:0e:1f has joined the ZHA zigbee network
[0x20D3](TRADFRI SHORTCUT Button): started configuration
[0x20D3:ZDO](TRADFRI SHORTCUT Button): 'async_configure' stage succeeded
[0x20D3:1:0x0000]: Configuring cluster attribute reporting
Device 0x20d3 (84:ba:20:ff:fe:d4:0e:1f) joined the network
[0x20d3:zdo] ZDO request ZDOCmd.Device_annce: [0x20D3, 84:ba:20:ff:fe:d4:0e:1f, 128]
[0x20D3:1:0x1000] Received ZCL frame: b'\x19\x32\x41\x01\x00\x00'
[0x20D3:1:0x1000] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False, *is_reply=True), tsn=50, command_id=65, *direction=<Direction.Client_to_Server: 1>, *is_reply=True)
[0x20D3:1:0x1000] Decoded ZCL frame: LightLinkCluster:get_group_identifiers_rsp(total=1, start_index=0, group_info_records=[])
[0x0000:2] Cannot add 0x0000 group, no groups cluster
[0x0000:1] Cannot add 0x0000 group, no groups cluster
[0x20D3:1:0x0001]: bound 'power' cluster: Status.SUCCESS
[0x20D3:1:0x0020]: bound 'poll_control' cluster: Status.SUCCESS
[0x20D3:1:0x0001] Received ZCL frame: b'\x08\x36\x07\x00'
[0x20D3:1:0x0001] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 1>, disable_default_response=0, reserved=0, *is_cluster=False, *is_general=True, *is_reply=True), tsn=54, command_id=7, *direction=<Direction.Client_to_Server: 1>, *is_reply=True)
[0x20D3:1:0x0001] Decoded ZCL frame: PowerConfiguration1CRCluster:Configure_Reporting_rsp(status_records=[ConfigureReportingResponseRecord(status=<Status.SUCCESS: 0>)])
[0x20D3:1:0x0001]: Successfully configured reporting for '{'battery_voltage': (3600, 10800, 1), 'battery_percentage_remaining': (3600, 10800, 1)}' on 'power' cluster: [ConfigureReportingResponseRecord(status=<Status.SUCCESS: 0>)]
[0x20D3:1:0x0020] Received ZCL frame: b'\x18\x37\x04\x00'
[0x20D3:1:0x0020] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 1>, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True, *is_reply=True), tsn=55, command_id=4, *direction=<Direction.Client_to_Server: 1>, *is_reply=True)
[0x20D3:1:0x0020] Decoded ZCL frame: PollControl:Write_Attributes_rsp(status_records=[WriteAttributesStatusRecord(status=<Status.SUCCESS: 0>)])
[0x20D3:1:0x0020]: 3300.0s check-in interval set: Write_Attributes_rsp(status_records=[WriteAttributesStatusRecord(status=<Status.SUCCESS: 0>)])
[0x20D3:1:0x0020]: finished channel configuration
[0x20D3:1:0x1000] Received ZCL frame: b'\x19\x2B\x41\x01\x00\x00'
[0x20D3:1:0x1000] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False, *is_reply=True), tsn=43, command_id=65, *direction=<Direction.Client_to_Server: 1>, *is_reply=True)
[0x20D3:1:0x1000] Decoded ZCL frame: LightLinkCluster:get_group_identifiers_rsp(total=1, start_index=0, group_info_records=[])
[0x0000:2] Cannot add 0x0000 group, no groups cluster
[0x0000:1] Cannot add 0x0000 group, no groups cluster
[0x20D3:1:0x0003] Received ZCL frame: b'\x08\x2F\x0B\x40\x00'
[0x20D3:1:0x0003] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 1>, disable_default_response=0, reserved=0, *is_cluster=False, *is_general=True, *is_reply=True), tsn=47, command_id=11, *direction=<Direction.Client_to_Server: 1>, *is_reply=True)
[0x20D3:1:0x0003] Decoded ZCL frame: Identify:Default_Response(command_id=64, status=<Status.SUCCESS: 0>)
[0x20D3:1:0x0003]: executed 'trigger_effect' command with args: '(2, 0)' kwargs: '{}' result: Default_Response(command_id=64, status=<Status.SUCCESS: 0>)
[0x20D3](TRADFRI SHORTCUT Button): started initialization
[0x20D3:ZDO](TRADFRI SHORTCUT Button): 'async_initialize' stage succeeded
[0x20D3:1:0x0000]: initializing channel: from_cache: False
[0x20D3:1:0x0000]: finished channel initialization
[0x20D3:1:0x0003]: initializing channel: from_cache: False
[0x20D3:1:0x0003]: finished channel initialization
[0x20D3:1:0x0001]: initializing channel: from_cache: False
[0x20D3:1:0x0001]: initializing uncached channel attributes: ['battery_voltage', 'battery_percentage_remaining'] - from cache[False]
[0x20D3:1:0x0001]: Reading attributes in chunks: ['battery_voltage', 'battery_percentage_remaining']
[0x20D3:1:0x0001] Sending request header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=False, direction=<Direction.Server_to_Client: 0>, disable_default_response=0, reserved=0, *is_cluster=False, *is_general=True, *is_reply=False), tsn=56, command_id=<GeneralCommand.Read_Attributes: 0>, *direction=<Direction.Server_to_Client: 0>, *is_reply=False)
[0x20D3:1:0x0001] Sending request: Read_Attributes(attribute_ids=[32, 33])
[0x20d3] Extending timeout for 0x38 request
[0x20D3:1:0x0020]: initializing channel: from_cache: False
[0x20D3:1:0x0020]: finished channel initialization
[0x20D3:1:0x1000]: initializing channel: from_cache: False
[0x20D3:1:0x1000]: finished channel initialization
[0x20D3:1:0x0102]: initializing channel: from_cache: False
[0x20D3:1:0x0102]: finished channel initialization
[0x20D3:1:0x0008]: initializing channel: from_cache: False
[0x20D3:1:0x0008]: finished channel initialization
[0x20D3:1:0x0006]: initializing channel: from_cache: False
[0x20D3:1:0x0006]: finished channel initialization
[0x20D3:1:0x0019]: initializing channel: from_cache: False
[0x20D3:1:0x0019]: finished channel initialization
[0x20d3:zdo] ZDO request ZDOCmd.Bind_rsp: [<Status.SUCCESS: 0>]
[0x20d3:zdo] No handler for ZDO request:ZDOCmd.Bind_rsp([<Status.SUCCESS: 0>])
[0x20D3:1:0x0001] Received ZCL frame: b'\x18\x38\x01\x20\x00\x00\x20\x00\x21\x00\x00\x20\x64'
[0x20D3:1:0x0001] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 1>, disable_default_response=1, reserved=0, *is_cluster=False, *is_general=True, *is_reply=True), tsn=56, command_id=1, *direction=<Direction.Client_to_Server: 1>, *is_reply=True)
[0x20D3:1:0x0001] Decoded ZCL frame: PowerConfiguration1CRCluster:Read_Attributes_rsp(status_records=[ReadAttributeRecord(attrid=0x0020, status=<Status.SUCCESS: 0>, value=TypeValue(type=uint8_t, value=0)), ReadAttributeRecord(attrid=0x0021, status=<Status.SUCCESS: 0>, value=TypeValue(type=uint8_t, value=100))])
[0x20D3:1:0x0001]: Performing channel specific initialization: ['battery_voltage', 'battery_percentage_remaining']
[0x20D3:1:0x0001]: Reading attributes in chunks: ['battery_size', 'battery_quantity']
[0x20D3:1:0x0001]: finished channel initialization
[0x20D3:1:0x0000]: 'async_initialize' stage succeeded
[0x20D3:1:0x0003]: 'async_initialize' stage succeeded
[0x20D3:1:0x0001]: 'async_initialize' stage succeeded
[0x20D3:1:0x0020]: 'async_initialize' stage succeeded
[0x20D3:1:0x1000]: 'async_initialize' stage succeeded
[0x20D3:1:0x0102]: 'async_initialize' stage succeeded
[0x20D3:1:0x0008]: 'async_initialize' stage succeeded
[0x20D3:1:0x0006]: 'async_initialize' stage succeeded
[0x20D3:1:0x0019]: 'async_initialize' stage succeeded
[0x20D3](TRADFRI SHORTCUT Button): power source: Battery or Unknown
[0x20D3](TRADFRI SHORTCUT Button): completed initialization
[0x20D3:1:0x0001] Received ZCL frame: b'\x08\x36\x07\x00'
[0x20D3:1:0x0001] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 1>, disable_default_response=0, reserved=0, *is_cluster=False, *is_general=True, *is_reply=True), tsn=54, command_id=7, *direction=<Direction.Client_to_Server: 1>, *is_reply=True)
[0x20D3:1:0x0001] Decoded ZCL frame: PowerConfiguration1CRCluster:Configure_Reporting_rsp(status_records=[ConfigureReportingResponseRecord(status=<Status.SUCCESS: 0>)])
[0x20D3:1:0x0001] Received command 0x07 (TSN 54): Configure_Reporting_rsp(status_records=[ConfigureReportingResponseRecord(status=<Status.SUCCESS: 0>)])
[0x20d3:zdo] ZDO request ZDOCmd.Bind_rsp: [<Status.SUCCESS: 0>]
[0x20d3:zdo] No handler for ZDO request:ZDOCmd.Bind_rsp([<Status.SUCCESS: 0>])
[0x20D3:1:0x0001]: Failed to bind 'power' cluster: 
[0x20D3:1:0x0020]: Failed to bind 'poll_control' cluster: 
[0x20D3:1:0x0102]: Failed to bind 'window_covering' cluster: 
[0x20D3:1:0x0008]: Failed to bind 'level' cluster: 
[0x20D3:1:0x0006]: Failed to bind 'on_off' cluster: 
[0x20D3:1:0x0102]: Failed to bind 'window_covering' cluster: 
[0x20D3:1:0x0008]: Failed to bind 'level' cluster: 
[0x20D3:1:0x0006]: Failed to bind 'on_off' cluster: 
[0x20D3:1:0x0000]: 'async_configure' stage succeeded
[0x20D3:1:0x0003]: 'async_configure' stage succeeded
[0x20D3:1:0x0001]: 'async_configure' stage succeeded
[0x20D3:1:0x0020]: 'async_configure' stage succeeded
[0x20D3:1:0x1000]: 'async_configure' stage succeeded
[0x20D3:1:0x0102]: 'async_configure' stage succeeded
[0x20D3:1:0x0008]: 'async_configure' stage succeeded
[0x20D3:1:0x0006]: 'async_configure' stage succeeded
[0x20D3:1:0x0019]: 'async_configure' stage succeeded
[0x20D3](TRADFRI SHORTCUT Button): completed configuration
[0x20D3:1:0x0003] Sending request header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=False, direction=<Direction.Server_to_Client: 0>, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False, *is_reply=False), tsn=59, command_id=64, *direction=<Direction.Server_to_Client: 0>, *is_reply=False)
[0x20D3:1:0x0003] Sending request: trigger_effect(effect_id=<EffectIdentifier.Okay: 2>, effect_variant=<EffectVariant.Default: 0>)
[0x20d3] Extending timeout for 0x3b request
[0xD19C](TRADFRI SHORTCUT Button): last_seen is 475264.87036395073 seconds ago and ping attempts have been exhausted, marking the device unavailable
[0xD19C](TRADFRI SHORTCUT Button): Update device availability -  device available: False - new availability: False - changed: False
[0x7F6A](DS01): Device seen - marking the device available and resetting counter
[0x7F6A](DS01): Update device availability -  device available: True - new availability: True - changed: False
[0x20D3:1:0x0020]: Couldn't set check-in interval: Request failed after 5 attempts: <Status.NWK_NO_ROUTE: 205>
[0x20D3:1:0x0020]: finished channel configuration
[0x20D3:1:0x0001]: failed to set reporting on 'power' cluster for: Request failed after 5 attempts: <Status.NWK_NO_ROUTE: 205>
[0x20D3:1:0x0000]: 'async_configure' stage succeeded
[0x20D3:1:0x0003]: 'async_configure' stage succeeded
[0x20D3:1:0x0001]: 'async_configure' stage succeeded
[0x20D3:1:0x0020]: 'async_configure' stage succeeded
[0x20D3:1:0x1000]: 'async_configure' stage succeeded
[0x20D3:1:0x0102]: 'async_configure' stage succeeded
[0x20D3:1:0x0008]: 'async_configure' stage succeeded
[0x20D3:1:0x0006]: 'async_configure' stage succeeded
[0x20D3:1:0x0019]: 'async_configure' stage succeeded
[0x20D3](TRADFRI SHORTCUT Button): completed configuration
[0x20D3:1:0x0003] Sending request header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=False, direction=<Direction.Server_to_Client: 0>, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False, *is_reply=False), tsn=60, command_id=64, *direction=<Direction.Server_to_Client: 0>, *is_reply=False)
[0x20D3:1:0x0003] Sending request: trigger_effect(effect_id=<EffectIdentifier.Okay: 2>, effect_variant=<EffectVariant.Default: 0>)
[0x20d3] Extending timeout for 0x3c request
[0x20D3:1:0x0003]: command failed: 'trigger_effect' args: '(2, 0)' kwargs '{}' exception: 'Request failed after 5 attempts: <Status.NWK_NO_ROUTE: 205>'
[0x20D3](TRADFRI SHORTCUT Button): started initialization
[0x20D3:ZDO](TRADFRI SHORTCUT Button): 'async_initialize' stage succeeded
[0x20D3:1:0x0000]: initializing channel: from_cache: False
[0x20D3:1:0x0000]: finished channel initialization
[0x20D3:1:0x0003]: initializing channel: from_cache: False
[0x20D3:1:0x0003]: finished channel initialization
[0x20D3:1:0x0001]: initializing channel: from_cache: False
[0x20D3:1:0x0001]: initializing uncached channel attributes: ['battery_voltage', 'battery_percentage_remaining'] - from cache[False]
[0x20D3:1:0x0001]: Reading attributes in chunks: ['battery_voltage', 'battery_percentage_remaining']
[0x20D3:1:0x0001] Sending request header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=False, direction=<Direction.Server_to_Client: 0>, disable_default_response=0, reserved=0, *is_cluster=False, *is_general=True, *is_reply=False), tsn=61, command_id=<GeneralCommand.Read_Attributes: 0>, *direction=<Direction.Server_to_Client: 0>, *is_reply=False)
[0x20D3:1:0x0001] Sending request: Read_Attributes(attribute_ids=[32, 33])
[0x20d3] Extending timeout for 0x3d request
[0x20D3:1:0x0020]: initializing channel: from_cache: False
[0x20D3:1:0x0020]: finished channel initialization
[0x20D3:1:0x1000]: initializing channel: from_cache: False
[0x20D3:1:0x1000]: finished channel initialization
[0x20D3:1:0x0102]: initializing channel: from_cache: False
[0x20D3:1:0x0102]: finished channel initialization
[0x20D3:1:0x0008]: initializing channel: from_cache: False
[0x20D3:1:0x0008]: finished channel initialization
[0x20D3:1:0x0006]: initializing channel: from_cache: False
[0x20D3:1:0x0006]: finished channel initialization
[0x20D3:1:0x0019]: initializing channel: from_cache: False
[0x20D3:1:0x0019]: finished channel initialization
[0x20D3](TRADFRI SHORTCUT Button): Device seen - marking the device available and resetting counter
[0x20D3](TRADFRI SHORTCUT Button): Update device availability -  device available: True - new availability: True - changed: False
[0x20D3:1:0x0003]: command failed: 'trigger_effect' args: '(2, 0)' kwargs '{}' exception: 'Request failed after 5 attempts: <Status.NWK_NO_ROUTE: 205>'
[0x20D3](TRADFRI SHORTCUT Button): started initialization
[0x20D3:ZDO](TRADFRI SHORTCUT Button): 'async_initialize' stage succeeded
[0x20D3:1:0x0000]: initializing channel: from_cache: False
[0x20D3:1:0x0000]: finished channel initialization
[0x20D3:1:0x0003]: initializing channel: from_cache: False
[0x20D3:1:0x0003]: finished channel initialization
[0x20D3:1:0x0001]: initializing channel: from_cache: False
[0x20D3:1:0x0001]: initializing uncached channel attributes: ['battery_voltage', 'battery_percentage_remaining'] - from cache[False]
[0x20D3:1:0x0001]: Reading attributes in chunks: ['battery_voltage', 'battery_percentage_remaining']
[0x20D3:1:0x0001] Sending request header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=False, direction=<Direction.Server_to_Client: 0>, disable_default_response=0, reserved=0, *is_cluster=False, *is_general=True, *is_reply=False), tsn=62, command_id=<GeneralCommand.Read_Attributes: 0>, *direction=<Direction.Server_to_Client: 0>, *is_reply=False)
[0x20D3:1:0x0001] Sending request: Read_Attributes(attribute_ids=[32, 33])
[0x20d3] Extending timeout for 0x3e request
[0x20D3:1:0x0020]: initializing channel: from_cache: False
[0x20D3:1:0x0020]: finished channel initialization
[0x20D3:1:0x1000]: initializing channel: from_cache: False
[0x20D3:1:0x1000]: finished channel initialization
[0x20D3:1:0x0102]: initializing channel: from_cache: False
[0x20D3:1:0x0102]: finished channel initialization
[0x20D3:1:0x0008]: initializing channel: from_cache: False
[0x20D3:1:0x0008]: finished channel initialization
[0x20D3:1:0x0006]: initializing channel: from_cache: False
[0x20D3:1:0x0006]: finished channel initialization
[0x20D3:1:0x0019]: initializing channel: from_cache: False
[0x20D3:1:0x0019]: finished channel initialization
[0x20D3:1:0x0001]: failed to get attributes '['battery_voltage', 'battery_percentage_remaining']' on 'power' cluster: Request failed after 5 attempts: <Status.NWK_NO_ROUTE: 205>
[0x20D3:1:0x0001]: async_initialize: retryable request #1 failed: Request failed after 5 attempts: <Status.NWK_NO_ROUTE: 205>. Retrying in 1.0s
[0x20D3:1:0x0001]: initializing channel: from_cache: False
[0x20D3:1:0x0001]: initializing uncached channel attributes: ['battery_voltage', 'battery_percentage_remaining'] - from cache[False]
[0x20D3:1:0x0001]: Reading attributes in chunks: ['battery_voltage', 'battery_percentage_remaining']
[0x20D3:1:0x0001] Sending request header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.GLOBAL_COMMAND: 0>, is_manufacturer_specific=False, direction=<Direction.Server_to_Client: 0>, disable_default_response=0, reserved=0, *is_cluster=False, *is_general=True, *is_reply=False), tsn=63, command_id=<GeneralCommand.Read_Attributes: 0>, *direction=<Direction.Server_to_Client: 0>, *is_reply=False)
[0x20D3:1:0x0001] Sending request: Read_Attributes(attribute_ids=[32, 33])
[0x20d3] Extending timeout for 0x3f request
[0xBF0E](TS0044): Device seen - marking the device available and resetting counter
[0xBF0E](TS0044): Update device availability -  device available: True - new availability: True - changed: False

Device 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=4476, maximum_buffer_size=82, maximum_incoming_transfer_size=82, server_mask=11264, maximum_outgoing_transfer_size=82, 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": 260,
      "device_type": "0x0820",
      "in_clusters": [
        "0x0000",
        "0x0001",
        "0x0003",
        "0x0009",
        "0x0020",
        "0x1000"
      ],
      "out_clusters": [
        "0x0003",
        "0x0004",
        "0x0006",
        "0x0008",
        "0x0019",
        "0x0102",
        "0x1000"
      ]
    }
  },
  "manufacturer": "IKEA of Sweden",
  "model": "TRADFRI SHORTCUT Button",
  "class": "zhaquirks.ikea.shortcutbtn.IkeaTradfriShortcutBtn"
}

About this issue

  • Original URL
  • State: closed
  • Created 2 years ago
  • Reactions: 1
  • Comments: 19 (5 by maintainers)

Most upvoted comments

Seems the only procedure that seems to work quite often is:

  1. delete shortcut button
  2. restart HA
  3. re-bind the button

Without step 2, events do not appear.

HIH.

Had a similar issue. This did the trick for me:

  • remove the battery
  • press the button a few times (probably unnecessary but that’s what I did)
  • re-insert the battery
  • reconfigure, press the button right after starting reconfiguring

The reconfigure went really fast, exited with an error, but it works nonetheless. I’ve tried removing/repairing/reconfiguring many times and removing the battery was the thing that finally did the trick for me.

Actually I couldn’t pair it with various routers, but only with coordinator. I now moved it where it does have to go thru 2 or 3 routers and seems it’s still working. But pairing is a nightmare.