zigpy / zha-device-handlers

ZHA device handlers bridge the functionality gap created when manufacturers deviate from the ZCL specification, handling deviations and exceptions by parsing custom messages to and from Zigbee devices.
Apache License 2.0
685 stars 638 forks source link

[Device Support Request] Busch-Jaeger Zigbee Light Link control devices (especially 6737) #610

Open docgalaxyblock opened 3 years ago

docgalaxyblock commented 3 years ago

Busch Jaeger Productsite Already supported at Z2M: https://www.zigbee2mqtt.io/devices/6735_6736_6737.html And deconz

Is your feature request related to a problem? Please describe. My device (6737-XX) recognizes as RM01 I am able to switch it it also shows a brigthness slider but the connected module is only a switch

Describe the solution you'd like

Device signature ``` { "node_descriptor": "NodeDescriptor(byte1=17, byte2=64, mac_capability_flags=142, manufacturer_code=4398, maximum_buffer_size=89, maximum_incoming_transfer_size=61, server_mask=0, maximum_outgoing_transfer_size=61, descriptor_capability_field=0)", "endpoints": { "10": { "profile_id": 49246, "device_type": "0x0810", "in_clusters": [ "0x0000", "0x1000" ], "out_clusters": [ "0x0003", "0x0004", "0x0005", "0x0006", "0x0008", "0x0019", "0x0300", "0x1000" ] }, "11": { "profile_id": 49246, "device_type": "0x0810", "in_clusters": [ "0x0000", "0x1000" ], "out_clusters": [ "0x0003", "0x0004", "0x0005", "0x0006", "0x0008", "0x0300", "0x1000" ] }, "12": { "profile_id": 49246, "device_type": "0x0810", "in_clusters": [ "0x0000", "0x1000" ], "out_clusters": [ "0x0003", "0x0004", "0x0005", "0x0006", "0x0008", "0x0300", "0x1000" ] }, "13": { "profile_id": 49246, "device_type": "0x0810", "in_clusters": [ "0x0000", "0x1000" ], "out_clusters": [ "0x0003", "0x0004", "0x0005", "0x0006", "0x0008", "0x0300", "0x1000" ] }, "18": { "profile_id": 49246, "device_type": "0x0000", "in_clusters": [ "0x0000", "0x0003", "0x0004", "0x0005", "0x0006", "0x0008" ], "out_clusters": [] } }, "manufacturer": "Busch-Jaeger", "model": "RM01", "class": "zigpy.device.Device" } ```

Device signature and pairing log at my dev VM

Additional context I am not shure but it could be that Z2M pools the state of the switch because if I use the device buttons it recognizes the change 5s later

github-actions[bot] commented 2 years ago

There hasn't been any activity on this issue recently. Due to the high number of incoming GitHub notifications, we have to clean some of the old issues, as many of them have already been resolved with the latest updates. Please make sure to update to the latest version and check if that solves the issue. Let us know if that works for you by adding a comment 👍 This issue has now been marked as stale and will be closed if no further activity occurs. Thank you for your contributions.

docgalaxyblock commented 2 years ago

Comment for the bot 😉

ornago commented 2 years ago

Unfortunately your Device Link broke?! Productsite I recently switched from deconz to ZHA within Home-Assistant, because of latency problems. It's quite a little pain changing all devices and my 6735-84 ZigBee Light Link control element especially. When I switch on the light on the Buttons i get no change of state in the app. Is that your problem too? I would really appreciate a better support with ZHA. Is there any way i can contribute?

MattWestb commented 2 years ago

Then you is pairing the device is ZHA pulling one ZLL group from it and adding it in the Zigbee groups (Old IKEA remotes is using ZLL and ZHA is getting the random group they is using the pairing the device) ?

Also little logs then pairing and the device signature can being good if the devs like to looking on this case (they dont if all info is missing) ;-))

ornago commented 2 years ago

Not really getting what you want to say with your first sentence. Should I pair the device in a different way or configure it with cluster settings?

Here is the cluster signature:

{
  "node_descriptor": "NodeDescriptor(logical_type=<LogicalType.Router: 1>, complex_descriptor_available=0, user_descriptor_available=1, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress|RxOnWhenIdle|MainsPowered|FullFunctionDevice: 142>, manufacturer_code=4398, maximum_buffer_size=89, maximum_incoming_transfer_size=61, server_mask=0, maximum_outgoing_transfer_size=61, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)",
  "endpoints": {
    "10": {
      "profile_id": 49246,
      "device_type": "0x0810",
      "in_clusters": [
        "0x0000",
        "0x1000"
      ],
      "out_clusters": [
        "0x0003",
        "0x0004",
        "0x0005",
        "0x0006",
        "0x0008",
        "0x0019",
        "0x0300",
        "0x1000"
      ]
    },
    "18": {
      "profile_id": 49246,
      "device_type": "0x0100",
      "in_clusters": [
        "0x0000",
        "0x0003",
        "0x0004",
        "0x0005",
        "0x0006",
        "0x0008"
      ],
      "out_clusters": []
    }
  },
  "manufacturer": "Busch-Jaeger",
  "model": "RM01",
  "class": "zigpy.device.Device"
}

Also tried to reconnect the device, but I am not sure if the device is doing anything right now. Normally I have to press both buttons to get it into programming mode. After blinking alternately the LEDs will be illuminated. Stop pressing the rocker and briefly press both sides of it again. Unfortunately can't reproduce this anymore. Hope I didn't broke that thing?!

No matter what, here ist the log output while trying to connect:

