ZigBee Configure (bind) Attribute Never Responds

So I am having an issue I’m guessing is a firmware bug but since this is my first attempt at writing groovy/ZigBee/DTH code I’d like to ask the community.

I can send a
zigbee.readAttribute( CLUSTER_DOORLOCK, DOORLOCK_ATTR_OPERATING_MODE )
and I get the current attribute value with no problems.

I can send a
zigbee.writeAttribute( CLUSTER_DOORLOCK, DOORLOCK_ATTR_OPERATING_MODE, TYPE_ENUM8, zigbee.convertToHexString(2,2) )
and this works as well.

But this is not working
zigbee.configureReporting( CLUSTER_DOORLOCK, DOORLOCK_ATTR_OPERATING_MODE, TYPE_ENUM8, 0, 21600, null )

I get a valid response from the bind, but the attribute never reports unless I manually send a readAttribute. I have many other binds that work fine, but nothing shows up in the logs when this attribute changes.

BTW this is a Yale ZigBee lock.

The command looks right. Can you paste in the output of the zigbee.configureReporting and the logs showing the response?

This is a long response. I have shown a zigbee.configureReporting, readAttribute and writeAttribute for both OPERATING_MODE : 0x0025 and PRIVACY_BUTTON : 0x002B

Test Configure ( OPERATING_MODE : 0x0025 and PRIVACY_BUTTON : 0x002B )

7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:06:06 AM: debug parse() --- returned: null
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:06:06 AM: debug parseResponseMessage() --- ignoring response - catchall: 0000 8021 00 00 0040 00 B8F1 00 00 0000 00 00 0200
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:06:06 AM: trace parse() --- description: catchall: 0000 8021 00 00 0040 00 B8F1 00 00 0000 00 00 0200
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:06:05 AM: debug parse() --- returned: null
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:06:05 AM: debug parseResponseMessage() --- ignoring response - catchall: 0104 0101 01 01 0140 00 B8F1 00 00 0000 07 01 89002500
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:06:05 AM: trace parse() --- description: catchall: 0104 0101 01 01 0140 00 B8F1 00 00 0000 07 01 89002500
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:05:59 AM: debug parse() --- returned: null
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:05:59 AM: debug parseResponseMessage() --- ignoring response - catchall: 0104 0101 01 01 0140 00 B8F1 00 00 0000 07 01 00
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:05:59 AM: trace parse() --- description: catchall: 0104 0101 01 01 0140 00 B8F1 00 00 0000 07 01 00
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:05:57 AM: debug parse() --- returned: null
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:05:57 AM: debug parseResponseMessage() --- ignoring response - catchall: 0000 8021 00 00 0040 00 B8F1 00 00 0000 00 00 0300
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:05:57 AM: trace parse() --- description: catchall: 0000 8021 00 00 0040 00 B8F1 00 00 0000 00 00 0300
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:05:57 AM: debug parse() --- returned: null
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:05:57 AM: debug parseResponseMessage() --- ignoring response - catchall: 0000 8021 00 00 0040 00 B8F1 00 00 0000 00 00 0300
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:05:57 AM: trace parse() --- description: catchall: 0000 8021 00 00 0040 00 B8F1 00 00 0000 00 00 0300
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:05:57 AM: debug parse() --- returned: null
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:05:57 AM: debug parseResponseMessage() --- ignoring response - catchall: 0000 8021 00 00 0040 00 B8F1 00 00 0000 00 00 0200
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:05:57 AM: trace parse() --- description: catchall: 0000 8021 00 00 0040 00 B8F1 00 00 0000 00 00 0200
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:05:56 AM: debug parse() --- returned: null
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:05:56 AM: debug parseResponseMessage() --- ignoring response - catchall: 0104 0101 01 01 0140 00 B8F1 00 00 0000 07 01 89002500
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:05:56 AM: trace parse() --- description: catchall: 0104 0101 01 01 0140 00 B8F1 00 00 0000 07 01 89002500
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:05:56 AM: debug parse() --- returned: null
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:05:56 AM: debug parseResponseMessage() --- ignoring response - catchall: 0000 8021 00 00 0040 00 B8F1 00 00 0000 00 00 0200
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:05:56 AM: trace parse() --- description: catchall: 0000 8021 00 00 0040 00 B8F1 00 00 0000 00 00 0200
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:05:51 AM: info configure() --- cmds: [zdo bind 0xB8F1 0x01 0x01 0x0101 {000D6F0002FB86F0} {}, delay 2000, st cr 0xB8F1 0x01 0x0101 0x0025 0x30 0x0000 0x5460 {}, delay 2000, zdo bind 0xB8F1 0x01 0x01 0x0101 {000D6F0002FB86F0} {}, delay 2000, st cr 0xB8F1 0x01 0x0101 0x002B 0x10 0x0000 0x5460 {}, delay 2000]

