Help with sending ZigBee Configure Reporting Command


(John Rucker) #1

I have a device that uses the Analog Cluster 0x000C and reports its value on attribute 0x0055. I would like to configure its reporting interval using the ZigBee Configure Reporting Command. I’m struggling to understand the examples in the device type examples (maybe i haven’t found a good example yet). Looking at the configure() method in the SmartSense Moisture Sensor Device Type I see they are using this command: “zcl global send-me-a-report 1 0x20 0x20 300 0600 {01}” Im guessing this is the command for the the Configure Reporting Command. Can someone please verify this for me and help with the attributes that are passed to the method.


[RELEASE] Iris Smart Plug (3210-L) Zigbee Plug with Z-wave Repeater
(John Rucker) #3

After some time I have come up with this possible syntax for the command. I still cant get the command to be sent to my ZigBee device so I must have something wrong.


CoRE and Piston Rules Engine, first design steps
(Andrew Urman) #4

for this message right now you need to use the “send command” right after.

"zcl global send-me-a-report 1 0x20 0x20 600 3600 {0100}", "delay 500",
"send 0x${device.deviceNetworkId} 1 1", "delay 1000",

where the 1 1 part of the message is source and destination endpoints.


(John Rucker) #5

Thanks Andrew I tried that yesterday wondering what that send command was for. I put it back in today and I still don’t get a report configuration packet. With my sniffer I don’t see a (configure attribute reporting packet) coming from the SmartThings hub. After my device does a device announce, I see the SmartThings hub query my end points, query each end point for a simple descriptor, do a ZDO bind as my code instructs but no configure attribute reporting packet is sent?? Does your send-me-a-report method support 0x39 single precision data type? I wonder if I still have some type of syntax error?
Here is my configure() method:

def configure() {
log.debug "Configuring reporting for attribute 0x0055 of the Analog cluster" 
log.debug "Binding SEP 0x38 DEP 0x01 Cluster 0x000D Analog cluster to hub"         
    def configCmds = [
    "zcl global send-me-a-report 0x000C 0x0055 0x39 0x3C 0x384 {0x3f800000}", "delay 200",
    "send 0x${device.deviceNetworkId} 0x01 0x38", "delay 1500",


    "zdo bind 0x${device.deviceNetworkId} 0x38 0x01 0x000C {${device.zigbeeId}} {}", "delay 500",
    "zdo bind 0x${device.deviceNetworkId} 0x38 0x01 0x0006 {${device.zigbeeId}} {}", "delay 1500",        
]
log.info "Sending ZigBee Configuration Commands to Backyard Anemometer 2"
return configCmds
}

(John Rucker) #6

Update: It looks like the SmartThings method “zcl global send-me-a-report” is getting hung up on my attributes data type 0x39 floating point value. I was able to get a “configure reporting” packet to be sent to my backyard Anemometer if I changed the attribute data type to 0x20 Unsigned 8-bit integer with a value of {1}.

The Analog cluster reports its present value attribute 0x0055 as a Single precision value. Please see page 167 table 3.67 of the ZigBee Cluster Library. I need to be able to send a Data type 0x39 Single precision (see Table 2.16 on page 56 of the ZigBee Cluster Library) value in my configure attribute reporting packet.

Thanks please let me know if there is another way to send this command or if I’m totally off base here. I will be happy to change my custom device type.


(Andrew Urman) #7

the payload is automatically in hex so you don’t have to use the 0x part of {0x3f800000}. It was probably not getting packed and sent.


(John Rucker) #8

That gets me a big step closer. Now the packet is being sent from the SmartThings hub and received by my device. It has the Minimum and Maximum reporting value but is missing the Reportable Change number (my floating point value). Here is my updated method (same as before just took the 0x off the reportable change parameter)

def configure() {
log.debug "Configuring reporting for attribute 0x0055 of the Analog cluster" 
log.debug "Binding SEP 0x38 DEP 0x01 Cluster 0x000D Analog cluster to hub"         
    def configCmds = [
    "zcl global send-me-a-report 0x000C 0x0055 0x39 0x3C 0x384 {3f800000}", "delay 200",
    "send 0x${device.deviceNetworkId} 0x01 0x38", "delay 1500",


    "zdo bind 0x${device.deviceNetworkId} 0x38 0x01 0x000C {${device.zigbeeId}} {}", "delay 500",
    "zdo bind 0x${device.deviceNetworkId} 0x38 0x01 0x0006 {${device.zigbeeId}} {}", "delay 1500",        
]
log.info "Sending ZigBee Configuration Commands to Backyard Anemometer 2"
return configCmds
//return configCmds + refresh()
}

I have also included a screen shot of two packets my sniffer recorded.

The first one Packet #164 shows a good Configure Reporting command I sent from my desktop.

This next screen shot is of Packet #60 sent from my SmartThings hub to my device and in it you can see that the Maximum Reporting Interval is missing.


(John Rucker) #9

Any news on this? Im still not able to send a floating point value to my device.


(Bill Goodman) #10

Having messed with this a bit the last couple days, I’m not certain but I’m guessing the {3F800000} in your payload needs to have the byte order reversed. It should probably be {0000803F}.


(Bill Goodman) #11

Hey JohnR, did you get this to work?

Your info here helped me to get my reports to work.

One thing I discovered is that you can see the response to the Configure Reporting command which comes back as a catchall with commandId=7.

I was setting up 3 reports and one wasn’t working. Looking at the Configure Reporting Response I saw that there was an error code for UNREPORTABLE_ATTRIBUTE (0x8C) which presumably means that the device is not capable of doing periodic reports on that particular attribute.


(John Rucker) #12

Yea I got this to work by not using the floating point value to set the reporting value if I remember correctly. I basically worked around the problem. It it has been working great for months now. Thanks for the suggestion what your are referring too is called Little Indian format and it refers to reverse ordering the bytes in multi-byte values. All multi-byte values sent in ZigBee data packets are Little Indian format. At least all that I have seen.

Thanks again!


#13

That’s probably an autocorrect, but the term you’re looking for is “Little Endian.” Not “Little Indian.” :wink:

http://betterexplained.com/articles/understanding-big-and-little-endian-byte-order/