[0x0000:zdo] ZDO request ZDOCmd.Mgmt_Permit_Joining_req: [60, <Bool.false: 0>]
[0x7577:2:0x0400] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=71 command_id=Command.Report_Attributes>
[0x7577:2:0x0400] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint16_t, value=10552>)]]
[0x7577:2:0x0400] Attribute report received: measured_value=10552
[0xc0c3:2:0x0406] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=171 command_id=Command.Report_Attributes>
[0xc0c3:2:0x0406] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=bitmap8, value=bitmap8.1>)]]
[0xc0c3:2:0x0406] Attribute report received: occupancy=1
[0xc0c3:2:0x0400] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=172 command_id=Command.Report_Attributes>
[0xc0c3:2:0x0400] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint16_t, value=7325>)]]
[0xc0c3:2:0x0400] Attribute report received: measured_value=7325
[0xBED8:1:0x0b04]: async_update
[0xbed8:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=79 command_id=Command.Read_Attributes_rsp>
[0xc0c3:2:0x0406] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=173 command_id=Command.Report_Attributes>
[0xc0c3:2:0x0406] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=bitmap8, value=bitmap8.0>)]]
[0xc0c3:2:0x0406] Attribute report received: occupancy=0
[0xc0c3:2:0x0406] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=175 command_id=Command.Report_Attributes>
[0xc0c3:2:0x0406] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=bitmap8, value=bitmap8.1>)]]
[0xc0c3:2:0x0406] Attribute report received: occupancy=1
[0xc0c3:2:0x0400] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=176 command_id=Command.Report_Attributes>
[0xc0c3:2:0x0400] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint16_t, value=5986>)]]
[0xc0c3:2:0x0400] Attribute report received: measured_value=5986
[0xc0c3:2:0x0406] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=177 command_id=Command.Report_Attributes>
[0xc0c3:2:0x0406] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=bitmap8, value=bitmap8.0>)]]
[0xc0c3:2:0x0406] Attribute report received: occupancy=0
[0xBED8:1:0x0b04]: async_update
[0xbed8:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=84 command_id=Command.Read_Attributes_rsp>
[0x134a:1:0x0008] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=34 command_id=Command.Report_Attributes>
[0x134a:1:0x0008] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint8_t, value=254>)]]
[0x134a:1:0x0008] Attribute report received: current_level=254
[0x134A:1:0x0008]: received attribute: 0 update with value: 254
[0x134a:1:0x0006] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=33 command_id=Command.Report_Attributes>
[0x134a:1:0x0006] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=Bool, value=Bool.false>)]]
[0x134a:1:0x0006] Attribute report received: on_off=0
[0xc0c3:2:0x0402] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=178 command_id=Command.Report_Attributes>
[0xc0c3:2:0x0402] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=int16s, value=1912>)]]
[0xc0c3:2:0x0402] Attribute report received: measured_value=1912
[0xc0c3:2:0x0400] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=179 command_id=Command.Report_Attributes>
[0xc0c3:2:0x0400] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint16_t, value=7905>)]]
[0xc0c3:2:0x0400] Attribute report received: measured_value=7905
[0xBED8:1:0x0b04]: async_update
[0xbed8:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=90 command_id=Command.Read_Attributes_rsp>
[0xc0c3:2:0x0406] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=180 command_id=Command.Report_Attributes>
[0xc0c3:2:0x0406] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=bitmap8, value=bitmap8.1>)]]
[0xc0c3:2:0x0406] Attribute report received: occupancy=1
[0xc0c3:2:0x0400] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=181 command_id=Command.Report_Attributes>
[0xc0c3:2:0x0400] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint16_t, value=6334>)]]
[0xc0c3:2:0x0400] Attribute report received: measured_value=6334
[0xc0c3:2:0x0406] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=182 command_id=Command.Report_Attributes>
[0xc0c3:2:0x0406] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=bitmap8, value=bitmap8.0>)]]
[0xc0c3:2:0x0406] Attribute report received: occupancy=0
[0xc0c3:2:0x0406] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=183 command_id=Command.Report_Attributes>
[0xc0c3:2:0x0406] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=bitmap8, value=bitmap8.1>)]]
[0xc0c3:2:0x0406] Attribute report received: occupancy=1
[0xBED8:1:0x0b04]: async_update
[0xbed8:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=96 command_id=Command.Read_Attributes_rsp>
[0xc0c3:2:0x0406] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=184 command_id=Command.Report_Attributes>
[0xc0c3:2:0x0406] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=bitmap8, value=bitmap8.0>)]]
[0xc0c3:2:0x0406] Attribute report received: occupancy=0
MattWestb commented 2 years ago

Can you pleas putting ``` before and after the code block and deleting the ` before and after it so its being one code block and easier looking in and not losing its formatting.

MattWestb commented 2 years ago

Now its possible reading nicely :-))

But only attribute reports from your sensors in the log.

What i was saying is that Zigbee light swishes can configuring one light group then there is being reseted and joined one network. ZHA can reading this group then its pairing the device and adding it as one group with one strange name and the switch is sending all commands to that group. They is looking like that:

Group Information
Name: No name group 0x9CED

Group Id: 0x9ced

Some light switches is not doing it at all and other is making it wrong or using the same group for all switches of the same model so it not working with more switches.

If you is having one light group like this you shall putting you lights in it and the switch is controlling them and the status of the group is the status of the lights in the group (switches dont have any status they is only sending commands)

ornago commented 2 years ago

I am not sure if you know this 6735-84 (84 is just the color code) device. It is sitting on a 6715 U device in the wall outlet. I don't know exactly but i think the rocker of 6735 is controlling the light of 6715 directly? Or is it in one zigbee group you described? Maybe i have to get the light controller (6715) and the rocker of the switch (6735) into one group to see a state change in my Home-Assistant App? Unfortunately I can only see and connect the rocker into my network. The light is an entity of that switch device.

Got my switch working again and made a new connection to my zigbee network. This is the log dump:

