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

[BUG] Philips RDM002 long press indistinguishable from dial left rotation #3696

Open
fholzer opened this issue Jan 10, 2025 · 3 comments
Open

Comments

@fholzer
Copy link
Contributor

fholzer commented Jan 10, 2025

Bug description

Long-pressing buttons will correctly emit long_press/hold events, but they will also emit LevelControl events. Dial rotation will emit only LevelControl events. Due to the args/params attached to the LevelControl events emitted by button long-press, they are indistinguishable from dial left rotation. Dial right rotation uses different arguments, so can be distinguished. See #2340 (comment) for more details.

Steps to reproduce

  1. enable debug logging on zha integration, or start listening to zha_event in dev tools.
  2. perform left rotation on RDM002 dial
  3. hold any button for several seconds
  4. observe the same step_with_on_off with indistinguishable args/params for both of above actions

Expected behavior

Ideally holding a button shouldn't emit LevelControl events.

Screenshots/Video

No response

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": 4107,
    "maximum_buffer_size": 82,
    "maximum_incoming_transfer_size": 128,
    "server_mask": 11264,
    "maximum_outgoing_transfer_size": 128,
    "descriptor_capability_field": 0
  },
  "endpoints": {
    "1": {
      "profile_id": "0x0104",
      "device_type": "0x0820",
      "input_clusters": [
        "0x0000",
        "0x0001",
        "0x0003",
        "0x1000",
        "0xfc00"
      ],
      "output_clusters": [
        "0x0000",
        "0x0003",
        "0x0004",
        "0x0005",
        "0x0006",
        "0x0008",
        "0x0019",
        "0x1000"
      ]
    }
  },
  "manufacturer": "Signify Netherlands B.V.",
  "model": "RDM002",
  "class": "zhaquirks.philips.rdm002.PhilipsRDM002"
}

Diagnostic information

No response

Logs

No response

Additional information

No response

@gtunes-dev
Copy link

Thanks for looking into this and creating the issue, @fholzer. Of course I'd personally appreciate it if you considered fixing it, since I think you're the expert on this integration now :)

I have a question for you. Someone noticed that the step_with_on_off events fired by log presses have "transition_time" param of 8. The similar rotation events appear to me to consistently have a transition_time of 4.

Do you have an opinion on whether or not this is a reliable way to discriminate between the two in a blueprint or script until the underlying issue is fixed? Thanks!

@fholzer
Copy link
Contributor Author

fholzer commented Jan 10, 2025

Debug logs, filtered
# Dial rotation left
2025-01-10 19:30:54.771 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 30, 54, 771539, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=203, profile_id=260, cluster_id=8, data=Serialized[b'\x01\x1c\x06\x01\x0e\x04\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=220, rssi=-45)
2025-01-10 19:30:54.772 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0x0008] Received ZCL frame: b'\x01\x1c\x06\x01\x0e\x04\x00'
2025-01-10 19:30:54.772 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0x0008] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x01>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 0>, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=28, command_id=6, *direction=<Direction.Client_to_Server: 0>)
2025-01-10 19:30:54.772 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0x0008] Decoded ZCL frame: LevelControl:step_with_on_off(step_mode=<StepMode.Down: 1>, step_size=14, transition_time=4)
--
2025-01-10 19:30:54.780 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 30, 54, 780510, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=204, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x10\x1d\x00\x14\x00\x010\x01)\xe2\xff!d\x00)\xe2\xff!d\x00)\xe2\xff!\x90\x01'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=224, rssi=-44)
2025-01-10 19:30:54.780 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x10\x1d\x00\x14\x00\x010\x01)\xe2\xff!d\x00)\xe2\xff!d\x00)\xe2\xff!\x90\x01'
2025-01-10 19:30:54.781 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=29, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 19:30:54.781 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=20, param2=3145984, press_type=1, param4=41, param5=65506)

