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.