Green Power Application Overview

Green Power Device

A Green Power Device (GPD) is a special type of Zigbee device different from the three logical devices defined in Zigbee PRO: Coordinator, Router or End Device. GPDs are designed for applications where the end product has a very strict energy budget, such as an energy-harvesting device or batteryless devices. GPDs follow their own Zigbee Green Power specification which defines the possible capabilities of a given GPD implementation, such as security level, commissioning procedures and supported commands per device definition.

As GPDs are the most restricted device in terms of functionality, these devices are not part of the Zigbee network unless they are commissioned to a Green Power Sink (GPS) device directly or through a Green Power Proxy (GPP). Although GPS is a specific application function to be added, the GPP feature is automatically applied to all routing nodes (Zigbee coordinators and routers) as required to meet Zigbee product compliancy (see Product Certification). If the device to which a GPD is commissioned to is not present, then the GPD must be recommissioned, as it does not have a means to keep communication with any other device.

Once the GPD is commissioned it can send Green Power Data Frames (GPDF) which are converted by the GPP into Green Power Notifications (ZCL frames) that can travel through the Zigbee network until it reaches its GPS destination to be processed by the application. For further details on GPDs and their interactions with the network, please refer to z-stack-overview-green-power.

General Application Architecture

This section describes how a Green Power Device application task is structured in more detail. Refer to the Running the Example Applications to determine which Zigbee 3.0 examples support specific Green Power functionality (GPD and GPS).

Green Power Device Configuration

Configuration definitions are used at build time and determine the behavior of the device at runtime. Thus, to change the Green Power Device behavior, it is ecessary to modify the SysConfig settings, the descriptions of which are covered in z-stack-overview-green-power. An example of creating a GPD switch is given below (found in Debug/syscfg/ti_zigbee_config.h of the gpd_switch project after building).

/******************************************************************************
* CONFIGURATION
*/

#ifndef CHANNEL_LIST
#define CHANNEL_LIST            {17}
#endif



#ifndef GPD_APP_ID_TYPE
#define GPD_APP_ID_TYPE         0
#endif

#ifndef GPD_SRC_ID
#define GPD_SRC_ID              0xabacadac
#endif

#ifndef SECURITY_LEVEL
#define SECURITY_LEVEL          3
#endif

#ifndef SECURITY_KEY_TYPE
#define SECURITY_KEY_TYPE       4
#endif

#ifndef SECURITY_KEY
#define SECURITY_KEY            {0xCF,0xCE,0xCD,0xCC,0xCB,0xCA,0xC9,0xC8,0xC7,0xC6,0xC5,0xC4,0xC3,0xC2,0xC1,0xC0}
#endif

#ifndef GPDF_REPETITIONS
#define GPDF_REPETITIONS        3
#endif

#ifndef UNIDIR_DEVICE
#define UNIDIR_DEVICE           ZB_FALSE
#endif

#ifndef BATTERYLESS_DEVICE
#define BATTERYLESS_DEVICE      ZB_TRUE
#endif

Additional definitions are located from the Project PropertiesBuildARM CompilerPredefined Symbols but should not be changed.

Application

The application code is minimal to reduce power consumption on device start-up (from gpd_switch.c):