# Dial rotation right
2025-01-10 19:30:57.166 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 30, 57, 166520, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=205, profile_id=260, cluster_id=8, data=Serialized[b'\x01\x1e\x06\x00\x0e\x04\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=220, rssi=-45)
2025-01-10 19:30:57.167 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0x0008] Received ZCL frame: b'\x01\x1e\x06\x00\x0e\x04\x00'
2025-01-10 19:30:57.167 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0x0008] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x01>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 0>, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=30, command_id=6, *direction=<Direction.Client_to_Server: 0>)
2025-01-10 19:30:57.168 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0x0008] Decoded ZCL frame: LevelControl:step_with_on_off(step_mode=<StepMode.Up: 0>, step_size=14, transition_time=4)
--
2025-01-10 19:30:57.175 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 30, 57, 175599, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=206, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x10\x1f\x00\x14\x00\x010\x01)\x1e\x00!d\x00)\x1e\x00!d\x00)\x1e\x00!\x90\x01'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=220, rssi=-45)
2025-01-10 19:30:57.176 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x10\x1f\x00\x14\x00\x010\x01)\x1e\x00!d\x00)\x1e\x00!d\x00)\x1e\x00!\x90\x01'
2025-01-10 19:30:57.176 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=31, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 19:30:57.176 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=20, param2=3145984, press_type=1, param4=41, param5=30)

# Button 1 long press
2025-01-10 19:31:02.052 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 31, 2, 52192, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=207, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x10 \x00\x01\x00\x000\x00!\x00\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=232, rssi=-42)
2025-01-10 19:31:02.052 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x10 \x00\x01\x00\x000\x00!\x00\x00'
2025-01-10 19:31:02.052 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=32, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 19:31:02.053 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=1, param2=3145728, press_type=0, param4=33, param5=0)
--
2025-01-10 19:31:02.822 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 31, 2, 822386, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=208, profile_id=260, cluster_id=8, data=Serialized[b'\x01!\x06\x01\xff\x08\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=232, rssi=-42)
2025-01-10 19:31:02.822 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0x0008] Received ZCL frame: b'\x01!\x06\x01\xff\x08\x00'
2025-01-10 19:31:02.823 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0x0008] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x01>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 0>, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=33, command_id=6, *direction=<Direction.Client_to_Server: 0>)
2025-01-10 19:31:02.823 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0x0008] Decoded ZCL frame: LevelControl:step_with_on_off(step_mode=<StepMode.Down: 1>, step_size=255, transition_time=8)
--
2025-01-10 19:31:02.848 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 31, 2, 848728, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=209, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x10"\x00\x01\x00\x000\x01!\x08\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=232, rssi=-42)
2025-01-10 19:31:02.849 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x10"\x00\x01\x00\x000\x01!\x08\x00'
2025-01-10 19:31:02.849 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=34, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 19:31:02.849 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=1, param2=3145728, press_type=1, param4=33, param5=8)
--
2025-01-10 19:31:03.168 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 31, 3, 168945, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=210, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x10#\x00\x01\x00\x000\x03!\x0b\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=232, rssi=-42)
2025-01-10 19:31:03.170 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x10#\x00\x01\x00\x000\x03!\x0b\x00'
2025-01-10 19:31:03.170 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=35, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 19:31:03.171 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=1, param2=3145728, press_type=3, param4=33, param5=11)

# Button 2 long press
2025-01-10 19:31:09.575 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 31, 9, 575750, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=211, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x10$\x00\x02\x00\x000\x00!\x00\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=220, rssi=-45)
2025-01-10 19:31:09.576 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x10$\x00\x02\x00\x000\x00!\x00\x00'
2025-01-10 19:31:09.576 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=36, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 19:31:09.577 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=2, param2=3145728, press_type=0, param4=33, param5=0)
--
2025-01-10 19:31:10.347 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 31, 10, 347221, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=212, profile_id=260, cluster_id=8, data=Serialized[b'\x01%\x06\x01\xff\x08\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=220, rssi=-45)
2025-01-10 19:31:10.347 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0x0008] Received ZCL frame: b'\x01%\x06\x01\xff\x08\x00'
2025-01-10 19:31:10.347 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0x0008] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x01>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 0>, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=37, command_id=6, *direction=<Direction.Client_to_Server: 0>)
2025-01-10 19:31:10.348 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0x0008] Decoded ZCL frame: LevelControl:step_with_on_off(step_mode=<StepMode.Down: 1>, step_size=255, transition_time=8)
--
2025-01-10 19:31:10.372 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 31, 10, 372777, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=213, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x10&\x00\x02\x00\x000\x01!\x08\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=220, rssi=-45)
2025-01-10 19:31:10.373 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x10&\x00\x02\x00\x000\x01!\x08\x00'
2025-01-10 19:31:10.373 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=38, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 19:31:10.373 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=2, param2=3145728, press_type=1, param4=33, param5=8)
--
2025-01-10 19:31:10.944 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 31, 10, 944803, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=214, profile_id=260, cluster_id=64512, data=Serialized[b"\x1d\x0b\x10'\x00\x02\x00\x000\x03!\r\x00"], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=228, rssi=-43)
2025-01-10 19:31:10.945 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b"\x1d\x0b\x10'\x00\x02\x00\x000\x03!\r\x00"
2025-01-10 19:31:10.946 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=39, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 19:31:10.947 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=2, param2=3145728, press_type=3, param4=33, param5=13)