[0x0000:zdo] ZDO request ZDOCmd.Mgmt_Permit_Joining_req: [60, <Bool.false: 0>]
[0xa3c5:2:0x0406] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=138 command_id=Command.Report_Attributes>
[0xa3c5:2:0x0406] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=bitmap8, value=bitmap8.1>)]]
[0xa3c5:2:0x0406] Attribute report received: occupancy=1
[0xa3c5:2:0x0400] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=139 command_id=Command.Report_Attributes>
[0xa3c5:2:0x0400] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint16_t, value=5337>)]]
[0xa3c5:2:0x0400] Attribute report received: measured_value=5337
[0xBED8:1:0x0b04]: async_update
[0xbed8:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=229 command_id=Command.Read_Attributes_rsp>
[0xa3c5:2:0x0406] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=140 command_id=Command.Report_Attributes>
[0xa3c5:2:0x0406] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=bitmap8, value=bitmap8.0>)]]
[0xa3c5:2:0x0406] Attribute report received: occupancy=0
[0x3e82:zdo] ZDO request ZDOCmd.IEEE_addr_rsp: [<Status.SUCCESS: 0>, ec:1b:bd:ff:fe:93:ed:67, 0x3E82, None, None, []]
[0x3e82:zdo] Unsupported ZDO request:ZDOCmd.IEEE_addr_rsp
[0x3e82:zdo] ZDO request ZDOCmd.IEEE_addr_rsp: [<Status.SUCCESS: 0>, ec:1b:bd:ff:fe:93:ed:67, 0x3E82, None, None, []]
[0x3e82:zdo] Unsupported ZDO request:ZDOCmd.IEEE_addr_rsp
[0x7577:2:0x0406] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=73 command_id=Command.Report_Attributes>
[0x7577:2:0x0406] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=bitmap8, value=bitmap8.1>)]]
[0x7577:2:0x0406] Attribute report received: occupancy=1
[0x7577:2:0x0400] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=74 command_id=Command.Report_Attributes>
[0x7577:2:0x0400] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint16_t, value=12464>)]]
[0x7577:2:0x0400] Attribute report received: measured_value=12464
Device 0x6384 (d8:5d:ef:11:a1:00:46:30) joined the network
Device d8:5d:ef:11:a1:00:46:30 changed id (0x6384 => 0x6384)
[0x6384] Skipping initialization, device is fully initialized
Device is initialized <Device model='RM01' manuf='Busch-Jaeger' nwk=0x6384 ieee=d8:5d:ef:11:a1:00:46:30 is_initialized=True>
Checking quirks for Busch-Jaeger RM01 (d8:5d:ef:11:a1:00:46:30)
Considering <class 'zhaquirks.xbee.xbee_io.XBeeSensor'>
Fail because endpoint list mismatch: {232, 230} {18, 10}
Considering <class 'zhaquirks.xbee.xbee3_io.XBee3Sensor'>
Fail because endpoint list mismatch: {232, 230} {18, 10}
Considering <class 'zhaquirks.smartthings.tag_v4.SmartThingsTagV4'>
Fail because endpoint list mismatch: {1} {18, 10}
Considering <class 'zhaquirks.smartthings.multi.SmartthingsMultiPurposeSensor'>
Fail because endpoint list mismatch: {1} {18, 10}
Considering <class 'zhaquirks.netvox.z308e3ed.Z308E3ED'>
Fail because endpoint list mismatch: {1} {18, 10}
Considering <class 'zhaquirks.gledopto.soposhgu10.SoposhGU10'>
Fail because endpoint list mismatch: {11, 13} {18, 10}
Considering <class 'bellows.zigbee.application.EZSPCoordinator'>
Fail because endpoint list mismatch: {1} {18, 10}
[0x6384:zdo] ZDO request ZDOCmd.Device_annce: [0x6384, d8:5d:ef:11:a1:00:46:30, 142]
device - 25476:d8:5d:ef:11:a1:00:46:30 entering async_device_initialized - is_new_join: False
device - 25476:d8:5d:ef:11:a1:00:46:30 has been reset and re-added or its nwk address changed
skipping discovery for previously discovered device - 25476:d8:5d:ef:11:a1:00:46:30
[25476](RM01): started configuration
[25476:ZDO](RM01): 'async_configure' stage succeeded
[25476:10:0x0000]: finished channel configuration
[0x6384] Delivery error for seq # 0xec, on endpoint id 0 cluster 0x0021: message send failure
[25476:10:0x0008]: Failed to bind 'level' cluster: [0x6384:0:0x0021]: Message send failure
[25476:10:0x0008]: finished channel configuration
[25476:10:0x0019]: finished channel configuration
[0x6384] Delivery error for seq # 0xee, on endpoint id 0 cluster 0x0021: message send failure
[25476:10:0x0006]: Failed to bind 'on_off' cluster: [0x6384:0:0x0021]: Message send failure
[25476:10:0x0006]: finished channel configuration
Device d8:5d:ef:11:a1:00:46:30 already exists. Updating it.
[0x6384] Delivery error for seq # 0xf0, on endpoint id 0 cluster 0x0021: message send failure
[25476:10:0x0005]: Failed to bind 'scenes' cluster: [0x6384:0:0x0021]: Message send failure
[25476:10:0x0005]: finished channel configuration
[0x6384] Delivery error for seq # 0xf2, on endpoint id 0 cluster 0x0021: message send failure
[25476:10:0x0300]: Failed to bind 'light_color' cluster: [0x6384:0:0x0021]: Message send failure
[25476:10:0x0300]: finished channel configuration
[0x6384] Delivery error for seq # 0xf4, on endpoint id 0 cluster 0x0021: message send failure
[25476:18:0x0006]: Failed to bind 'on_off' cluster: [0x6384:0:0x0021]: Message send failure
[0x6384] Delivery error for seq # 0xf6, on endpoint id 0 cluster 0x0021: message send failure
[25476:18:0x0008]: Failed to bind 'level' cluster: [0x6384:0:0x0021]: Message send failure
[0x6384] Delivery error for seq # 0xf8, on endpoint id 18 cluster 0x0006: message send failure
[25476:18:0x0006]: failed to set reporting on 'on_off' cluster for: [0x6384:18:0x0006]: Message send failure
[25476:18:0x0006]: finished channel configuration
[25476:18:0x0000]: finished channel configuration
[0x6384] Delivery error for seq # 0xfa, on endpoint id 18 cluster 0x0008: message send failure
[25476:18:0x0008]: failed to set reporting on 'level' cluster for: [0x6384:18:0x0008]: Message send failure
[25476:18:0x0008]: finished channel configuration
[25476:18:0x0006]: 'async_configure' stage succeeded
[25476:18:0x0008]: 'async_configure' stage succeeded
[25476:18:0x0000]: 'async_configure' stage succeeded
[0x6384:10:0x1000] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=CLUSTER_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=234 command_id=65>
[25476:10:0x0000]: 'async_configure' stage succeeded
[25476:10:0x1000]: 'async_configure' stage succeeded
[25476:10:0x0008]: 'async_configure' stage succeeded
[25476:10:0x0006]: 'async_configure' stage succeeded
[25476:10:0x0019]: 'async_configure' stage succeeded
[25476:10:0x0005]: 'async_configure' stage succeeded
[25476:10:0x0300]: 'async_configure' stage succeeded
[25476](RM01): completed configuration
[25476](RM01): stored in registry: ZhaDeviceEntry(name='Busch-Jaeger RM01', ieee='d8:5d:ef:11:a1:00:46:30', last_seen=1633856543.023593)
[0x6384:18:0x0003] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=252 command_id=Command.Default_Response>
[25476:18:0x0003]: executed 'trigger_effect' command with args: '(2, 0)' kwargs: '{}' result: [64, <Status.SUCCESS: 0>]
[25476](RM01): started initialization
[25476:ZDO](RM01): 'async_initialize' stage succeeded
[25476:10:0x0000]: initializing channel: from_cache: False
[25476:10:0x0000]: finished channel configuration
[25476:10:0x1000]: initializing channel: from_cache: False
[25476:10:0x1000]: finished channel configuration
[25476:10:0x0008]: initializing channel: from_cache: False
[25476:10:0x0008]: finished channel configuration
[25476:10:0x0006]: initializing channel: from_cache: False
[25476:10:0x0006]: finished channel configuration
[25476:10:0x0019]: initializing channel: from_cache: False
[25476:10:0x0019]: finished channel configuration
[25476:10:0x0005]: initializing channel: from_cache: False
[25476:10:0x0005]: finished channel configuration
[25476:10:0x0300]: initializing channel: from_cache: False
[25476:10:0x0300]: finished channel configuration
[25476:18:0x0006]: initializing channel: from_cache: False
[25476:18:0x0008]: initializing channel: from_cache: False
[25476:18:0x0000]: initializing channel: from_cache: False
[25476:18:0x0000]: finished channel configuration
[25476:10:0x0000]: 'async_initialize' stage succeeded
[25476:10:0x1000]: 'async_initialize' stage succeeded
[25476:10:0x0008]: 'async_initialize' stage succeeded
[25476:10:0x0006]: 'async_initialize' stage succeeded
[25476:10:0x0019]: 'async_initialize' stage succeeded
[25476:10:0x0005]: 'async_initialize' stage succeeded
[25476:10:0x0300]: 'async_initialize' stage succeeded
[0x6384:18:0x0006] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=254 command_id=Command.Read_Attributes_rsp>
[25476:18:0x0006]: finished channel configuration
[0x6384:18:0x0008] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=0 command_id=Command.Read_Attributes_rsp>
[25476:18:0x0008]: received attribute: 0 update with value: 254
[25476:18:0x0008]: finished channel configuration
[25476:18:0x0006]: 'async_initialize' stage succeeded
[25476:18:0x0008]: 'async_initialize' stage succeeded
[25476:18:0x0000]: 'async_initialize' stage succeeded
[25476](RM01): power source: Mains
[25476](RM01): completed initialization
[0xdbce:2:0x0406] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=66 command_id=Command.Report_Attributes>
[0xdbce:2:0x0406] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=bitmap8, value=bitmap8.1>)]]
[0xdbce:2:0x0406] Attribute report received: occupancy=1
[0xdbce:2:0x0400] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=67 command_id=Command.Report_Attributes>
[0xdbce:2:0x0400] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint16_t, value=18117>)]]
[0xdbce:2:0x0400] Attribute report received: measured_value=18117
[0x7577:2:0x0406] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=75 command_id=Command.Report_Attributes>
[0x7577:2:0x0406] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=bitmap8, value=bitmap8.0>)]]
[0x7577:2:0x0406] Attribute report received: occupancy=0
[0xBED8:1:0x0b04]: async_update
[0xbed8:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=5 command_id=Command.Read_Attributes_rsp>
[0x7577:2:0x0400] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=76 command_id=Command.Report_Attributes>
[0x7577:2:0x0400] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint16_t, value=12354>)]]
[0x7577:2:0x0400] Attribute report received: measured_value=12354
[0xdbce:2:0x0400] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=68 command_id=Command.Report_Attributes>
[0xdbce:2:0x0400] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint16_t, value=18095>)]]
[0xdbce:2:0x0400] Attribute report received: measured_value=18095
[0x6384:zdo] ZDO request ZDOCmd.Match_Desc_req: [0xFFFD, 49246, [6], []]
[0x6384:zdo] ZDO request ZDOCmd.Match_Desc_req: [0xFFFD, 260, [6], []]
[0x7577:2:0x0406] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=77 command_id=Command.Report_Attributes>
[0x7577:2:0x0406] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=bitmap8, value=bitmap8.1>)]]
[0x7577:2:0x0406] Attribute report received: occupancy=1
[0x6384:zdo] ZDO request ZDOCmd.Match_Desc_req: [0xFFFD, 260, [25], []]
[0xBED8:1:0x0b04]: async_update
[0xbed8:1:0x0b04] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=True> manufacturer=None tsn=13 command_id=Command.Read_Attributes_rsp>
[0x7577:2:0x0400] ZCL deserialize: <ZCLHeader frame_control=<FrameControl frame_type=GLOBAL_COMMAND manufacturer_specific=False is_reply=True disable_default_response=False> manufacturer=None tsn=78 command_id=Command.Report_Attributes>
[0x7577:2:0x0400] ZCL request 0x000a: [[Attribute(attrid=0, value=<TypeValue type=uint16_t, value=11287>)]]
[0x7577:2:0x0400] Attribute report received: measured_value=11287
MattWestb commented 2 years ago

