This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC2650: Zigbee Communication Between Z-Tool Coordinator and Xiaomi Endpoint

Part Number: CC2650
Other Parts Discussed in Thread: CC2531, , Z-STACK

Hi,

In a project,we have SmartRF06 EVM + CC2650EMK and we have programmed CC2650 as a ZNP coordinator. We used CC2531 USB Dongle with Ubiqua as a sniffer.In addition to this we have xiaomi wijia wireless switch WXKG01LM. We wanted to use Z-tool as a CC2650 coordinator(with our javascript that was attached).

We could not work coordinator with xiaomi wijia wireless switch WXKG01LM. After joning network, Xiaomi is continously sending data request but we could not response from coordinator.Could you please guide us to communicate Z-tool based coordinator and Xiaomi liked endpoints?

Below is our Ubiqua screenshoots, and also attached our z-tool script code

znp.txt
import System;
import System.Text;
import TI.ZPI2;

class TheScript
{

  // Set this variable to the COM port assigned to the target device.

  private var comPort : String = "COM4";



  // Set to 'true' when running the ZNP in order to reset the devices and startup the network.
  private var ZNP_RUN : boolean = true;
  private var SUCCESS : int = 0;
  private var HOMEAUT : int = 0x0104;
  private var LIGHT   : int = 0x0100;
  private var AF_DEFAULT_RADIUS : int = 0x1E;

  

  // Set this variable to 'true' to enable the display of log messages (i.e. verbose mode).
  private var showLogMsgs : boolean = true;

  // Variables set by the incoming message handler to enable "re-try until success" looping.
  private var gotRstRsp           : boolean = false;
  private var gotCfgRsp           : boolean = false;
  private var gotRegRsp           : boolean = false;
  private var gotStartRsp         : boolean = false;
  private var gotStateRsp         : boolean = false;
  private var gotAfReqExtRsp      : boolean = false;
  private var gotAfIncExt         : boolean = false;
  private var gotAfStoreRsp       : boolean = false;
  private var gotAfRetrieveRsp    : boolean = false;
  private var gotDevRsp           : boolean = false;
  private var gotEpRsp            : boolean = false;
  private var gotSdescRsp         : boolean = false;
  private var gotTogRsp         : boolean = false;
  private var gotDevAnn         : boolean = false;


  private var isLight             : boolean = false;
  private var lightStatus             : boolean = false;

  private var profileId           : UInt16  = 0x0104;  // HA Profile ID
  private var devId               : UInt16  = 0x0100;  // HA Profile ID  oprginal 0x0100
  private var endPoint            : Byte    = 0x07;    // SampleSW has endpoint 12 so we use that
  private var inClusterCnt        : Byte    = 5;
  private var outClusterCnt       : Byte    = 1;
  private var inClusterList = new Array(inClusterCnt);
  private var outClusterList = new Array(outClusterCnt);

  private var NV_STARTUP_OPTION     : Byte = 0x03;
  private var NV_STARTUP_OPTION_VAL : Byte = 0x03;	// 0x03 = clear configuration
  private var NV_STARTUP_LEN        : Byte = 1;

  private var cfgArr = new Array(256);        // Make big enough for any configuration item.
  private var retrieveBuf = new Array(1024);  // Make big enough for any huge message attempted.
  private var retrieveTot           : UInt16 = 741;
  private var retrieveLen           : Byte = 247;
  private var retrieveIdx           : UInt16;
  private var devaddr               : UInt16;
  private var dstEndPoint           : Byte    = 0x00;

  //DATA REQUEST VARIABLES
  private var drData = new Array(99);
  private var drCluster           : UInt16;
  private var drTrans          : Byte;
  private var drOption           : Byte;
  private var drRadius           : Byte = 0x1E;//AF_DEFAULT_RADIUS
  private var drLen           : Byte;

  //INCOMING MESSAGES VARIABLES

