【GoogleAppsScript】Slackに投稿したらNature RemoのAPIを使って照明とエアコンを消す
はじめに
外出時にいつも同居人に外出する旨のメッセージを送ってるんだけど↓の3つをやらなくちゃいけないのがめんどい
- Nature Remoで照明を消す
- Nature Remoでエアコンを消す
- Slackでメッセージを送る
「Slackにメッセージを送るのが前提としてあるんだったら他のフローは省略できるのでは...?」って思ったのがきっかけです
Nature Remoとは?
やること
- Slackにメッセージを投稿する
- SlackからGASにイベントを投げてもらう
- GASからNature RemoのAPIを叩く
1は人間が実行して2,3を自動化します:)
使うもの
(いつも 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
ボタンを押せるようになるので保存
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; }
コード全文
最後に
スマートスピーカー持ってません