Yado_tech

旅館+ITとはなんぞ

GASでTuya APIにアクセスする 後編

 

f:id:devilmakelie:20210110163301j:plain

前回から随分と間が空いてしまいましたが、GAS側のコードを掲載します。

 

yadotech.hateblo.jp

 

 

やり方はTuyaからトークン取得→トークンを使ってコマンドを送る。

コマンドの種類やURLはTuya Developerの

[Cloud] →[API Explorer]

f:id:devilmakelie:20210520103720p:plain

[Device Management] → [Get Device Details]

f:id:devilmakelie:20210520104327p:plain

こちらにDevice Idを貼り付けてPOSTすると右側に出ている[category]がデバイスのカテゴリです。


f:id:devilmakelie:20210520184858p:plain

このカテゴリでデバイスのコマンドを探します。この場合は『dj』がカテゴリとなります。

バイスのカテゴリはこちらで見つけます。

[Cloud Development] →[Standard Instruction]

でカテゴリに応じたコマンドを見つけることができます。

あとは以下GASをコピペして利用して下さい。

最後にmain functionを実行すると思ったとおりの結果になると思います。


//TUYA API 設定 こちらに記載。
const clientId = "cliend_id";
const clientSecret = "client_secret";
const device_id = ["device_id"];

var url = "https://openapi.tuyacn.com/v1.0/token?grant_type=1";
var command_urls = device_id.map(
  (key) => `https://openapi.tuyacn.com/v1.0/devices/${key}/commands`
);

//コマンド。こちらはデバイスのカテゴリに応じて変更。
var tuya_command = {
  off: [{ code: "switch_led", value: false }],
  scene: [
    { code: "switch_led", value: true },
    { code: "scene_data_v2", value: { scene_num: 4 } },
  ],
};

function mainfunction() {
  setScene(tuya_command["off"]);
}

//ここから
function setScene(command) {
  var timeStamp = getTime().toString();

  var token = retreiveAccessToken(clientId, clientSecret, timeStamp, url);
  var sign = calcSignWithToken(clientId, token, clientSecret, timeStamp);
  var headers = {
    client_id: clientId,
    access_token: token,
    t: timeStamp,
    sign: sign,
    sign_method: "HMAC-SHA256",
    "Content-Type": "application/json",
  };

  var options = {
    method: "POST",
    headers: headers,
    payload: JSON.stringify({
      commands: command,
    }),
  };
  // Logger.log(`access_token: ${token}`);
  // Logger.log(`sign :${sign}`);
  // Logger.log(`timestamp:${timeStamp}`);
  res = command_urls.map((key) => UrlFetchApp.fetch(key, options));
  Logger.log(res);
}

function retreiveAccessToken(clientId, clientSecret, timeStamp, url) {
  var easy_sign = calcSign(clientId, clientSecret, timeStamp);
  var headers = {
    client_id: clientId,
    sign: easy_sign,
    t: timeStamp,
    sign_method: "HMAC-SHA256",
    // Authorization: `Bearer $clientSecret`,
  };

  var options = {
    method: "GET",
    headers: headers,
    payload: {},
  };

  res = UrlFetchApp.fetch(url, options);
  return JSON.parse(res).result.access_token;
}

function getTime() {
  var now = new Date().getTime();
  return now;
}

function calcSign(clientId, clientSecret, timeStamp) {
  var str = clientId + timeStamp;
  var hash = Utilities.computeHmacSha256Signature(str, clientSecret);
  var signature = hash.reduce(function (str, chr) {
    chr = (chr < 0 ? chr + 256 : chr).toString(16);
    return str + (chr.length == 1 ? "0" : "") + chr;
  }, "");
  return signature.toUpperCase();
}

function calcSignWithToken(clientId, accessToken, clientSecret, timeStamp) {
  var str = clientId + accessToken + timeStamp;
  var hash = Utilities.computeHmacSha256Signature(str, clientSecret);
  var signature = hash.reduce(function (str, chr) {
    chr = (chr < 0 ? chr + 256 : chr).toString(16);
    return str + (chr.length == 1 ? "0" : "") + chr;
  }, "");
  return signature.toUpperCase();
}