  private var imData = new Array(99);
  private var imGroup           : UInt16;
  private var imCluster           : UInt16;
  private var imSrcAddr           : UInt16;
  private var imSrcEndp           : Byte;
  private var imDstEndp           : Byte;
  private var imLen           : Byte;


  private var lqiData = new Array(99);
  private var lqiCount           : UInt16  = 0;



  // Main class function that effects the work of this test script.
  function run()
  {
    //set up clusters for light
    inClusterList[0] = 0;
    inClusterList[1] = 3;
    inClusterList[2] = 4;
    inClusterList[3] = 5;
    inClusterList[4] = 6;

    outClusterList[0] = 0;

    // Subscribe to the incoming message handler.
    ZEngine.add_OnMessageZPI2(this.msgHandler);

    if (ZNP_RUN)
    {
      // Force a device out of the boot loader wait routine (no bad effect when SBL is not present).
      sysReset(comPort);

      // Set the Startup_Option to Clear Configuration and reset to effect the action.
      cfgArr[0] = NV_STARTUP_OPTION_VAL;
      writeCfg(comPort , NV_STARTUP_OPTION, NV_STARTUP_LEN, cfgArr);
      sysReset(comPort);


      // Setup the device type, panId & channel mask and reset to effect the settings.
      cfgArr[0] = 0x00;                    // Set Logical Device Type to ZC.
      writeCfg(comPort, 0x87, 0x01, cfgArr);
      cfgArr[0] = 0xFF; cfgArr[1] = 0xFF;  // Set Pan Id to 0xFFFF Change this to any PAN ID you need to test
      writeCfg(comPort, 0x83, 0x02, cfgArr);
      cfgArr[0] = 0x00; cfgArr[1] = 0x00; cfgArr[2] = 0x08; cfgArr[3] = 0x00;
                                // Set Channel Maks to 0x00080000  // 19 - 0x13 - Current channel mask
      writeCfg(comPort, 0x84, 0x04, cfgArr);
      // Start the devices on the network.
      cfgArr[0] = 0x01;
      writeCfg(comPort, 0x8F, 0x01, cfgArr);// Set ZCD_NV_ZDO_DIRECT_CB to true. ZCD_NV_ZDO_DIRECT_CB address = 0x8F

      afReg(comPort);// set end point this is needed in order to send af_data_request

      startReq(comPort);// start the application
	  
	  //ZEngine.Pause(800);
	  //msgzes1(comPort ,0,Object);
	  
	  //while(1)
	  //{
		//  ZEngine.Pause(800);
		  // msgzes2(comPort ,0,Object);
	  //}
	   //msgzes3(comPort ,0,Object);
      //Add application specific code HERE if needed.
    }

    ZEngine.Complete(true);
  }
  
//
/*
	function msgzes1(comm : String)
	{
		logMsg("ZES -->" + comm + " --> SCript Complete");
	}
	function msgzes2(comm)
	{
		logMsg("ZES -->" + comm + " --> Döngü -->");
	}
	function msgzes3(comm : String)
	{
		logMsg("ZES -->" + comm + " --> Dongu Complete"+ Object);
	}	
*/	
 // Handler for incoming messages.
  function msgHandler(comm : String, id : MESSAGE_ID, msg : Object)
  {
	//logMsg("ZES -->" + comm + " --> "+ Object);
    switch (id)
    {
    case MESSAGE_ID.SYS_RESET_RESPONSE:
    {
      gotRstRsp = true;
      break;
    }
    case MESSAGE_ID.UTIL_GET_DEVICE_INFO_RESPONSE:
    {
        var devRsp : UTIL_GET_DEVICE_INFO_RESPONSE = msg;
        if (devRsp.Status == SUCCESS && devRsp.NumAssocDevices != 0)
        {
            gotDevRsp = true;
            devaddr = devRsp.AssocDevicesList[0];
        }

      break;
    }

    case MESSAGE_ID.ZDO_ACTIVE_EP_RSP:
    {
        var epRsp : ZDO_ACTIVE_EP_RSP = msg;
        if (epRsp.Status == SUCCESS && epRsp.ActiveEPCount != 0)
        {
            gotEpRsp=true;
            dstEndPoint = epRsp.ActiveEPList[0];
        }


      break;
    }

    case MESSAGE_ID.ZB_WRITE_CONFIGURATION_RSP:
    {
      var cfgRsp : ZB_WRITE_CONFIGURATION_RSP = msg;

      if (cfgRsp.Status == SUCCESS)
      {
        gotCfgRsp = true;
      }
      break;
    }

    case MESSAGE_ID.AF_REGISTER_SRSP:
    {
      var regRsp : AF_REGISTER_SRSP = msg;

      if (regRsp.Status == SUCCESS)
      {
        gotRegRsp = true;
      }
      break;
    }

    case MESSAGE_ID.ZB_START_REQUEST_RSP:
    {
      gotStartRsp = true;
      break;
    }


    case MESSAGE_ID.ZDO_END_DEVICE_ANNCE_IND:
    {
      var zdoDevInd : ZDO_END_DEVICE_ANNCE_IND = msg;
      devaddr = zdoDevInd.NwkAddr;
      gotDevAnn = true;

      break;
    }

    case MESSAGE_ID.ZDO_STATE_CHANGE_IND:
    {
      var zdoStateInd : ZDO_STATE_CHANGE_IND = msg;

      // { DEV_END_DEVICE, DEV_ROUTER, DEV_ZB_COORD } : { 6, 7, 9 }
      if ((zdoStateInd.State == 6) || (zdoStateInd.State == 7) || (zdoStateInd.State == 9))
      {
        gotStateRsp = true;
      }
      break;
    }

    case MESSAGE_ID.AF_DATA_REQUEST_EXT_SRSP:
    {
      var afRegExtRsp : AF_DATA_REQUEST_EXT_SRSP = msg;

      if (afRegExtRsp.Status == SUCCESS)
      {
        gotAfReqExtRsp = true;
      }
      break;
    }

    case MESSAGE_ID.AF_DATA_STORE_SRSP:
    {
      var afStoreRsp : AF_DATA_STORE_SRSP = msg;

      if (afStoreRsp.Status == SUCCESS)
      {
        gotAfStoreRsp = true;
      }
      break;
    }

    case MESSAGE_ID.AF_INCOMING_MSG_EXT:
    {
      var afIncExt : AF_INCOMING_MSG_EXT = msg;
      afDataRetrieve(comm, msg);
      gotAfIncExt = true;
      break;
    }

    case MESSAGE_ID.AF_INCOMING_MSG:
    {
      var inMsgDat : AF_INCOMING_MSG = msg;
      imGroup = inMsgDat.GroupID;
      imCluster = inMsgDat.ClusterID;
      imSrcAddr = inMsgDat.SrcAddr;
      imSrcEndp = inMsgDat.SrcEndpoint;
      imDstEndp = inMsgDat.DstEndpoint;
      imLen = inMsgDat.Len;
      for (var idx = 0; idx < imLen; idx++)
      {
          imData[idx] = inMsgDat.Data[idx];
      }

      break;
    }

    case MESSAGE_ID.AF_DATA_RETRIEVE_SRSP:
    {
      var afRetrieveRsp : AF_DATA_RETRIEVE_SRSP = msg;

      if (afRetrieveRsp.Status == SUCCESS)
      {
        var index = retrieveIdx;

        for (var idx = 0; idx < afRetrieveRsp.Length; idx++, index++)
        {
          retrieveBuf[index] = afRetrieveRsp.Data[idx];
        }

        gotAfRetrieveRsp = true;
      }
      break;
    }

    default:
	
      break;
    }
  }
  
// Send a ZB_SYSTEM_RESET message until success.
  function sysReset(comm : String)
  {
    var req : ZB_SYSTEM_RESET = new ZB_SYSTEM_RESET();
    gotRstRsp = false;

    while (!gotRstRsp)
    {
      logMsg("ZB_SYSTEM_RESET  to " + comm);
      ZEngine.Send(comm, req);
      ZEngine.Pause(800);

      // Sending SYS_STACK_TUNE as a way to get a 0x07 byte to the SBL before a 0xF8 byte.
      // An 0x07 byte forces the immediate run of valid code.
      //sysStackTune(comm, 7, 7);
      //ZEngine.Pause(300);
    }
  }


  
  