Test readAttribute ( OPERATING_MODE : 0x0025 and PRIVACY_BUTTON : 0x002B )

7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:09:50 AM: debug parse() --- returned: [name:operatingModeTile, isStateChange:true, displayed:true, descriptionText:Current Value of Operating Mode: 0, value:operatingEnabled, linkText:Front Door]
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:09:50 AM: trace parse() --- description: read attr - raw: B8F10101010A2500003000, dni: B8F1, endpoint: 01, cluster: 0101, size: 0A, attrId: 0025, result: success, encoding: 30, value: 00
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:09:42 AM: debug parse() --- returned: [name:privacyModeTile, isStateChange:true, displayed:true, descriptionText:Current Value of Privacy Button: 0, value:privacyDisabled, linkText:Front Door]
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:09:42 AM: trace parse() --- description: read attr - raw: B8F10101010A2B00001000, dni: B8F1, endpoint: 01, cluster: 0101, size: 0A, attrId: 002b, result: success, encoding: 10, value: 00
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:09:42 AM: debug parse() --- returned: [name:privacyModeTile, isStateChange:true, displayed:true, descriptionText:Current Value of Privacy Button: 0, value:privacyDisabled, linkText:Front Door]
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:09:42 AM: trace parse() --- description: read attr - raw: B8F10101010A2B00001000, dni: B8F1, endpoint: 01, cluster: 0101, size: 0A, attrId: 002b, result: success, encoding: 10, value: 00
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:09:42 AM: debug parse() --- returned: [name:operatingModeTile, isStateChange:true, displayed:true, descriptionText:Current Value of Operating Mode: 0, value:operatingEnabled, linkText:Front Door]
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:09:42 AM: trace parse() --- description: read attr - raw: B8F10101010A2500003000, dni: B8F1, endpoint: 01, cluster: 0101, size: 0A, attrId: 0025, result: success, encoding: 30, value: 00
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:09:40 AM: debug parse() --- returned: [name:operatingModeTile, isStateChange:true, displayed:true, descriptionText:Current Value of Operating Mode: 0, value:operatingEnabled, linkText:Front Door]
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:09:40 AM: trace parse() --- description: read attr - raw: B8F10101010A2500003000, dni: B8F1, endpoint: 01, cluster: 0101, size: 0A, attrId: 0025, result: success, encoding: 30, value: 00
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:09:37 AM: info refresh() --- cmds: [st rattr 0xB8F1 0x01 0x0101 0x0025, delay 2000, st rattr 0xB8F1 0x01 0x0101 0x002B, delay 2000]

Remote writeAttribute( PRIVACY_BUTTON )

7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:13:16 AM: debug parse() --- returned: [name:privacyModeTile, isStateChange:true, displayed:true, descriptionText:Current Value of Privacy Button: 1, value:privacyEnabled, linkText:Front Door]
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:13:16 AM: trace parse() --- description: read attr - raw: B8F1010101082B001001, dni: B8F1, endpoint: 01, cluster: 0101, size: 08, attrId: 002b, encoding: 10, value: 01
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:13:15 AM: debug parse() --- returned: null
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:13:15 AM: debug parseResponseMessage() --- ignoring response - catchall: 0104 0101 01 01 0140 00 B8F1 00 00 0000 04 01 00
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:13:15 AM: trace parse() --- description: catchall: 0104 0101 01 01 0140 00 B8F1 00 00 0000 04 01 00
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:13:13 AM: debug enablePrivacyButton() --- cmds: [st wattr 0xB8F1 0x01 0x0101 0x002B 0x0010 {01}, delay 2000]

Remote writeAttribute ( OPERATING_MODE )

7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:14:17 AM: debug parse() --- returned: null
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:14:17 AM: debug parseResponseMessage() --- ignoring response - catchall: 0104 0101 01 01 0140 00 B8F1 00 00 0000 04 01 00
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:14:17 AM: trace parse() --- description: catchall: 0104 0101 01 01 0140 00 B8F1 00 00 0000 04 01 00
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:14:15 AM: debug disableKeypad() --- cmds: [st wattr 0xB8F1 0x01 0x0101 0x0025 0x0030 {02}, delay 2000]

