RaspberryPi3を使ってSlackからエアコン操作を行う①

0.はじめに

以前暖房をつけっぱなしで家を出てしまい、家に帰宅した時に気づいて絶望しました。ラズパイを使ってこのようなことが起きないように、対策をしてみました。
手順としては、
①毎日決まった時間に部屋の温度を通知してくれるようにして、
②部屋の温度が明らかにおかしい(エアコンが付いている)場合は、リモートで操作して消す。
これを実現していきます。
①に関してはこちら↓の記事を参照してください。
RaspberryPi3で温湿度を取得してSlackに通知する
今回は②をやっていきます。

尚、今回は下記の記事を参考にしています。ありがとうございました。
バージョンの違いなどで何箇所かこの通りに行かなかったところもあったので、
そこを補えればいいなあ。
Slack経由で家の外からエアコンをon, offできる装置を、Raspberry Piで作ってみた。(しかも御坂美琴ちゃんが応答してくれる)

完成形はこちら
2018-03-17 22.30.35.jpg

1.必要なもの

以下を使って作成しました。

2.環境

次のことが準備できている前提で進みます。

  • ラズパイのOSインストール、初期設定が完了している。
  • 必要なものが揃っている。
  • Slackのサインアップが終わっている。
  • ラズパイのパブリックIPが設定されている。

3.Apache,phpのインストール

php5はインストールできなかったので、指定せず最新(php7.0)を入れました。

terminal
$ sudo apt-get install apache2
$ sudo apt-get install php
$ sudo update-rc.d apache2 defaults #起動時にapacheが自動で立ち上がるように設定

apacheのドキュメントルートはデフォルトが「/var/www」になっているので、そこにindex.phpを配置してapacheとphpの動作確認をします。

terminal
$ sudo vi /var/www/index.php
index.php
hello world from raspberry pi!
<?php echo "phpは正しく動いています。"; #phpが正しく動いてるか確認 ?>

下記コマンドを打てば、このように帰ってくればOKです。

terminal
$ curl http://localhost
hello world from raspberry pi!
phpは正しく動いています。

4.LEDをチカチカをさせる

ここからSlackとラズパイを連携させていきます。そのためにまずはLチカをさせるところから始めていきます。

ラズパイの電源を落として下図のように配線をします。
今回GPIOの接続は2番ピンにしています。
この後、LEDの指定をする時に、2番でない場合は何番にしたか覚えておきましょう。

スクリーンショット 2018-03-18 10.13.43.png

続いてLチカのコードを書いていきます。
任意のディレクトリで下記を作成します。

blink.sh
echo 2 > /sys/class/gpio/export #「GPIO2」を使う
sleep 1
echo out > /sys/class/gpio/gpio2/direction #「GPIO2」を出力用に使う

echo 1 > /sys/class/gpio/gpio2/value #点灯
sleep 1                              #1秒休む
echo 0 > /sys/class/gpio/gpio2/value #消灯
sleep 1
echo 1 > /sys/class/gpio/gpio2/value
sleep 1
echo 0 > /sys/class/gpio/gpio2/value
sleep 1
echo 1 > /sys/class/gpio/gpio2/value
sleep 1
echo 0 > /sys/class/gpio/gpio2/value

echo 2 > /sys/class/gpio/unexport #「GPIO2」の使用を終了
terminal
$ sudo sh blink.sh

LEDがチカチカすればOKです。

5.HTTPリクエストを送り、LEDをチカチカさせる

次は手順3のcurlコマンドでLチカを行います。
先ほど作成した/var/www/index.phpを修正します。

terminal
$ sudo vi /var/www/index.php
index.php
<?php exec('sudo sh /(任意)/blink.sh'); ?>
LEDを点滅させました!

ここでcurlコマンドを実行しても、権限の関係で動いてくれないみたいです。。
なので設定を追記します。

terminal
$ sudo visudo  #/etc/sudoers.tmpファイルが開かれる
/etc/sudoers.tmp
www-data ALL=NOPASSWD:/bin/sh  #一番下にこの行を追加します。

これでLEDがチカチカすればOKです。

terminal
$ curl http://localhost
LEDを点滅させました!

6.Slackと連携する

Slackと連携をさせるにはSlackのAPI「Outgoing WebHooks」というものを使用します。
参考にさせていただいた記事によると、「Outgoing WebHooks」はこんな感じみたいです。

Slack経由で家の外からエアコンをon, offできる装置を、Raspberry Piで作ってみた。(しかも御坂美琴ちゃんが応答してくれる)

このAPIは、特定のチャンネルや特定の文字列を含んだメッセージが送られると、こちらの指定したURLにPOSTアクセスをしてくれるというものです。
しかも、レスポンスでjsonデータを返してやれば、それをslack上のメッセージに表示してくれます。

ふむふむ。

下記サイトから「Outgoing WebHooks」を検索して、設定を行います。
https://slack.com/services/new

チャンネルと引き金となる言葉を指定します。
URLはラズパイのパブリックIPを指定します。

スクリーンショット 2018-03-18 10.59.11.png

スクリーンショット 2018-03-18 11.04.47.png

設定を保存したら、Slackから指定した言葉を投稿してみましょう。
LEDがチカチカすればOKです。
ここでうまく行かない場合は、URLが間違っている可能性が高いです。
(私はここでプライベートIPを指定していたことに気づかず、かなりの時間を消耗しました。。)

次にSlackで実行した際にラズパイから返答が返って来るようにします。
「Outgoing WebHooks」ではJSON形式で返せば、メッセージを返答させることができます。

/var/www/index.phpを下記のように修正します。

index.php
<?php exec('sudo sh /var/pi/blink.sh'); ?>
{"text":"LEDを点滅させました!"}

これでSlackで実行すると、このように返って来ると思います。
スクリーンショット 2018-03-18 11.28.18.png

(私は初めこの時点で「Outgoing WebHooks」の引き金となる言葉を「LED」にしていたために、無限ループに陥りました。。。みなさん気をつけてくださいね。)
スクリーンショット 2018-03-18 11.31.17.png

今回は一旦ここまでとします。
次からいよいよエアコンとの連携をしていきます。
RaspberryPi3を使ってSlackからエアコン操作を行う②

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.