    // Send a ZB_WRITE_CONFIGURATION message.
  function writeCfg(comm : String, cfgId : Byte, len : Byte,  value : Array )
  {
    var req : ZB_WRITE_CONFIGURATION = new ZB_WRITE_CONFIGURATION();
    req.ConfigId = cfgId;
    req.Len = len;
		req.Value = new byte[len];

    for (var idx = 0; idx < len; idx++)
    {
      req.Value[idx] = value[idx];
    }

    gotCfgRsp = false;
    while (!gotCfgRsp)
    {
      logMsg("ZB_WRITE_CONFIGURATION  to " + comm);
      ZEngine.Send(comm, req);
      ZEngine.Pause(200);
    }
  }

    // Send a ZB_AF_REGISTER_REQUEST message.
  function afReg(comm : String)
  {
    var req : AF_REGISTER  = new AF_REGISTER ();
    req.AppProfID = profileId;
    req.AppDeviceId = devId;
    req.EndPoint = endPoint;
    req.AppInClusterList = inClusterList;
    req.AppNumInClusters = inClusterCnt;
    req.AppOutClusterList = outClusterList;
    req.AppNumOutClusters = outClusterCnt;

    gotRegRsp = false;
    while (!gotRegRsp)
    {
      logMsg("ZB_AF_REGISTER_REQUEST to " + comm);
      ZEngine.Send(comm, req);
      ZEngine.Pause(200);
    }
  }
  