Refresh readAttribute ( OPERATING_MODE : 0x0025 and PRIVACY_BUTTON : 0x002B )

7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:15:28 AM: debug parse() --- returned: [name:privacyModeTile, isStateChange:true, displayed:true, descriptionText:Current Value of Privacy Button: 1, value:privacyEnabled, linkText:Front Door]
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:15:28 AM: trace parse() --- description: read attr - raw: B8F10101010A2B00001001, dni: B8F1, endpoint: 01, cluster: 0101, size: 0A, attrId: 002b, result: success, encoding: 10, value: 01
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:15:28 AM: debug parse() --- returned: [name:privacyModeTile, isStateChange:true, displayed:true, descriptionText:Current Value of Privacy Button: 1, value:privacyEnabled, linkText:Front Door]
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:15:28 AM: trace parse() --- description: read attr - raw: B8F10101010A2B00001001, dni: B8F1, endpoint: 01, cluster: 0101, size: 0A, attrId: 002b, result: success, encoding: 10, value: 01
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:15:27 AM: debug parse() --- returned: [name:privacyModeTile, isStateChange:true, displayed:true, descriptionText:Current Value of Privacy Button: 1, value:privacyEnabled, linkText:Front Door]
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:15:27 AM: trace parse() --- description: read attr - raw: B8F10101010A2B00001001, dni: B8F1, endpoint: 01, cluster: 0101, size: 0A, attrId: 002b, result: success, encoding: 10, value: 01
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:15:23 AM: debug parse() --- returned: [name:operatingModeTile, isStateChange:true, displayed:true, descriptionText:Current Value of Operating Mode: 2, value:operatingDisabled, linkText:Front Door]
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:15:23 AM: trace parse() --- description: read attr - raw: B8F10101010A2500003002, dni: B8F1, endpoint: 01, cluster: 0101, size: 0A, attrId: 0025, result: success, encoding: 30, value: 02
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:15:21 AM: info refresh() --- cmds: [st rattr 0xB8F1 0x01 0x0101 0x0025, delay 2000, st rattr 0xB8F1 0x01 0x0101 0x002B, delay 2000]

Manually change OPERATING_MODE

Nothing

Manually change PRIVACY_BUTTON

7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:17:47 AM: debug parse() --- returned: [name:privacyModeTile, isStateChange:true, displayed:true, descriptionText:Current Value of Privacy Button: 0, value:privacyDisabled, linkText:Front Door]
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:17:47 AM: trace parse() --- description: read attr - raw: B8F1010101082B001000, dni: B8F1, endpoint: 01, cluster: 0101, size: 08, attrId: 002b, encoding: 10, value: 00

Refresh readAttribute ( OPERATING_MODE : 0x0025 and PRIVACY_BUTTON : 0x002B )

7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:18:42 AM: debug parse() --- returned: [name:privacyModeTile, isStateChange:true, displayed:true, descriptionText:Current Value of Privacy Button: 0, value:privacyDisabled, linkText:Front Door]
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:18:42 AM: trace parse() --- description: read attr - raw: B8F10101010A2B00001000, dni: B8F1, endpoint: 01, cluster: 0101, size: 0A, attrId: 002b, result: success, encoding: 10, value: 00
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:18:32 AM: debug parse() --- returned: [name:operatingModeTile, isStateChange:true, displayed:true, descriptionText:Current Value of Operating Mode: 0, value:operatingEnabled, linkText:Front Door]
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:18:32 AM: trace parse() --- description: read attr - raw: B8F10101010A2500003000, dni: B8F1, endpoint: 01, cluster: 0101, size: 0A, attrId: 0025, result: success, encoding: 30, value: 00
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:18:32 AM: debug parse() --- returned: [name:operatingModeTile, isStateChange:true, displayed:true, descriptionText:Current Value of Operating Mode: 0, value:operatingEnabled, linkText:Front Door]
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:18:31 AM: trace parse() --- description: read attr - raw: B8F10101010A2500003000, dni: B8F1, endpoint: 01, cluster: 0101, size: 0A, attrId: 0025, result: success, encoding: 30, value: 00
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:18:31 AM: debug parse() --- returned: [name:privacyModeTile, isStateChange:true, displayed:true, descriptionText:Current Value of Privacy Button: 0, value:privacyDisabled, linkText:Front Door]
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:18:31 AM: trace parse() --- description: read attr - raw: B8F10101010A2B00001000, dni: B8F1, endpoint: 01, cluster: 0101, size: 0A, attrId: 002b, result: success, encoding: 10, value: 00
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:18:31 AM: debug parse() --- returned: [name:operatingModeTile, isStateChange:true, displayed:true, descriptionText:Current Value of Operating Mode: 0, value:operatingEnabled, linkText:Front Door]
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:18:31 AM: trace parse() --- description: read attr - raw: B8F10101010A2500003000, dni: B8F1, endpoint: 01, cluster: 0101, size: 0A, attrId: 0025, result: success, encoding: 30, value: 00
7ca857b7-5502-48da-a03e-baf9a2c9b7b5 9:18:27 AM: info refresh() --- cmds: [st rattr 0xB8F1 0x01 0x0101 0x0025, delay 2000, st rattr 0xB8F1 0x01 0x0101 0x002B, delay 2000]