In ZHA is light switches is one relay that is switching on / off (perhaps dimming) one light (or somthing else) and you is getting one light entry in ZHA.

The "controller" (some saying remote) that is switching the light on/off is normally controlling the relay direct and do not getting and entry in ZHA if its main powered (if battery you is getting one battery entry).

It can being that the controller is not sending and commands to other devices and only working local or its also sending the commands (on/of dim up/down) for steering light to one group that is random after reset (then ZHA is reading it and adding it in groups) or if its possible group that is added to the device with zigbee commands (if the device is supporting it).

Now to your device its have 2 endpoints: EP 10 = "device_type": "0x0810", = COLOR_SCENE_CONTROLLER And out cluster "0x0004", is the group cluster.

EP 18 = "device_type": = "0x0100", DIMMABLE_LIGHT And in cluster "0x0004", is the group cluster.

So you can adding groups to the light part on EP 10 on in cluster 0x0004 (is normally being made in the group panele in ZHA).

The controller part is EP 18 with in group cluster 0x0004 you is normally binding the controller to one group so the controller is sending all light commands to groups. Normal you need binding (made from the device card manage cluster) on/off (0x0006) and light level cluster (0x0008) and also group cluster (0x0004) (option color cluster 0x0300) to one group you have making and adding light to it.

The work flow is making one group if not having one and adding lights to the group. Binding the controller to the group (out cluster on EP 10) so it sending commands to the lights in the group. ZHA is getting the status from the light is reporting there status to the coordinator. The controller is only sending the commands to the group and the coordinator can catching them then listening to the group and you can see them in events log under zha_evens and using them in automatons.

The binding is making the light and controller is working autonomous also then the coordinator / host system is not online.

Edit: I have not seen and light link group in your log then the device was already configurated and ZHA was using the saved data from it and not reading all new.

ornago commented 2 years ago

Hey, thanks for your long post. I did try to do your work flow but didn't got any further. I do have some groups in the ZHA Configuration Tab. One is called 'Default Lightlink Group', so I added the deconz stick and the devices to it. I also made a new group for each switch in combination with deconz. In the device configuration i tried to bind the EP 10 clusters to the group and also made a 'device reconfiguration'

Bildschirmfoto 2021-10-16 um 00 59 51 Bildschirmfoto 2021-10-16 um 00 38 04

But still no state change in the frontend while triggering with the rocker. I do get a change of state when asking an cluster attribute.

Bildschirmfoto 2021-10-16 um 01 04 49

What am I missing?

docgalaxyblock commented 2 years ago

@ornago Regarding the incorrect report to ZHA that the switch is a dimmable light I found a solution. https://www.home-assistant.io/integrations/zha#modifying-the-device-type

And yes my one relais (bathroom vent) does not report the state back...

ornago commented 2 years ago

Thanks for your information, I'm not sure if the naming is wrong. The endpoint 10 is the rocker or you could call it a switch. It's naming is 'COLOR_SCENE_CONTROLLER'. There is nothing with color changing but the rest fits. And then there is the endpoint 18 'DIMMABLE_LIGHT' which is the electronical device dimming my light bulb. Can't say if a naming would help, but please tell me if it does.

OngiiDE commented 2 years ago

I am also desperately needing ZHA support to the Busch 673x family. How can I support?

github-actions[bot] commented 1 year ago

There hasn't been any activity on this issue recently. Due to the high number of incoming GitHub notifications, we have to clean some of the old issues, as many of them have already been resolved with the latest updates. Please make sure to update to the latest version and check if that solves the issue. Let us know if that works for you by adding a comment 👍 This issue has now been marked as stale and will be closed if no further activity occurs. Thank you for your contributions.

docgalaxyblock commented 1 year ago

.

spabinger commented 1 year ago

Hi,

thanks for creating the ticket. I'm facing the same issue with my Busch-Jaeger 6737, which allows me to control the associated light but I cannot assign automations or trigger events to the remaining 6 buttons.

It would be great if somebody could post a solution.

Thanks, Stephan

Dabbadoeber commented 1 year ago

2 years later........... after leaving deconz for Z2M and not happy with the result of Z2M, i wanted to switch to ZHA but unfortunately the switch RB01 is not supported (yes the top rocker works but the bottom one does not) is there anybody how got this Busch-Jaeger stuff working in ZHA ?

lepatrick commented 1 year ago

Still no support for this switches?

aitchofman commented 1 year ago

Hi, how can I help make this device work with ZHA? I have got an updated 6737/01-8 on firmware 1.2 that works on all 8 buttons with deconz. I can post the DDF file here - will it help?

gclever commented 1 year ago

Hi, I am having the same problem: can control the relais with HA via ZHA over the new SkyConnect stick (but status is not reported back) but have no access to the lower rockers. Has anyone found a solution to control this device via ZHA?

weakfl commented 1 year ago

I've stumbled upon this because I'm thinking about trying out HA (currently using openHAB), but wanted to make sure that my BJ dimmers/relays work before even giving it a try. So maybe I can shed some light on some of the issues described here.

@gclever but status is not reported back

Unfortunately the device completely ignores whatever reporting configuration you set and does not report changes of the relay/dimmer state. It only reports like once an hour.

I've mitigated this issue by setting a polling period of 60 seconds, so you have to rely on polling to get state updates in reasonable time.

Is it possible to configure the polling interval in HA?

@gclever but have no access to the lower rockers

The binding table of these devices has only room for four entries (I only have the 2-rocker variants, maybe the other devices have more).

If the endpoints are not consolidated properly the rockers won't work. You might end up with a binding table that's missing one of the endpoints:

