目的
スマフォの通知ではダメなの?
はい、だめなのです!
私のスマフォは常時マナーモードで単純に気づかないのです(´ノω・`*)ナケル-
そこで、IoT ブロック MESH LEDを使って
Slackの障害報告専用チャンネルを監視して光で知らせることができれば
晩ご飯つくってるときとかTVみているときでもすぐに反応ができるのではと考えました。
ちなみに社畜ではありませんが
エンジニアとして最低限の責任を果たしたいだけです( ・`ω・´)キリッ
MESHとは
以下リンクを確認ください
今回利用するMESH LEDはこちら
事前準備
- MESH LEDを購入
- Googleスプレッドシートを作成してGoogle Apps ScriptをWebアプリ化する
- Slack APIを利用するたにBOTを作成
- MESH アプリをダウンロード
- MESH SDK利用のためのアカウントを登録
MESH SDKとは、ざっくりオリジナルのレシピを作成するもの
参考:https://meshprj.com/sdk-jp/
Let's try!
光らせるまでの整理
- 一定間隔で監視を走らせる
-
Slackの障害報告専用チャンネルのメッセージを取得して
最終投稿日を取得
- Googleスプレッドシート
- で取得した最終投稿日をPOST
- シートA1の登録済みの最終投稿日を取得
- シートA1の値をで取得した最終投稿日で更新
-
登録済みの最終投稿日
とPOSTされた最終投稿日
を比較 - 比較した結果をレスポンスに含めて返す
- レスポンスの結果をみて
MESH LEDを光らせる
OR処理を止める
1. MESH LEDを購入
公式サイトにリンクがあるので買いましょう。
2. Googleスプレッドシートを作成してGoogle Apps ScriptをWebアプリ化する
ツールのスクリプトエディタをクリックして開く
-
コード.gs
function doPost(e) { const sheet = SpreadsheetApp.getActive().getSheetByName('alert'); const range = sheet.getRange('A2'); const value = range.getValue(); const params = e.parameter; let result = { 'isAlert': false }; if (!'latest_timestamp' in params) { return postResult(result); } if (value !== params['latest_timestamp']) { range.setValue(params['latest_timestamp']); result.isAlert = true; return postResult(result); } return postResult(result); } function postResult (obj) { return ContentService.createTextOutput(JSON.stringify(obj)).setMimeType(ContentService.MimeType.JSON); }
デプロイ完了後にウェブアプリのURLが発行されるのでメモ
3. Slack APIを利用するたにBOTを作成
手順はググればたくさんでてくるので省略します。
必要なのはAPI利用のためのTokenと適切な権限を設定してください。
今回利用するAPI
4. MESH SDKを利用してオリジナルレシピを作成
MESH SDK利用のためのアカウントを登録済みであることが前提
MESH SDKのドキュメント
https://meshprj.com/sdk/doc/ja/
Slack レシピ
特定チャンネルのメッセージを取得して最新投稿データのタイムスタンプを取得する
Connectorのラベル名はなくてもよい
Code詳細
callbackSuccessが呼ばれたら
それ以降に記述された処理がどうなるかまでは調べ切れていないのであしからず。
Initialize
return {
resultType : 'pause'
}
Receive
記述なし
Execute
var url = "https://slack.com/api/conversations.history";
var token = '****';
var data = {
'channel' : '****',
'limit' : 10
};
ajax ({
url : url,
data : data,
type : 'get',
contentType : 'application/x-www-form-urlencoded',
dataType : 'json',
timeout : 10000,
beforeSend: function( xhr ) {
xhr.setRequestHeader('Authorization', 'Bearer ' + token );
},
success : function ( contents ) {
log('Slack Response : ' + contents);
if (contents.ok) {
for (k in contents.messages) {
var v = contents.messages[k];
log('text : ' + v.text);
if ('blocks' in v) {
callbackSuccess( {
resultType : 'continue',
messageValues : {
latestTimestamp : v.ts
}
} );
break;
}
}
} else {
callbackSuccess( {
resultType : 'stop'
} );
}
},
error : function ( request, errorMessage ) {
log('Slack Error : ' + errorMessage);
callbackSuccess( {
resultType : 'stop'
} );
}
});
return {
resultType : 'pause'
};
Result
return {
resultType : 'continue'
};
Google Sheets レシピ
Slackレシピで取得したタイムスタンプをGoogle SheetsにPOSTする
Connectorのラベル名はなくてもよい
Code詳細
callbackSuccessが呼ばれたら
それ以降に記述された処理がどうなるかまでは調べ切れていないのであしからず。
Initialize
return {
resultType : 'pause'
}
Receive
記述なし
Execute
var url = "https://script.google.com/macros/s/****/exec";
var data = {
'latest_timestamp' : messageValues.latestTimestamp
};
log(messageValues.latestTimestamp);
ajax ({
url : url,
data : data,
type : 'post',
contentType : 'application/x-www-form-urlencoded',
dataType : 'json',
timeout : 10000,
success : function ( contents ) {
log('Google Response : ' + contents);
if (contents.isAlert) {
log('Alert occurs');
callbackSuccess( {
resultType : 'continue'
} );
} else {
log('Peace');
callbackSuccess( {
resultType : 'stop'
} );
}
},
error : function ( request, errorMessage ) {
log('Google Error : ' + errorMessage);
callbackSuccess( {
resultType : 'stop'
} );
}
});
return {
resultType : 'pause'
};
Result
return {
resultType : 'continue'
};
5. MESH アプリで組み立てる
MESH SDKで作成したレシピの追加方法は下記URLの2. 追加
で説明があります。
https://meshprj.com/sdk/doc/ja/
各タグの詳細
① 既存レシピのタイマーを設置して一定の間隔で
を設定
② MESH SDKで作成したレシピの Slack関数を設定
③ MESH SDKで作成したレシピの Google Sheets関数を設定
④ ご自由に
6. 以上で完成
光らせてみた感想
単純に楽しい
可能性は無限大
ただ、おそらくですが
光らせるまでの処理はiPhoneに入れたMESHアプリが担当するので
バッテリーの減りとかが気になる
今回は機種変して不要となったiPhoneを利用したのでよいけど
iPhoneの役割をRaspberry Piに置き換えることも可能とのこと