async get(options = {}) {
    const payload = {
      gwId: this.device.gwID,
      devId: this.device.id,
      t: Math.round(new Date().getTime() / 1000).toString(),
      dps: {},
      uid: this.device.id
    };

    if (options.cid) {
      payload.cid = options.cid;
    }

    const commandByte = this.device.version === '3.4' || this.device.version === '3.5' ? CommandType.DP_QUERY_NEW : CommandType.DP_QUERY;

    // Create byte buffer
    const buffer = this.device.parser.encode({
      data: payload,
      commandByte,
      sequenceN: ++this._currentSequenceN
    });

    let data;
    // Send request to read data - should work in most cases beside Protocol 3.2
    if (this.device.version !== '3.2') {
      debug('GET Payload:');
      debug(payload);

      data = await this._send(buffer);
    }

    // If data read failed with defined error messages or device uses Protocol 3.2 we need to read differently
    if (
      this.device.version === '3.2' ||
      data === 'json obj data unvalid' || data === 'data format error' /* || data === 'devid not found' */
    ) {
      // Some devices don't respond to DP_QUERY so, for DPS get commands, fall
      // back to using SEND with null value. This appears to always work as
      // long as the DPS key exist on the device.
      // For schema there's currently no fallback options
      debug('GET needs to use SEND instead of DP_QUERY to get data');
      const setOptions = {
        dps: options.dps ? options.dps : 1,
        set: null,
        isSetCallToGetData: true
      };
      data = await this.set(setOptions);
    }

    if (typeof data !== 'object' || options.schema === true) {
      // Return whole response
      return data;
    }

    if (options.dps) {
      // Return specific property
      return data.dps[options.dps];
    }

    // Return first property by default
    return data.dps ? data.dps['1'] : undefined;
  }
Gets a device's current status.
Defaults to returning only the value of the first DPS index.
@param {Object} [options] Options object
@param {Boolean} [options.schema]
true to return entire list of properties from device
@param {Number} [options.dps=1]
DPS index to return
@param {String} [options.cid]
if specified, use device id of zigbee gateway and cid of subdevice to get its status
@example
// get first, default property from device
tuya.get().then(status => console.log(status))
@example
// get second property from device
tuya.get({dps: 2}).then(status => console.log(status))
@example
// get all available data from device
tuya.get({schema: true}).then(data => console.log(data))
@returns {Promise<Boolean|undefined|Object>}
returns boolean if single property is requested, otherwise returns object of results