> bindtable D85DEF11A1003142
Binding table for node 37485 [D85DEF11A1003142]
Src Address          | Dest Address         | Group | Mode    | Cluster
D85DEF11A1003142/18  | 0022A300002921FD/1   |       | Address | 0006:ON_OFF
D85DEF11A1003142/10  | 0022A300002921FD/1   |       | Address | 0008:LEVEL_CONTROL
D85DEF11A1003142/10  | 0022A300002921FD/1   |       | Address | 0006:ON_OFF
D85DEF11A1003142/18  | 0022A300002921FD/1   |       | Address | 0008:LEVEL_CONTROL

Here it's missing the endpoint for the 2nd rocker, which would be 11:

node D85DEF11A1003142
IEEE Address     : D85DEF11A1003142
Network Address  : 37485
Node Descriptor  : NodeDescriptor [apsFlags=0, bufferSize=89, complexDescriptorAvailable=false, manufacturerCode=4398, logicalType=ROUTER, serverCapabilities=[], incomingTransferSize=61, outgoingTransferSize=61, userDescriptorAvailable=true, frequencyBands=[FREQ_2400_MHZ], macCapabilities=[MAINS_POWER, RECEIVER_ON_WHEN_IDLE, FULL_FUNCTION_DEVICE], extendedEndpointListAvailable=false, extendedSimpleDescriptorListAvailable=false, stackCompliance=0]
Power Descriptor : RECEIVER_ON_IDLE, [DISPOSABLE_BATTERY, MAINS, RECHARGABLE_BATTERY], MAINS, FULL
Associations     : []
Endpoints        : 
            10   : Profile     C05E ZIGBEE_LIGHT_LINK
                 : Device Type 0000 ON_OFF_SWITCH
                   -> BASIC
                   -> TOUCHLINK
                   <- TOUCHLINK
                   <- COLOR_CONTROL
                   <- IDENTIFY
                   <- GROUPS
                   <- SCENES
                   <- ON_OFF
                   <- LEVEL_CONTROL
                   <- OTA_UPGRADE
            11   : Profile     C05E ZIGBEE_LIGHT_LINK
                 : Device Type 0000 ON_OFF_SWITCH
                   -> BASIC
                   -> TOUCHLINK
                   <- TOUCHLINK
                   <- COLOR_CONTROL
                   <- IDENTIFY
                   <- GROUPS
                   <- SCENES
                   <- ON_OFF
                   <- LEVEL_CONTROL
            18   : Profile     C05E ZIGBEE_LIGHT_LINK
                 : Device Type 0000 ON_OFF_SWITCH
                   -> BASIC
                   -> IDENTIFY
                   -> GROUPS
                   -> SCENES
                   -> ON_OFF
                   -> LEVEL_CONTROL

So you have to manually unbind endpoint 10 (which is obsolete) and bind endpoint 11 to make it work.

I obviously have no idea if that's the problem here, but it might be worth checking out.

E-ASa commented 11 months ago

I also have the same issue. I moved from an old Rasbee / Deconz setup to Home Assistant Yellow and the integrated Zigbee module with ZHA. I didn't realize that my Busch & Jaeger switches would stop working. Any help in getting these switches working in ZHA would be greatly appreciated!

JohnDoep commented 8 months ago

I also had the problem of getting the Busch-Jaeger 2gang working with ZHA (which was working perfectly before with Deconz). I fiddled around with a quirk I found for another switch. And after some back and forth, I finally managed to get the switch working with ZHA. Using the quirk appended to this message, I can join the device and get events for all four buttons. Probably the quirk can be adapted to the 4gang version quite easily. Since I had not worked with quirks before and had no time to dig deeper into the topic, my implementation might be mediocre. But I hope it might be a good starting point for someone who knows how to do it properly (or someone who desperately needs support for the switch).


from zigpy.profiles import zha, zll
from zigpy.quirks import CustomDevice
from zigpy.zcl.clusters.general import Basic, OnOff, Identify, Ota, LevelControl, PowerConfiguration, Time, Groups, Scenes
from zigpy.zcl.clusters.lighting import Color
from zigpy.zcl.clusters.lightlink import LightLink

from zhaquirks.const import (
    MODEL,
    BUTTON_1,
    BUTTON_2,
    BUTTON_3,
    BUTTON_4,
    ARGS,
    COMMAND,
    DEVICE_TYPE,
    ENDPOINT_ID,
    ENDPOINTS,
    INPUT_CLUSTERS,
    CLUSTER_ID,
    LONG_PRESS,
    LONG_RELEASE,
    MODELS_INFO,
    OUTPUT_CLUSTERS,
    PROFILE_ID,
    SHORT_PRESS,
    COMMAND_ON,
    COMMAND_OFF,
    COMMAND_STEP,
    COMMAND_MOVE,
    COMMAND_STOP,
    COMMAND_STEP_ON_OFF
)

class BJRB01ButtonTriggers:
    """Busch-Jaeger RB01 4-button triggers."""

    device_automation_triggers = {
            (SHORT_PRESS, BUTTON_1): {COMMAND: COMMAND_OFF, CLUSTER_ID: 6, ENDPOINT_ID: 10, ARGS: []},
            (SHORT_PRESS, BUTTON_2): {COMMAND: COMMAND_ON, CLUSTER_ID: 6, ENDPOINT_ID: 10, ARGS: []},
            (SHORT_PRESS, BUTTON_3): {COMMAND: COMMAND_OFF, CLUSTER_ID: 6, ENDPOINT_ID: 11, ARGS: []},
            (SHORT_PRESS, BUTTON_4): {COMMAND: COMMAND_ON, CLUSTER_ID: 6, ENDPOINT_ID: 11, ARGS: []},
            (LONG_PRESS, BUTTON_2): {
                COMMAND: COMMAND_STEP_ON_OFF,
                CLUSTER_ID: 8,
                ENDPOINT_ID: 10,
                ARGS: [0, 254, 50],
            },      
            (LONG_RELEASE, BUTTON_2): {COMMAND: COMMAND_STOP, CLUSTER_ID: 8, ENDPOINT_ID: 10, ARGS: []},       
    }

class BJRB01Remote(CustomDevice, BJRB01ButtonTriggers):
    """Busch-Jaeger 4-button remote device."""

    signature = {
        MODELS_INFO: [("Busch-Jaeger", "RB01")],
        ENDPOINTS: {
            10: {
                PROFILE_ID: zll.PROFILE_ID,
                DEVICE_TYPE: zll.DeviceType.COLOR_SCENE_CONTROLLER,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    LightLink.cluster_id,
                ],
                OUTPUT_CLUSTERS: [
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                    LevelControl.cluster_id,
                    Ota.cluster_id,
                    Color.cluster_id,
                    LightLink.cluster_id,
                ],
            },
            11: {
                PROFILE_ID: zll.PROFILE_ID,
                DEVICE_TYPE: zll.DeviceType.COLOR_SCENE_CONTROLLER,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    LightLink.cluster_id,
                ],
                OUTPUT_CLUSTERS: [
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                    LevelControl.cluster_id,
                    Color.cluster_id,
                    LightLink.cluster_id,
                ],
            },
        },
    }
    replacement = {
        ENDPOINTS: {
            10: {
                PROFILE_ID: zll.PROFILE_ID,
                DEVICE_TYPE: zll.DeviceType.CONTROLLER,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    LightLink.cluster_id,
                ],
                OUTPUT_CLUSTERS: [
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                    LevelControl.cluster_id,
                    Ota.cluster_id,
                    Color.cluster_id,
                    LightLink.cluster_id,
                ],
            },
            11: {
                PROFILE_ID: zll.PROFILE_ID,
                DEVICE_TYPE: zll.DeviceType.CONTROLLER,
                INPUT_CLUSTERS: [
                    Basic.cluster_id,
                    LightLink.cluster_id,
                ],
                OUTPUT_CLUSTERS: [
                    Identify.cluster_id,
                    Groups.cluster_id,
                    Scenes.cluster_id,
                    OnOff.cluster_id,
                    LevelControl.cluster_id,
                    Color.cluster_id,
                    LightLink.cluster_id,
                ],
            },
        },
    }