    // Send a ZB_START_REQUEST message.
  function startReq(comm : String)
  {
    var req : ZB_START_REQUEST  = new ZB_START_REQUEST();

    gotStateRsp = false;
    while (!gotStateRsp)
    {
      gotStartRsp = false;
      while (!gotStartRsp)
      {
        logMsg("ZB_START_REQUEST  to " + comm);
        ZEngine.Send(comm, req);
        ZEngine.Pause(1000);
      }
      ZEngine.Pause(5000);
    }
  }
  
  // Display a log message if log messages are enabled.
  function logMsg(theMsg : String)
  {
    if (showLogMsgs)
    {
      ZEngine.WriteLog(theMsg);  // Display the message.
    }
  }  
  
  // Send a series of AF_DATA_RETRIEVE message(s) to get the data of an incoming huge message.
  function afDataRetrieve(comm : String, msgIn : AF_INCOMING_MSG_EXT)
  {
    var req : AF_DATA_RETRIEVE = new AF_DATA_RETRIEVE();

    req.Timestamp = msgIn.Timestamp;
    req.Length = retrieveLen;

    for (retrieveIdx = 0; retrieveIdx < msgIn.Len; retrieveIdx += retrieveLen)
    {
      req.Index = retrieveIdx;

      gotAfRetrieveRsp = false;
      while (!gotAfRetrieveRsp)
      {
        logMsg("AF_DATA_RETRIEVE to " + comm);
        ZEngine.Send(comm, req);
        ZEngine.Pause(100);
      }
    }

    /* Retrieve request with zero length indicates to flush the message and free the dynamic
     * memory. If this request fails, the device times out the incoming huge message buffer and
     * flushes it automatically, so no loop here.
     */
    req.Length = 0;
    logMsg("AF_DATA_RETRIEVE to " + comm);
    ZEngine.Send(comm, req);
    ZEngine.Pause(100);
  } 
 
  
} // End of TheScript class.


// The script engine will execute the following code.
var script:TheScript = new TheScript();
script.run();