0.はじめに
以前暖房をつけっぱなしで家を出てしまい、家に帰宅した時に気づいて絶望しました。ラズパイを使ってこのようなことが起きないように、対策をしてみました。
手順としては、
①毎日決まった時間に部屋の温度を通知してくれるようにして、
②部屋の温度が明らかにおかしい(エアコンが付いている)場合は、リモートで操作して消す。
これを実現していきます。
①に関してはこちら↓の記事を参照してください。
RaspberryPi3で温湿度を取得してSlackに通知する
今回は②をやっていきます。
尚、今回は下記の記事を参考にしています。ありがとうございました。
バージョンの違いなどで何箇所かこの通りに行かなかったところもあったので、
そこを補えればいいなあ。
Slack経由で家の外からエアコンをon, offできる装置を、Raspberry Piで作ってみた。(しかも御坂美琴ちゃんが応答してくれる)
1.必要なもの
以下を使って作成しました。
- RaspberryPi3
- ブレッドボード
- 抵抗220Ω(200Ωあれば良い) 1本
- ジャンパーケーブル(オスXメス) 4本,(オスXオス) 2本
- 赤外線リモコン受信モジュール PL-IRM2121(38kHz)
- 5mm赤外線LED 940nm OSI5FU5111C-40(5個入)
2.環境
次のことが準備できている前提で進みます。
- ラズパイのOSインストール、初期設定が完了している。
- 必要なものが揃っている。
- Slackのサインアップが終わっている。
- ラズパイのパブリックIPが設定されている。
3.Apache,phpのインストール
php5はインストールできなかったので、指定せず最新(php7.0)を入れました。
$ sudo apt-get install apache2
$ sudo apt-get install php
$ sudo update-rc.d apache2 defaults #起動時にapacheが自動で立ち上がるように設定
apacheのドキュメントルートはデフォルトが「/var/www」になっているので、そこにindex.phpを配置してapacheとphpの動作確認をします。
$ sudo vi /var/www/index.php
hello world from raspberry pi!
<?php echo "phpは正しく動いています。"; #phpが正しく動いてるか確認 ?>
下記コマンドを打てば、このように帰ってくればOKです。
$ curl http://localhost
hello world from raspberry pi!
phpは正しく動いています。
4.LEDをチカチカをさせる
ここからSlackとラズパイを連携させていきます。そのためにまずはLチカをさせるところから始めていきます。
ラズパイの電源を落として下図のように配線をします。
今回GPIOの接続は2番ピンにしています。
この後、LEDの指定をする時に、2番でない場合は何番にしたか覚えておきましょう。
続いてLチカのコードを書いていきます。
任意のディレクトリで下記を作成します。
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」の使用を終了
$ sudo sh blink.sh
LEDがチカチカすればOKです。
5.HTTPリクエストを送り、LEDをチカチカさせる
次は手順3のcurlコマンドでLチカを行います。
先ほど作成した/var/www/index.phpを修正します。
$ sudo vi /var/www/index.php
<?php exec('sudo sh /(任意)/blink.sh'); ?>
LEDを点滅させました!
ここでcurlコマンドを実行しても、権限の関係で動いてくれないみたいです。。
なので設定を追記します。
$ sudo visudo #/etc/sudoers.tmpファイルが開かれる
www-data ALL=NOPASSWD:/bin/sh #一番下にこの行を追加します。
これでLEDがチカチカすればOKです。
$ 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を指定します。
設定を保存したら、Slackから指定した言葉を投稿してみましょう。
LEDがチカチカすればOKです。
ここでうまく行かない場合は、URLが間違っている可能性が高いです。
(私はここでプライベートIPを指定していたことに気づかず、かなりの時間を消耗しました。。)
次にSlackで実行した際にラズパイから返答が返って来るようにします。
「Outgoing WebHooks」ではJSON形式で返せば、メッセージを返答させることができます。
/var/www/index.phpを下記のように修正します。
<?php exec('sudo sh /var/pi/blink.sh'); ?>
{"text":"LEDを点滅させました!"}
これでSlackで実行すると、このように返って来ると思います。
(私は初めこの時点で「Outgoing WebHooks」の引き金となる言葉を「LED」にしていたために、無限ループに陥りました。。。みなさん気をつけてくださいね。)
今回は一旦ここまでとします。
次からいよいよエアコンとの連携をしていきます。
RaspberryPi3を使ってSlackからエアコン操作を行う②