Dabbadoeber commented 8 months ago

I have same switch's which are working, but I use Zigbee2mqtt, also large networks cause the devices to become unreliable so I am running 3 networks at the moment. I think max number of devices is limited to around 20

Ra72xx commented 7 months ago

As I want to switch from Zigbee2MQTT, I'll post a comment to keep this issue alive...

Ra72xx commented 7 months ago
device_automation_triggers = {
        (SHORT_PRESS, BUTTON_1): {COMMAND: COMMAND_OFF, CLUSTER_ID: 6, ENDPOINT_ID: 10, ARGS: []},
        (SHORT_PRESS, BUTTON_2): {COMMAND: COMMAND_ON, CLUSTER_ID: 6, ENDPOINT_ID: 10, ARGS: []},
        (SHORT_PRESS, BUTTON_3): {COMMAND: COMMAND_OFF, CLUSTER_ID: 6, ENDPOINT_ID: 11, ARGS: []},
        (SHORT_PRESS, BUTTON_4): {COMMAND: COMMAND_ON, CLUSTER_ID: 6, ENDPOINT_ID: 11, ARGS: []},
        (LONG_PRESS, BUTTON_2): {
            COMMAND: COMMAND_STEP_ON_OFF,
            CLUSTER_ID: 8,
            ENDPOINT_ID: 10,
            ARGS: [0, 254, 50],
        },        
        (LONG_RELEASE, BUTTON_2): {COMMAND: COMMAND_STOP, CLUSTER_ID: 8, ENDPOINT_ID: 10, ARGS: []},       
}

Is there any reason why the long press actions are only defined for button 2?

MattWestb commented 7 months ago

Look if its sending light level command from EP 11 and if yes you can adding it like its done for EP 10. Use zha_event for listening to events and you can see all commands its sending.

Ra72xx commented 7 months ago

