I am relatively new to Home Assistant, so forgive me if I am just missing something basic here.
I purchased a used Xfinity XHK1-TC from ebay and hooked it up to HA with ZHA. I had no issue getting the device back to factory settings, pairing it to ZHA, and having it be picked up by the Alarmcontrolpanel. I can even enter the code set in ZHA in conjunction with the corresponding alarm state on the device in order to get the HA Alarmcontrolpanel state to change. But after this point is where my problems seem to start. I always see the arm state change in HA no matter what. 100% of the time when I arm the system on the keypad the HA state arms, when I disarm the keypad the HA state disarms. But I have random trouble getting the keypad to accurately and regularly reflect those changes. About 50% of the time when I arm the system the keypad beeps, and lights up the corresponding arm settings in red. When I unarm it beeps again and the red light on the previously armed state is off. The other 50% of the time the keypad seems to have no response to the change, despite HA receiving the arm/disarm signal and changing it there. This is also behavior I see when arming/disarming directly though the HA Alarmcontrolpanel, 50% of the time the keypad seems to understand the state has changed and will change to reflect that state, 50% of the time it stays as it is.
I have looked around a bit for information, but to no avail. My best guess is the keypad just misses some confirmation signal from ZHA. The device is not far from the zigbee transmitter (about 5-10 ft) so I do not think distance is an issue. I have seem some posts talking about syncing Xfinity keypads with more specific alarm systems such as Alarmo, but my goal here is to have this work as barebones as possible, so bare Alarmcontrolpanel and ZHA would be the most preferable.
Any information on this would be great. Even if it is just information on how these Xfinity keypads operate in general, it might lead me to better understand what the actual issue at hand is.
EDIT:
Looking deeper into the logs, I for sure think it is an issue of the reply from ZHA not making it back to the keypad. Here is what a disarm looks like when ZHA cannot talk to the keypad
2022-10-30 23:42:14.718 DEBUG (MainThread) [homeassistant.core] Bus:Handling <Event state_changed[L]: entity_id=alarm_control_panel.technicolor_tka105_alarmcontrolpanel, old_state=<state alarm_control_panel.technicolor_tka105_alarmcontrolpanel=armed_home; code_format=text, changed_by=None, code_arm_required=False, friendly_name=Front Door Keypad Alarmcontrolpanel, supported_features=15 @ 2022-10-30T23:34:57.587644-05:00>, new_state=<state alarm_control_panel.technicolor_tka105_alarmcontrolpanel=disarmed; code_format=text, changed_by=None, code_arm_required=False, friendly_name=Front Door Keypad Alarmcontrolpanel, supported_features=15 @ 2022-10-30T23:42:14.718692-05:00>>
2022-10-30 23:42:14.724 DEBUG (MainThread) [zigpy.zcl] [0x057D:1:0x0501] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=False, direction=<Direction.Client_to_Server: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False, *is_reply=True), tsn=8, command_id=0, *direction=<Direction.Client_to_Server: 1>, *is_reply=True)
2022-10-30 23:42:14.725 DEBUG (MainThread) [zigpy.zcl] [0x057D:1:0x0501] Sending reply: arm_response(arm_notification=<ArmNotification.All_Zones_Disarmed: 0>)
2022-10-30 23:42:14.727 DEBUG (MainThread) [zigpy_znp.zigbee.application] Sending packet ZigbeePacket(src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x057D), dst_ep=1, source_route=None, extended_timeout=False, tsn=8, profile_id=260, cluster_id=1281, data=Serialized[b'\x19\x08\x00\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=None, rssi=None)
2022-10-30 23:42:14.731 DEBUG (MainThread) [zigpy.zcl] [0x057D:1:0x0501] Sending reply header: ZCLHeader(frame_control=FrameControl(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=False, direction=<Direction.Client_to_Server: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False, *is_reply=True), tsn=9, command_id=4, *direction=<Direction.Client_to_Server: 1>, *is_reply=True)
2022-10-30 23:42:14.732 DEBUG (MainThread) [zigpy.zcl] [0x057D:1:0x0501] Sending reply: panel_status_changed(panel_status=<PanelStatus.Panel_Disarmed: 0>, seconds_remaining=0, audible_notification=<AudibleNotification.Default_Sound: 1>, alarm_status=<AlarmStatus.No_Alarm: 0>)
2022-10-30 23:42:14.733 DEBUG (MainThread) [zigpy_znp.zigbee.application] Sending packet ZigbeePacket(src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x057D), dst_ep=1, source_route=None, extended_timeout=False, tsn=9, profile_id=260, cluster_id=1281, data=Serialized[b'\x19\t\x04\x00\x00\x01\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=None, rssi=None)
2022-10-30 23:42:14.734 DEBUG (MainThread) [zigpy_znp.api] Sending request: AF.DataRequestExt.Req(DstAddrModeAddress=AddrModeAddress(mode=<AddrMode.NWK: 2>, address=0x057D), DstEndpoint=1, DstPanId=0x0000, SrcEndpoint=1, ClusterId=1281, TSN=8, Options=<TransmitOptions.SUPPRESS_ROUTE_DISC_NETWORK: 32>, Radius=0, Data=b'\x19\x08\x00\x00')
2022-10-30 23:42:14.755 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.DataRequestExt.Rsp(Status=<Status.SUCCESS: 0>)
2022-10-30 23:42:14.756 DEBUG (MainThread) [zigpy_znp.api] Sending request: AF.DataRequestExt.Req(DstAddrModeAddress=AddrModeAddress(mode=<AddrMode.NWK: 2>, address=0x057D), DstEndpoint=1, DstPanId=0x0000, SrcEndpoint=1, ClusterId=1281, TSN=9, Options=<TransmitOptions.SUPPRESS_ROUTE_DISC_NETWORK: 32>, Radius=0, Data=b'\x19\x09\x04\x00\x00\x01\x00')
2022-10-30 23:42:14.787 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.DataRequestExt.Rsp(Status=<Status.SUCCESS: 0>)
2022-10-30 23:42:14.855 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.DataConfirm.Callback(Status=<Status.MAC_NO_ACK: 233>, Endpoint=1, TSN=8)
2022-10-30 23:42:14.857 DEBUG (MainThread) [zigpy_znp.zigbee.application] Request failed (Unsuccessful request status code: <Status.MAC_NO_ACK: 233>), retry attempt 1 of 5
2022-10-30 23:42:14.874 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.DataConfirm.Callback(Status=<Status.MAC_NO_ACK: 233>, Endpoint=1, TSN=9)
2022-10-30 23:42:14.875 DEBUG (MainThread) [zigpy_znp.zigbee.application] Request failed (Unsuccessful request status code: <Status.MAC_NO_ACK: 233>), retry attempt 1 of 5
2022-10-30 23:42:16.363 DEBUG (MainThread) [zigpy_znp.api] Sending request: AF.DataRequestExt.Req(DstAddrModeAddress=AddrModeAddress(mode=<AddrMode.NWK: 2>, address=0x057D), DstEndpoint=1, DstPanId=0x0000, SrcEndpoint=1, ClusterId=1281, TSN=8, Options=<TransmitOptions.SUPPRESS_ROUTE_DISC_NETWORK: 32>, Radius=0, Data=b'\x19\x08\x00\x00')
2022-10-30 23:42:16.385 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.DataRequestExt.Rsp(Status=<Status.SUCCESS: 0>)
2022-10-30 23:42:16.387 DEBUG (MainThread) [zigpy_znp.api] Sending request: AF.DataRequestExt.Req(DstAddrModeAddress=AddrModeAddress(mode=<AddrMode.NWK: 2>, address=0x057D), DstEndpoint=1, DstPanId=0x0000, SrcEndpoint=1, ClusterId=1281, TSN=9, Options=<TransmitOptions.SUPPRESS_ROUTE_DISC_NETWORK: 32>, Radius=0, Data=b'\x19\x09\x04\x00\x00\x01\x00')
2022-10-30 23:42:16.420 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.DataRequestExt.Rsp(Status=<Status.SUCCESS: 0>)
2022-10-30 23:42:16.492 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.DataConfirm.Callback(Status=<Status.MAC_NO_ACK: 233>, Endpoint=1, TSN=8)
2022-10-30 23:42:16.493 DEBUG (MainThread) [zigpy_znp.zigbee.application] Request failed (Unsuccessful request status code: <Status.MAC_NO_ACK: 233>), retry attempt 2 of 5
2022-10-30 23:42:16.514 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.DataConfirm.Callback(Status=<Status.MAC_NO_ACK: 233>, Endpoint=1, TSN=9)
2022-10-30 23:42:16.515 DEBUG (MainThread) [zigpy_znp.zigbee.application] Request failed (Unsuccessful request status code: <Status.MAC_NO_ACK: 233>), retry attempt 2 of 5
2022-10-30 23:42:16.994 DEBUG (MainThread) [zigpy_znp.api] Sending request: AF.DataRequestSrcRtg.Req(DstAddr=0x057D, DstEndpoint=1, SrcEndpoint=1, ClusterId=1281, TSN=8, Options=<TransmitOptions.SUPPRESS_ROUTE_DISC_NETWORK: 32>, Radius=0, SourceRoute=[], Data=b'\x19\x08\x00\x00')
2022-10-30 23:42:17.013 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.DataRequestSrcRtg.Rsp(Status=<Status.SUCCESS: 0>)
2022-10-30 23:42:17.017 DEBUG (MainThread) [zigpy_znp.api] Sending request: AF.DataRequestSrcRtg.Req(DstAddr=0x057D, DstEndpoint=1, SrcEndpoint=1, ClusterId=1281, TSN=9, Options=<TransmitOptions.SUPPRESS_ROUTE_DISC_NETWORK: 32>, Radius=0, SourceRoute=[], Data=b'\x19\x09\x04\x00\x00\x01\x00')
2022-10-30 23:42:17.036 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.DataRequestSrcRtg.Rsp(Status=<Status.SUCCESS: 0>)
2022-10-30 23:42:17.132 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.DataConfirm.Callback(Status=<Status.MAC_NO_ACK: 233>, Endpoint=1, TSN=8)
2022-10-30 23:42:17.133 DEBUG (MainThread) [zigpy_znp.api] Sending request: ZDO.ExtRouteDisc.Req(Dst=0x057D, Options=<RouteDiscoveryOptions.UNICAST: 0>, Radius=30)
2022-10-30 23:42:17.152 DEBUG (MainThread) [zigpy_znp.api] Received command: ZDO.ExtRouteDisc.Rsp(Status=<Status.SUCCESS: 0>)
2022-10-30 23:42:17.152 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.DataConfirm.Callback(Status=<Status.MAC_NO_ACK: 233>, Endpoint=1, TSN=9)
2022-10-30 23:42:18.454 DEBUG (MainThread) [zigpy_znp.zigbee.application] Request failed (Unsuccessful request status code: <Status.MAC_NO_ACK: 233>), retry attempt 3 of 5
2022-10-30 23:42:18.454 DEBUG (MainThread) [zigpy_znp.zigbee.application] Request failed (Unsuccessful request status code: <Status.MAC_NO_ACK: 233>), retry attempt 3 of 5
2022-10-30 23:42:18.957 DEBUG (MainThread) [zigpy_znp.api] Sending request: AF.DataRequestExt.Req(DstAddrModeAddress=AddrModeAddress(mode=<AddrMode.NWK: 2>, address=0x057D), DstEndpoint=1, DstPanId=0x0000, SrcEndpoint=1, ClusterId=1281, TSN=8, Options=<TransmitOptions.SUPPRESS_ROUTE_DISC_NETWORK: 32>, Radius=0, Data=b'\x19\x08\x00\x00')
2022-10-30 23:42:18.976 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.DataRequestExt.Rsp(Status=<Status.SUCCESS: 0>)
2022-10-30 23:42:18.977 DEBUG (MainThread) [zigpy_znp.api] Sending request: AF.DataRequestExt.Req(DstAddrModeAddress=AddrModeAddress(mode=<AddrMode.NWK: 2>, address=0x057D), DstEndpoint=1, DstPanId=0x0000, SrcEndpoint=1, ClusterId=1281, TSN=9, Options=<TransmitOptions.SUPPRESS_ROUTE_DISC_NETWORK: 32>, Radius=0, Data=b'\x19\x09\x04\x00\x00\x01\x00')
2022-10-30 23:42:19.008 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.DataRequestExt.Rsp(Status=<Status.SUCCESS: 0>)
2022-10-30 23:42:19.069 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.DataConfirm.Callback(Status=<Status.MAC_NO_ACK: 233>, Endpoint=1, TSN=8)
2022-10-30 23:42:19.069 DEBUG (MainThread) [zigpy_znp.zigbee.application] Request failed (Unsuccessful request status code: <Status.MAC_NO_ACK: 233>), retry attempt 4 of 5
2022-10-30 23:42:19.085 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.DataConfirm.Callback(Status=<Status.MAC_NO_ACK: 233>, Endpoint=1, TSN=9)
2022-10-30 23:42:19.086 DEBUG (MainThread) [zigpy_znp.zigbee.application] Request failed (Unsuccessful request status code: <Status.MAC_NO_ACK: 233>), retry attempt 4 of 5
2022-10-30 23:42:19.572 DEBUG (MainThread) [zigpy_znp.api] Sending request: AF.DataRequestExt.Req(DstAddrModeAddress=AddrModeAddress(mode=<AddrMode.IEEE: 3>, address=00:0d:6f:00:0d:9f:f5:48), DstEndpoint=1, DstPanId=0x0000, SrcEndpoint=1, ClusterId=1281, TSN=8, Options=<TransmitOptions.SUPPRESS_ROUTE_DISC_NETWORK: 32>, Radius=0, Data=b'\x19\x08\x00\x00')
2022-10-30 23:42:19.593 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.DataRequestExt.Rsp(Status=<Status.SUCCESS: 0>)
2022-10-30 23:42:19.594 DEBUG (MainThread) [zigpy_znp.api] Sending request: AF.DataRequestExt.Req(DstAddrModeAddress=AddrModeAddress(mode=<AddrMode.IEEE: 3>, address=00:0d:6f:00:0d:9f:f5:48), DstEndpoint=1, DstPanId=0x0000, SrcEndpoint=1, ClusterId=1281, TSN=9, Options=<TransmitOptions.SUPPRESS_ROUTE_DISC_NETWORK: 32>, Radius=0, Data=b'\x19\x09\x04\x00\x00\x01\x00')
2022-10-30 23:42:19.627 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.DataRequestExt.Rsp(Status=<Status.SUCCESS: 0>)
2022-10-30 23:42:19.686 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.DataConfirm.Callback(Status=<Status.MAC_NO_ACK: 233>, Endpoint=1, TSN=8)
2022-10-30 23:42:19.688 DEBUG (MainThread) [zigpy_znp.zigbee.application] Request failed (Unsuccessful request status code: <Status.MAC_NO_ACK: 233>), retry attempt 5 of 5
2022-10-30 23:42:19.703 DEBUG (MainThread) [zigpy_znp.api] Received command: AF.DataConfirm.Callback(Status=<Status.MAC_NO_ACK: 233>, Endpoint=1, TSN=9)
2022-10-30 23:42:19.704 DEBUG (MainThread) [zigpy_znp.zigbee.application] Request failed (Unsuccessful request status code: <Status.MAC_NO_ACK: 233>), retry attempt 5 of 5
2022-10-30 23:42:20.189 DEBUG (MainThread) [homeassistant.components.zha.core.channels.base] [0x057D:1:0x0501]: command failed: 'arm_response' args: '(<ArmNotification.All_Zones_Disarmed: 0>,)' kwargs '{}' exception: 'Request failed after 5 attempts: <Status.MAC_NO_ACK: 233>'
2022-10-30 23:42:20.206 DEBUG (MainThread) [homeassistant.components.zha.core.channels.base] [0x057D:1:0x0501]: command failed: 'panel_status_changed' args: '(<PanelStatus.Panel_Disarmed: 0>, 0, <AudibleNotification.Default_Sound: 1>, <AlarmStatus.No_Alarm: 0>)' kwargs '{}' exception: 'Request failed after 5 attempts: <Status.MAC_NO_ACK: 233>'
Other zigbee devices in ZHA and onthe same coordinator work just fine, although technically they are only sending messages not receiving.
EDIT 2:
For anyone happening to stumble upon this same issue, I have effectively solved it by ditching ZHA for Zigbee2MQTT, Alarmo, and synchronization automations, which I think is technically the more ‘complete’ way to do it. It is unfortunately more complex then I originally wished for, but it does seem the ZHA compatibility for these Xfinity pads is spotty at best. No dropouts since I have started this system though, and I suppose I do get the reap the benefits of Alarmo and MQTT now.