Raspberry Pi のタクトスイッチ(複数個)を押すと Slack に通知する

Raspberry Pi のタクトスイッチを押すことで Slack に定型文を投稿できるようにしたい。タクトスイッチは4つぐらい設置してそれぞれに定型文を割り当てたい。これに挑戦してみることにした。

今回は4つのタクトスイッチを使い、それぞれ別の定型文を Slack に投稿できるようにしたいが、単純なメッセージ送信だけでなく、時刻や指定時間後のように時間を指定したメッセージ送信を行いたい。

環境:Raspberry Pi 3 Model B、Raspbian Stretch

(1)配線は『ラズベリー・パイで遊ぼう!』(p257)と全く同じ。

TactSwitchToSlack-20180228

タクトスイッチはブレッドボードに刺す向きを注意しよう。

タクトスイッチは向きに注意|文系の伊藤さんと電気の話
https://ameblo.jp/bun-ito/entry-12259611903.html

(2)以下のページで Slack の Incoming Webhook 用 Webhook URL を取得する。

https://slack.com/services/new/incoming-webhook

(3)時間を指定した投稿用のシェルスクリプトを作成する。といっても以下のようなシンプルなものだ。slack-post.sh とでも名前を付けておこう。

#!/bin/sh
curl -X POST --data-urlencode "payload={\"channel\": \"#[チャンネル名]\", \"username\": \"[botの名前]\", \"text\": \"[投稿内容]\", \"icon_emoji\": \"[bot アイコン]\"}" [2の Webhook URL]

(2018-12-03 追記: [チャンネル名] 等の [ と ] はコードから除いてください。)

bot アイコンは以下のページが参考になる。

Emoji cheat sheet for GitHub, Basecamp and other services
https://www.webpagefx.com/tools/emoji-cheat-sheet/

(4)時間指定投稿用に at コマンドのインストールもしておく。

$ sudo apt-get install at

三浦さんちのブログ: Raspberry PiのLinux、Raspbian atコマンドで学んだshとbashの問題
http://smiura3000.blogspot.jp/2016/04/raspberry-pilinuxraspbian-atshbash.html

(5)同じディレクトリに、投稿用の以下のようなシェルスクリプトを作成する。TactSwitchToSlack.sh とでも名前を付けておこう。

#!/bin/sh

PORT1=18
PORT2=23
PORT3=24
PORT4=25

sleep 30s

for port in $PORT1 $PORT2 $PORT3 $PORT4 ; do
  gpio -g mode $port in
  gpio -g mode $port down
done

while true ; do

  if [ `gpio -g read $PORT1` -eq 1 ] ; then
    curl -X POST --data-urlencode "payload={\"channel\": \"#[チャンネル名]\", \"username\": \"[botの名前]\", \"text\": \"[投稿内容]\", \"icon_emoji\": \"[bot アイコン]\"}" [2の Webhook URL]
  fi

  if [ `gpio -g read $PORT2` -eq 1 ] ; then
    curl -X POST --data-urlencode "payload={\"channel\": \"#[チャンネル名]\", \"username\": \"[botの名前]\", \"text\": \"[投稿内容]\", \"icon_emoji\": \"[bot アイコン]\"}" [2の Webhook URL]
  fi

  if [ `gpio -g read $PORT3` -eq 1 ] ; then
    at now +40minutes -f ./home/pi/slack-post.sh
  fi

  if [ `gpio -g read $PORT4` -eq 1 ] ; then
    at 17:30 -f ./home/pi/slack-post.sh
  fi

  sleep 0.2
done

タクトスイッチの割り当ては以下。時間指定の場合だけ、3の外部のシェルスクリプトを呼び出すようにした(同一シェルスクリプト内に書く方法が分からなくて・・・)。

タクトスイッチの割り当て
・GPIO 18:Slack へ定型文を投稿1
・GPIO 23:Slack へ定型文を投稿2
・GPIO 24:40 分後に Slack へ3の定型文を投稿
・GIPO 25:17:30 にSlack へ3の定型文を投稿

起動時に 30 秒間 sleep させているのは、そうしないと時々連続投稿が始まって暴走状態になるから。理由はよく分からない。

最後の sleep 0.2 は 0.1 だと連続投稿になってしまうことが多かったから。

at で指定するシェルスクリプトは絶対パスで記述する。

【at】Linuxで指定した時刻にジョブを実行する | UX MILK
http://uxmilk.jp/53442

Linuxコマンド【 sleep 】指定した時間だけ処理を遅延 – Linux入門 – Webkaru
https://webkaru.net/linux/sleep-command/

(6)3と5のシェルスクリプトに実行権限を与える。

$ sudo chmod 735 slack-post.sh
$ sudo chmod 735 TactSwitchToSlack.sh

(7)実行してみよう。

$ ./TactSwitchToSlack.sh

タクトスイッチを押すと Slack に投稿されるはずだ。Ctrl + c で終了できるが、時間指定の投稿に関しては at のキューに登録されているので、指定時間になったら投稿される。

(8)Raspberry Pi 起動時にシェルスクリプトを開始したいので、/etc/rc.local というファイルを編集する。

exit 0 より前に以下を追加しよう。以下のように絶対パスで記入しないとうまく動かなかった。

./home/pi/TactSwitchToSlack.sh

参考:
Raspberry Piでプログラムを自動起動する5種類の方法を比較・解説
http://hendigi.karaage.xyz/2016/11/auto-boot/