# Button 3 long press
2025-01-10 19:31:18.895 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 31, 18, 895449, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=215, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x10(\x00\x03\x00\x000\x00!\x00\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=255, rssi=-34)
2025-01-10 19:31:18.896 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x10(\x00\x03\x00\x000\x00!\x00\x00'
2025-01-10 19:31:18.896 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=40, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 19:31:18.897 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=3, param2=3145728, press_type=0, param4=33, param5=0)
--
2025-01-10 19:31:19.665 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 31, 19, 664988, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=216, profile_id=260, cluster_id=8, data=Serialized[b'\x01)\x06\x01\xff\x08\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=255, rssi=-35)
2025-01-10 19:31:19.665 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0x0008] Received ZCL frame: b'\x01)\x06\x01\xff\x08\x00'
2025-01-10 19:31:19.665 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0x0008] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x01>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 0>, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=41, command_id=6, *direction=<Direction.Client_to_Server: 0>)
2025-01-10 19:31:19.666 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0x0008] Decoded ZCL frame: LevelControl:step_with_on_off(step_mode=<StepMode.Down: 1>, step_size=255, transition_time=8)
--
2025-01-10 19:31:19.689 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 31, 19, 689139, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=217, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x10*\x00\x03\x00\x000\x01!\x08\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=255, rssi=-36)
2025-01-10 19:31:19.689 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x10*\x00\x03\x00\x000\x01!\x08\x00'
2025-01-10 19:31:19.689 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=42, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 19:31:19.689 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=3, param2=3145728, press_type=1, param4=33, param5=8)
--
2025-01-10 19:31:20.489 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 31, 20, 489157, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=218, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x10+\x00\x03\x00\x000\x01!\x10\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=255, rssi=-35)
2025-01-10 19:31:20.489 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x10+\x00\x03\x00\x000\x01!\x10\x00'
2025-01-10 19:31:20.489 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=43, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 19:31:20.489 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=3, param2=3145728, press_type=1, param4=33, param5=16)
--
2025-01-10 19:31:20.529 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 31, 20, 529767, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=219, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x10,\x00\x03\x00\x000\x03!\x10\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=255, rssi=-35)
2025-01-10 19:31:20.530 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x10,\x00\x03\x00\x000\x03!\x10\x00'
2025-01-10 19:31:20.530 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=44, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 19:31:20.530 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=3, param2=3145728, press_type=3, param4=33, param5=16)