I’m guessing this response is saying the bind is not supported in some way.

0104 0101 01 01 0140 00 B8F1 00 00 0000 07 01 89002500

This is the Configure Reporting Response and it does mean there is a problem. The 89 near the end indicates INSUFFICIENT_SPACE. Devices can’t report an unlimited number of attributes and apparently the lock has hit its limit. You can test this by changing configure to only configure reporting of the Operational Mode and see if it starts working after you factory reset and join it again.

The zigbee-lock DTH configures reporting for two attributes, lock state and battery percentage remaining. Assuming you’re basing your development on that DTH, I believe you could remove the reporting of lock state if you implement support for Operating Events. Perhaps that would leave enough room for you to configure reporting of Operating Mode.

1 Like

Awesome. Thanks for your help. I was thinking that could be the issue. I do get lock status from both lock state and operation events lock responses. Operation Events lock responses are just sent (no binding). Unfortunately, if the response is lost, it will not send again. For reliability, having a max relay time on lock state is probably still a better choice. I’ll look at removing something else.

@tpmanley Thanks again. Apparently binding to this attribute takes even more memory than lock state and I have to remove something else as well to get it configured. I find it surprising that if I bind to all of the attributes Yale advertises and can configure manually I run out of memory. I would have thought they would have had enough memory at least for all of those (they do it on the Control4 modules, but then again, there is more money there). Back to the drawing board.

Have you been able to get it to report if its the only attribute configured for reporting? It’s possible that there is something else going on preventing it from reporting and the error code indicating INSUFFICIENT SPACE is incorrect. I might be able to find out from Yale if they support reporting of that attribute at all.

It is reporting now. I had 8 configure attributes and had to drop it to 6 to get it to report.

Lock State
Battery
Alarm
Auto lock
One touch locking
Operating mode
Privacy Button
Sound volume

Removing those two was enough.

Did you try just removing Privacy Button on its own? I’m just guessing but maybe Lock State has a default reporting configuration so removing the call to configure reporting of that attribute didn’t change the total number of attributes it was reporting.

One of the other configures failed. Perhaps it had been that way since my last release when I added the 7th and I did not notice. I’d prefer to be able to configure more but I can do with 6. Just good to know why it was failing.

Interesting. I don’t know if this will help but if you don’t expect one or more of the attributes to change except if a command is sent from the Device Type Handler then you could just manually read the attribute after some delay. Taking enableAutoLock for example you could do something like this:

cmds = [zigbee.writeAttribute(CLUSTER_DOORLOCK, DOORLOCK_ATTR_AUTO_RELOCK_TIME, TYPE_U32, zigbee.convertToHexString(myTime,8)), "delay 5000", zigbee.readAttribute(CLUSTER_DOORLOCK, DOORLOCK_ATTR_AUTO_RELOCK_TIME)]

Then you won’t need to configure that attribute for reporting. Of course if the value is changed through the lock itself then it won’t send the report so it’s not ideal.

1 Like

Thanks. I’m already doing that with some commands that can’t change from the keypad. However, I would need about 10 configures to handle all of the attributes that can manually be changed. Just going to make it a point to tell users not to manually change them.

Cool. I switched my own Yale lock over to your DTH and it looks great so far. Looking forward to seeing where you take it!

I actually just went through the list and it is only 6 attributes that I am interested in changing that are manually changeable (plus Alarm and Battery: total 8). Just needed a little more memory space.

In any case I plan to add a stripped down version with the same commands/attributes as the “Z-Wave Lock with Lock Codes” to the SmartThings git shortly. Once I figure out how to do that. I plan on adding a few additions but not nearly as many as I have in the full DTH. Memory issues should not be a problem with that one.

1 Like

Just about to release version 0.7. That one removes the lock state. I’m guessing there is a bug in the current one and volume will not report correctly (it will hit the memory limitation)