MAIN()
{
  /* Variable where a mask of pressed buttons will be stored to */
  zb_uint32_t button_mask = 0;
  zb_uint32_t button_id = 0;
  zb_uint_t comm_steps = 0;

  ARGV_UNUSED;

  /* Platform-specific initialization */
  zgpd_platform_init(ARGC_ARGV);

  TRACE_INIT("zgpd_bidir_battery_onoff");

  /* ZPGD stack init */
  zgpd_app_init(g_zgpd_encryption_key, &g_device_config);

#if ( UNIDIR_DEVICE == ZB_FALSE )

#if ( BATTERYLESS_DEVICE == ZB_TRUE )
  zgpd_bidir_batteryless_mode();
#else
  zgpd_bidir_battery_mode();
#endif // BATTERYLESS_DEVICE == ZB_TRUE

#elif ( BATTERYLESS_DEVICE == ZB_FALSE )
    // Enable button decounce if unidirectional and not a batteryless device
    zgpd_button_enable_debounce();
#endif // UNIDIR_DEVICE == ZB_FALSE

  /* Inform platform layer about buttons number */
  zgpd_set_buttons_max_num(BUTTONS_NUM);

#if (BATTERYLESS_DEVICE == ZB_FALSE)
  while (1)
#endif // BATTERYLESS_DEVICE == ZB_FALSE
  {
    /* Get mask of buttons pressed at power ON time - if multiple are pressed
      simultaneously, only the higher index is considered */
    zgpd_wait_for_button();
    button_mask = zgpd_test_get_button_mask();
    button_id = 31 - MAGIC_CLZ(button_mask);

    switch (button_id)
    {
    case BUTTON_COMMISSIONING:

#if ( UNIDIR_DEVICE == ZB_TRUE )
      zgpd_unidir_commissioning_step(&g_device_config, &g_tx_cfg);
#else

#if ( BATTERYLESS_DEVICE == ZB_TRUE )
      if (!zgpd_bidir_is_commissionned())
      {
        /* In bidir batteryless we can do only one commissioning iteration a time, then die */
        zgpd_bidir_commissioning_step(&g_device_config, &g_tx_cfg);
      }
#else // Battery Bidirectional Device
      /* Commissioning button pressed when alredy commissioned - let's decommission this device */
      if (zgpd_bidir_is_commissionned())
      {
        zgpd_bidir_decommission(&g_device_config, &g_tx_cfg);
        break;
      }

      /** [bidir_step] */
      /* In contrast to batteryless bidir commissioning, here we can do multiple
      * iterations until commissioning complete. */
      while (!zgpd_bidir_is_commissionned())
      {
        zgpd_bidir_commissioning_step(&g_device_config, &g_tx_cfg);

        /* If can't commission, do not loop there forever */
        comm_steps++;
        if (comm_steps > COMM_STEPS_LIMIT)
        {
          break;
        }
      }
      comm_steps = 0;
      /** [bidir_step] */

      if (!zgpd_bidir_is_commissionned())
      {
        /* If could not commission, go to deep sleep to save the battery */
        continue;
      }
#endif // BATTERYLESS_DEVICE == ZB_TRUE
#endif // UNIDIR_DEVICE == ZB_TRUE
      break;

    case BUTTON_ON:
      /* Button 1 pressed - send ON */
      ZGPD_CMD_ON(&g_device_config, &g_tx_cfg);
      /** [button2] */
      break;

    case BUTTON_TOGGLE:
      /* Button 2 pressed - send TOGGLE */
      ZGPD_CMD_TOGGLE(&g_device_config, &g_tx_cfg);
      break;

    case BUTTON_OFF:
      /* Button 3 pressed - send OFF */
      ZGPD_CMD_OFF(&g_device_config, &g_tx_cfg);
      break;

    default:
      break;
    }
#if ( BATTERYLESS_DEVICE == ZB_TRUE )
    osif_deep_sleep();
#endif // BATTERYLESS_DEVICE == ZB_TRUE
  }
}

Mode and commissioning functions used, along with button operations, are dependent on the BATTERYLESS_DEVICE and UNIDIR_DEVICE pre-definitions.

Send Green Power Data Frames

API prototypes to send Green Power Data Frames (GPDF) is provided in zb_command.h. The generic function zb_zgpd_payloadless_cmd() sends a frame formated for the Green Power Device configuration automatically by providing a zgpd_tx_cfg_t struct with the formatted zgpd_device_config_t device configuration.

Setting Up the Network with GPD and GPS

To set up a network with a Green Power Device (GPD) and a Green Power Sink (GPS), you will need 2-3 devices:

  1. Green Power Device (gpd_switch or gpd_attr_reporting)

  2. Green Power Sink

  3. Optional: Green Power Proxy (any other Zigbee 3.0 routing device)

Select Network Channel

First, determine which channel you would like to use for your test. On the Green Power Sink (and Green Power Proxy, if applicable), configure the channel mask accordingly (see Configuring Channel). Select the same channel for the Green Power Device (see Radio Configuration).

Create and Open the Network on the GPS

Next, create a network with your coordinator.

Join the GPP Device

If you would prefer a Green Power Proxy (GPP) to route GP Data Frames, it must be joined to the network formed by the coordinator.

Note

This step is entirely optional as the GPD can be directly commissioned to the GPS coordinator

Enable Commissioning on the GPS

Next, enable GPS Commissioning on the ZC GP Sink.

Commission the GPD into the Network

Lastly, commission a GPD like the gpd_switch into the network by following the instructions in the Commissioning the device Into the network section of this readme:

Example Sniffer Capture of Green Power Traffic

Here is an annotated Zigbee sniffer log of the expected behavior following the instructions above:

../_images/green-power-network-example.png