Ошибка в реализации состояния отчета для Google Home

Как предлагается в образце кода codelabs, я реализую состояние отчета следующим образом:

function reportState(devid, actionVal) {
  console.log('INSIDE REPORT STATE');
  if (!app.jwt) {
    console.warn('Service account key is not configured');
    console.warn('Report state is unavailable');
    return;
  }




const postData = {
    requestId: 'hgrwbj', /* Any unique ID */
    agentUserId: '123', /* Hardcoded user ID */
    payload: {
      devices: {
        states: {
          [devid]: {
            on: actionVal,
          },
        },
      },
    },
  };



  console.log('POSTDATA %j', postData);

  return app.reportState(postData)
     .then((data) => {
       console.log('Report state came back');
       console.info(data);
     });
};

Но он дает мне следующий ответ:

{
  "error": {
    "code": 400,
    "message": "Request contains an invalid argument.",
    "status": "INVALID_ARGUMENT"
  }
}

где значение для пост-данных:

{"requestId":"hgrwbj","agentUserId":"123","payload":{"devices":{"states":{"0123456789:01":{"on":"true"}}}}}

Поэтому я попытался реализовать это другим способом, а именно:

function reportState(devid, actionVal) {
  console.log('INSIDE REPORT STATE');
  if (!app.jwt) {
    console.warn('Service account key is not configured');
    console.warn('Report state is unavailable');
    return;
  }

  const jwtClient = new google.auth.JWT(
    jwt.client_email,
    null,
    jwt.private_key,
    ['https://www.googleapis.com/auth/homegraph'],
    null
  );
  console.log('JWT',jwt);
  console.log('JWTCLIENT',jwtClient);

  const postData = {
    requestId: 'hgrwbj', /* Any unique ID */
    agentUserId: '123', /* Hardcoded user ID */
    payload: {
      devices: {
        states: {
          [devid]: {
            on: actionVal,
          },
        },
      },
    },
  };

  jwtClient.authorize((err, tokens) => {
    if (err) {
      console.error(err);
      return;
    }
    console.log('ACCESS TOKEN',tokens.access_token);
    const options = {
      hostname: 'homegraph.googleapis.com',
      port: 443,
      path: '/v1/devices:reportStateAndNotification',
      method: 'POST',
      headers: {
        Authorization: ` Bearer ${tokens.access_token}`,
      },
    };
    return new Promise((resolve, reject) => {
      let responseData = '';
      const req = https.request(options, (res) => {
        res.on('data', (d) => {
          responseData += d.toString();
        });
        res.on('end', () => {
          resolve(responseData);
        });
      });
      req.on('error', (e) => {
        reject(e);
      });
      // Write data to request body
      req.write(JSON.stringify(postData));
      req.end();
    }).then((data) => {
      console.info('REPORT STATE RESPONsE', data);
    });
  });


  console.log('POSTDATA %j', postData);

};

Но на этот раз в ответ выдает только идентификатор запроса:

{"requestId":"hgrwbj"} 

На этот раз Postdata:

{"requestId":"hgrwbj","agentUserId":"123","payload":{"devices":{"states": {"0123456789:01":{"on":true}}}}}

Есть ли предложения о том, где я хочу получить правильный ответ? Заранее спасибо .


person Sanu    schedule 13.11.2018    source источник


Ответы (1)


В вашем отчете укажите:

"on": "true"

Вы отправляете свойство "true" в виде строки. Сервер ожидает логический тип без кавычек:

"on": true

Это должно работать, как ожидалось.

person Nick Felker    schedule 13.11.2018
comment
Спасибо @Nick Felker за быстрый ответ. Надеюсь, это решит проблему. Я дам вам знать, когда снова скомпилирую и протестирую код. - person Sanu; 14.11.2018
comment
Привет, @ nick-felker! После редактирования я получаю тот же ответ, то есть "{requestId: hgrwbj}". Вероятно, в этом случае код статуса включен только в заголовок. Как и в случае недействительного запроса, тело ответа JSON также содержало код: 400, я ожидал, что в теле ответа будет код: 200. Надеюсь, это сработает. Однако у меня есть еще одно сомнение, если я открыл Google Home на двух устройствах одновременно и просматривал Smart Plug в режиме просмотра одного устройства. При переключении устройства в один. он не отражается в другом, если его снова не минимизировать и не максимизировать. Это нормально? - person Sanu; 14.11.2018
comment
Если ответ HTTP равен 200, он передается обратно как один из заголовков ответа, а не в теле. Если вы получаете идентификатор запроса, а не сообщение об ошибке, это хорошо. В самом приложении может быть проблема состояния, но вы должны ожидать, что это будет нормально. - person Nick Felker; 14.11.2018