For my better understanding (as I said, I don't use ZHA yet, but Zigbee2MQTT, but I got lots of this Busch Jäger Switches in my flat and the missing support is a deal breaker in my intention to switch over): Do I need a working quirk like the one above to get the switches working, or is listening to zha_event always possible?

paepke commented 7 months ago

Also interested in this and have the 8 butten version in the so called "RM01" variant. Tried the above snippet with the other model signature but can't get the quirks stuff working. The debug log says it "Loaded custom quirks" and I also get the pycache folder but I still can't get my head around why it does not work. The zigbee info on the device says nothing about a loaded quirk as I have seen on other github issues. Probably I'm missing something obvious.

ullmonde commented 6 months ago

Same here! Please, please add Busch Jaeger Support for Wall switches e.g. RB01 and RM01 | RB01. Thank u so much!!!

Chrissi2812 commented 6 months ago

I have a dimmer unit (6715 U) in connection with the 2-way switch (6736-84)

Device Signature ```json { "node_descriptor": "NodeDescriptor(logical_type=, complex_descriptor_available=0, user_descriptor_available=1, reserved=0, aps_flags=0, frequency_band=, mac_capability_flags=, manufacturer_code=4398, maximum_buffer_size=89, maximum_incoming_transfer_size=61, server_mask=0, maximum_outgoing_transfer_size=61, descriptor_capability_field=, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)", "endpoints": { "10": { "profile_id": "0xc05e", "device_type": "0x0810", "input_clusters": [ "0x0000", "0x1000" ], "output_clusters": [ "0x0003", "0x0004", "0x0005", "0x0006", "0x0008", "0x0019", "0x0300", "0x1000" ] }, "11": { "profile_id": "0xc05e", "device_type": "0x0810", "input_clusters": [ "0x0000", "0x1000" ], "output_clusters": [ "0x0003", "0x0004", "0x0005", "0x0006", "0x0008", "0x0300", "0x1000" ] }, "18": { "profile_id": "0xc05e", "device_type": "0x0100", "input_clusters": [ "0x0000", "0x0003", "0x0004", "0x0005", "0x0006", "0x0008" ], "output_clusters": [] } }, "manufacturer": "Busch-Jaeger", "model": "RM01", "class": "zigpy.device.Device" } ```

I got the bottom row working with this custom quirk.

Custom Quirk ```python from zigpy.profiles import zha, zll from zigpy.quirks import CustomDevice from zigpy.zcl.clusters.general import Basic, OnOff, Identify, Ota, LevelControl, Groups, Scenes from zigpy.zcl.clusters.lighting import Color from zigpy.zcl.clusters.lightlink import LightLink from zhaquirks.const import ( MODEL, BUTTON_3, BUTTON_4, ARGS, COMMAND, DEVICE_TYPE, ENDPOINT_ID, ENDPOINTS, INPUT_CLUSTERS, CLUSTER_ID, MODELS_INFO, OUTPUT_CLUSTERS, PROFILE_ID, SHORT_PRESS, COMMAND_ON, COMMAND_OFF ) class BuschJaegerRM01(CustomDevice): """Busch-Jaeger RM01 with Dimmer""" signature = { MODELS_INFO: [ ("Busch-Jaeger", "RM01"), ], ENDPOINTS: { 10: { PROFILE_ID: zll.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.COLOR_SCENE_CONTROLLER, INPUT_CLUSTERS: [ Basic.cluster_id, LightLink.cluster_id, ], OUTPUT_CLUSTERS: [ Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, Ota.cluster_id, Color.cluster_id, LightLink.cluster_id, ], }, 11: { PROFILE_ID: zll.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.COLOR_SCENE_CONTROLLER, INPUT_CLUSTERS: [ Basic.cluster_id, LightLink.cluster_id, ], OUTPUT_CLUSTERS: [ Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, Color.cluster_id, LightLink.cluster_id, ], }, 18: { PROFILE_ID: zll.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT, INPUT_CLUSTERS: [ Basic.cluster_id, Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, ], OUTPUT_CLUSTERS: [] }, }, } replacement = { ENDPOINTS: { 18: { PROFILE_ID: zll.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.ON_OFF_LIGHT, INPUT_CLUSTERS: [ Basic.cluster_id, Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, ], OUTPUT_CLUSTERS: [], }, 11: { PROFILE_ID: zll.PROFILE_ID, DEVICE_TYPE: zha.DeviceType.COLOR_SCENE_CONTROLLER , INPUT_CLUSTERS: [ Basic.cluster_id, LightLink.cluster_id, ], OUTPUT_CLUSTERS: [ Identify.cluster_id, Groups.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, Color.cluster_id, LightLink.cluster_id, ], } }, } device_automation_triggers = { (SHORT_PRESS, BUTTON_3): {COMMAND: COMMAND_OFF, CLUSTER_ID: 6, ENDPOINT_ID: 11, ARGS: []}, (SHORT_PRESS, BUTTON_4): {COMMAND: COMMAND_ON, CLUSTER_ID: 6, ENDPOINT_ID: 11, ARGS: []}, (LONG_PRESS, BUTTON_3): { COMMAND: COMMAND_STEP, CLUSTER_ID: 8, ENDPOINT_ID: 11, ARGS: [1, 254, 50], }, (LONG_PRESS, BUTTON_4): { COMMAND: COMMAND_STEP_ON_OFF, CLUSTER_ID: 8, ENDPOINT_ID: 11, ARGS: [0, 254, 50], }, } ```

Whats not working:

Ra72xx commented 6 months ago
  • Double press doesn't seem to trigger any zha_event

Does this device support double presses? I never had that with Deconz, and Z2M does not support them, too.

weakfl commented 6 months ago

@Chrissi2812 Dimmer status is not updated when button on the device is used

As mentioned in the link you shared the device doesn't report state changes. I'm also using a very short polling interval to work around it (on openHAB).

I've contacted BJ numerous times reporting the issue but they never fixed it. Given how long it's been since the firmware has been updated I'm not expecting them to fix this anymore.

Chrissi2812 commented 6 months ago

I still had the Scenes.cluster_id in the replacement part. And that prevented the Long_Press from working.

replacement = {
    ENDPOINTS: {
       11: {
            PROFILE_ID: zll.PROFILE_ID,
            DEVICE_TYPE: zha.DeviceType.COLOR_SCENE_CONTROLLER ,
            INPUT_CLUSTERS: [
                Basic.cluster_id,
                LightLink.cluster_id,
            ],
            OUTPUT_CLUSTERS: [
                Identify.cluster_id,
                Groups.cluster_id,
                # Scenes.cluster_id, # This had to be removed for the Long_Press to work
                OnOff.cluster_id,
                LevelControl.cluster_id,
                Color.cluster_id,
                LightLink.cluster_id,
            ],
        }
    }
}

Have Updated the quirk here https://github.com/zigpy/zha-device-handlers/issues/610#issuecomment-1880155862

Has anybody an idea how to poll the OnOff periodically (Like every 5 seconds or so). I'm not that into Python but want to try to get it working inside the quirk itself and not with an automation in Homeassistant.

rulerise commented 5 months ago

I am also interested in finding a solution. It is currently happening. The following: If an RM01 is only plugged onto a power supply, it is recognised by the zigpy.appdb as "Considering <class 'BJ-RM01.BJRM01Remote". This "Remote" can then also trigger up to four switches, depending on the version. The 8 switch version then only works with 4 switches. At the moment when a switch or dimmer is used as a wall module, only light is recognised regardless of the control module, whether 2, 4 or 8 switches. The switches that are then controlled similarly to the remote do not work. I have already created a quirk. However, this is not activated because the zigpy.appdb is queried first and apparently has priority over the quirks. I am happy to contribute something for everyone but need the support of a "sighted" person. Please let me know how I can help.

theincogtion commented 4 months ago

I am not sure if you know this 6735-84 (84 is just the color code) device. It is sitting on a 6715 U device in the wall outlet

I am thinking of buying a 6715U. Did you already got it to work with ZHA @ornago ?

TeeJayR commented 1 month ago

I have the 8-button control unit (6737) mounted both to a switch (6711 U) and a dimmer (6715 U), respectively. Both have different signatures of course:

Signature 6737 on 6711 U ``` { "node_descriptor": "NodeDescriptor(logical_type=, complex_descriptor_available=0, user_descriptor_available=1, reserved=0, aps_flags=0, frequency_band=, mac_capability_flags=, manufacturer_code=4398, maximum_buffer_size=89, maximum_incoming_transfer_size=61, server_mask=0, maximum_outgoing_transfer_size=61, descriptor_capability_field=, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)", "endpoints": { "10": { "profile_id": "0xc05e", "device_type": "0x0810", "input_clusters": [ "0x0000", "0x1000" ], "output_clusters": [ "0x0003", "0x0004", "0x0005", "0x0006", "0x0008", "0x0019", "0x0300", "0x1000" ] }, "11": { "profile_id": "0xc05e", "device_type": "0x0810", "input_clusters": [ "0x0000", "0x1000" ], "output_clusters": [ "0x0003", "0x0004", "0x0005", "0x0006", "0x0008", "0x0300", "0x1000" ] }, "12": { "profile_id": "0xc05e", "device_type": "0x0810", "input_clusters": [ "0x0000", "0x1000" ], "output_clusters": [ "0x0003", "0x0004", "0x0005", "0x0006", "0x0008", "0x0300", "0x1000" ] }, "13": { "profile_id": "0xc05e", "device_type": "0x0810", "input_clusters": [ "0x0000", "0x1000" ], "output_clusters": [ "0x0003", "0x0004", "0x0005", "0x0006", "0x0008", "0x0300", "0x1000" ] }, "18": { "profile_id": "0xc05e", "device_type": "0x0000", "input_clusters": [ "0x0000", "0x0003", "0x0004", "0x0005", "0x0006", "0x0008" ], "output_clusters": [] } }, "manufacturer": "Busch-Jaeger", "model": "RM01", "class": "busch_jaeger_rm01.BuschJaegerRM01" } ```
Signature 6737 on 6715 U ``` { "node_descriptor": "NodeDescriptor(logical_type=, complex_descriptor_available=0, user_descriptor_available=1, reserved=0, aps_flags=0, frequency_band=, mac_capability_flags=, manufacturer_code=4398, maximum_buffer_size=89, maximum_incoming_transfer_size=61, server_mask=0, maximum_outgoing_transfer_size=61, descriptor_capability_field=, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)", "endpoints": { "10": { "profile_id": "0xc05e", "device_type": "0x0810", "input_clusters": [ "0x0000", "0x1000" ], "output_clusters": [ "0x0003", "0x0004", "0x0005", "0x0006", "0x0008", "0x0019", "0x0300", "0x1000" ] }, "11": { "profile_id": "0xc05e", "device_type": "0x0810", "input_clusters": [ "0x0000", "0x1000" ], "output_clusters": [ "0x0003", "0x0004", "0x0005", "0x0006", "0x0008", "0x0300", "0x1000" ] }, "12": { "profile_id": "0xc05e", "device_type": "0x0810", "input_clusters": [ "0x0000", "0x1000" ], "output_clusters": [ "0x0003", "0x0004", "0x0005", "0x0006", "0x0008", "0x0300", "0x1000" ] }, "13": { "profile_id": "0xc05e", "device_type": "0x0810", "input_clusters": [ "0x0000", "0x1000" ], "output_clusters": [ "0x0003", "0x0004", "0x0005", "0x0006", "0x0008", "0x0300", "0x1000" ] }, "18": { "profile_id": "0xc05e", "device_type": "0x0100", "input_clusters": [ "0x0000", "0x0003", "0x0004", "0x0005", "0x0006", "0x0008" ], "output_clusters": [] } }, "manufacturer": "Busch-Jaeger", "model": "RM01", "class": "zigpy.device.Device" } ```

Now, the main problem I am facing is, that the two bottom rows send recall events with the group ID and scene ID as arguments. The scene ID uniquely identifies each button per control unit, so for the 4 buttons of the bottom two rows it is 5, 6, 7 and 8. However, the group ID is the same for all buttons, but different for each of the control units I have. Thus, it is not possible to write a custom quirk that matches all control units.

So, for one of my 6711 U switches with a 6737 control unit, being assigned to group ID 2, a working custom quirk looks like this:

Custom quirk 6737 on 6711 U with group ID 2 ```python from zigpy.profiles import zll from zigpy.quirks import CustomDevice from zigpy.zcl.clusters.general import Basic, OnOff, Identify, Ota, LevelControl, Groups, Scenes from zigpy.zcl.clusters.lighting import Color from zigpy.zcl.clusters.lightlink import LightLink from zhaquirks.const import ( BUTTON_1, BUTTON_2, BUTTON_3, BUTTON_4, BUTTON_5, BUTTON_6, ARGS, COMMAND, COMMAND_RECALL, DEVICE_TYPE, ENDPOINT_ID, ENDPOINTS, INPUT_CLUSTERS, CLUSTER_ID, MODELS_INFO, OUTPUT_CLUSTERS, PROFILE_ID, SHORT_PRESS, COMMAND_ON, COMMAND_OFF, SKIP_CONFIGURATION ) class BuschJaegerRM01(CustomDevice): """Busch-Jaeger RM01""" signature = { MODELS_INFO: [("Busch-Jaeger", "RM01")], ENDPOINTS: { 10: { PROFILE_ID: zll.PROFILE_ID, DEVICE_TYPE: zll.DeviceType.COLOR_SCENE_CONTROLLER, INPUT_CLUSTERS: [ Basic.cluster_id, LightLink.cluster_id ], OUTPUT_CLUSTERS: [ Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, Ota.cluster_id, Color.cluster_id, LightLink.cluster_id ] }, 11: { PROFILE_ID: zll.PROFILE_ID, DEVICE_TYPE: zll.DeviceType.COLOR_SCENE_CONTROLLER, INPUT_CLUSTERS: [ Basic.cluster_id, LightLink.cluster_id ], OUTPUT_CLUSTERS: [ Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, Color.cluster_id, LightLink.cluster_id ] }, 12: { PROFILE_ID: zll.PROFILE_ID, DEVICE_TYPE: zll.DeviceType.COLOR_SCENE_CONTROLLER, INPUT_CLUSTERS: [ Basic.cluster_id, LightLink.cluster_id ], OUTPUT_CLUSTERS: [ Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, Color.cluster_id, LightLink.cluster_id ] }, 13: { PROFILE_ID: zll.PROFILE_ID, DEVICE_TYPE: zll.DeviceType.COLOR_SCENE_CONTROLLER, INPUT_CLUSTERS: [ Basic.cluster_id, LightLink.cluster_id ], OUTPUT_CLUSTERS: [ Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, Color.cluster_id, LightLink.cluster_id ] }, 18: { PROFILE_ID: zll.PROFILE_ID, DEVICE_TYPE: zll.DeviceType.ON_OFF_LIGHT, INPUT_CLUSTERS: [ Basic.cluster_id, Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, OnOff.cluster_id, LevelControl.cluster_id ], OUTPUT_CLUSTERS: [] }, }, } replacement = { SKIP_CONFIGURATION: False, ENDPOINTS: { 10: { PROFILE_ID: zll.PROFILE_ID, DEVICE_TYPE: zll.DeviceType.COLOR_SCENE_CONTROLLER, INPUT_CLUSTERS: [ Basic.cluster_id, LightLink.cluster_id ], OUTPUT_CLUSTERS: [ Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, Ota.cluster_id, Color.cluster_id, LightLink.cluster_id ] }, 11: { PROFILE_ID: zll.PROFILE_ID, DEVICE_TYPE: zll.DeviceType.COLOR_SCENE_CONTROLLER, INPUT_CLUSTERS: [ Basic.cluster_id, LightLink.cluster_id ], OUTPUT_CLUSTERS: [ Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, Color.cluster_id, LightLink.cluster_id ] }, 12: { PROFILE_ID: zll.PROFILE_ID, DEVICE_TYPE: zll.DeviceType.COLOR_SCENE_CONTROLLER, INPUT_CLUSTERS: [ Basic.cluster_id, LightLink.cluster_id ], OUTPUT_CLUSTERS: [ Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, Color.cluster_id, LightLink.cluster_id ] }, 13: { PROFILE_ID: zll.PROFILE_ID, DEVICE_TYPE: zll.DeviceType.COLOR_SCENE_CONTROLLER, INPUT_CLUSTERS: [ Basic.cluster_id, LightLink.cluster_id ], OUTPUT_CLUSTERS: [ Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, OnOff.cluster_id, LevelControl.cluster_id, Color.cluster_id, LightLink.cluster_id ] }, 18: { PROFILE_ID: zll.PROFILE_ID, DEVICE_TYPE: zll.DeviceType.ON_OFF_LIGHT, INPUT_CLUSTERS: [ Basic.cluster_id, Identify.cluster_id, Groups.cluster_id, Scenes.cluster_id, OnOff.cluster_id, LevelControl.cluster_id ], OUTPUT_CLUSTERS: [] }, }, } device_automation_triggers = { (SHORT_PRESS, BUTTON_1): { COMMAND: COMMAND_OFF, CLUSTER_ID: 6, ENDPOINT_ID: 11, ARGS: [], }, (SHORT_PRESS, BUTTON_2): { COMMAND: COMMAND_ON, CLUSTER_ID: 6, ENDPOINT_ID: 11, ARGS: [], }, (SHORT_PRESS, BUTTON_3): { COMMAND: COMMAND_RECALL, CLUSTER_ID: 5, ENDPOINT_ID: 12, ARGS: [2, 5], }, (SHORT_PRESS, BUTTON_4): { COMMAND: COMMAND_RECALL, CLUSTER_ID: 5, ENDPOINT_ID: 12, ARGS: [2, 6], }, (SHORT_PRESS, BUTTON_5): { COMMAND: COMMAND_RECALL, CLUSTER_ID: 5, ENDPOINT_ID: 13, ARGS: [2, 7], }, (SHORT_PRESS, BUTTON_6): { COMMAND: COMMAND_RECALL, CLUSTER_ID: 5, ENDPOINT_ID: 13, ARGS: [2, 8], }, } ```

Of course I could simply add a custom quirk per unit with matching group IDs, respectively, but this would not be anything I could contribute to the repo so it would directly work for others (with potentially different group IDs).

I see two directions from here to explore:

  1. Write some custom logic in the quirks to drop the group ID on the events. Not sure if that is even possible though.
  2. Drop the group assignment from the devices. But so far all my attempts to do this failed. Does anyone have an idea how to remove the assigned group from the devices?
TeeJayR commented 1 month ago

The arguments of the recall events (and probably even the whole events themself) of the two bottom rows seem to be controlled by the "Scenes" cluster, since when I comment out the cluster in all output clusters of the endpoints in the replacement there are no events sent anymore at all.

TeeJayR commented 1 month ago

Diving deeper into the whole ZigBee protocol specification topic things start to make sense somehow. From the ZigBee Cluster Library Specification:

In most cases scenes are associated with a particular group ID. Scenes MAY also exist without a group, in which case the value 0x0000 replaces the group ID. Note that extra care is required in these cases to avoid a scene ID collision, and that commands related to scenes without a group MAY only be unicast, i.e., they MAY not be multicast or broadcast.

However, the value of this associated group ID seems not to be controllable really. While I would have assumed that saving a new scene directly through the device's programming mode would also assign a new group ID, I found that in my current setup I cannot program the device like described in the manual (section 2) at all. When long-pressing a button to enter programming mode (required pushing for at least 15 seconds) the button sends a stop event after ~10 seconds and that is the end of the story - no entering of the programming mode possible.

I start to believe that the device_automation_triggers section of the custom quirk would need a wildcard value definition for some of the arguments. This way one could match a trigger with any group ID but only a particular scene ID.