# Button 4 long press
2025-01-10 19:31:27.584 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 31, 27, 584330, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=220, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x10-\x00\x04\x00\x000\x00!\x00\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=255, rssi=-36)
2025-01-10 19:31:27.584 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x10-\x00\x04\x00\x000\x00!\x00\x00'
2025-01-10 19:31:27.585 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=45, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 19:31:27.585 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=4, param2=3145728, press_type=0, param4=33, param5=0)
--
2025-01-10 19:31:28.359 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 31, 28, 359582, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=221, profile_id=260, cluster_id=8, data=Serialized[b'\x01.\x06\x01\xff\x08\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=252, rssi=-37)
2025-01-10 19:31:28.360 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0x0008] Received ZCL frame: b'\x01.\x06\x01\xff\x08\x00'
2025-01-10 19:31:28.360 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0x0008] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x01>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=0, direction=<Direction.Client_to_Server: 0>, disable_default_response=0, reserved=0, *is_cluster=True, *is_general=False), tsn=46, command_id=6, *direction=<Direction.Client_to_Server: 0>)
2025-01-10 19:31:28.361 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0x0008] Decoded ZCL frame: LevelControl:step_with_on_off(step_mode=<StepMode.Down: 1>, step_size=255, transition_time=8)
--
2025-01-10 19:31:28.382 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 31, 28, 382935, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=222, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x10/\x00\x04\x00\x000\x01!\x08\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=255, rssi=-36)
2025-01-10 19:31:28.383 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x10/\x00\x04\x00\x000\x01!\x08\x00'
2025-01-10 19:31:28.383 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=47, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 19:31:28.383 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=4, param2=3145728, press_type=1, param4=33, param5=8)
--
2025-01-10 19:31:29.181 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 31, 29, 181030, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=223, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x100\x00\x04\x00\x000\x01!\x10\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=255, rssi=-35)
2025-01-10 19:31:29.181 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x100\x00\x04\x00\x000\x01!\x10\x00'
2025-01-10 19:31:29.182 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=48, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 19:31:29.182 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=4, param2=3145728, press_type=1, param4=33, param5=16)
--
2025-01-10 19:31:29.275 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 18, 31, 29, 275227, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=224, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x101\x00\x04\x00\x000\x03!\x11\x00'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=255, rssi=-36)
2025-01-10 19:31:29.275 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x101\x00\x04\x00\x000\x03!\x11\x00'
2025-01-10 19:31:29.276 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=49, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 19:31:29.276 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=4, param2=3145728, press_type=3, param4=33, param5=17)

@gtunes-dev yes, I didn't notice this at first, but you're right, the transition_time param seems to be 4 when using the dial, and 8 for the button long-press events. Could be used to discriminate the event source, I think, yes. And yes, I'll try to get this fixed.

Generally I think there's two approaches to resolve this:

  1. Write a custom implementation of the LevelControl cluster, inspecting the transition_time field to discriminate between dial roation and button long press event sources, only emitting events for the dial. The drawback here is that we rely on Philips not changing these values in a future firmware update.
  2. Completely discarding all events we get for the LevelControl cluster and instead adding logic to the PhilipsRdm002RemoteCluster. This is viable because we also receive button events for dial rotations, though at the moment we discard those because the device also sends LevelControl events. We could trigger our own LevelControl that are based on the button events, while discarding the LevelControl events from the device altogether. (I hope this makes sense. If not, let me know and I can explain in more detail)

Without having had a look into what changes would be needed in detail, I thinks option 2 would be preferable. What do you think @TheJulianJES?

Also, based on these logs, I think param5 should be changed from uint16 to int16, which makes left/right dial rotation result in a negative and a positive number respectively, instead of a number close to 65535 and one close to 0, respectively.

With param5 changed to t.int16s, I get this for dial rotations: (filtered for only PhilipsRdm002RemoteCluster events)

logs
# dial left rotation
2025-01-10 20:31:51.126 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 19, 31, 51, 126434, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=247, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x10G\x00\x14\x00\x010\x01)\xf1\xff!d\x00)\xf1\xff!d\x00)\xf1\xff!\x90\x01'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=220, rssi=-45)
2025-01-10 20:31:51.126 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x10G\x00\x14\x00\x010\x01)\xf1\xff!d\x00)\xf1\xff!d\x00)\xf1\xff!\x90\x01'
2025-01-10 20:31:51.127 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=71, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 20:31:51.127 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=20, param2=3145984, press_type=1, param4=41, param5=-15)
--
2025-01-10 20:31:51.528 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 19, 31, 51, 528430, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=248, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x10H\x00\x14\x00\x010\x02)\xf1\xff!\x90\x01)\xe2\xff!\xf4\x01)\xf1\xff!\x90\x01'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=232, rssi=-42)
2025-01-10 20:31:51.528 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x10H\x00\x14\x00\x010\x02)\xf1\xff!\x90\x01)\xe2\xff!\xf4\x01)\xf1\xff!\x90\x01'
2025-01-10 20:31:51.528 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=72, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 20:31:51.529 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=20, param2=3145984, press_type=2, param4=41, param5=-15)
--
2025-01-10 20:31:54.299 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 19, 31, 54, 299233, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=251, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x10K\x00\x14\x00\x010\x01)Z\xff!d\x00)Z\xff!d\x00)Z\xff!\x90\x01'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=236, rssi=-41)
2025-01-10 20:31:54.299 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x10K\x00\x14\x00\x010\x01)Z\xff!d\x00)Z\xff!d\x00)Z\xff!\x90\x01'
2025-01-10 20:31:54.300 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=75, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 20:31:54.300 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=20, param2=3145984, press_type=1, param4=41, param5=-166)
--
2025-01-10 20:31:54.700 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 19, 31, 54, 700472, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=252, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x10L\x00\x14\x00\x010\x02)i\xff!\x90\x01)\xc3\xfe!\xf4\x01)i\xff!\x90\x01'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=228, rssi=-43)
2025-01-10 20:31:54.700 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x10L\x00\x14\x00\x010\x02)i\xff!\x90\x01)\xc3\xfe!\xf4\x01)i\xff!\x90\x01'
2025-01-10 20:31:54.700 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=76, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 20:31:54.701 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=20, param2=3145984, press_type=2, param4=41, param5=-151)
--

