2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SlackからRaspberry Piにメッセージを送信する

Last updated at Posted at 2019-02-15

PCやスマホのSlackからRaspberry Piにメッセージを送信します。メッセージ内容に応じた処理をラズパイに登録しておくことで、スマホからラズパイの再起動・シャットダウンといったことも可能になります。また、Node-REDからSlackにメッセージ(Emoji Icon付き)、画像ファイルを送信する方法についても記載します。スマホでラズパイを操作したい方、Slackに自動でメッセージを送信したい方はぜひお試しください。

Slackノードのインストールと事前準備

導入手順はこちら(botsを使用)こちら(hubotを使用)に分かりやすくまとまっています。どちらか1つを導入すればよいです。また、slackノードからメッセージを送信する場合は、こちら(botsを使用)のIncoming WebHooksの手順にてWebHook URLを取得しておきます。また、Slackに画像も送信したい場合は、こちらこちらの手順でChannel IDを取得しておきます。ありがたく参照させていただくことにして、ここでは割愛します。以上で必要なものは揃います。

実現方法

PCやスマホのSlackからRaspberry Piにメッセージを送信:

事前準備の手順に従って、Slackにbotsもしくはhubotの設定が行い、トークンを取得してあるものします。取得したトークンをSlack Bot Inノードに指定することで、PCやスマホのSlackから当該ボット宛に送信したメッセージをSlack Bot Inが受け取ることができます(メッセージはmsg.payloadに格納される)。例えばメッセージが「reboot」であれば、sudo rebootを行うexecノードを配置すれば、スマホから再起動が可能になります。
slack01.JPG
(起動時にNode-REDが自動起動する設定にしておかないと、再度スマホからrebootはできないのでご注意ください。)
また、Slack Bot Outノードにも同じトークンを指定しておくことで、Slack Bot Outに渡したmsg.payloadがボットに送信してPCやスマホから閲覧可能となります。

Raspberry PiからSlackにメッセージ(Emoji Icon付き)を送信:

slackノードにWebHook URLと「#」で始まるChannel名を指定し、msg.username, msg.emojiIcon, msg.payloadにそれぞれ表示するユーザ名、Emoji Icon, メッセージをセットした状態でslackノードにmsgを渡します。そうすることで指定のChannelにメッセージを送信して、PCやスマホから閲覧可能となります。以下はslackノードに渡すmsgを用意するfunctionノードのコードイメージです。

msg.username='user name'
msg.emojiIcon=':smile:';
msg.payload = 'メッセージ';
return msg;

(注意1)以下の「slackノードの編集」にて「Posting UserName」や「Emoji Icon」を設定していると、これらの設定値のほうがmsgで渡すmsg.usernameやmsg.emojiIconよりも優先されます。msgを使用して渡す値を切り替えたい場合は、以下の編集画面の設定値は空白にしておきます。(WebHook URLは空白ではなく設定が必要です。)
slack02.JPG
(注意2)msg.usernameは切り替えずにmsg.emojiIconのみ切り替えてメッセージ送信しても、Slack上に表示されるEmoji Iconは切り替わらないようです(同じユーザのメッセージとして連続でメッセージのみ表示される)。これはmsg.emojiIcon(もしくは編集画面の「Emoji Icon」)で指定するのがユーザのアイコンだからであり、msg.emojiIconでユーザのアイコンをメッセージごとに切り替えたい場合は、ユーザを切り替える(msg.emojiIconとmsg.usernameをセットで切り替える)ようにすればよいようです。メッセージ内に表示するEmoji Iconを切り替えたい場合はmsg.payloadに切り替えた絵文字のコードを埋め込めばよいです。

msg.payload='メッセージ:smile:'

Emoji Iconの一覧はこちらにまとまっていますので、めぼしいものをmsg.payloadに設定して表示してみるとよいかと思います。

Raspberry PiからSlackにメッセージと画像(jpg等)を送信:

これはslackノードでは実現できなさそうでしたので、pythonでコードを書き、Node-RED上のexecノードから実行します。requests.postを使用するにあたりトークンとChannel IDが必要になりますが、前述の通りトークンはbotsもしくはhubotの設定時に取得したトークン、Channel IDは「#」で始まるChannel名ではなく、別のものであることにご注意ください。(slackノードを使用した場合の送信はノードで指定したユーザからの送信、この方法の送信はトークンに対応するボットからの送信になります。)
Channel IDの確認方法とPythonコードはこちらこちらを参照させていただきました。
また、Node-REDのフロー上で送信する画像ファイルを切り替えたい場合は、Pythonコードで

import sys
args = sys.argv
filename = args[1]
...

などで引数を取得するようにしておき、execノードは以下のようにmsg.payloadを引数に使用する旨のチェックボックスをonにしておけばよいです。execノードに対して画像ファイル名が格納されたmsg.payloadを渡せば、そのファイルをSlackに送信することができます(ファイル名は絶対パスで渡すのがよいかと思います)。
slack03.JPG

まとめ

長々と書きましたが、ポイントは以下の通りです。

  1. PCやスマホからRaspberry Piにメッセージを送る場合は、Slackにボットの設定トークンの取得Slack Bot Inノードに当該トークンを設定
  2. Raspberry PiからPCやスマホ(のslack)にメッセージを送る場合は、画像を送らないのであればSlackにIncoming WebHooksの設定WebHook URLの取得slackノードに当該WebHook URLと「#」で始まるChannel名を設定
  3. 画像も送るのであればボットのトークンと「#」で始まるChannel名とは異なるChannel IDを取得Pythonコードを用意したうえで当該トークンと当該Channel IDを設定

参考にしたサイト

BotsとIncoming WebHooks: node-redにSlackをつなげてみる
Hubot: 一番シンプルにSlackでbotを作る
Channel ID取得と画像送信: プログラムからSlackに画像投稿する方法まとめ
Channel ID取得と画像送信:PythonでSlackに画像をアップロードする方法
Emoji Iconリスト:Qiita/Github/Slack/Discord 絵文字一覧

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?