XBee Product Codes
Digi Product Types
Adapter or boxed Xbee products purchased from Digi will come correctly configured and be displayed within the web interface and telnet node lists with a type string - such as "RS-232 Adapter" or "X4 gateway". The XBee module's "DD" parameter encodes this knowledge as a 32-bit value.
Yet if you replace the supplied Xbee module with a new one - for example to swap a higher power XBP24-B module for the supplied XB24-B module, then the device may show up as "Unspecified Device" instead. Some XBee firmware - such as the special purpose Digital or Analog I/O versions - force the "DD" value to the correct codes, while others - such as the generic AT or API firmware usable in RS-232 or RS-485 adapters will leave set DD set to zero and be shown as "Unspecified".
It is important that the "DD" value be correct, as many gateway and Python functions rely upon the "DD" value to understand how to use the device.
Python access to DD Parameter
Your Python program can read or write the DD or Digi Device Type with the ddo_get_param() method and ddo_set_param() method call. If the ddo_get_param() is successful, then 'result' will be a 4-byte binary string in form AA BB CC DD, where Module Device Type is 0xAABB and Product Type is 0xCCDD:
import zigbee result = zigbee.ddo_get_param( "[00:13:a2:00:40:0a:07:8d]!", 'DD')
Forcing New DD from a Digi Gateway
You can preload the DD value correctly from XCTU when you load the XBee module firmware
You can also use telnet (or the command-line) access to a Digi X2/X4/X8 gateway to write new DD values to an active device. In the example below, the four "Unspecified" devices are RS-232 Adapters which had new XBee modules installed. The set xbee command is shown used to set new DD values, plus the WR command must be added to save the new DD value to NVRAM. The 0x03 in the upper word defines these correctly as Zigbee 2007, and the 0x0005 in the lower word defines them as RS-232 adapters.
Since the gateway does not expect the DD value of devices to change dynamically, you may need to reboot either the affected XBee nodes or the gateway to have the new device information show up. Of course, setting the incorrect DD values will confuse and perhaps disable mesh applications which base functional and I/O expectations on the DD value!
#> disp xbee XBee network device list PAN ID: 0x3261 Channel: 0x0d (2415 MHz) Gateway address: 00:13:a2:00:40:4b:87:c7! Node ID Network Extended address Product type ------------ ------- ------------------------ ------------ COORDINATOR [0000]! 00:13:a2:00:40:4b:87:c7! X4 Gateway ROUTERS AN05 [5aea]! 00:13:a2:00:40:52:94:8b! Analog IO Adapter AN06 [0c06]! 00:13:a2:00:40:52:94:b8! Analog IO Adapter AN17 [7ad6]! 00:13:a2:00:40:52:94:ac! Analog IO Adapter AN26 [0480]! 00:13:a2:00:40:52:94:ad! Analog IO Adapter ANNA_ZN [05e8]! 00:13:a2:00:40:52:94:a0! Unspecified BELA_ZN [794a]! 00:13:a2:00:40:34:16:20! Unspecified CALI_ZN [3c39]! 00:13:a2:00:40:34:16:4e! Unspecified DEBI_ZN [3921]! 00:13:a2:00:40:52:94:b2! Unspecified #> set xbee address=00:13:a2:00:40:52:94:b2! DD=0x30005 WR #> set xbee address=00:13:a2:00:40:34:16:20! DD=0x30005 WR #> set xbee address=00:13:a2:00:40:52:94:a0! DD=0x30005 WR #> set xbee address=00:13:a2:00:40:34:16:4e! DD=0x30005 WR (Then after some time delay ... the types will refresh and show correctly) #> disp xbee ... ANNA_ZN [05e8]! 00:13:a2:00:40:52:94:a0! RS-232 Adapter DEBI_ZN [3921]! 00:13:a2:00:40:52:94:b2! RS-232 Adapter CALI_ZN [3c39]! 00:13:a2:00:40:34:16:4e! RS-232 Adapter BELA_ZN [794a]! 00:13:a2:00:40:34:16:20! RS-232 Adapter ...
Note that the telnet "DD=" command assumes decimal unless the "0x" prefix is added. So setting "DD=30005" will instead set the DD value to 0x00007535. You need to use "DD=0x30005"
DD upper word : Module Type
16-bit | Description | FW / HW Mnemonics |
---|---|---|
0x0000 | Unspecified | |
0x0001 | XBee 802.15.4 (Series 1) | XB24 (or XB24-A) |
0x0002 | XBee ZNet 2.5 | XB24-B |
0x0003 | XBee ZB (Zigbee 2007) | XB24-ZB (or XB24-Z7) |
0x0004 | XBee DigiMesh 900 (900MHz) | XB09-DM |
0x0005 | XBee DigiMesh 2.4 (2.4GHz) | XB24-DM |
0x0006 | XBee 868 point to multi-point (868MHz for EU market) | XB08-DP |
0x0007 | XBee Point to Multi-point 900Mhz | XB09-DP |
0x0008 | XTend DigiMesh 900Mhz | |
0x0009 | XBee 802.11 Wifi | |
0x000A | XBee ZB on S2C (surface mount) | |
0x000B | XBee DigiMesh 900 S3B | |
0x000C | XBee DigiMesh 868 |
The PRO or higher wattage XBee modules use XBP instead of XB in firmware and hardware mnemonics. However the upper DD word is used to learn the general class of API command functionality within the firmware in a module, thus do not attempt to assign hardware meaning to these values!
Example code to convert these values to strings:
dd_upper_names = ['Bad_Code','ZB24-A','ZB24-B','XB24-ZB','XB09-DM','XB24-DM','XB08-DP','XB09-DP'] def get_dd_upper_code_string( code): """Given upper/module-type word of the DD response as 16-bit integer, return string""" try: return( dd_upper_names[code]) except: return( dd_upper_names[0])
Important feature/limitation in the DD upper word
While some XBee technology force this value to be as expected, others allow the user to redefine the meaning. Thus you can never fully trust the DD value returned. For example, an OEM who produced products using ZNet 2.5 might load a value such as 0x00021234 into their product. After they start creating Zigbee 2007 or DigiMesh 2.4Mhz models, the SHOULD change the DD value to be 0x00031234 and 0x00051234 respectively - but they might not. Therefore it is safest to have your Python code use the upper-word of the gateway XBee to determine 'mesh/xbee' type, and only read the DD lower word of attached devices.
DD lower word : Digi Product Type
0x0000 | Unspecified |
0x0001 | ConnectPort X8 Gateway |
0x0002 | ConnectPort X4 Gateway |
0x0003 | ConnectPort X2 Gateway |
0x0004 | XBee Commissioning Tool |
0x0005 | XBee RS-232 Adapter |
0x0006 | XBee RS-485 Adapter |
0x0007 | XBee Sensor (1-wire) Adapter |
0x0008 | XBee Wall Router |
0x0009 | XBee RS-232PH (Power Harvesting) Adapter |
0x000A | XBee Digital IO Adapter |
0x000B | XBee Analog IO Adapter |
0x000C | X-Stick |
0x000D | XBee Sensor /L/T/H Adapter |
0x000E | XBee Sensor /L/T Adapter |
0x000F | Smart Plug |
0x0010 | USB Dongle |
0x0011 | LCD Display |
0x0013 | ConnectPort X5 Gateway |
0x0014 | Embedded Gateway |
0x0015 | ConnectPort X3 Gateway |
0x0016 | Net OS Device |
0x0017 | XG3 Gateway |
0x0018 | LTS Gateway |
0x0019 | CC3G Gateway |
0x001A | X2 ULC Gateway |
0xFF00-0xFFFF | Available for private customer use |
Example code to convert these values to strings:
dd_lower_names = ['Unspecified','X8','X4','X2','XBee Commissioning Tool','XBee232','XBee485', 'XBee1W','XBee Wall Router', 'XBee232PH','XBeeDIO','XBeeAIO','X-Stick', 'XBee /L/T/H','XBee /L/T','SmartPlug','USB Dongle','LCD Display','Undefined', 'X5','Embbeded GWay','X3','NetOS', ] def get_dd_lower_code_string( code): """Given lower/product word of the DD response as 16-bit integer, return string""" try: return( dd_lower_names[code]) except: return( dd_lower_names[0])
Currently assigned 'Private Customer Use' code
Note Although these are official, Digi is not rigidly enforcing use. Thus you may encounter other XBee users reusing these codes for other products.
Rabbit-Brand Products
0x0100 | Generic Rabbit-Brand Product |
0x0101 | RCM4510W |
0x0102 | BL4S1xx |
0x0103 | BL4S230 |
0x01F0-0x01FF | Rabbit End-Customer Use |
Non-Digi End Products
0x0201 | Massa M3 |
0x0210 | B&B Electronics LDVDS-XB |
0x0220 | SSI Embedded Systems PSU Sensor M |
0x0221 | SSI Embedded Systems PSU Sensor O |
0x0231 | PointSix Temperature Sensor |
0x0240 | Henny Penny 485 Adapter with PXBee |
0x02B0-BF | Bejouled Solar Inverters |
0x02C0-CF | Windpower |
0x02D0-DF | RobustMesh, RS-232/485 |
If you have a device utilizing an XBee radio and desire a registered public DD value, please contact Digi support.