Raspberry Pi のタクトスイッチ(複数個)を押すと Slack に通知する
Raspberry Pi のタクトスイッチを押すことで Slack に定型文を投稿できるようにしたい。タクトスイッチは4つぐらい設置してそれぞれに定型文を割り当てたい。これに挑戦してみることにした。
今回は4つのタクトスイッチを使い、それぞれ別の定型文を Slack に投稿できるようにしたいが、単純なメッセージ送信だけでなく、時刻や指定時間後のように時間を指定したメッセージ送信を行いたい。
環境:Raspberry Pi 3 Model B、Raspbian Stretch
(1)配線は『ラズベリー・パイで遊ぼう!』(p257)と全く同じ。
タクトスイッチはブレッドボードに刺す向きを注意しよう。
タクトスイッチは向きに注意|文系の伊藤さんと電気の話
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 とでも名前を付けておこう。
1#!/bin/sh
2curl -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 とでも名前を付けておこう。
1#!/bin/sh
2
3PORT1=18
4PORT2=23
5PORT3=24
6PORT4=25
7
8sleep 30s
9
10for port in $PORT1 $PORT2 $PORT3 $PORT4 ; do
11 gpio -g mode $port in
12 gpio -g mode $port down
13done
14
15while true ; do
16
17 if [ `gpio -g read $PORT1` -eq 1 ] ; then
18 curl -X POST --data-urlencode "payload={\"channel\": \"#[チャンネル名]\", \"username\": \"[botの名前]\", \"text\": \"[投稿内容]\", \"icon_emoji\": \"[bot アイコン]\"}" [2の Webhook URL]
19 fi
20
21 if [ `gpio -g read $PORT2` -eq 1 ] ; then
22 curl -X POST --data-urlencode "payload={\"channel\": \"#[チャンネル名]\", \"username\": \"[botの名前]\", \"text\": \"[投稿内容]\", \"icon_emoji\": \"[bot アイコン]\"}" [2の Webhook URL]
23 fi
24
25 if [ `gpio -g read $PORT3` -eq 1 ] ; then
26 at now +40minutes -f ./home/pi/slack-post.sh
27 fi
28
29 if [ `gpio -g read $PORT4` -eq 1 ] ; then
30 at 17:30 -f ./home/pi/slack-post.sh
31 fi
32
33 sleep 0.2
34done
タクトスイッチの割り当ては以下。時間指定の場合だけ、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/