【GoogleAppsScript】Slackに投稿したらNature RemoのAPIを使って照明とエアコンを消す

はじめに

外出時にいつも同居人に外出する旨のメッセージを送ってるんだけど↓の3つをやらなくちゃいけないのがめんどい

  1. Nature Remoで照明を消す
  2. Nature Remoでエアコンを消す
  3. Slackでメッセージを送る

「Slackにメッセージを送るのが前提としてあるんだったら他のフローは省略できるのでは...?」って思ったのがきっかけです

Nature Remoとは?

nature.global

やること

  1. Slackにメッセージを投稿する
  2. SlackからGASにイベントを投げてもらう
  3. GASからNature RemoのAPIを叩く

1は人間が実行して2,3を自動化します:)

使うもの

  • Nature Remo API
  • GoogleAppsScript
  • Slack Bot

(いつも GoogleAppsScript なのか GoogleAppScripts なのかが覚えられずググってまう)

手順

1. Slackでアプリbotの作成

https://api.slack.com/apps からアプリBotを作成して、Event Subscriptionsからトリガーとなるイベントを設定する
今回はチャンネルでもDMでも使いたかったから以下を設定

Request URL で検証するために以下の内容でGASを作成して一旦Webアプリケーションとしてデプロイする

function doPost(e) {
  const params = JSON.parse(e.postData.getDataAsString());
  return ContentService.createTextOutput(params.challenge);
}

実行URLをSlack側のRequest URLに入力
↓みたいにVerified になったらSave Changesボタンを押せるようになるので保存

Slack Apiの画面

2. GASからNature RemoのAPIを叩く

https://home.nature.global/ からNature RemoのBearerトークンの発行

電化製品を操作するためのIDの取得には https://api.nature.global/1/appliances/ へGETリクエストを送って確認する

①電気を消す

UrlFetchApp.fetch(
  "https://api.nature.global/1/appliances/" + LIGHT_ID + "/light",
  {
    method: "post",
    headers: { Authorization: "Bearer " + NATURE_REMO_TOKEN },
    payload: {
      appliance: LIGHT_ID,
      button: "off",
    },
  }
);

②エアコンを消す

UrlFetchApp.fetch(
  "https://api.nature.global/1/appliances/" + AIRCON_ID + "/aircon_settings",
  {
    method: "post",
    headers: { Authorization: "Bearer " + NATURE_REMO_TOKEN },
    payload: {
      appliance: AIRCON_ID,
      button: "power-off",
    },
  }
);

クエリパラメータでもbodyでも動作するのなんでなん...?

Slackからのイベントでメッセージが特定の言葉だったときにこれらを実行する

function doPost(e) {
  const SLACK_USER_ID = "自分のSlackUserId";
  const params = JSON.parse(e.postData.getDataAsString());
  if (
    params.event.type === "message" &&
    ["トリガーにしたいメッセージの配列"].includes(params.event.text) &&
    params.event.user === SLACK_USER_ID
  ) {
    turnOffAppliances();
    return;
  }
  return;
}

コード全文

最後に

スマートスピーカー持ってません

参考

developer.nature.global swagger.nature.global

api.slack.com