# dial right rotation
2025-01-10 20:32:05.812 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 19, 32, 5, 812139, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=255, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x10O\x00\x14\x00\x010\x01)\x0f\x00!d\x00)\x0f\x00!d\x00)\x0f\x00!\x90\x01'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=128, rssi=-68)
2025-01-10 20:32:05.812 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x10O\x00\x14\x00\x010\x01)\x0f\x00!d\x00)\x0f\x00!d\x00)\x0f\x00!\x90\x01'
2025-01-10 20:32:05.813 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=79, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 20:32:05.813 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=20, param2=3145984, press_type=1, param4=41, param5=15)
--
2025-01-10 20:32:07.718 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 19, 32, 7, 718056, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=1, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x10Q\x00\x14\x00\x010\x01)K\x00!d\x00)K\x00!d\x00)K\x00!\x90\x01'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=180, rssi=-55)
2025-01-10 20:32:07.718 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x10Q\x00\x14\x00\x010\x01)K\x00!d\x00)K\x00!d\x00)K\x00!\x90\x01'
2025-01-10 20:32:07.718 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=81, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 20:32:07.719 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=20, param2=3145984, press_type=1, param4=41, param5=75)
--
2025-01-10 20:32:08.112 DEBUG (MainThread) [zigpy.application] Received a packet: ZigbeePacket(timestamp=datetime.datetime(2025, 1, 10, 19, 32, 8, 112519, tzinfo=datetime.timezone.utc), priority=0, src=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x514D), src_ep=1, dst=AddrModeAddress(addr_mode=<AddrMode.NWK: 2>, address=0x0000), dst_ep=1, source_route=None, extended_timeout=False, tsn=2, profile_id=260, cluster_id=64512, data=Serialized[b'\x1d\x0b\x10R\x00\x14\x00\x010\x02)\x8b\x02!\x90\x01)\xd6\x02!\xf4\x01)\x8b\x02!\x90\x01'], tx_options=<TransmitOptions.NONE: 0>, radius=0, non_member_radius=0, lqi=188, rssi=-53)
2025-01-10 20:32:08.112 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Received ZCL frame: b'\x1d\x0b\x10R\x00\x14\x00\x010\x02)\x8b\x02!\x90\x01)\xd6\x02!\xf4\x01)\x8b\x02!\x90\x01'
2025-01-10 20:32:08.113 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame header: ZCLHeader(frame_control=FrameControl<0x1D>(frame_type=<FrameType.CLUSTER_COMMAND: 1>, is_manufacturer_specific=True, direction=<Direction.Server_to_Client: 1>, disable_default_response=1, reserved=0, *is_cluster=True, *is_general=False), manufacturer=4107, tsn=82, command_id=0, *direction=<Direction.Server_to_Client: 1>)
2025-01-10 20:32:08.113 DEBUG (MainThread) [zigpy.zcl] [0x514D:1:0xfc00] Decoded ZCL frame: PhilipsRdm002RemoteCluster:notification(button=20, param2=3145984, press_type=2, param4=41, param5=651)

@fholzer
Copy link
Contributor Author

fholzer commented Jan 11, 2025

Okay, seems like option 2 isn't that easy after all. To maintain compatibility, any emitted events would need to have params set, though that field is generated by zha's Device:emit_zha_event only if the cluster's commands dict has a proper ZCLCommandDef present. The issue is that the fields command definition would be different between button presses and dial rotations...

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

2 participants